FCITX_EXPORT_API int FcitxUINewMessageToOldStyleMessage(FcitxInstance* instance, FcitxMessages* msgUp, FcitxMessages* msgDown) { int i = 0; FcitxInputState* input = instance->input; int extraLength = input->iCursorPos; FcitxMessagesSetMessageCount(msgUp, 0); FcitxMessagesSetMessageCount(msgDown, 0); for (i = 0; i < FcitxMessagesGetMessageCount(input->msgAuxUp) ; i ++) { FcitxMessagesAddMessageAtLast(msgUp, FcitxMessagesGetMessageType(input->msgAuxUp, i), "%s", FcitxMessagesGetMessageString(input->msgAuxUp, i)); extraLength += strlen(FcitxMessagesGetMessageString(input->msgAuxUp, i)); } for (i = 0; i < FcitxMessagesGetMessageCount(input->msgPreedit) ; i ++) FcitxMessagesAddMessageAtLast(msgUp, FcitxMessagesGetMessageType(input->msgPreedit, i), "%s", FcitxMessagesGetMessageString(input->msgPreedit, i)); for (i = 0; i < FcitxMessagesGetMessageCount(input->msgAuxDown) ; i ++) FcitxMessagesAddMessageAtLast(msgDown, FcitxMessagesGetMessageType(input->msgAuxDown, i), "%s", FcitxMessagesGetMessageString(input->msgAuxDown, i)); FcitxCandidateWord* candWord = NULL; for (candWord = FcitxCandidateWordGetCurrentWindow(input->candList), i = 0; candWord != NULL; candWord = FcitxCandidateWordGetCurrentWindowNext(input->candList, candWord), i ++) { char strTemp[3] = { '\0', '\0', '\0' }; strTemp[0] = FcitxCandidateWordGetChoose(input->candList)[i]; if (instance->config->bPointAfterNumber) strTemp[1] = '.'; unsigned int mod = FcitxCandidateWordGetModifier(input->candList); FcitxMessagesAddMessageAtLast(msgDown, MSG_INDEX, "%s%s%s%s%s", (mod & FcitxKeyState_Super) ? "M-" : "", (mod & FcitxKeyState_Ctrl) ? "C-" : "", (mod & FcitxKeyState_Alt) ? "A-" : "", (mod & FcitxKeyState_Shift) ? "S-" : "", strTemp); FcitxMessageType type = candWord->wordType; if (i == 0 && FcitxCandidateWordGetCurrentPage(input->candList) == 0 && type == MSG_OTHER && !FcitxInstanceGetContextBoolean(instance, CONTEXT_DISABLE_AUTO_FIRST_CANDIDATE_HIGHTLIGHT) ) type = MSG_FIRSTCAND; FcitxMessagesAddMessageAtLast(msgDown, type, "%s", candWord->strWord); if (candWord->strExtra && strlen(candWord->strExtra) != 0) FcitxMessagesAddMessageAtLast(msgDown, candWord->extraType, "%s", candWord->strExtra); FcitxMessagesAddMessageAtLast(msgDown, MSG_OTHER, " "); } return extraLength; }
FCITX_EXPORT_API int FcitxUINewMessageToOldStyleMessage(FcitxInstance* instance, FcitxMessages* msgUp, FcitxMessages* msgDown) { int i = 0; FcitxInputState* input = instance->input; int extraLength = input->iCursorPos; FcitxMessagesSetMessageCount(msgUp, 0); FcitxMessagesSetMessageCount(msgDown, 0); for (i = 0; i < FcitxMessagesGetMessageCount(input->msgAuxUp) ; i ++) { FcitxMessagesAddMessageAtLast(msgUp, FcitxMessagesGetMessageType(input->msgAuxUp, i), "%s", FcitxMessagesGetMessageString(input->msgAuxUp, i)); extraLength += strlen(FcitxMessagesGetMessageString(input->msgAuxUp, i)); } for (i = 0; i < FcitxMessagesGetMessageCount(input->msgPreedit) ; i ++) FcitxMessagesAddMessageAtLast(msgUp, FcitxMessagesGetMessageType(input->msgPreedit, i), "%s", FcitxMessagesGetMessageString(input->msgPreedit, i)); for (i = 0; i < FcitxMessagesGetMessageCount(input->msgAuxDown) ; i ++) FcitxMessagesAddMessageAtLast(msgDown, FcitxMessagesGetMessageType(input->msgAuxDown, i), "%s", FcitxMessagesGetMessageString(input->msgAuxDown, i)); FcitxCandidateWord* candWord = NULL; for (candWord = FcitxCandidateWordGetCurrentWindow(input->candList), i = 0; candWord != NULL; candWord = FcitxCandidateWordGetCurrentWindowNext(input->candList, candWord), i ++) { char strTemp[3] = { '\0', '\0', '\0' }; strTemp[0] = FcitxCandidateWordGetChoose(input->candList)[i]; if (instance->config->bPointAfterNumber) strTemp[1] = '.'; FcitxMessagesAddMessageAtLast(msgDown, MSG_INDEX, "%s", strTemp); FcitxMessageType type = candWord->wordType; if (i == 0 && FcitxCandidateWordGetCurrentPage(input->candList) == 0 && type == MSG_OTHER) type = MSG_FIRSTCAND; FcitxMessagesAddMessageAtLast(msgDown, type, "%s", candWord->strWord); if (candWord->strExtra && strlen(candWord->strExtra) != 0) FcitxMessagesAddMessageAtLast(msgDown, candWord->extraType, "%s", candWord->strExtra); FcitxMessagesAddMessageAtLast(msgDown, MSG_OTHER, " "); } return extraLength; }
INPUT_RETURN_VALUE QWGetCandWords(void *arg) { FcitxQWState* qwstate = (FcitxQWState*) arg; FcitxInputState* input = FcitxInstanceGetInputState(qwstate->owner); int iQu, iWei; int i; FcitxCandidateWordSetPageSize(FcitxInputStateGetCandidateList(input), 10); FcitxCandidateWordSetChoose(FcitxInputStateGetCandidateList(input), DIGIT_STR_CHOOSE); if (FcitxInputStateGetRawInputBufferSize(input) == 3) { iQu = (FcitxInputStateGetRawInputBuffer(input)[0] - '0') * 10 + FcitxInputStateGetRawInputBuffer(input)[1] - '0'; iWei = (FcitxInputStateGetRawInputBuffer(input)[2] - '0') * 10; for (i = 0; i < 10; i++) { FcitxCandidateWord candWord; candWord.callback = QWGetCandWord; candWord.owner = qwstate; candWord.priv = NULL; candWord.strExtra = NULL; candWord.strWord = strdup(GetQuWei(qwstate, iQu, iWei + i + 1)); candWord.wordType = MSG_OTHER; FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); } } FcitxInputStateSetCursorPos(input, FcitxInputStateGetRawInputBufferSize(input)); FcitxMessagesSetMessageCount(FcitxInputStateGetPreedit(input), 0); FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", FcitxInputStateGetRawInputBuffer(input)); return IRV_DISPLAY_CANDWORDS; }
void FcitxKkcOnClose(void* arg, FcitxIMCloseEventType event) { FcitxKkc *kkc = (FcitxKkc*)arg; if (event == CET_LostFocus) { // TODO } else if (event == CET_ChangeByUser) { kkc_context_reset(kkc->context); } else if (event == CET_ChangeByInactivate) { KkcSegmentList* segments = kkc_context_get_segments(kkc->context); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(kkc->owner); if (config->bSendTextWhenSwitchEng) { FcitxMessagesSetMessageCount(kkc->tempMsg, 0); if (kkc_segment_list_get_cursor_pos(segments) >= 0) { int i = 0; for (i = 0; i < kkc_segment_list_get_size(segments); i ++) { KkcSegment* segment = kkc_segment_list_get(segments, i); const gchar* str = kkc_segment_get_output(segment); FcitxMessagesAddMessageAtLast(kkc->tempMsg, MSG_INPUT, "%s", str); } } else { gchar* str = kkc_context_get_input(kkc->context); FcitxMessagesAddMessageAtLast(kkc->tempMsg, MSG_INPUT, "%s", str); g_free(str); } if (FcitxMessagesGetMessageCount(kkc->tempMsg) > 0) { char* commit = FcitxUIMessagesToCString(kkc->tempMsg); FcitxInstanceCommitString(kkc->owner, FcitxInstanceGetCurrentIC(kkc->owner), commit); free(commit); } } kkc_context_reset(kkc->context); } }
static void CloudSetClientPreedit(FcitxCloudPinyin *cloudpinyin, const char *str) { FcitxInputState *input = FcitxInstanceGetInputState(cloudpinyin->owner); FcitxMessages *message = FcitxInputStateGetClientPreedit(input); char *py; char *string = GetCurrentString(cloudpinyin, &py); FcitxMessagesSetMessageCount(message, 0); if (py) { *py = '\0'; FcitxMessagesAddMessageAtLast(message, MSG_INPUT, "%s%s", string, str); } else { FcitxMessagesAddMessageAtLast(message, MSG_INPUT, "%s", str); } fcitx_utils_free(string); FcitxInstanceUpdateClientSideUI( cloudpinyin->owner, FcitxInstanceGetCurrentIC(cloudpinyin->owner)); }
FCITX_EXPORT_API void FcitxUICommitPreedit(FcitxInstance* instance) { if (instance->CurrentIC && !instance->config->bDontCommitPreeditWhenUnfocus && !(instance->CurrentIC->contextCaps & CAPACITY_CLIENT_UNFOCUS_COMMIT)) { FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxMessages* clientPreedit = FcitxInputStateGetClientPreedit(input); if (FcitxMessagesGetMessageCount(clientPreedit) > 0) { char* str = FcitxUIMessagesToCStringForCommit(clientPreedit); if (str[0]) { FcitxInstanceCommitString(instance, instance->CurrentIC, str); } free(str); } FcitxMessagesSetMessageCount(clientPreedit, 0); } }
FCITX_EXPORT_API void FcitxUICommitPreedit(FcitxInstance* instance) { if (!instance->CurrentIC) return; boolean callOnClose = false; boolean doServerSideCommit = false; if (!instance->config->bDontCommitPreeditWhenUnfocus && !(instance->CurrentIC->contextCaps & CAPACITY_CLIENT_UNFOCUS_COMMIT)) { callOnClose = true; doServerSideCommit = true; } if (instance->CurrentIC->contextCaps & CAPACITY_CLIENT_UNFOCUS_COMMIT) { callOnClose = true; } if (callOnClose) { FcitxIM* im = FcitxInstanceGetCurrentIM(instance); if (im && im->OnClose) { im->OnClose(im->klass, CET_LostFocus); } } if (doServerSideCommit) { FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxMessages* clientPreedit = FcitxInputStateGetClientPreedit(input); if (FcitxMessagesGetMessageCount(clientPreedit) > 0) { char* str = FcitxUIMessagesToCStringForCommit(clientPreedit); if (str[0]) { FcitxInstanceCommitString(instance, instance->CurrentIC, str); } free(str); } FcitxMessagesSetMessageCount(clientPreedit, 0); } }
static boolean ClipboardPostHook(void *arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE *ret_val) { FcitxClipboard *clipboard = arg; FcitxClipboardConfig *config = &clipboard->config; if (!((clipboard->primary.len && config->use_primary) || clipboard->clp_hist_len)) return false; FcitxInstance *instance = clipboard->owner; FcitxInputState *input = FcitxInstanceGetInputState(instance); if (FcitxInputStateGetRawInputBufferSize(input)) return false; if (!FcitxHotkeyIsHotKey(sym, state, config->trigger_key)) return false; clipboard->active = true; FcitxCandidateWordList *cand_list = FcitxInputStateGetCandidateList(input); FcitxGlobalConfig *gconfig = FcitxInstanceGetGlobalConfig(instance); FcitxMessages *msg; FcitxCandidateWord cand_word = { .callback = ClipboardCommitCallback, .wordType = MSG_OTHER, .owner = clipboard }; FcitxInstanceCleanInputWindow(instance); FcitxCandidateWordSetLayoutHint(cand_list, CLH_Vertical); FcitxCandidateWordSetPageSize(cand_list, gconfig->iMaxCandWord); FcitxCandidateWordSetChooseAndModifier( cand_list, DIGIT_STR_CHOOSE, cmodifiers[config->choose_modifier]); if (clipboard->clp_hist_len) { ClipboardSetCandWord(clipboard, &cand_word, clipboard->clp_hist_lst); FcitxCandidateWordAppend(cand_list, &cand_word); } int primary_found; if (clipboard->primary.len && config->use_primary) { primary_found = ClipboardSelectionClipboardFind( clipboard, clipboard->primary.str, clipboard->primary.len); if (primary_found == 0) goto skip_primary; ClipboardSetCandWord(clipboard, &cand_word, &clipboard->primary); FcitxCandidateWordAppend(cand_list, &cand_word); } else { primary_found = -1; } skip_primary: msg = FcitxInputStateGetAuxUp(input); FcitxInputStateSetShowCursor(input, false); FcitxMessagesSetMessageCount(msg, 0); FcitxMessagesAddMessageStringsAtLast(msg, MSG_TIPS, _("Select to paste")); unsigned int i; for (i = 1;i < clipboard->clp_hist_len;i++) { if ((int)i == primary_found) continue; ClipboardSetCandWord(clipboard, &cand_word, clipboard->clp_hist_lst + i); FcitxCandidateWordAppend(cand_list, &cand_word); } *ret_val = IRV_FLAG_UPDATE_INPUT_WINDOW; return true; }
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; }
boolean QuickPhrasePreFilter(void* arg, FcitxKeySym sym, unsigned int state, INPUT_RETURN_VALUE *retval ) { QuickPhraseState *qpstate = (QuickPhraseState*) arg; FcitxInputState *input = FcitxInstanceGetInputState(qpstate->owner); if (qpstate->enabled) { FcitxKeySym keymain = FcitxHotkeyPadToMain(sym); if (FcitxHotkeyIsHotKeySimple(keymain, state)) { *retval = QuickPhraseDoInput(qpstate, keymain, state); if (*retval == IRV_TO_PROCESS) { if (strlen(FcitxInputStateGetRawInputBuffer(input)) == 0 && (FcitxHotkeyIsHotKey(keymain, state, QuickPhraseTriggerKeys[qpstate->triggerKey]) || FcitxHotkeyIsHotKey(keymain, state, FCITX_SPACE))) { char c[2] = { (char) (QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym & 0xff), '\0'}; FcitxModuleFunctionArg farg; FcitxKeySym s = QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym; farg.args[0] = &s; char* strTemp = InvokeFunction(qpstate->owner, FCITX_PUNC, GETPUNC, farg); strcpy(FcitxInputStateGetOutputString(input), strTemp ? strTemp : c); *retval = IRV_COMMIT_STRING; } else { char buf[2]; buf[0] = keymain; buf[1] = '\0'; if (strlen(FcitxInputStateGetRawInputBuffer(input)) < MAX_USER_INPUT) strcat(FcitxInputStateGetRawInputBuffer(input), buf); ShowQuickPhraseMessage(qpstate); *retval = QuickPhraseGetCandWords(qpstate); } } else return true; } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { size_t len = strlen(FcitxInputStateGetRawInputBuffer(input)); if (len > 0) FcitxInputStateGetRawInputBuffer(input)[--len] = '\0'; if (len == 0) { *retval = IRV_CLEAN; } else { ShowQuickPhraseMessage(qpstate); *retval = QuickPhraseGetCandWords(qpstate); } } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ENTER)) { if (strlen(FcitxInputStateGetRawInputBuffer(input)) > 0) { strcpy(FcitxInputStateGetOutputString(input), FcitxInputStateGetRawInputBuffer(input)); QuickPhraseReset(qpstate); *retval = IRV_COMMIT_STRING; } else { char c[2] = { (char) (QuickPhraseTriggerKeys[qpstate->triggerKey][0].sym & 0xff), '\0'}; strcpy(FcitxInputStateGetOutputString(input), c); *retval = IRV_COMMIT_STRING; } } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_ESCAPE)) { *retval = IRV_CLEAN; } else *retval = IRV_DO_NOTHING; if (*retval == IRV_DISPLAY_MESSAGE) { FcitxMessagesSetMessageCount(FcitxInputStateGetAuxDown(input), 0); if (FcitxCandidateWordPageCount(FcitxInputStateGetCandidateList(input)) == 0) FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxDown(input), MSG_TIPS, "%s", _("Press Enter to input text")); } return true; } return false; }