/** Process a button event. */ void HandleButtonEvent(const XButtonEvent *event) { ClientNode *np; int north, south, east, west; np = FindClientByParent(event->window); if(np) { if(event->type == ButtonPress) { FocusClient(np); RaiseClient(np); } DispatchBorderButtonEvent(event, np); } else if(event->window == rootWindow && event->type == ButtonPress) { if(!ShowRootMenu(event->button, event->x, event->y, 0)) { if(event->button == Button4) { LeftDesktop(); } else if(event->button == Button5) { RightDesktop(); } } } else { const unsigned int mask = event->state & ~lockMask; np = FindClientByWindow(event->window); if(np) { switch(event->button) { case Button1: case Button2: FocusClient(np); RaiseClient(np); if(mask == Mod1Mask) { GetBorderSize(&np->state, &north, &south, &east, &west); MoveClient(np, event->x + west, event->y + north); } break; case Button3: if(mask == Mod1Mask) { GetBorderSize(&np->state, &north, &south, &east, &west); ResizeClient(np, BA_RESIZE | BA_RESIZE_E | BA_RESIZE_S, event->x + west, event->y + north); } else { FocusClient(np); RaiseClient(np); } break; default: break; } JXAllowEvents(display, ReplayPointer, eventTime); } } }
/** Handle a _NET_WM_MOVERESIZE request. */ void HandleNetWMMoveResize(const XClientMessageEvent *event, ClientNode *np) { const long x = event->data.l[0] - np->x; const long y = event->data.l[1] - np->y; const long direction = event->data.l[2]; switch(direction) { case 0: /* top-left */ ResizeClient(np, BA_RESIZE | BA_RESIZE_N | BA_RESIZE_W, x, y); break; case 1: /* top */ ResizeClient(np, BA_RESIZE | BA_RESIZE_N, x, y); break; case 2: /* top-right */ ResizeClient(np, BA_RESIZE | BA_RESIZE_N | BA_RESIZE_E, x, y); break; case 3: /* right */ ResizeClient(np, BA_RESIZE | BA_RESIZE_E, x, y); break; case 4: /* bottom-right */ ResizeClient(np, BA_RESIZE | BA_RESIZE_S | BA_RESIZE_E, x, y); break; case 5: /* bottom */ ResizeClient(np, BA_RESIZE | BA_RESIZE_S, x, y); break; case 6: /* bottom-left */ ResizeClient(np, BA_RESIZE | BA_RESIZE_S | BA_RESIZE_W, x, y); break; case 7: /* left */ ResizeClient(np, BA_RESIZE | BA_RESIZE_W, x, y); break; case 8: /* move */ MoveClient(np, x, y); break; case 9: /* resize-keyboard */ ResizeClientKeyboard(np); break; case 10: /* move-keyboard */ MoveClientKeyboard(np); break; case 11: /* cancel */ if(np->controller) { (np->controller)(0); } break; default: break; } }
void __stdcall PlayerLaunch_AFTER(unsigned int ship, unsigned int client) { returncode = DEFAULT_RETURNCODE; if (transferFlags[client] == CLIENT_STATE_TRANSFER) { if (!ValidateCargo(client)) { PrintUserCmdText(client, STR_INFO2); return; } transferFlags[client] = CLIENT_STATE_NONE; MoveClient(client, set_iTargetBaseID); return; } if (transferFlags[client] == CLIENT_STATE_RETURN) { if (!ValidateCargo(client)) { PrintUserCmdText(client, STR_INFO2); return; } transferFlags[client] = CLIENT_STATE_NONE; unsigned int returnPoint = ReadReturnPointForClient(client); if (!returnPoint) return; MoveClient(client, returnPoint); HookExt::IniSetI(client, "conn.retbase", 0); return; } }
/** Take the appropriate action for a click on a client border. */ void DispatchBorderButtonEvent(const XButtonEvent *event, ClientNode *np) { static Time lastClickTime = 0; static int lastX = 0, lastY = 0; static char doubleClickActive = 0; BorderActionType action; int bsize; /* Middle click starts a move unless it's over the maximize button. */ action = GetBorderActionType(np, event->x, event->y); if(event->button == Button2 && action != BA_MAXIMIZE) { MoveClient(np, event->x, event->y); return; } /* Determine the size of the border. */ if(np->state.border & BORDER_OUTLINE) { bsize = settings.borderWidth; } else { bsize = 0; } /* Other buttons are context sensitive. */ switch(action & 0x0F) { case BA_RESIZE: /* Border */ if(event->type == ButtonPress) { if(event->button == Button1) { ResizeClient(np, action, event->x, event->y); } else if(event->button == Button3) { const int x = np->x + event->x - bsize; const int y = np->y + event->y - settings.titleHeight - bsize; ShowWindowMenu(np, x, y, 0); } } break; case BA_MOVE: /* Title bar */ if(event->button == Button1) { if(event->type == ButtonPress) { if(doubleClickActive && event->time != lastClickTime && event->time - lastClickTime <= settings.doubleClickSpeed && abs(event->x - lastX) <= settings.doubleClickDelta && abs(event->y - lastY) <= settings.doubleClickDelta) { MaximizeClientDefault(np); doubleClickActive = 0; } else { if(MoveClient(np, event->x, event->y)) { doubleClickActive = 0; } else { doubleClickActive = 1; lastClickTime = event->time; lastX = event->x; lastY = event->y; } } } } else if(event->button == Button3) { const int x = np->x + event->x - bsize; const int y = np->y + event->y - settings.titleHeight - bsize; ShowWindowMenu(np, x, y, 0); } else if(event->button == Button4) { ShadeClient(np); } else if(event->button == Button5) { UnshadeClient(np); } break; case BA_MENU: /* Menu button */ if(event->button == Button4) { ShadeClient(np); } else if(event->button == Button5) { UnshadeClient(np); } else if(event->type == ButtonPress) { const int x = np->x + event->x - bsize; const int y = np->y + event->y - settings.titleHeight - bsize; ShowWindowMenu(np, x, y, 0); } break; case BA_CLOSE: /* Close button */ if(event->type == ButtonRelease && (event->button == Button1 || event->button == Button3)) { DeleteClient(np); } break; case BA_MAXIMIZE: /* Maximize button */ if(event->type == ButtonRelease) { switch(event->button) { case Button1: MaximizeClientDefault(np); break; case Button2: MaximizeClient(np, np->state.maxFlags ^ MAX_VERT); break; case Button3: MaximizeClient(np, np->state.maxFlags ^ MAX_HORIZ); break; default: break; } } break; case BA_MINIMIZE: /* Minimize button */ if(event->type == ButtonRelease) { if(event->button == Button3) { if(np->state.status & STAT_SHADED) { UnshadeClient(np); } else { ShadeClient(np); } } else if(event->button == Button1) { MinimizeClient(np, 1); } } break; default: break; } DiscardEnterEvents(); }
/** Process a button event. */ void HandleButtonEvent(const XButtonEvent *event) { int x, y; ClientNode *np; int north, south, east, west; np = FindClientByParent(event->window); if(np) { RaiseClient(np); if(focusModel == FOCUS_CLICK) { FocusClient(np); } switch(event->button) { case Button1: DispatchBorderButtonEvent(event, np); break; case Button2: MoveClient(np, event->x, event->y); break; case Button3: GetBorderSize(np, &north, &south, &east, &west); x = event->x + np->x - west; y = event->y + np->y - north; ShowWindowMenu(np, x, y); break; case Button4: ShadeClient(np); break; case Button5: UnshadeClient(np); break; default: break; } } else if(event->window == rootWindow && event->type == ButtonPress) { if(!ShowRootMenu(event->button, event->x, event->y)) { if(event->button == 4) { LeftDesktop(); } else if(event->button == 5) { RightDesktop(); } } } else { np = FindClientByWindow(event->window); if(np) { switch(event->button) { case Button1: case Button2: RaiseClient(np); if(focusModel == FOCUS_CLICK) { FocusClient(np); } if(event->state & Mod1Mask) { GetBorderSize(np, &north, &south, &east, &west); MoveClient(np, event->x + west, event->y + north); } break; case Button3: if(event->state & Mod1Mask) { GetBorderSize(np, &north, &south, &east, &west); ResizeClient(np, BA_RESIZE | BA_RESIZE_E | BA_RESIZE_S, event->x + west, event->y + north); } else { RaiseClient(np); if(focusModel == FOCUS_CLICK) { FocusClient(np); } } break; default: break; } JXAllowEvents(display, ReplayPointer, CurrentTime); } } UpdatePager(); }
/** Take the appropriate action for a click on a client border. */ void DispatchBorderButtonEvent(const XButtonEvent *event, ClientNode *np) { static Time lastClickTime = 0; static int lastX = 0, lastY = 0; static int doubleClickActive = 0; BorderActionType action; int bsize; action = GetBorderActionType(np, event->x, event->y); switch(action & 0x0F) { case BA_RESIZE: if(event->type == ButtonPress) { ResizeClient(np, action, event->x, event->y); } break; case BA_MOVE: if(event->type == ButtonPress) { if(doubleClickActive && abs(event->time - lastClickTime) > 0 && abs(event->time - lastClickTime) <= doubleClickSpeed && abs(event->x - lastX) <= doubleClickDelta && abs(event->y - lastY) <= doubleClickDelta) { MaximizeClientDefault(np); doubleClickActive = 0; } else { if(MoveClient(np, event->x, event->y)) { doubleClickActive = 0; } else { doubleClickActive = 1; lastClickTime = event->time; lastX = event->x; lastY = event->y; } } } break; case BA_MENU: if(event->type == ButtonPress) { if(np->state.border & BORDER_OUTLINE) { bsize = borderWidth; } else { bsize = 0; } ShowWindowMenu(np, np->x + event->x - bsize, np->y + event->y - titleHeight - bsize); } break; case BA_CLOSE: if(event->type == ButtonRelease) { DeleteClient(np); } break; case BA_MAXIMIZE: if(event->type == ButtonRelease) { MaximizeClientDefault(np); } break; case BA_MINIMIZE: if(event->type == ButtonRelease) { MinimizeClient(np); } break; default: break; } }