【发布时间】:2011-01-15 07:10:48
【问题描述】:
对于我的应用程序的 Windows 版本,我使用 WM_INPUT 并直接注册鼠标设备以获得最精确的移动。我将如何在 X11 中执行此操作?
【问题讨论】:
对于我的应用程序的 Windows 版本,我使用 WM_INPUT 并直接注册鼠标设备以获得最精确的移动。我将如何在 X11 中执行此操作?
【问题讨论】:
有几种方法可以做到这一点,具体取决于您使用的框架。
如果您打算使用 X11 编程的最基本方法“Xlib”来执行此操作,您应该查看Xlib manual,特别注意 XInput。 可以使用XI2(XInput 版本 2)检索更详细的信息
其他更高级别的框架可以使事情变得更容易。看看Qt。这是我见过的最好的 GUI API 之一。
如果您需要更多,请告诉我们。
【讨论】:
这里有 11 个链接,它们提供了参考、建议和两种不同的方法来获取 Linux 上的原始鼠标移动。 Link #2 (Python) 显示读取鼠标设备的传统方式,#1 (C)、#3 (Python) 和#4 (C) 显示事件方式。 link #5 中介绍了 ps/2 协议。 Link #6 是一个命令行示例。
这两种方法中的每一种都通过从设备驱动程序文件中获取 x 和 y 方向的增量流来绕过 X (Xlib)。 Xlib 不提供增量,传统上只提供窗口(或屏幕)位置,因此如果您想继续获取特定方向的读数,则必须不断将指针从窗口边缘移动。 [请参阅link #8 快速讨论许多程序使用 X 使用的“变形到中心”hack。] 然而,新的 XInput 2.0 扩展 (link #10) 提供了用于获取增量的 X API(您可能有至少链接 -lX11 和 -lXi)。
这两种设备方法的本质是这样的:
1:打开以读取“/dev/input/mouse0”设备或类似设备(这取决于您的发行版命名以及您要使用的方法,/dev/input/event4 用于其他方法)。
2:从中读取。每这么多字节代表一次鼠标移动。例如,对于 ps/2 原始协议方法,例如,通过打开 mouse[n] 如上所述,如果您只关心 x、y 移动,则基本上只需要每 3 个字节序列的第 2 个和第 3 个字节。第二个字节代表 X。第三个代表 Y。两个字节中的每一个都是一个 int8_t(有符号 8 位)数量。正X好像在右边,没问题;然而,正 Y 似乎是向上的(就像在大多数数学教科书中一样),而在屏幕上,正 Y 通常被认为是从屏幕的左上角向下(而不是从左下角向上作为典型的原点)笛卡尔坐标系)。
其他注意事项:如果您正在运行 X,您可能希望使用 open/read 而不是 fopen/getc(请参阅 link #7 和其他链接中的代码)。如果您想要前 3 个按钮的鼠标按钮状态或想要确认 x 或 y 的符号,那么还要查看第一个字节。 [我怀疑溢出是普通“流”使用中的一个问题,但这些位也存在。]如果您在 Linux 命令行上进行实验,您可能会注意到,例如,快速“猫”到“少”,大多数动作只是 1 个单位(很多 ^A ^@ 和
【讨论】: