我正在设计和实现一个实验性的GUI应用程序 . 我希望允许我的用户在人体工程学上同时使用双手与应用程序进行交互 . 例如,想象一下GIMP和左手(其他)手中的第二个鼠标(轨迹球):您可以用左手导航,平移,旋转或缩放图片,同时绘制/编辑精确点,线或图形用右手同时进行 . 早在2000〜2002年,我就用两只老鼠进行了一些实验:一个在PS2(USB)接口上,另一个在RS232串行接口上 . 如今,多年以后,我正在重新审视这个古老的想法,使用现代软件和现代(USB)输入设备 .
在理想情况下,我的目标是使用X将第二个鼠标(或轨迹球)连接到GNU / Linux系统,然后能够:
(1.)继续使用主鼠标作为X默认主指针 .
(2 . )以编程方式从第二个鼠标访问/读取事件 .
(3 . )从主鼠标中分别(以可辨别的方式)从第二个鼠标中获取事件 .
(4.)能够"consume"来自第二个鼠标的事件,这样每当我的程序启动时,第二个鼠标不会影响主指针 .
(5)优选地,仅当我的节目的GUI窗口具有焦点时才应捕获第二鼠标 .
(6 . )优选地,完整的解决方案不应依赖于其他包或库,例如gpm . 但是,如果需要(任何)udev规则,这不是问题,因为最终用户无论如何都需要安装我的程序 .
(7 . )最好,解决方案不需要任何额外的权限或权限,例如将用户添加到"input"组 .
我花了6个小时在互联网上搜索提示,但遗憾的是我并没有超出一些“肮脏”的部分解决方案,有几个缺点:
(A . )将用户添加到"input"组 .
(B . )从下面的示例程序中捕获第二个鼠标中的事件 .
(C . )开放点:进一步了解如何"consume"来自第二只鼠标的事件?
(D.)应对全局捕获(不仅是焦点窗口)和其他问题?
...
#include
#include
#include
#include
int main(int argc, char **argv)
{
int ret=1; /* Program's return value; 0=success. */
int fd; /* File descriptor (handler) */
struct input_event ev;
if (argc != 2) {
printf("Usage:\n rdinpdev \n"
"Print events from an input device.\n"
);
}
else {
fd = open(argv[1], O_RDONLY);
printf("open returned %d\n",fd);
if(fd >= 0) {
ret=0;
while(1) {
read(fd, &ev, sizeof(struct input_event));
printf("value %d, type %d, code %d\n",ev.value,ev.type,ev.code);
}
}
}
return ret;
}