static int SimpleFrontendProcessKey(FcitxSimpleFrontend *simple, FcitxSimpleRequest *request) { FcitxInputState *input = FcitxInstanceGetInputState(simple->owner); if (simple->ic == NULL) simple->ic = FcitxInstanceCreateIC(simple->owner, simple->frontendid, NULL); FcitxInputContext* ic = FcitxInstanceGetCurrentIC(simple->owner); if (ic != simple->ic || ic->frontendid != simple->frontendid) { FcitxInstanceSetCurrentIC(simple->owner, simple->ic); FcitxUIOnInputFocus(simple->owner); } ic = simple->ic; FcitxKeySym sym; unsigned int state; state = request->state & FcitxKeyState_SimpleMask; state &= FcitxKeyState_UsedMask; FcitxHotkeyGetKey(request->key, state, &sym, &state); if (request->key == 0) return 0; //FcitxInstanceEnableIM(ipc->owner, ic, false); FcitxInputStateSetKeyCode(input, request->keycode); FcitxInputStateSetKeySym(input, request->key); FcitxInputStateSetKeyState(input, request->state); INPUT_RETURN_VALUE retVal = FcitxInstanceProcessKey(simple->owner, request->type == SE_KeyEventPress ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY, 0, sym, state); FcitxInputStateSetKeyCode(input, 0); FcitxInputStateSetKeySym(input, 0); FcitxInputStateSetKeyState(input, 0); if (retVal & IRV_FLAG_FORWARD_KEY || retVal == IRV_TO_PROCESS) { return 0; } else { return 1; } }
void XIMProcessKey(FcitxXimFrontend* xim, IMForwardEventStruct * call_data) { KeySym originsym; FcitxKeySym sym; XKeyEvent *kev; int keyCount; uint32_t state; char strbuf[STRBUFLEN]; FcitxInputContext* ic = FcitxInstanceGetCurrentIC(xim->owner); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(xim->owner); FcitxInputState* input = FcitxInstanceGetInputState(xim->owner); if (ic == NULL) { ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); if (FcitxInstanceSetCurrentIC(xim->owner, ic) && ic) FcitxUIOnInputFocus(xim->owner); } if (ic == NULL) return; if (ic->frontendid != xim->frontendid || GetXimIC(ic)->id != call_data->icid) { ic = FcitxInstanceFindIC(xim->owner, xim->frontendid, &call_data->icid); if (ic == NULL) return; if (FcitxInstanceSetCurrentIC(xim->owner, ic)) FcitxUIOnInputFocus(xim->owner); } kev = (XKeyEvent *) & call_data->event; memset(strbuf, 0, STRBUFLEN); keyCount = XLookupString(kev, strbuf, STRBUFLEN, &originsym, NULL); const uint32_t originstate = kev->state; state = kev->state - (kev->state & FcitxKeyState_NumLock) - (kev->state & FcitxKeyState_CapsLock) - (kev->state & FcitxKeyState_ScrollLock); state &= FcitxKeyState_UsedMask; FcitxHotkeyGetKey((FcitxKeySym) originsym, state, &sym, &state); FcitxLog(DEBUG, "KeyRelease=%d state=%d KEYCODE=%d KEYSYM=%d keyCount=%d", (call_data->event.type == KeyRelease), state, kev->keycode, (int) sym, keyCount); xim->currentSerialNumberCallData = call_data->serial_number; xim->currentSerialNumberKey = kev->serial; FcitxKeyEventType type = (call_data->event.type == KeyRelease) ? (FCITX_RELEASE_KEY) : (FCITX_PRESS_KEY); if (ic->state == IS_CLOSED) { if (type == FCITX_PRESS_KEY && FcitxHotkeyIsHotKey(sym, state, config->hkTrigger)) { FcitxInstanceEnableIM(xim->owner, ic, false); return; } else { XimForwardKeyInternal(xim, GetXimIC(ic), &call_data->event ); return; } } FcitxInputStateSetKeyCode(input, kev->keycode); FcitxInputStateSetKeySym(input, originsym); FcitxInputStateSetKeyState(input, originstate); INPUT_RETURN_VALUE retVal = FcitxInstanceProcessKey(xim->owner, type, kev->time, sym, state); FcitxInputStateSetKeyCode(input, 0); FcitxInputStateSetKeySym(input, 0); FcitxInputStateSetKeyState(input, 0); if ((retVal & IRV_FLAG_FORWARD_KEY) || retVal == IRV_TO_PROCESS) { XimForwardKeyInternal(xim, GetXimIC(ic), &call_data->event ); } else { if (!GetXimIC(ic)->bHasCursorLocation) SetTrackPos(xim, ic, NULL); } xim->currentSerialNumberCallData = xim->currentSerialNumberKey = 0L; }