void CalMenuWindowPosition(XlibMenu *menu, int x, int y, int dodgeHeight) { FcitxXlibWindow* window = (FcitxXlibWindow*) menu; FcitxClassicUI *classicui = window->owner; FcitxRect rect = GetScreenGeometry(classicui, x, y); if (x < rect.x1) menu->iPosX = rect.x1; else menu->iPosX = x; if (y < rect.y1) menu->iPosY = rect.y1; else menu->iPosY = y + dodgeHeight; if ((menu->iPosX + window->width) > rect.x2) menu->iPosX = rect.x2 - window->width; if ((menu->iPosY + window->height) > rect.y2) { if (menu->iPosY > rect.y2) menu->iPosY = rect.y2 - window->height; else /* better position the window */ menu->iPosY = menu->iPosY - window->height - dodgeHeight; } }
void InputWindowMoveWindow(FcitxXlibWindow* window) { InputWindow* inputWindow = (InputWindow*) window; int x = 0, y = 0, w = 0, h = 0; FcitxInputContext* ic = FcitxInstanceGetCurrentIC(window->owner->owner); FcitxInstanceGetWindowRect(window->owner->owner, ic, &x, &y, &w, &h); FcitxRect rect = GetScreenGeometry(window->owner, x, y); int iTempInputWindowX, iTempInputWindowY; if (x < rect.x1) iTempInputWindowX = rect.x1; else iTempInputWindowX = x + inputWindow->iOffsetX; if (y < rect.y1) iTempInputWindowY = rect.y1; else iTempInputWindowY = y + h + inputWindow->iOffsetY; if ((iTempInputWindowX + window->width) > rect.x2) iTempInputWindowX = rect.x2 - window->width; if ((iTempInputWindowY + window->height) > rect.y2) { if (iTempInputWindowY > rect.y2) iTempInputWindowY = rect.y2 - window->height - 40; else /* better position the window */ iTempInputWindowY = iTempInputWindowY - window->height - ((h == 0)?40:h) - 2 * inputWindow->iOffsetY; } XMoveWindow(window->owner->dpy, window->wId, iTempInputWindowX, iTempInputWindowY); }