新增键盘组合按键
- 需求是按照PC上的键盘在caps lock启用时,按shift键字母切换输出小写效果。因为是实体键盘的需求,所以先来看看Generic.kcm的加载流程。
图画的流程比较简单,解析的动作都在KeyCharacterMap.cpp这个类里面了。做的事情就是把Generic.kcm里的metaState和字符一一对应存放在behavior里面。
- 接着就修改Generic.kcm,往里面metaState和字符。
//下面就是可以选择的metaState,+就是组合解析时会进行或运算。
static const Modifier modifiers[] = {
{ "shift", AMETA_SHIFT_ON },
{ "lshift", AMETA_SHIFT_LEFT_ON },
{ "rshift", AMETA_SHIFT_RIGHT_ON },
{ "alt", AMETA_ALT_ON },
{ "lalt", AMETA_ALT_LEFT_ON },
{ "ralt", AMETA_ALT_RIGHT_ON },
{ "ctrl", AMETA_CTRL_ON },
{ "lctrl", AMETA_CTRL_LEFT_ON },
{ "rctrl", AMETA_CTRL_RIGHT_ON },
{ "meta", AMETA_META_ON },
{ "lmeta", AMETA_META_LEFT_ON },
{ "rmeta", AMETA_META_RIGHT_ON },
{ "sym", AMETA_SYM_ON },
{ "fn", AMETA_FUNCTION_ON },
{ "capslock", AMETA_CAPS_LOCK_ON },
{ "numlock", AMETA_NUM_LOCK_ON },
{ "scrolllock", AMETA_SCROLL_LOCK_ON },
};
修改如下:
--- a/base/data/keyboards/Generic.kcm
+++ b/base/data/keyboards/Generic.kcm
@@ -27,13 +27,17 @@ type FULL
key A {
label: 'A'
base: 'a'
+ capslock+lshift+shift: 'a'
shift, capslock: 'A'
+
}
key B {
label: 'B'
base: 'b'
+ capslock+lshift+shift: 'b'
shift, capslock: 'B'
+
}
...... 省略
-
经过一系列的编译推送,测试发现没有成功。
接着看看字符的调用流程:
原来按键在获取字符是需要通过输入法的,某狗输入法直接固定了一个metaState的值。导致无论我怎么组合都只能拿到一个值。
如是我修改了getUnicodeChar(int metaState),直接使用了mMetaState,不接收输入法传下来的值。注意getKeyBehavior里还有一个坑,调用matchesMetaState方法时,EXACT_META_STATES需要把你新增的组合加进去,否则无法获取正确的值。
更新
- 发现上述做法有问题。而且太繁琐了,换一种做法。
@@ -235,6 +235,11 @@ char16_t KeyCharacterMap::getCharacter(int32_t keyCode, int32_t metaState) const
if (getKeyBehavior(keyCode, metaState, &key, &behavior)) {
result = behavior->character;
}
+ //caps_lock + shift + 字母 = 小写
+ if(metaState & AMETA_SHIFT_ON && metaState & AMETA_CAPS_LOCK_ON && result < 91 && result > 64){
+ result += 32;
+ }
+
- 某狗书法还会在开启caps_lock的情况下,将获得的字符全部转为大写... 看来还得换一种输入法。