|
阅读到fcitx中输入处理中枢
void ProcessKey (IMForwardEventStruct * call_data) 时,由于对Xwindow按键处理方式不是特别了解.对于如下的代码有点疑惑.
- if (call_data->event.type == KeyRelease) {
- if ((kev->time - lastKeyPressedTime) < 500 && (!bIsDoInputOnly)) {
- if (!bLocked && iKeyState == KEY_CTRL_SHIFT_COMP && (iKey == 225 || iKey == 227)) {
- if (ConnectIDGetState (call_data->connect_id) == IS_CHN)
- SwitchIM (-1);
- else if (IsHotKey (iKey, hkTrigger))
- CloseIM (call_data);
- }
- else if (!bLocked && iKey == CTRL_LSHIFT) {
- if (ConnectIDGetState (call_data->connect_id) == IS_CHN)
- SwitchIM (-1);
- else if (IsHotKey (iKey, hkTrigger))
- CloseIM (call_data);
- ...................
复制代码
一开始的时候在想KEY_CTRL_SHIFT_COMP 表明是ctr与shift的组合键,ikey值是225或227(也就是shift或ctrl), 这两个条件合起来是表示的什么键呢? Ctrl+Shift 还是 ctrl+shift+ctr 或者 ctrl+ shift+shift?
为了找到答案,我先是按了这几个键试了一下,发现后两者没什么反应,于是觉得应是ctrl+shift. 但随后又发现了一个问题,if (!bLocked && iKey == CTRL_LSHIFT)也是来处理ctrl+shift的. 那这不是重复了嘛.
我先把第一个if语句删掉,重新编译之后,发现ctrl+shift也没反应了. 把第二句去掉,或一切正常. 因此,认定第二句是不起什么做用的,是完全可以删掉的.
但是为什么会不起做用呢? 在读代码时记得有一个调式语句,我把它加上然后重新编译看了一个.把printf ("iKeyState=%d KEYCODE=%d iKey=%d\n", iKeyState, kev->keycode, iKey);加到按键处理的最前面,结果如下
整个按键过程中,当我们按下左ctrl,ikeystate=0 keycode=37 ikey=9227
按下shift,ikeystate=4 keycode=50 ikey=301
释放shift,ikeystate=5 keycode=50 ikey=225
释放ctrl,ikeystate=4 keycode=50 ikey=300
第二句在keyrelease事件中,iKey == CTRL_LSHIFT(301),永远不会成立的应为 它的值是225,除非修改GetKey() ,让它无论是按下或者是释放,都反回同一个值. 所以这个语句永远不会执行. 可以去掉.
最的一发现了一个有趣的东西,就是单按左ctrl,按下去时,keystate是0,没有修饰键.但释放时,state是4,修饰键ctrl. |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|