c -通过QT应用程序在Linux中的多指针处理



从1.7版开始的Xorg服务器支持在一台PC上使用多个鼠标光标。

我也知道QT提供了处理鼠标事件并对其进行操作的功能。

Question:

我想在双鼠标设备配置中处理QT应用程序中的特定鼠标事件。

假设我已经创建了2个鼠标指针,并有2个物理鼠标设备连接到PC。第一个鼠标设备用于常规使用,第二个应该在某些QWidget中无限移动。

是否有可能在QT应用程序中识别相应的鼠标设备(在多个鼠标光标的情况下)并使其仅在指定的小部件中移动,同时第二只鼠标应该能够作为常规鼠标设备使用?

NOTES:

QT应用程序将在Linux上运行,所以我对Windows不感兴趣。

我可以自由修改Linux内核驱动程序等…

这并没有回答OP的问题,因为这是一种更通用的方法,而不是针对qt的。


如果辅助鼠标(或任何您想使用的HID设备)通常根本不打算成为指针,您可以使用Linux输入子系统来"抓取"。并直接连接到输入设备。这样做的缺点是它不再是指针,你需要自己处理它的移动并生成它产生的事件;但是,包括Qt在内的所有工具包都支持。

HID事件输入设备可以作为/dev/input/event*访问,相应的伪文件/sys/class/input/event*/device/name给出其人类可读的名称(例如,PS/2 Generic Mouse),/sys/class/input/event*/device/id/vendor/sys/class/input/event*/device/id/product其USB供应商:product(十六进制)。大多数Linux发行版在/dev/input/by-id//dev/input/by-path/中生成符号链接,但是您最有可能希望设置一个udev规则(在/etc/udev/rules.d//lib/udev/rules.d/中,取决于您是作为用户还是管理员,还是作为安装应用程序的一部分),该规则生成合适的符号链接并授予目标用户对设备的访问权限。

本质上,一个访问事件设备的进程,打开它(读写),并运行ioctl(devfd, EVIOCGRAB, 1)到"抓取";设备,以便只有本进程看到本设备生成的事件(并且它们不再转发给其他进程);特别是,鼠标将不再影响主指针的移动)。然后,进程只从设备中读取struct input_event结构,如<linux/input.h>所述。(更多细节请点击这里。)该设备只返回完整的结构,如果缓冲区足够大,每次读取可以返回多个结构,所以它是一个非常简单的接口。

所有这些(设备和伪文件)都是Linux内核-用户空间的直接接口,并且被Linux内核开发人员认为是稳定的。这意味着在应用程序中依赖它们是安全的。

在实践中,您可能希望在单独的线程或单独的进程中访问设备。独立的进程允许你进行特权分离,以防你想限制其他应用程序对设备的直接访问(当你的应用程序没有运行时);请注意,即使这样,您可能希望在Qt应用程序中使用一个单独的线程来接收来自该进程的事件,并生成由主线程处理的小部件事件。

就我个人而言,我会使用一个由应用程序启动的单独进程,用Unix域流套接字(而不是普通的管道,因为套接字是双向的)或两个连接两者:一个套接字以您认为合适的任何格式提供鼠标事件(以本机二进制格式,因为它们在同一台机器上运行),另一个套接字用于控制信息,例如描述哪些设备可用,何时添加或删除设备,以及应用程序选择实际使用的设备。(我会用前者替换标准输入,用后者替换标准输出——反之亦然——在单独的过程中。这一点也不复杂。)

一个单独的进程也允许你分离翻译逻辑,如果你有一天决定支持非hid设备,比如一个自定义的3D USB控制器,它有自己的用户空间"驱动程序";应用程序。只要确保您决定在应用程序和helper进程之间使用的任何格式都能满足您的需求(而不是设备功能)。

请注意,上述内容并不局限于鼠标或操纵杆,键盘也同样适用。事件结构相同,只是内容不同。

最新更新