【问题标题】:Which event is fired when switching kb layout in X.org在 X.org 中切换 kb 布局时会触发哪个事件
【发布时间】:2013-03-19 12:37:23
【问题描述】:

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

【问题讨论】:

  • 你在做什么来切换键盘布局?您使用的是 GUI 客户端吗?还是编辑配置文件?更改何时生效?这些线索可以帮助我们了解在哪里寻找。
  • 在语言布局(en、cs、...)之间切换。一个监听 kb 开关的 GUI 客户端(例如,我已经设置了两个 Shift 来切换键盘布局,并且这个开关会生成一个我想要捕获并执行一些操作的事件)。应该是c/c++代码。
  • 你能贴一些代码吗?
  • 启动 xev 并切换键盘布局。
  • @jthill,使用 xev 不行。是的,通过键盘切换布局会产生 KeyPressKeyRelease 事件,keysym 0xfe08 - ISO_Next_Group。但是,布局也可以通过一些小部件,用鼠标切换,然后我们就错过了。

标签: c++ c xorg


【解决方案1】:

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 的新值与之前保存的值进行比较。

注意。还有XkbMapNotifyEvent 事件,它不是通知切换布局本身,而是通知更改键盘映射。您可能也想研究一下。

【讨论】:

  • 程序员需要注意的可能是提示如何使用现代工具包(如 GTK)获取此事件。
  • 在GTK中,通常不需要处理原始XEvents(至少不需要检测布局变化),因为有gdk events,可以用来获取当前键盘组,也。此外,在 gtk 应用程序中干预 X 事件处理可能会破坏工具包,因为它有自己的事件处理循环。我不太了解 Qt,但我怀疑那里的情况相似。
  • 我看到的唯一可用于检测键盘组更改的 gdk 事件是GdkEventKey。即使假设我们将设法监听根窗口事件(因为 gdk/gtk 中的所有事件处理都是基于窗口/小部件的,并且我们想要所有事件,而不仅仅是特定窗口的事件),我们仍然只检测通过键盘完成的布局更改,并错过通过其他方式完成的更改。所以,我不明白它是如何做到的。甚至不确定这是否可能。不过,我确实知道如何从 GTK 应用程序获取原始 XEvents。我可以把它写在我的答案中,但感觉题外话太具体了。
  • GDK 实际上支持一个钩子来监听事件,无论它们属于哪个小部件:gdk_event_handler_set。这通常由 GTK 采取,但只要记得拨打gtk_main_do_event,就可以根据需要对事件做出反应。看看各种 Gnome 键盘布局指示器是如何实现的会很有趣。
  • 嗯,libgnomekbd(参见 gkbd-configuration.c:224)和 xfce4-xkb-plugin(参见 panel-plugin/xkb-config.c:112)都听“X-state- changed” glib 事件,由 libxklavier 发出(参见 xklavier.c:498)。 xklavier 库监听 X 事件(在 xkl_xkb_process_x_event() 函数中)。因此,使用 libxklavier(和 glib)是检测布局更改的另一种可能性(上面的链接提供了一些示例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多