C 如何在linux,X下以合法和编程方式捕获第二个鼠标或轨迹球?

C 如何在linux,X下以合法和编程方式捕获第二个鼠标或轨迹球?,c,linux,mouse,x11,evdev,C,Linux,Mouse,X11,Evdev,我正在设计和实现一个实验性的GUI应用程序。我希望允许我的用户以符合人体工程学的方式同时使用双手与应用程序交互。例如,想象一下GIMP和左手(另一只)中的第二个鼠标(轨迹球):您可以用左手导航、平移、旋转或缩放图片,同时用右手绘制/编辑精确的点、线或图形。2000~2002年,我用两只老鼠做了一些实验:一只在PS2(USB)接口上,另一只在RS232串行接口上。许多年后的今天,我用现代软件和当代(USB)输入设备重新审视这个古老的想法 在理想情况下,我的目标是使用X将第二个鼠标(或轨迹球)连接到

我正在设计和实现一个实验性的GUI应用程序。我希望允许我的用户以符合人体工程学的方式同时使用双手与应用程序交互。例如,想象一下GIMP和左手(另一只)中的第二个鼠标(轨迹球):您可以用左手导航、平移、旋转或缩放图片,同时用右手绘制/编辑精确的点、线或图形。2000~2002年,我用两只老鼠做了一些实验:一只在PS2(USB)接口上,另一只在RS232串行接口上。许多年后的今天,我用现代软件和当代(USB)输入设备重新审视这个古老的想法

在理想情况下,我的目标是使用X将第二个鼠标(或轨迹球)连接到GNU/Linux系统,然后能够:

  • (1.)继续使用主鼠标作为X默认主指针
  • (2.)以编程方式从第二个鼠标访问/读取事件
  • (3.)分别从第二个鼠标获取事件(在 可识别的方式)从主鼠标
  • (4.)能够“使用”来自第二个鼠标的事件,以便无论何时启动我的程序,第二个鼠标都不会影响主指针
  • (5.)最好仅当GUI 我的程序窗口有焦点
  • (6.)完整的解决方案最好不依赖于其他包或库,例如gpm。但是,如果需要(任何)udev规则,这不是问题,因为最终用户无论如何都需要安装我的程序
  • (7.)解决方案最好不需要任何额外的特权或权限 权限,例如将用户添加到“输入”组
我花了6个多小时在互联网上搜索提示,但遗憾的是,我并没有超出某些“肮脏”的局部解决方案,但有几个缺点:

  • (A.)将用户添加到“输入”组
  • (B.)从第二个鼠标捕获事件,如下面的示例程序所示
  • (C.)开放点:进一步了解如何“消费”第二个鼠标的事件
  • (D.)应对全球捕获(不仅仅是聚焦窗口)和其他问题

#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int ret=1;/*程序的返回值;0=成功*/
int fd;/*文件描述符(处理程序)*/
结构输入\事件ev;
如果(argc!=2){
printf(“用法:\n rdinpdev\n”
“从输入设备打印事件。\n”
);
}
否则{
fd=打开(argv[1],仅限Ordu);
printf(“打开并返回%d\n”,fd);
如果(fd>=0){
ret=0;
而(1){
读取(fd、ev和sizeof(结构输入事件));
printf(“值%d,类型%d,代码%d\n”,版本值,版本类型,版本代码);
}
}
}
返回ret;
}
简短回答:

更长的回答:X有一个核心输入设备的概念,通常是键盘和鼠标,以及可以通过上述扩展查询的附加输入设备。如果您要求,这些可选输入可以生成事件

下面是列出所有输入设备的简短代码:

#include <stdio.h>

#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>

int main (int argc, char *argv[])
{

  Display *d = XOpenDisplay (0);

  if (!d)
  {
    printf ("Failed to open display.\n");
    return 1;
  }

  int i, num;
  XDeviceInfo *dev;

  dev = XListInputDevices (d, &num);
  printf ("Found %d input devices:\n", num);

  for (i = 0; i < num; i++)
  {
    printf ("  name: %s; classes: %d; use: %d\n", dev[i].name, dev[i].num_classes, dev[i].use);
  }

  XCloseDisplay (d);
  return 0;
}

一个有趣的问题(但可能不适合S.O.)。您是否正在尝试在平板电脑、智能手机等设备上进行“手势”处理?您可能希望在顶部添加一段描述您的用例。祝你好运。@Sheller,谢谢你的评论。我在顶部加了一段:)的确如此。关于适当性,我无法想象一个比S.O.更好的地方,但我愿意接受建议。@embedeo一般来说:仅仅因为没有主题上的地方并不意味着没有主题上的地方。非常感谢你的回答,JvO!我希望明天能通过X输入设备扩展来实际测试我是否能实现我的7个目标。然后我会提供反馈。
#include <stdio.h>

#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>

int main (int argc, char *argv[])
{

  Display *d = XOpenDisplay (0);

  if (!d)
  {
    printf ("Failed to open display.\n");
    return 1;
  }

  int i, num;
  XDeviceInfo *dev;

  dev = XListInputDevices (d, &num);
  printf ("Found %d input devices:\n", num);

  for (i = 0; i < num; i++)
  {
    printf ("  name: %s; classes: %d; use: %d\n", dev[i].name, dev[i].num_classes, dev[i].use);
  }

  XCloseDisplay (d);
  return 0;
}
second-input: second-input.o
       $(CC) -o $@ $< -lX11 -lXi

.o:.c
       $(CC) -g -o $@ $<
Found 10 input devices:
  name: Virtual core pointer; classes: 2; use: 0
  name: Virtual core keyboard; classes: 1; use: 1
  name: Virtual core XTEST pointer; classes: 2; use: 4
  name: Virtual core XTEST keyboard; classes: 1; use: 3
  name: Power Button; classes: 1; use: 3
  name: Power Button; classes: 1; use: 3
  name: USB Mouse              ; classes: 2; use: 4
  name: Wacom Volito Pen; classes: 0; use: 2
  name: UVC Camera (046d:081d); classes: 1; use: 3
  name: AT Translated Set 2 keyboard; classes: 1; use: 3