在X.org中切换kb布局时会触发哪个事件

时间:2013-03-19 12:37:23

标签: c++ c xorg

我是X.org编程的新手。我想建立一个小应用程序,它对X键盘布局开关作出反应。我已经搜索过,但是在切换kb布局时没有找到触发的事件。请指出正确的事件。感谢

1 个答案:

答案 0 :(得分:9)

XkbStateNotify事件类型是X Keyboard Extension的一部分。你可以从中获取布局语言:

void x11Events(XEvent* evt)
{
    if(evt->type == xkbEventType) {
        XkbEvent* xkbevt = (XkbEvent*)evt;
        if (xkbevt->any.xkb_type == XkbStateNotify) {
            int lang = xkbevt->state.group;
            // Some code using lang here.
        }
    }
}

要获取xkbEventType,请调用XkbQueryExtension()函数(在XKBlib.h中声明)。

但是,XkbStateNotify不仅会在布局更改时触发。这来自上面引用的规范:

  

报告的更改包括对键盘任何方面的更改   state:当设置或取消设置修饰符时,当前组   更改,或按下或释放指针按钮时。

因此,您必须在某处保存lang的值,然后在新活动到达时,将lang的新值与之前保存的值进行比较。

NB。还有XkbMapNotifyEvent事件,它不会通知切换布局本身,而是关于更改键盘映射。你可能也想研究那个。