INPUT_RETURN_VALUE QuickPhraseDoInput(void* arg, FcitxKeySym sym, int state) { QuickPhraseState *qpstate = (QuickPhraseState*) arg; FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); FcitxGlobalConfig* fc = FcitxInstanceGetGlobalConfig(qpstate->owner); int retVal = IRV_TO_PROCESS; const FcitxHotkey* hkPrevPage = FcitxInstanceGetContextHotkey(qpstate->owner, CONTEXT_ALTERNATIVE_PREVPAGE_KEY); if (hkPrevPage == NULL) hkPrevPage = fc->hkPrevPage; const FcitxHotkey* hkNextPage = FcitxInstanceGetContextHotkey(qpstate->owner, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY); if (hkNextPage == NULL) hkNextPage = fc->hkNextPage; if (FcitxHotkeyIsHotKey(sym, state, hkPrevPage)) { if (FcitxCandidateWordGoPrevPage(FcitxInputStateGetCandidateList(input))) retVal = IRV_DISPLAY_MESSAGE; } else if (FcitxHotkeyIsHotKey(sym, state, hkNextPage)) { if (FcitxCandidateWordGoNextPage(FcitxInputStateGetCandidateList(input))) retVal = IRV_DISPLAY_MESSAGE; } else if (FcitxHotkeyIsHotKeyDigit(sym, state)) { int iKey = FcitxHotkeyCheckChooseKey(sym, state, DIGIT_STR_CHOOSE); if (iKey >= 0) retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), iKey); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) != 0) retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); } return retVal; }
boolean IMSelectorPreFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retval) { IMSelector* imselector = arg; FcitxInstance* instance = imselector->owner; FcitxInputState *input = FcitxInstanceGetInputState(instance); FcitxGlobalConfig* fc = FcitxInstanceGetGlobalConfig(instance); if (!imselector->triggered) return false; const FcitxHotkey* hkPrevPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_PREVPAGE_KEY); if (hkPrevPage == NULL) hkPrevPage = fc->hkPrevPage; const FcitxHotkey* hkNextPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY); if (hkNextPage == NULL) hkNextPage = fc->hkNextPage; FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (FcitxHotkeyIsHotKey(sym, state, hkPrevPage)) { FcitxCandidateWordGoPrevPage(candList); *retval = IRV_DISPLAY_MESSAGE; } else if (FcitxHotkeyIsHotKey(sym, state, hkNextPage)) { FcitxCandidateWordGoNextPage(candList); *retval = IRV_DISPLAY_MESSAGE; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { if (FcitxCandidateWordPageCount(candList) != 0) *retval = FcitxCandidateWordChooseByIndex(candList, 0); } else if (FcitxHotkeyIsHotKeyDigit(sym, state)) { int iKey = FcitxHotkeyCheckChooseKey(sym, state, DIGIT_STR_CHOOSE); if (iKey >= 0) *retval = FcitxCandidateWordChooseByIndex(candList, iKey); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ESCAPE)) { *retval = IRV_CLEAN; } if (*retval == IRV_TO_PROCESS) *retval = IRV_DO_NOTHING; return true; }
boolean ProcessPunc(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE* retVal) { FcitxPuncState* puncState = (FcitxPuncState*) arg; FcitxInstance* instance = puncState->owner; FcitxInputState* input = FcitxInstanceGetInputState(puncState->owner); FcitxProfile* profile = FcitxInstanceGetProfile(instance); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(instance); char *pPunc = NULL; if (*retVal != IRV_TO_PROCESS) return false; FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (FcitxCandidateWordPageCount(candList) != 0 && FcitxCandidateWordGetHasGoneToNextPage(candList) ) { const FcitxHotkey* hkPrevPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_PREVPAGE_KEY); if (hkPrevPage == NULL) hkPrevPage = config->hkPrevPage; if (FcitxHotkeyIsHotKey(sym, state, hkPrevPage)) { return false; } } /* * comparing with upper case, if paging is occupied, * punc will not let next page pass */ if (FcitxCandidateWordPageCount(candList) != 0) { const FcitxHotkey* hkNextPage = FcitxInstanceGetContextHotkey(instance, CONTEXT_ALTERNATIVE_NEXTPAGE_KEY); if (hkNextPage == NULL) hkNextPage = config->hkNextPage; if (FcitxHotkeyIsHotKey(sym, state, hkNextPage)) { return false; } } FcitxKeySym origsym = sym; sym = FcitxHotkeyPadToMain(sym); if (profile->bUseWidePunc) { if (puncState->bLastIsNumber && config->bEngPuncAfterNumber && (FcitxHotkeyIsHotKey(origsym, state, FCITX_PERIOD) || FcitxHotkeyIsHotKey(origsym, state, FCITX_SEMICOLON) || FcitxHotkeyIsHotKey(origsym, state, FCITX_COMMA))) { puncState->cLastIsAutoConvert = origsym; puncState->bLastIsNumber = false; *retVal = IRV_DONOT_PROCESS; return true; } if (FcitxHotkeyIsHotKeySimple(sym, state)) pPunc = GetPunc(puncState, origsym); } /* * 在有候选词未输入的情况下,选择第一个候选词并输入标点 */ if (IsHotKeyPunc(sym, state)) { FcitxInputStateGetOutputString(input)[0] = '\0'; INPUT_RETURN_VALUE ret = IRV_TO_PROCESS; if (!FcitxInputStateGetIsInRemind(input)) ret = FcitxCandidateWordChooseByTotalIndex(FcitxInputStateGetCandidateList(input), 0); /* if there is nothing to commit */ if (ret == IRV_TO_PROCESS) { if (pPunc) { strcat(FcitxInputStateGetOutputString(input), pPunc); *retVal = IRV_PUNC; FcitxInstanceCleanInputWindow(instance); return true; } else return false; } else { if (pPunc) strcat(FcitxInputStateGetOutputString(input), pPunc); else { char buf[2] = { sym, 0 }; strcat(FcitxInputStateGetOutputString(input), buf); } FcitxInstanceCleanInputWindow(instance); *retVal = IRV_PUNC; return true; } return false; } if (profile->bUseWidePunc) { if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE) && puncState->cLastIsAutoConvert) { char *pPunc; FcitxInstanceForwardKey(puncState->owner, FcitxInstanceGetCurrentIC(instance), FCITX_PRESS_KEY, sym, state); pPunc = GetPunc(puncState, puncState->cLastIsAutoConvert); if (pPunc) FcitxInstanceCommitString(puncState->owner, FcitxInstanceGetCurrentIC(instance), pPunc); puncState->cLastIsAutoConvert = 0; *retVal = IRV_DO_NOTHING; return true; } else if (FcitxHotkeyIsHotKeySimple(sym, state)) { if (FcitxHotkeyIsHotKeyDigit(sym, state)) puncState->bLastIsNumber = true; else { puncState->bLastIsNumber = false; } } } puncState->cLastIsAutoConvert = 0; return false; }