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

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

问题描述:

我是X.org编程的新手。我想建立一个小的应用程序,它对X键盘布局开关起作用。我已经搜索过,但没有发现在切换kb布局时会触发哪个事件。请告诉我正确的事件。谢谢在X.org中切换kb布局时会触发哪个事件

+0

你在做什么来切换键盘布局?你在使用GUI客户端吗?或者编辑配置文件?更改何时生效?这些是可以帮助我们学习到哪里寻找的线索。 – 2013-03-19 22:26:02

+0

在语言布局(en,cs,...)之间切换。一个监听kb开关的GUI客户端(例如,我已经设置了两个Shifts来切换键盘布局,并且这个开关产生了一个我想要捕捉并执行一些操作的事件)。应该是c/C++代码。 – Pat 2013-03-20 08:45:50

+0

你能发表一些代码吗? – JoRouss 2013-04-12 17:46:38

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不仅在版面更改上被解雇。这是从上述引用的规范:

报告的改变包括改变到键盘 状态的任何方面:当改性剂设置或取消,当当前组 变化,或当按下指针按钮或释放。

正因为如此,你必须保存的lang价值的地方,然后,当新的事件到来时,比较lang新的价值先前保存的一个。

注意:还有XkbMapNotifyEvent事件,它不通知本身切换布局,而是通知更改键盘映射。你可能也想看看那个。

+0

给程序员的提示可能是一个提示,如何使用现代工具包(如GTK)获取此事件。 – user4815162342 2013-04-13 10:26:02

+1

在GTK中,通常不需要处理原始的'XEvents'(至少不用于检测布局变化),因为[gdk events](https://developer.gnome.org/pygtk/stable/class- gdkevent.html),它也可以用来获取当前的键盘组。而且,干预gtk应用程序中的X事件处理可能会破坏工具包,因为它具有自己的事件处理循环。我对Qt并没有太多的了解,但我怀疑那里的东西是相似的。 – shakurov 2013-04-13 17:25:19

+0

这正是我所指的 - 与上述代码相同的代码,但使用GDK事件。必须可以从GTK/GDK访问Xkb布局切换事件,因为至少键盘指示器小程序需要检测切换。 – user4815162342 2013-04-13 17:34:37