Fcitx (Flexible Input Method Framework) ──即小企鹅输入法,它是一个以 GPL 方式发布的输入法平台,可以通过安装引擎支持多种输入法,支持简入繁出,是在 Linux 操作系统中常用的中文输入法。由于fcitx的开发者比较小众,相应的说明文档比较少,这里对fctix里面常用的接口进行了分类说明,希望有帮助。
输入法管理
fcitx输入法状态管理的各种接口
//注册输入法
//在输入法的插件里面通过该接口向输入法框架里面注册输入法
void FcitxInstanceRegisterIM(
//fcitx框架的实例
struct _FcitxInstance *instance,
void *imclass,//指向输入法的指针
const char* uniqueName,//不能重复的名称
//输入法的名称
const char* name,
//输入法图标的名称
const char* iconName,
//初始化的回调函数
FcitxIMInit Init,
//重置输入法的回调函数
FcitxIMResetIM ResetIM,
//按键响应的回调函数
FcitxIMDoInput DoInput,
//获取候选的回调函数
FcitxIMGetCandWords GetCandWords,
//短语回调的提示函数
FcitxIMPhraseTips PhraseTips,
//输入法保存的回调函数
FcitxIMSave Save,
//加载配置的回调函数
FcitxIMReloadConfig ReloadConfig,
//按键阻塞的回调函数
FcitxIMKeyBlocker KeyBlocker,
//输入法的优先级
int priority,
//输入法的语言码(中文:zh_CN)
const char *langCode
);
//注销输入法框架里面的某个名称的输入法
void FcitxInstanceUnregisterIM(FcitxInstance* instance, const char* name);
//通过名称切换fcitx中的当前的输入法
void FcitxInstanceSwitchIMByName(FcitxInstance* instance, const char* name);
//根据输入法列表中的索引来切换输入法
void FcitxInstanceSwitchIM(FcitxInstance* instance, int index);
//激活fcitx中的某个输入法
void FcitxInstanceEnableIM(struct _FcitxInstance* instance, struct _FcitxInputContext* ic, boolean keepState);
//获得fcitx输入法列表中的当前输入法的实例
struct _FcitxIM* FcitxInstanceGetCurrentIM(struct _FcitxInstance *instance);
//获得当前输入法的输入上下文
void FcitxInstanceChangeIMState(struct _FcitxInstance* instance, struct _FcitxInputContext* ic);
//关闭当前输入状态
void FcitxInstanceCloseIM(struct _FcitxInstance* instance, struct _FcitxInputContext* ic);
//重置当前输入
void FcitxInstanceResetInput(struct _FcitxInstance* instance);
//保存所有的输入法
void FcitxInstanceSaveAllIM(struct _FcitxInstance* instance);
各种状态钩子
在fcitx框架中有时候我们需要对输入过程中的某个环节做单独处理,这就需要用到fcitx的钩子函数了。
//注册重置输入过程中调用的钩子
void FcitxInstanceRegisterResetInputHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册输入法激活的时候的钩子
void FcitxInstanceRegisterTriggerOnHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册输入法失效的时候的钩子
void FcitxInstanceRegisterTriggerOffHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册获得输入焦点的时候的钩子
void FcitxInstanceRegisterInputFocusHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册失去输入焦点的时候的钩子
void FcitxInstanceRegisterInputUnFocusHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册输入法切换的时候的钩子
void FcitxInstanceRegisterIMChangedHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册输入法更新候选词的时候的钩子
void FcitxInstanceRegisterUpdateCandidateWordHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//fcitx注册更新输入法列表的时候的钩子
void FcitxInstanceRegisterUpdateIMListHook(struct _FcitxInstance* instance, FcitxIMEventHook hook);
//注册输入状态变化的时候的钩子
void FcitxInstanceRegisterICStateChangedHook(struct _FcitxInstance* instance, FcitxICEventHook hook);
//注册UI状态变化的时候的钩子
void FcitxInstanceRegisterUIStatusChangedHook(struct _FcitxInstance* instance, FcitxUIStatusHook hook);
//注册钩子的调用方法
FcitxIMEventHook imchangehook; //fcitx输入法事件的钩子
imchangehook.arg = imInstance; //回调函数的参数一般是指针
imchangehook.func = IMeChangeCallback; //输入法切换的回调函数
//注册输入法切换的回调钩子函数
FcitxInstanceRegisterIMChangedHook(fcitxInstance, imchangehook);
注册快捷键
在输入法开发的时候我们有时候可能需要通过快捷键来改变输入法的某个状态,这时候我们就需要向fcitx中注册快捷键,这里介绍一下快捷键的注册方法。
//定义快捷键的钩子
FcitxHotkeyHook test_hotkey_hook;
//快捷键钩子的入参
test_hotkey_hook.arg = imeInstacne;
//定义热键
FcitxHotkey* hot_key_1 = new FcitxHotkey(); //定义快捷键
hot_key_1->state = FcitxKeyState_Ctrl; //组合键Ctrl按下
hot_key_1->sym = FcitxKey_F1; //主键F1
test_hotkey_hook.hotkey = hot_key_1;
test_hotkey_hook.hotkeyhandle = ;
//注册对应的热键事件
FcitxInstanceRegisterHotkeyFilter(fcitxInstance, test_hotkey_hook);
//各种常用的组合键的键值
FcitxKeyState_None = 0 //无组合键
FcitxKeyState_Shift = 1 << 0 //Shift按下
FcitxKeyState_CapsLock = 1 << 1 //大小写键按下
FcitxKeyState_Ctrl = 1 << 2 //Ctrl按下
FcitxKeyState_Alt = 1 << 3 //Alt按下
//Alt+Shift组合键
FcitxKeyState_Alt_Shift = FcitxKeyState_Alt | FcitxKeyState_Shift
//Ctrl+Shift组合键
FcitxKeyState_Ctrl_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Shift
//Ctrl+Alt组合键
FcitxKeyState_Ctrl_Alt = FcitxKeyState_Ctrl | FcitxKeyState_Alt
//Ctrl+Alt+Shift组合键
FcitxKeyState_Ctrl_Alt_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Alt | FcitxKeyState_Shift
FcitxKeyState_NumLock = 1 << 4 //小键盘功能键
FcitxKeyState_Super = 1 << 6 //windows键
FcitxKeyState_ScrollLock = 1 << 7, //滚轮键
FcitxKeyState_MousePressed = 1 << 8 //鼠标按下
输入法UI状态修改
通过UI状态的修改,我们可以控制输入法前端的皮肤显示
//fcitx清空隐藏输入窗口(同时也会清空输入状态)
void FcitxInstanceCleanInputWindow(struct _FcitxInstance *instance);
//移动输入窗口
void FcitxUIMoveInputWindow(struct _FcitxInstance* instance);
//关闭输入窗口
void FcitxUICloseInputWindow(struct _FcitxInstance* instance);
//更新某个属性的状态
void FcitxUIUpdateStatus(struct _FcitxInstance* instance, const char* name);
//使输入法皮肤获得焦点
void FcitxUIOnInputFocus(struct _FcitxInstance* instance);
//输入法皮肤失去焦点
void FcitxUIOnInputUnFocus(struct _FcitxInstance* instance);
//激活输入法皮肤
void FcitxUIOnTriggerOn(struct _FcitxInstance* instance);
//关闭输入法皮肤
void FcitxUIOnTriggerOff(struct _FcitxInstance* instance);
//获得当前输入法皮肤的某个状态的值
FcitxUIStatus *FcitxUIGetStatusByName(struct _FcitxInstance* instance, const char* name);
//获取输入法当前焦点窗口的尺寸
void FcitxUIGetMainWindowSize(struct _FcitxInstance* instance, int* x, int* y, int* w, int* h);
//刷新输入法的输入窗口
void FcitxUIUpdateInputWindow(struct _FcitxInstance* instance);
//fcitx切换到备用皮肤
void FcitxUISwitchToFallback(struct _FcitxInstance* instance);
//从备用皮肤切换回来
void FcitxUIResumeFromFallback(struct _FcitxInstance* instance);
//判断当前皮肤是不是备用皮肤
boolean FcitxUIIsFallback(struct _FcitxInstance* instance, struct _FcitxAddon* addon);
//fcitx的皮肤是不是支持当前的主窗口
boolean FcitxUISupportMainWindow(struct _FcitxInstance* instance);
//设置输入光标的位置
void FcitxInstanceSetWindowOffset(struct _FcitxInstance* instance, FcitxInputContext* ic, int x, int y);
//获取窗口光标的位置
void FcitxInstanceGetWindowPosition(struct _FcitxInstance* instance, FcitxInputContext *ic, int* x, int* y);
//获取输入光标的矩形的位置
void FcitxInstanceGetWindowRect(struct _FcitxInstance* instance, FcitxInputContext* ic, int* x, int* y, int* w, int* h);
//fcitx获取输入焦点位置的调用方法
int x = 0, y = 0, w = 0, h = 0;
FcitxInputContext* ic = FcitxInstanceGetCurrentIC(fcitxInstance);
if (!ic) {
return;
}
FcitxInstanceGetWindowRect(fcitxInstance, ic, &x, &y, &w, &h);