gpt4 book ai didi

c++ - 将 ncurses 键事件转发到 X11 窗口

转载 作者:行者123 更新时间:2023-11-28 05:53:32 24 4
gpt4 key购买 nike

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

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

最佳答案

嗯,根据定义,混合应用程序框架几乎是困难的。

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

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

您很可能会安排 X11 端,以便套接字读取回调从套接字读取结构,对其进行解释并决定随后应直接调用哪个回调。如果您的按键仅用于选择菜单条目、按钮等,那么这可能是避免映射问题的一种不错(但不是很好)的方法。

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

关于c++ - 将 ncurses 键事件转发到 X11 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com