void CloudPinyinFillCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); struct _FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (cacheEntry) { FcitxCandidateWord* candWord; for (candWord = FcitxCandidateWordGetFirst(candList); candWord != NULL; candWord = FcitxCandidateWordGetNext(candList, candWord)) { if (candWord->owner == cloudpinyin) break; } if (candWord == NULL) return; CloudCandWord* cloudCand = candWord->priv; if (cloudCand->filled) return; FcitxCandidateWord* cand; int i = 0; int size = FcitxCandidateWordGetPageSize(candList) * CLOUDPINYIN_CHECK_PAGE_NUMBER; for (cand = FcitxCandidateWordGetFirst(candList); cand != NULL; cand = FcitxCandidateWordGetNext(candList, cand)) { if (strcmp(cand->strWord, cacheEntry->str) == 0) { FcitxCandidateWordRemove(candList, candWord); FcitxUIUpdateInputWindow(cloudpinyin->owner); candWord = NULL; break; } i ++; if (i >= size) break; } if (candWord) { if (cloudCand->filled == false) { cloudCand->filled = true; free(candWord->strWord); candWord->strWord = strdup(cacheEntry->str); FcitxUIUpdateInputWindow(cloudpinyin->owner); } } } }
INPUT_RETURN_VALUE FcitxRimeDoInputReal(void* arg, FcitxKeySym sym, unsigned int state) { FcitxRime *rime = (FcitxRime *)arg; if (rime->api->is_maintenance_mode()) { return IRV_TO_PROCESS; } if (!rime->api->find_session(rime->session_id)) { rime->session_id = rime->api->create_session(); } if (!rime->session_id) { // service disabled FcitxRimeUpdateStatus(rime); return IRV_TO_PROCESS; } boolean result = rime->api->process_key(rime->session_id, sym, state); RIME_STRUCT(RimeCommit, commit); if (rime->api->get_commit(rime->session_id, &commit)) { FcitxInputContext* ic = FcitxInstanceGetCurrentIC(rime->owner); FcitxInstanceCommitString(rime->owner, ic, commit.text); rime->api->free_commit(&commit); } FcitxRimeUpdateStatus(rime); if (!result) { FcitxRimeGetCandWords(rime); FcitxUIUpdateInputWindow(rime->owner); return IRV_TO_PROCESS; } else return IRV_DISPLAY_CANDWORDS; }
boolean FcitxRimePaging(void* arg, boolean prev) { FcitxRime *rime = (FcitxRime *)arg; boolean result = RimeProcessKey(rime->session_id, prev ? FcitxKey_Page_Up : FcitxKey_Page_Down, 0); if (result) { FcitxRimeGetCandWords(rime); FcitxUIUpdateInputWindow(rime->owner); } return result; }
void ToggleChttransState(void* arg) { FcitxChttrans* transState = (FcitxChttrans*) arg; transState->enabled = !transState->enabled; FcitxUISetStatusString(transState->owner, "chttrans", transState->enabled ? _("Convert to Traditional Chinese") : _("Convert to Simplified Chinese"), _("Toggle Simp/Trad Chinese Conversion")); FcitxUIUpdateInputWindow(transState->owner); SaveChttransConfig(transState); }
static void QuickPhraseLaunch(QuickPhraseState *qpstate, int key, boolean useDup, boolean append) { qpstate->curTriggerKey[0].sym = key; qpstate->useDupKeyInput = useDup; qpstate->append = append; _QuickPhraseLaunch(qpstate); FcitxUIUpdateInputWindow(qpstate->owner); }
void* QuickPhraseLaunch(void* arg, FcitxModuleFunctionArg args) { const int* key = args.args[0]; const boolean* useDup = args.args[1]; const boolean* append = args.args[2]; QuickPhraseState *qpstate = (QuickPhraseState*) arg; qpstate->curTriggerKey[0].sym = *key; qpstate->useDupKeyInput = *useDup; qpstate->append = *append; _QuickPhraseLaunch(qpstate); FcitxUIUpdateInputWindow(qpstate->owner); return (void*)true; }
void SwitchVK(FcitxVKState *vkstate) { FcitxInstance* instance = vkstate->owner; if (vkstate->vkWindow == NULL) vkstate->vkWindow = CreateVKWindow(vkstate); VKWindow *vkWindow = vkstate->vkWindow; if (!vkstate->iVKCount) return; vkstate->bVK = !vkstate->bVK; if (vkstate->bVK) { int x, y; int dwidth, dheight; InvokeVaArgs(vkstate->owner, FCITX_X11, GETSCREENSIZE, &dwidth, &dheight); if (!FcitxUISupportMainWindow(instance)) { x = dwidth / 2 - VK_WINDOW_WIDTH / 2; y = 40; } else { int mx = 0, my = 0, mw = 0, mh = 0; FcitxUIGetMainWindowSize(instance, &mx, &my, &mw, &mh); x = mx; y = my + mh + 2; if ((y + VK_WINDOW_HEIGHT) >= dheight) y = my - VK_WINDOW_HEIGHT - 2; if (y < 0) y = 0; } if ((x + VK_WINDOW_WIDTH) >= dwidth) x = dwidth - VK_WINDOW_WIDTH - 1; if (x < 0) x = 0; XMoveWindow(vkWindow->dpy, vkWindow->window, x, y); DisplayVKWindow(vkWindow); FcitxUICloseInputWindow(instance); FcitxInputContext* ic = FcitxInstanceGetCurrentIC(instance); if (ic && FcitxInstanceGetCurrentState(instance) == IS_CLOSED) FcitxInstanceEnableIM(instance, ic, true); } else { XUnmapWindow(vkWindow->dpy, vkWindow->window); FcitxInstanceCleanInputWindow(instance); FcitxUIUpdateInputWindow(instance); } }
void ToggleChttransState(void* arg) { FcitxChttrans* transState = (FcitxChttrans*) arg; FcitxIM* im = FcitxInstanceGetCurrentIM(transState->owner); if (!im) return; boolean enabled = !ChttransEnabled(transState); fcitx_string_map_set(transState->enableIM, im->uniqueName, enabled); FcitxUISetStatusString(transState->owner, "chttrans", enabled ? _("Traditional Chinese") : _("Simplified Chinese"), _("Toggle Simp/Trad Chinese Conversion")); FcitxUIUpdateInputWindow(transState->owner); SaveChttransConfig(transState); }
INPUT_RETURN_VALUE FcitxRimeGetCandWord(void* arg, FcitxCandidateWord* candWord) { FcitxRime *rime = (FcitxRime *)arg; RIME_STRUCT(RimeContext, context); INPUT_RETURN_VALUE retVal = IRV_TO_PROCESS; if (rime->api->get_context(rime->session_id, &context)) { if (context.menu.num_candidates) { int i = *(int*) candWord->priv; const char* digit = DIGIT_STR_CHOOSE; int num_select_keys = context.menu.select_keys ? strlen(context.menu.select_keys) : 0; FcitxKeySym sym = FcitxKey_None; if (i < 10) { if (i < num_select_keys) sym = context.menu.select_keys[i]; else sym = digit[i]; } if (sym != FcitxKey_None) { boolean result = rime->api->process_key(rime->session_id, sym, 0); RIME_STRUCT(RimeCommit, commit); if (rime->api->get_commit(rime->session_id, &commit)) { FcitxInputContext* ic = FcitxInstanceGetCurrentIC(rime->owner); FcitxInstanceCommitString(rime->owner, ic, commit.text); rime->api->free_commit(&commit); } if (!result) { FcitxRimeGetCandWords(rime); FcitxUIUpdateInputWindow(rime->owner); retVal = IRV_TO_PROCESS; } else retVal = IRV_DISPLAY_CANDWORDS; } } rime->api->free_context(&context); } return retVal; }
void CloudPinyinFillCandidateWord(FcitxCloudPinyin* cloudpinyin, const char* pinyin) { CloudPinyinCache* cacheEntry = CloudPinyinCacheLookup(cloudpinyin, pinyin); FcitxInputState* input = FcitxInstanceGetInputState(cloudpinyin->owner); FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); if (cacheEntry) { int cloudidx; FcitxCandidateWord *candWord; for (cloudidx = 0; (candWord = FcitxCandidateWordGetByTotalIndex(candList, cloudidx)); cloudidx++) { if (candWord->owner == cloudpinyin) break; } if (candWord == NULL) return; CloudCandWord* cloudCand = candWord->priv; if (cloudCand->filled) return; FcitxCandidateWord *cand; int i; int pagesize = FcitxCandidateWordGetPageSize(candList); int size = pagesize * CLOUDPINYIN_CHECK_PAGE_NUMBER; for (i = 0;i < size && (cand = FcitxCandidateWordGetByTotalIndex(candList, i));i++) { if (strcmp(cand->strWord, cacheEntry->str) == 0) { uint64_t ts = cloudCand->timestamp; uint64_t curTs = CloudGetTimeStamp(); FcitxCandidateWordRemove(candList, candWord); /* if cloud word is not on the first page.. impossible */ if (cloudidx < pagesize) { /* if the duplication before cloud word */ if (i < cloudidx) { if (curTs - ts > LOADING_TIME_QUICK_THRESHOLD) { FcitxCandidateWordInsertPlaceHolder(candList, cloudidx); FcitxCandidateWord* placeHolder = FcitxCandidateWordGetByTotalIndex(candList, cloudidx); if (placeHolder && placeHolder->strWord == NULL) placeHolder->strWord = strdup(DUP_PLACE_HOLDER); } } else { if (i >= pagesize) { FcitxCandidateWordMove(candList, i - 1, cloudidx); } else { if (curTs - ts > LOADING_TIME_QUICK_THRESHOLD) { FcitxCandidateWordInsertPlaceHolder(candList, cloudidx); FcitxCandidateWord* placeHolder = FcitxCandidateWordGetByTotalIndex(candList, cloudidx); if (placeHolder && placeHolder->strWord == NULL) placeHolder->strWord = strdup(DUP_PLACE_HOLDER); } } } } FcitxUIUpdateInputWindow(cloudpinyin->owner); candWord = NULL; break; } } if (candWord) { if (cloudCand->filled == false) { cloudCand->filled = true; free(candWord->strWord); candWord->strWord = strdup(cacheEntry->str); if (cloudpinyin->config.iCandidateOrder <= 1 && (CloudGetTimeStamp() - cloudCand->timestamp <= LOADING_TIME_QUICK_THRESHOLD)) { FcitxCandidateWordMoveByWord(candList, candWord, 0); CloudSetClientPreedit(cloudpinyin, cacheEntry->str); } FcitxUIUpdateInputWindow(cloudpinyin->owner); } } } }