void FcitxUIUpdateInputWindowReal(FcitxInstance *instance) { FcitxInputState* input = instance->input; FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); FcitxCapacityFlags flags = CAPACITY_NONE; if (ic != NULL) flags = ic->contextCaps; if (flags & CAPACITY_CLIENT_SIDE_UI) { FcitxInstanceUpdateClientSideUI(instance, ic); return; } FcitxInstanceUpdatePreedit(instance, ic); boolean toshow = false; if (FcitxMessagesGetMessageCount(input->msgAuxUp) != 0 || FcitxMessagesGetMessageCount(input->msgAuxDown) != 0) toshow = true; if (FcitxCandidateWordGetListSize(input->candList) > 1) toshow = true; if (FcitxCandidateWordGetListSize(input->candList) == 1 && (!instance->config->bHideInputWindowWhenOnlyPreeditString || !instance->config->bHideInputWindowWhenOnlyOneCandidate)) toshow = true; if (FcitxMessagesGetMessageCount(input->msgPreedit) != 0 && !((flags & CAPACITY_PREEDIT) && instance->config->bHideInputWindowWhenOnlyPreeditString && instance->profile->bUsePreedit)) toshow = true; if (!toshow) { if (UI_FUNC_IS_VALID(CloseInputWindow)) instance->ui->ui->CloseInputWindow(instance->ui->addonInstance); } else FcitxUIShowInputWindow(instance); FcitxMessagesSetMessageChanged(input->msgAuxUp, false); FcitxMessagesSetMessageChanged(input->msgAuxDown, false); FcitxMessagesSetMessageChanged(input->msgPreedit, false); FcitxMessagesSetMessageChanged(input->msgClientPreedit, false); }
/** * @brief Process Key Input and return the status * * @param keycode keycode from XKeyEvent * @param state state from XKeyEvent * @param count count from XKeyEvent * @return INPUT_RETURN_VALUE **/ __EXPORT_API INPUT_RETURN_VALUE FcitxChewingDoInput(void* arg, FcitxKeySym sym, unsigned int state) { FcitxChewing* chewing = (FcitxChewing*) arg; FcitxInputState *input = FcitxInstanceGetInputState(chewing->owner); ChewingContext * c = chewing->context; if (FcitxCandidateWordGetListSize(FcitxInputStateGetCandidateList(input)) > 0 && (FcitxHotkeyIsHotKeyDigit(sym, state) || FcitxHotkeyIsHotKey(sym, state, FCITX_RIGHT) || FcitxHotkeyIsHotKey(sym, state, FCITX_LEFT))) return IRV_TO_PROCESS; if (FcitxHotkeyIsHotKeySimple(sym, state)) { int scan_code = (int) sym & 0xff; chewing_handle_Default(c, scan_code); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { chewing_handle_Backspace(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ESCAPE)) { chewing_handle_Esc(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_DELETE)) { chewing_handle_Del(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { chewing_handle_Space(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_UP)) { chewing_handle_Up(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_DOWN)) { chewing_handle_Down(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_PGUP)) { chewing_handle_PageDown(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_PGDN)) { chewing_handle_PageUp(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_RIGHT)) { chewing_handle_Right(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_LEFT)) { chewing_handle_Left(c); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ENTER)) { chewing_handle_Enter(c); } else if (state == FcitxKeyState_Ctrl && FcitxHotkeyIsHotKeyDigit(sym, FcitxKeyState_None)) { chewing_handle_CtrlNum(c, sym); } else { // to do: more chewing_handle return IRV_TO_PROCESS; } if (chewing_keystroke_CheckAbsorb(c)) { return IRV_DISPLAY_CANDWORDS; } else if (chewing_keystroke_CheckIgnore(c)) { return IRV_TO_PROCESS; } else if (chewing_commit_Check(c)) { char* str = chewing_commit_String(c); strcpy(FcitxInputStateGetOutputString(input), str); chewing_free(str); return IRV_COMMIT_STRING; } else return IRV_DISPLAY_CANDWORDS; }
FCITX_EXPORT_API INPUT_RETURN_VALUE FcitxCandidateWordChooseByIndex(FcitxCandidateWordList* candList, int index) { FcitxCandidateWord* candWord = FcitxCandidateWordGetByIndex(candList, index); if (candWord == NULL) { if (FcitxCandidateWordGetListSize(candList) > 0) return IRV_DO_NOTHING; else return IRV_TO_PROCESS; } else return candWord->callback(candWord->owner, candWord); }
static INPUT_RETURN_VALUE AutoEngCheckSelect(FcitxAutoEngState *autoEngState, FcitxKeySym sym, unsigned int state) { FcitxInstance *instance = autoEngState->owner; FcitxCandidateWordList *cand_list = FcitxInputStateGetCandidateList( FcitxInstanceGetInputState(autoEngState->owner)); if (!FcitxCandidateWordGetListSize(cand_list)) return IRV_TO_PROCESS; FcitxInputState *input = FcitxInstanceGetInputState(instance); FcitxGlobalConfig *fc = FcitxInstanceGetGlobalConfig(instance); int key; FcitxCandidateWord *cand_word; if (FcitxHotkeyIsHotKey(sym, state, fc->nextWord)) { if (!autoEngState->cursor_moved) { cand_word = FcitxCandidateWordGetCurrentWindow(cand_list); } else { cand_word = FcitxCandidateWordGetFocus(cand_list, true); cand_word = FcitxCandidateWordGetNext(cand_list, cand_word); if (!cand_word) { FcitxCandidateWordSetPage(cand_list, 0); } else { FcitxCandidateWordSetFocus( cand_list, FcitxCandidateWordGetIndex(cand_list, cand_word)); } } } else if (FcitxHotkeyIsHotKey(sym, state, fc->prevWord)) { if (!autoEngState->cursor_moved) { cand_word = FcitxCandidateWordGetByIndex( cand_list, FcitxCandidateWordGetCurrentWindowSize(cand_list) - 1); } else { cand_word = FcitxCandidateWordGetFocus(cand_list, true); cand_word = FcitxCandidateWordGetPrev(cand_list, cand_word); if (cand_word) { FcitxCandidateWordSetFocus( cand_list, FcitxCandidateWordGetIndex(cand_list, cand_word)); } } } else if (FcitxHotkeyIsHotKey(sym, state, FcitxConfigPrevPageKey(instance, fc))) { boolean has_prev_page; cand_word = FcitxCandidateWordGetFocus(cand_list, true); has_prev_page = FcitxCandidateWordGoPrevPage(cand_list); if (!autoEngState->cursor_moved) { cand_word = NULL; } else if (has_prev_page) { cand_word = FcitxCandidateWordGetCurrentWindow(cand_list) + FcitxCandidateWordGetCurrentWindowSize(cand_list) - 1; } } else if (FcitxHotkeyIsHotKey(sym, state, FcitxConfigNextPageKey(instance, fc))) { boolean has_next_page; cand_word = FcitxCandidateWordGetFocus(cand_list, true); has_next_page = FcitxCandidateWordGoNextPage(cand_list); if (!autoEngState->cursor_moved) { cand_word = NULL; } else if (has_next_page) { cand_word = FcitxCandidateWordGetCurrentWindow(cand_list); } } else if ((key = FcitxCandidateWordCheckChooseKey(cand_list, sym, state)) >= 0) { return FcitxCandidateWordChooseByIndex(cand_list, key); } else { return IRV_TO_PROCESS; } if (cand_word) { FcitxCandidateWordSetType(cand_word, MSG_CANDIATE_CURSOR); if (!autoEngState->cursor_moved) AutoEngSwapBuff(autoEngState); AutoEngSetBuff(autoEngState, cand_word->strWord, '\0'); autoEngState->cursor_moved = true; } else if (autoEngState->cursor_moved) { AutoEngSwapBuff(autoEngState); autoEngState->cursor_moved = false; } else { return IRV_FLAG_UPDATE_INPUT_WINDOW; } FcitxMessages *client_preedit = FcitxInputStateGetClientPreedit(input); FcitxMessages *preedit = FcitxInputStateGetPreedit(input); FcitxMessagesSetMessageCount(client_preedit, 0); FcitxMessagesSetMessageCount(preedit, 0); FcitxMessagesAddMessageStringsAtLast(client_preedit, MSG_INPUT, autoEngState->buf); FcitxMessagesAddMessageStringsAtLast(preedit, MSG_INPUT, autoEngState->buf); FcitxInputStateSetCursorPos(input, autoEngState->index); FcitxInputStateSetClientCursorPos(input, autoEngState->index); return IRV_FLAG_UPDATE_INPUT_WINDOW; }
/** * @brief Process Key Input and return the status * * @param keycode keycode from XKeyEvent * @param state state from XKeyEvent * @param count count from XKeyEvent * @return INPUT_RETURN_VALUE **/ __EXPORT_API INPUT_RETURN_VALUE FcitxChewingDoInput(void* arg, FcitxKeySym sym, unsigned int state) { FcitxChewing* chewing = (FcitxChewing*) arg; FcitxInputState *input = FcitxInstanceGetInputState(chewing->owner); ChewingContext * ctx = chewing->context; int zuin_len; FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (FcitxCandidateWordGetListSize(candList) > 0) { if (FcitxHotkeyIsHotKeyDigit(sym, state) || FcitxHotkeyIsHotKey(sym, state, FCITX_RIGHT) || FcitxHotkeyIsHotKey(sym, state, FCITX_LEFT)) return IRV_TO_PROCESS; if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { if (FcitxCandidateWordGoNextPage(candList)) return IRV_DISPLAY_MESSAGE; else return IRV_DO_NOTHING; } } if (FcitxHotkeyIsHotKeySimple(sym, state)) { int scan_code = (int) sym & 0xff; chewing_handle_Default(ctx, scan_code); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { char * zuin_str = chewing_zuin_String(ctx, &zuin_len); chewing_free(zuin_str); if (chewing_buffer_Len(ctx) + zuin_len == 0) return IRV_TO_PROCESS; chewing_handle_Backspace(ctx); if (chewing_buffer_Len(ctx) + zuin_len == 0) return IRV_CLEAN; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ESCAPE)) { chewing_handle_Esc(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_DELETE)) { char * zuin_str = chewing_zuin_String(ctx, &zuin_len); chewing_free(zuin_str); if (chewing_buffer_Len(ctx) + zuin_len == 0) return IRV_TO_PROCESS; chewing_handle_Del(ctx); if (chewing_buffer_Len(ctx) + zuin_len == 0) return IRV_CLEAN; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { chewing_handle_Space(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_UP)) { chewing_handle_Up(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_DOWN)) { chewing_handle_Down(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_PGUP)) { chewing_handle_PageDown(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_CHEWING_PGDN)) { chewing_handle_PageUp(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_RIGHT)) { chewing_handle_Right(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_LEFT)) { chewing_handle_Left(ctx); } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ENTER)) { chewing_handle_Enter(ctx); } else if (state == FcitxKeyState_Ctrl && FcitxHotkeyIsHotKeyDigit(sym, FcitxKeyState_None)) { chewing_handle_CtrlNum(ctx, sym); } else { // to do: more chewing_handle return IRV_TO_PROCESS; } if (chewing_keystroke_CheckAbsorb(ctx)) { return IRV_DISPLAY_CANDWORDS; } else if (chewing_keystroke_CheckIgnore(ctx)) { return IRV_TO_PROCESS; } else if (chewing_commit_Check(ctx)) { char* str = chewing_commit_String(ctx); FcitxInputContext* ic = FcitxInstanceGetCurrentIC(chewing->owner); FcitxInstanceCommitString(chewing->owner, ic, str); chewing_free(str); return IRV_DISPLAY_CANDWORDS; } else return IRV_DISPLAY_CANDWORDS; }