LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1255|回复: 0

阅读fcitx源代码中碰到的热键处理问题

[复制链接]
发表于 2008-3-24 12:04:26 | 显示全部楼层 |阅读模式
阅读到fcitx中输入处理中枢
void ProcessKey (IMForwardEventStruct * call_data) 时,由于对Xwindow按键处理方式不是特别了解.对于如下的代码有点疑惑.


  1. if (call_data->event.type == KeyRelease) {

  2. if ((kev->time - lastKeyPressedTime) < 500 && (!bIsDoInputOnly)) {
  3.             if (!bLocked && iKeyState == KEY_CTRL_SHIFT_COMP && (iKey == 225 || iKey == 227)) {
  4.                 if (ConnectIDGetState (call_data->connect_id) == IS_CHN)
  5.                     SwitchIM (-1);
  6.                 else if (IsHotKey (iKey, hkTrigger))
  7.                     CloseIM (call_data);
  8.             }
  9.             else if (!bLocked && iKey == CTRL_LSHIFT) {
  10.                 if (ConnectIDGetState (call_data->connect_id) == IS_CHN)
  11.                     SwitchIM (-1);
  12.                 else if (IsHotKey (iKey, hkTrigger))
  13.                     CloseIM (call_data);
  14. ...................

复制代码


一开始的时候在想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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表