转发将关键事件转移到X11窗口

时间:2016-01-09 23:31:53

标签: c++ c x11 ncurses qemu

我的应用程序的用户界面包含两个窗口:控制台(由ncurses处理)和图形的X11窗口。我想以集中的方式处理关键事件。也就是说,无论两个窗口中的哪一个处于活动状态,相同的事件循环都应该处理所有关键事件。我已经有一个X11事件的事件循环。剩下要做的就是将所有控制台事件转发到X11窗口。

找到实现此转发的主要构建块here。我唯一需要的是能够从getch()返回的值转换为X11 keycode。大约四个小时的网络搜索后,我找到了this代码,这是qemu的一部分。但是,当我将它提供的映射与xev的输出进行比较时,两者不匹配。例如,对于Home键,xev给出110,而提到的映射给出71 | 0x0100,这是327.这两种不同的keycodes?我错过了什么?

1 个答案:

答案 0 :(得分:1)

嗯,根据定义,混合应用程序框架很困难。

我认为实现所需内容的最佳方法是拥有两个独立的进程或线程,一个用于控制台,另一个用于X11应用程序。在每个中你都有相关的事件循环处理程序。要将它们连接在一起,请使用IPC通道,管道或插槽。您应该能够使用自己的回调使套接字/管道成为X11事件循环处理程序的输入。您可以在控制台端使用select()等待套接字或STDIN;这允许您在X11通过套接字发送内容时,在准备好按键或从套接字读取时调用getch()。如果您使用ZeroMQ之类的东西代替套接字,那就更好了。

那么,你会通过套接字发送什么?您必须定义自己的事件结构以在控制台和X11应用程序之间传递。当需要向另一方发送内容时,每一方都会填充并发送其中一个。您需要描述的事件类型包括戒烟,按键(+按键数据)等。

你最有可能安排X11端,以便套接字读取回调从套接字读取结构,解释它并决定应该直接调用什么回调。如果您的按键仅用于选择菜单条目,按钮等,那么这可能是避免映射问题的一种不太糟糕(但不是很好)的方法。

这意味着有两个事件循环处理程序,一个套接字和两个进程/线程。但它确实避免将两者混合成一件事。这也意味着您的控制台可能位于完全不同的机器上!如果您使用过zeromq,则可以轻松地在PUSH / PULL配置中将多个控制台连接到X11应用程序;也许是荒谬的,但可能。