INPUT_RETURN_VALUE DoQWInput(void* arg, FcitxKeySym sym, unsigned int state) { FcitxQWState* qwstate = (FcitxQWState*) arg; FcitxInputState* input = FcitxInstanceGetInputState(qwstate->owner); char* strCodeInput = FcitxInputStateGetRawInputBuffer(input); INPUT_RETURN_VALUE retVal; retVal = IRV_TO_PROCESS; if (FcitxHotkeyIsHotKeyDigit(sym, state)) { if (FcitxInputStateGetRawInputBufferSize(input) != 4) { strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = sym; strCodeInput[FcitxInputStateGetRawInputBufferSize(input) + 1] = '\0'; FcitxInputStateSetRawInputBufferSize(input, FcitxInputStateGetRawInputBufferSize(input) + 1); if (FcitxInputStateGetRawInputBufferSize(input) == 4) { retVal = IRV_TO_PROCESS; } else retVal = IRV_DISPLAY_CANDWORDS; } } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_BACKSPACE)) { if (!FcitxInputStateGetRawInputBufferSize(input)) return IRV_DONOT_PROCESS_CLEAN; FcitxInputStateSetRawInputBufferSize(input, FcitxInputStateGetRawInputBufferSize(input) - 1); strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = '\0'; if (!FcitxInputStateGetRawInputBufferSize(input)) retVal = IRV_CLEAN; else { retVal = IRV_DISPLAY_CANDWORDS; } } else if (FcitxHotkeyIsHotKey(sym, state, FCITX_SPACE)) { if (!FcitxInputStateGetRawInputBufferSize(input)) return IRV_TO_PROCESS; if (FcitxInputStateGetRawInputBufferSize(input) != 3) return IRV_DO_NOTHING; retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); } else return IRV_TO_PROCESS; return retVal; }
static void ShowAutoEngMessage(FcitxAutoEngState *autoEngState, INPUT_RETURN_VALUE *retval) { FcitxInputState* input = FcitxInstanceGetInputState(autoEngState->owner); char *raw_buff; int buff_len; FcitxInstanceCleanInputWindow(autoEngState->owner); if (autoEngState->buf[0] == '\0') return; raw_buff = FcitxInputStateGetRawInputBuffer(input); buff_len = strlen(autoEngState->buf); strncpy(raw_buff, autoEngState->buf, MAX_USER_INPUT); if (buff_len > MAX_USER_INPUT) { raw_buff[MAX_USER_INPUT] = '\0'; FcitxInputStateSetRawInputBufferSize(input, MAX_USER_INPUT); } else { FcitxInputStateSetRawInputBufferSize(input, buff_len); } if (buff_len > AUTOENG_MAX_PREEDIT) { FcitxMessagesAddMessageStringsAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, autoEngState->buf + buff_len - AUTOENG_MAX_PREEDIT); FcitxInputStateSetCursorPos(input, AUTOENG_MAX_PREEDIT); } else { FcitxMessagesAddMessageStringsAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, autoEngState->buf); FcitxInputStateSetCursorPos(input, autoEngState->index); } FcitxMessagesAddMessageStringsAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, autoEngState->buf); FcitxInputStateSetClientCursorPos(input, autoEngState->index); FcitxInputStateSetShowCursor(input, true); // AutoEngGetSpellHint(autoEngState); FcitxMessagesAddMessageStringsAtLast(FcitxInputStateGetAuxDown(input), MSG_TIPS, //_("Press Enter to input text")); " "); *retval |= IRV_FLAG_UPDATE_INPUT_WINDOW; }
/** * @brief handler called while preedit updated * * @param ppd preedit string * @return void **/ void FcitxWindowHandler::updatePreedit(const IPreeditString* ppd) { FcitxInstance* instance = owner->owner; FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxInputStateSetCursorPos(input, true); candidate_flag = true; const wstring& codeinput = this->owner->view->getPySegmentor()->getInputBuffer(); WCSTOMBS(FcitxInputStateGetRawInputBuffer(input), codeinput.c_str(), MAX_USER_INPUT); FcitxInputStateSetRawInputBufferSize(input, strlen(FcitxInputStateGetRawInputBuffer(input))); }
void ShowAutoEngMessage(FcitxAutoEngState* autoEngState) { FcitxInputState* input = FcitxInstanceGetInputState(autoEngState->owner); FcitxInstanceCleanInputWindow(autoEngState->owner); if (autoEngState->buf[0] == '\0') return; FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", autoEngState->buf); strcpy(FcitxInputStateGetRawInputBuffer(input), autoEngState->buf); FcitxInputStateSetRawInputBufferSize(input, strlen(autoEngState->buf)); FcitxInputStateSetCursorPos(input, FcitxInputStateGetRawInputBufferSize(input)); FcitxInputStateSetShowCursor(input, true); FcitxMessagesAddMessageAtLast(FcitxInputStateGetAuxDown(input), MSG_TIPS, _("Press Enter to input text")); }
/** * @brief function DoInput has done everything for us. * * @param searchMode * @return INPUT_RETURN_VALUE **/ __EXPORT_API INPUT_RETURN_VALUE FcitxLibpinyinGetCandWords(void* arg) { FcitxLibpinyin* libpinyin = (FcitxLibpinyin* )arg; FcitxInstance* instance = libpinyin->owner->owner; FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxGlobalConfig* config = FcitxInstanceGetGlobalConfig(libpinyin->owner->owner); FcitxLibpinyinConfig* pyConfig = &libpinyin->owner->config; struct _FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); FcitxCandidateWordSetPageSize(candList, config->iMaxCandWord); FcitxUICloseInputWindow(instance); strcpy(FcitxInputStateGetRawInputBuffer(input), libpinyin->buf); FcitxInputStateSetRawInputBufferSize(input, strlen(libpinyin->buf)); FcitxInputStateSetShowCursor(input, true); FcitxInputStateSetClientCursorPos(input, 0); if (libpinyin->type == LPT_Zhuyin) { FcitxKeyState state = candidateModifierMap[pyConfig->candidateModifiers]; FcitxCandidateWordSetChooseAndModifier(candList, "1234567890", state); } else FcitxCandidateWordSetChoose(candList, "1234567890"); /* add punc */ if (libpinyin->type == LPT_Zhuyin && strlen(libpinyin->buf) == 1 && LibpinyinCheckZhuyinKey((FcitxKeySym) libpinyin->buf[0], pyConfig->zhuyinLayout, pyConfig->useTone) && (libpinyin->buf[0] >= ' ' && libpinyin->buf[0] <= '\x7e') /* simple */ && !(libpinyin->buf[0] >= 'a' && libpinyin->buf[0] <= 'z') /* not a-z */ && !(libpinyin->buf[0] >= 'A' && libpinyin->buf[0] <= 'Z') /* not A-Z /*/ && !(libpinyin->buf[0] >= '0' && libpinyin->buf[0] <= '9') /* not digit */ ) { int c = libpinyin->buf[0]; char *result = FcitxPuncGetPunc(instance, &c); if (result) { FcitxCandidateWord candWord; FcitxLibpinyinCandWord* pyCand = (FcitxLibpinyinCandWord*) fcitx_utils_malloc0(sizeof(FcitxLibpinyinCandWord)); pyCand->ispunc = true; candWord.callback = FcitxLibpinyinGetCandWord; candWord.extraType = MSG_OTHER; candWord.owner = libpinyin; candWord.priv = pyCand; candWord.strExtra = NULL; candWord.strWord = strdup(result); candWord.wordType = MSG_OTHER; FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); } } char* sentence = NULL; pinyin_guess_sentence(libpinyin->inst); sentence = LibpinyinGetSentence(libpinyin); if (sentence) { FcitxLibpinyinUpdatePreedit(libpinyin, sentence); FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", sentence); g_free(sentence); } else { FcitxInputStateSetCursorPos(input, libpinyin->cursor_pos); FcitxMessagesAddMessageAtLast(FcitxInputStateGetClientPreedit(input), MSG_INPUT, "%s", libpinyin->buf); FcitxMessagesAddMessageAtLast(FcitxInputStateGetPreedit(input), MSG_INPUT, "%s", libpinyin->buf); } if (libpinyin->candidate) g_array_free(libpinyin->candidate, TRUE); libpinyin->candidate = g_array_new(FALSE, FALSE, sizeof(lookup_candidate_t)); pinyin_get_candidates(libpinyin->inst, LibpinyinGetOffset(libpinyin), libpinyin->candidate); int i = 0; for (i = 0 ; i < libpinyin->candidate->len; i ++) { lookup_candidate_t token = g_array_index(libpinyin->candidate, lookup_candidate_t, i); FcitxCandidateWord candWord; FcitxLibpinyinCandWord* pyCand = (FcitxLibpinyinCandWord*) fcitx_utils_malloc0(sizeof(FcitxLibpinyinCandWord)); pyCand->ispunc = false; pyCand->idx = i; candWord.callback = FcitxLibpinyinGetCandWord; candWord.extraType = MSG_OTHER; candWord.owner = libpinyin; candWord.priv = pyCand; candWord.strExtra = NULL; candWord.strWord = strdup(token.m_phrase_string); candWord.wordType = MSG_OTHER; FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); } return IRV_DISPLAY_CANDWORDS; }