boolean IsMouseInOtherMenu(XlibMenu *xlibMenu, int x, int y) { FcitxClassicUI *classicui = xlibMenu->parent.owner; FcitxInstance* instance = classicui->owner; FcitxUIMenu** menupp; UT_array* uimenus = FcitxInstanceGetUIMenus(instance); for (menupp = (FcitxUIMenu **) utarray_front(uimenus); menupp != NULL; menupp = (FcitxUIMenu **) utarray_next(uimenus, menupp) ) { XlibMenu* otherXlibMenu = (XlibMenu*)(*menupp)->uipriv[classicui->isfallback]; if (otherXlibMenu == xlibMenu) continue; XWindowAttributes attr; XGetWindowAttributes(classicui->dpy, otherXlibMenu->parent.wId, &attr); if (attr.map_state != IsUnmapped && FcitxUIIsInBox(x, y, attr.x, attr.y, attr.width, attr.height)) { return true; } } XlibMenu* otherXlibMenu = classicui->mainMenuWindow; if (otherXlibMenu == xlibMenu) return false; XWindowAttributes attr; XGetWindowAttributes(classicui->dpy, otherXlibMenu->parent.wId, &attr); if (attr.map_state != IsUnmapped && FcitxUIIsInBox(x, y, attr.x, attr.y, attr.width, attr.height)) { return true; } return false; }
boolean IsInRspArea(int x0, int y0, FcitxClassicUIStatus* status) { return FcitxUIIsInBox(x0, y0, status->x, status->y, status->w, status->h); }
/* * 处理相关鼠标键 */ boolean VKMouseKey(FcitxVKState* vkstate, int x, int y) { int iIndex = 0; char strKey[3] = { 0, 0, 0}; char *pstr = NULL; FcitxInstance* instance = vkstate->owner; if (FcitxUIIsInBox(x, y, 1, 1, VK_WINDOW_WIDTH, 16)) ChangVK(vkstate); else { if (FcitxInstanceGetCurrentIC(instance) == NULL) return false; strKey[1] = '\0'; pstr = strKey; if (y >= 28 && y <= 55) { //第一行 if (x < 4 || x > 348) return false; x -= 4; if (x >= 313 && x <= 344) { //backspace FcitxInstanceForwardKey(instance, FcitxInstanceGetCurrentIC(instance), FCITX_PRESS_KEY, FcitxKey_BackSpace, 0); return true; } else { iIndex = x / 24; if (iIndex > 12) //避免出现错误 iIndex = 12; pstr = vkstate->vks[vkstate->iCurrentVK].strSymbol[iIndex][vkstate->bShiftPressed ^ vkstate->bVKCaps]; if (vkstate->bShiftPressed) { vkstate->bShiftPressed = false; DrawVKWindow(vkstate->vkWindow); } } } else if (y >= 56 && y <= 83) { //第二行 if (x < 4 || x > 350) return false; if (x >= 4 && x < 38) { //Tab FcitxInstanceForwardKey(instance, FcitxInstanceGetCurrentIC(instance), FCITX_PRESS_KEY, FcitxKey_Tab, 0); return true; } else { iIndex = 13 + (x - 38) / 24; pstr = vkstate->vks[vkstate->iCurrentVK].strSymbol[iIndex][vkstate->bShiftPressed ^ vkstate->bVKCaps]; if (vkstate->bShiftPressed) { vkstate->bShiftPressed = false; DrawVKWindow(vkstate->vkWindow); } } } else if (y >= 84 && y <= 111) { //第三行 if (x < 4 || x > 350) return false; if (x >= 4 && x < 44) { //Caps //改变大写键状态 vkstate->bVKCaps = !vkstate->bVKCaps; pstr = (char *) NULL; DrawVKWindow(vkstate->vkWindow); } else if (x > 308 && x <= 350) //Return strKey[0] = '\n'; else { iIndex = 26 + (x - 44) / 24; pstr = vkstate->vks[vkstate->iCurrentVK].strSymbol[iIndex][vkstate->bShiftPressed ^ vkstate->bVKCaps]; if (vkstate->bShiftPressed) { vkstate->bShiftPressed = false; DrawVKWindow(vkstate->vkWindow); } } } else if (y >= 112 && y <= 139) { //第四行 if (x < 4 || x > 302) return false; if (x >= 4 && x < 62) { //SHIFT //改变SHIFT键状态 vkstate->bShiftPressed = !vkstate->bShiftPressed; pstr = (char *) NULL; DrawVKWindow(vkstate->vkWindow); } else { iIndex = 37 + (x - 62) / 24; pstr = vkstate->vks[vkstate->iCurrentVK].strSymbol[iIndex][vkstate->bShiftPressed ^ vkstate->bVKCaps]; if (vkstate->bShiftPressed) { vkstate->bShiftPressed = false; DrawVKWindow(vkstate->vkWindow); } } } else if (y >= 140 && y <= 162) { //第五行 if (x >= 4 && x < 38) { //Ins //改变INS键状态 FcitxInstanceForwardKey(instance, FcitxInstanceGetCurrentIC(instance), FCITX_PRESS_KEY, FcitxKey_Insert, 0); return true; } else if (x >= 61 && x < 98) { //DEL FcitxInstanceForwardKey(instance, FcitxInstanceGetCurrentIC(instance), FCITX_PRESS_KEY, FcitxKey_Delete, 0); return true; } else if (x >= 99 && x < 270) //空格 strcpy(strKey, " "); else if (x >= 312 && x <= 350) { //ESC SwitchVK(vkstate); pstr = (char *) NULL; } else return false; } if (pstr) { FcitxInstanceCommitString(instance, FcitxInstanceGetCurrentIC(instance), pstr); } } return true; }