static void* LuaCallCommand(void* arg, FcitxModuleFunctionArg args) { LuaModule *luamodule = (LuaModule *)arg; UT_array *result = InputCommand(luamodule, (const char *)args.args[0]); if (result) { FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); LuaResultItem *p = NULL; while ((p = (LuaResultItem *)utarray_next(result, p))) { FcitxCandidateWord candWord; if (args.args[1] && args.args[2]) { candWord.callback = args.args[1]; candWord.owner = args.args[2]; } else { candWord.callback = LuaGetCandWord; candWord.owner = luamodule; } candWord.priv = p->help ? strdup(p->help) : NULL; if (p->help || p->tip) { asprintf(&candWord.strExtra, "%s%s%s", p->help ? p->help : "", p->help && p->tip ? " " : "", p->tip ? p->tip : ""); } else { candWord.strExtra = NULL; } candWord.strWord = strdup(p->result); candWord.wordType = MSG_TIPS; candWord.extraType = MSG_CODE; FcitxCandidateWordAppend(FcitxInputStateGetCandidateList(input), &candWord); } utarray_free(result); } return NULL; }
static INPUT_RETURN_VALUE LuaGetCandWord(void *arg, FcitxCandidateWord *candWord) { FCITX_UNUSED(arg); LuaModule *luamodule = (LuaModule*)candWord->owner; FcitxInputState *input = FcitxInstanceGetInputState(GetFcitx(luamodule)); strncpy(FcitxInputStateGetOutputString(input), candWord->strWord, MAX_USER_INPUT); return IRV_COMMIT_STRING; }
void LuaUpdateCandidateWordHookCallback(void *arg) { LuaModule *luamodule = (LuaModule *)arg; FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); char *text = FcitxInputStateGetRawInputBuffer(input); UT_array *result = InputTrigger(luamodule, text); if (result) { LuaResultItem *p; while ((p = (LuaResultItem *)utarray_next(result, p))) { AddToCandList(luamodule, text, p->result); } utarray_free(result); } }
void AddToCandList(LuaModule *luamodule, const char *in, const char *out) { FcitxCandidateWord candWord; candWord.callback = LuaGetCandWord; candWord.owner = luamodule; candWord.priv = NULL; candWord.wordType = MSG_TIPS; candWord.strExtra = NULL; candWord.strWord = strdup(out); FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); FcitxCandidateWordInsert(candList, &candWord, 0); }
static INPUT_RETURN_VALUE LuaGetCandWord(void* arg, FcitxCandidateWord* candWord) { LuaModule *luamodule = (LuaModule *)candWord->owner; FcitxInputState* input = FcitxInstanceGetInputState(GetFcitx(luamodule)); snprintf(FcitxInputStateGetOutputString(input), MAX_USER_INPUT, "%s", candWord->strWord); return IRV_COMMIT_STRING; }