Razer键盘:在X下使用键盘作为鼠标

Razer键盘:在X下使用键盘作为鼠标

OP完全重新编辑。

我的Razer Cynosa 狼蛛幻彩版是一个物理设备(基本上不超过 PC_105 键盘),提供 3 个接口(1),其中一个用于同时发送一些扫描码,另一个用于在按下任何键时发送一些内部转码的鼠标报告。

我正在寻找一种在X下将后者用作鼠标的方法。


所有 3 个接口都会在启动时正确枚举,并绑定到适当的 hid 通用内核内置驱动程序 (2)

然后反弹到雷泽克布德模式探测时的驱动程序 (3)

其中每一项稍后都会与输入事件相关联并由 X11 服务器 (xorg-server-21.1.4) 注册:

  • 对于此类设备,通常的方式是关于键盘类型的第一个接口(设备 ID 9)和鼠标类型的第三个接口(设备 ID 11)(4)
  • 对于第二个键盘类型(设备 ID 10),以某种对我来说不寻常且至少不明确的方式。 (5) (参见配置为鼠标/配置为键盘顺序)

所有这些导致报告令人困惑

$ xinput --list --short
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ MOSART Semi. 2.4G Wireless Mouse          id=8    [slave  pointer  (2)]
⎜   ↳ Razer Razer Cynosa Chroma                 id=10   [slave  pointer  (2)]
⎜   ↳ Razer Razer Cynosa Chroma                 id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ Razer Razer Cynosa Chroma                 id=9    [slave  keyboard (3)]

(设备 ID 10 仅报告为从属指针,而最初注册为键盘类型。)

注意到cat /dev/input/event5按下任意键时会打印类似鼠标的通信,并且由于 event5 链接到设备 ID 10,因此xinput --test-xi2 10仅记录键盘事件类型 13 (原始按键)和 14(原始密钥发布

evdev 会不会感到困惑?


1:lsusb -vs 008:002报告:

$ lsusb -vs 008:002 
Bus 008 Device 002: ID 1532:022a Razer USA, Ltd Cynosa Chroma
Device Descriptor:
  Configuration Descriptor:
    bNumInterfaces          3
    Interface Descriptor:
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
    Interface Descriptor:
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      1 Keyboard
    Interface Descriptor:
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      2 Mouse

2:Bootlog 枚举 USB 设备

[kernel] input: Razer Razer Cynosa Chroma as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/0003:1532:022A.0002/input/input4
[kernel] hid-generic 0003:1532:022A.0002: input: USB HID v1.11 Keyboard [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input0
[kernel] input: Razer Razer Cynosa Chroma Keyboard as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.1/0003:1532:022A.0003/input/input5
[kernel] input: Razer Razer Cynosa Chroma Consumer Control as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.1/0003:1532:022A.0003/input/input6
[kernel] hid-generic 0003:1532:022A.0003: input: USB HID v1.11 Keyboard [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input1
[kernel] input: Razer Razer Cynosa Chroma as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.2/0003:1532:022A.0004/input/input9
[kernel] hid-generic 0003:1532:022A.0004: input: USB HID v1.11 Mouse [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input2

3:在 modprobe 时重新绑定 Razer 接口

[kernel] input: Razer Razer Cynosa Chroma as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/0003:1532:022A.0002/input/input10
[kernel] razerkbd 0003:1532:022A.0002: input: USB HID v1.11 Keyboard [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input0
[kernel] input: Razer Razer Cynosa Chroma as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.1/0003:1532:022A.0003/input/input11
[kernel] razerkbd 0003:1532:022A.0003: input: USB HID v1.11 Keyboard [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input1
[kernel] input: Razer Razer Cynosa Chroma as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.2/0003:1532:022A.0004/input/input12
[kernel] razerkbd 0003:1532:022A.0004: input: USB HID v1.11 Mouse [Razer Razer Cynosa Chroma] on usb-0000:00:1d.2-2/input2

4:第一个键盘接口和鼠标接口的XCONFIG-ing

config/udev: Adding input device Razer Razer Cynosa Chroma (/dev/input/event4)
Razer Razer Cynosa Chroma: Applying InputClass "evdev keyboard catchall"
Razer Razer Cynosa Chroma: Applying InputClass "system-keyboard"
Using input driver 'evdev' for 'Razer Razer Cynosa Chroma'
systemd-logind: got fd for /dev/input/event4 13:68 fd 39 paused 0
Razer Razer Cynosa Chroma: always reports core events
evdev: Razer Razer Cynosa Chroma: Device: "/dev/input/event4"
evdev: Razer Razer Cynosa Chroma: Vendor 0x1532 Product 0x22a
evdev: Razer Razer Cynosa Chroma: Found keys
evdev: Razer Razer Cynosa Chroma: Configuring as keyboard
Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/0003:1532:022A.0002/input/input10/event4"
Adding extended input device "Razer Razer Cynosa Chroma" (type: KEYBOARD, id 9)
Option "xkb_rules" "evdev"

config/udev: Adding input device Razer Razer Cynosa Chroma (/dev/input/event6)
Razer Razer Cynosa Chroma: Applying InputClass "evdev pointer catchall"
Using input driver 'evdev' for 'Razer Razer Cynosa Chroma'
systemd-logind: got fd for /dev/input/event6 13:70 fd 41 paused 0
Razer Razer Cynosa Chroma: always reports core events
evdev: Razer Razer Cynosa Chroma: Device: "/dev/input/event6"
evdev: Razer Razer Cynosa Chroma: Vendor 0x1532 Product 0x22a
evdev: Razer Razer Cynosa Chroma: Found 9 mouse buttons
evdev: Razer Razer Cynosa Chroma: Found scroll wheel(s)
evdev: Razer Razer Cynosa Chroma: Found relative axes
evdev: Razer Razer Cynosa Chroma: Found x and y relative axes
evdev: Razer Razer Cynosa Chroma: Configuring as mouse
evdev: Razer Razer Cynosa Chroma: Adding scrollwheel support
evdev: Razer Razer Cynosa Chroma: YAxisMapping: buttons 4 and 5
evdev: Razer Razer Cynosa Chroma: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.2/0003:1532:022A.0004/input/input12/event6"
XINPUT: Adding extended input device "Razer Razer Cynosa Chroma" (type: MOUSE, id 11)
evdev: Razer Razer Cynosa Chroma: initialized for relative axes.
Razer Razer Cynosa Chroma: (accel) keeping acceleration scheme 1
Razer Razer Cynosa Chroma: (accel) acceleration profile 0
Razer Razer Cynosa Chroma: (accel) acceleration factor: 2.000
Razer Razer Cynosa Chroma: (accel) acceleration threshold: 4

5:第二个键盘接口的 XCONFIG-ing 不明确

config/udev: Adding input device Razer Razer Cynosa Chroma (/dev/input/event5)
Razer Razer Cynosa Chroma: Applying InputClass "evdev keyboard catchall"
Razer Razer Cynosa Chroma: Applying InputClass "system-keyboard"
Using input driver 'evdev' for 'Razer Razer Cynosa Chroma'
systemd-logind: got fd for /dev/input/event5 13:69 fd 40 paused 0
Razer Razer Cynosa Chroma: always reports core events
evdev: Razer Razer Cynosa Chroma: Device: "/dev/input/event5"
evdev: Razer Razer Cynosa Chroma: Vendor 0x1532 Product 0x22a
evdev: Razer Razer Cynosa Chroma: Found 1 mouse buttons
evdev: Razer Razer Cynosa Chroma: Found scroll wheel(s)
evdev: Razer Razer Cynosa Chroma: Found relative axes
evdev: Razer Razer Cynosa Chroma: Forcing relative x/y axes to exist.
evdev: Razer Razer Cynosa Chroma: Found absolute axes
evdev: Razer Razer Cynosa Chroma: Forcing absolute x/y axes to exist.
evdev: Razer Razer Cynosa Chroma: Found keys
evdev: Razer Razer Cynosa Chroma: Configuring as mouse
evdev: Razer Razer Cynosa Chroma: Configuring as keyboard
evdev: Razer Razer Cynosa Chroma: Adding scrollwheel support
evdev: Razer Razer Cynosa Chroma: YAxisMapping: buttons 4 and 5
evdev: Razer Razer Cynosa Chroma: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.1/0003:1532:022A.0003/input/input11/event5"
XINPUT: Adding extended input device "Razer Razer Cynosa Chroma" (type: KEYBOARD, id 10)
Option "xkb_rules" "evdev"
evdev: Razer Razer Cynosa Chroma: initialized for relative axes.
evdev: Razer Razer Cynosa Chroma: ignoring absolute axes.
Razer Razer Cynosa Chroma: (accel) keeping acceleration scheme 1
Razer Razer Cynosa Chroma: (accel) acceleration profile 0
Razer Razer Cynosa Chroma: (accel) acceleration factor: 2.000
Razer Razer Cynosa Chroma: (accel) acceleration threshold: 4

答案1

一些背景知识:X 最初只有一个鼠标和一个键盘。 XINPUT 扩展(现在是第二个主要版本)使这变得更加灵活。它保留了原来的单鼠标和单键盘作为“核心指针”和“核心键盘”,但允许额外的“主设备”,如核心对,并将所有设备变成可以附加到主设备的从设备。 X 应用程序也可以直接查询 XINPUT 事件,但很少有应用程序真正这样做;大多数应用程序只对“核心”事件做出反应。

默认情况下(至少在我的系统上),所有 evdev 设备都连接到“核心”主设备,作为键盘或鼠标。显然这在您的系统上不起作用。您可以使用 查看当前映射xinput --list,并且无论映射如何,您都可以检查xinput --test-xi2 <device id>某些设备是否实际产生输出。

为了完整起见,如果您需要在较低级别上调试事件(在 X 处理它们之前),那么evtest可以帮助查看内核输入层发生了什么。

因此,如果您可以使用 看到鼠标事件xinput --test-xi2 <razor id>,并且由于某种原因,您的“Razer 键盘鼠标”由于未附加到核心指针而无法使用,那么您可以在必要时使用xinput --float <razor id>`xinput - 取消附加它,并将其附加到核心指针 - -重新附加<核心指针id'。

如果发生其他事情(我不知道是什么,到目前为止您没有提供任何附加信息),例如,如果您在“Razer键盘鼠标”上获取键盘事件,那么事情会变得更加复杂。

即使您的 udev 和/或 xorg.conf 搞砸了,也应该可以使用命令行工具使所有内容进入工作状态(除非有更根本的错误,例如没有鼠标事件)。完成此操作后,您可以查看配置文件以使其永久化。


好的,有了新信息:您有三个输入层设备(不是我根据原始问题所认为的两个),以及三个相应的 X 设备,一个键盘,一个鼠标,一种混合​​设备。

因此,第一步是弄清楚这些设备在内核输入层上的作用。所以evtest三个都跑吧。当您使用它时,请确保使用符号链接来/dev/input/by-*引用所有三个,选择对您来说最方便的符号链接(by-id可能就足够了)。请编辑您的问题,并提供所有三个相关的输出,以及您按下的键以及该键是否产生预期效果。

对所有三个设备重复此操作xinput --test-xi2 ...,查看事件是否正确转换为 X。

如果您有两个设备产生 X 指针事件(例如,如果混合设备和鼠标都产生这些事件),则浮动混合设备。然后它应该可以工作,xev如果需要的话可以用来测试。

如果没有一个设备产生 X 指针事件,那么我们需要查看更多细节来弄清楚发生了什么。

相关内容