喜欢 ThinkPad 的指点杆键盘,移动光标时手不需要离开键盘区.

在淘宝上面淘一个 0B47190 的国行指点杆键盘. 接上电脑,在 archlinux 上面,上下滚动能正常使用.
但有点小问题,按中键的时候,会先执行中键的功能,比如在终端上会粘贴剪切版的内容.

参考 https://wiki.archlinux.org/index.php/TrackPoint 的配置,执行 ~/.xinitrc 文件的内容,然后中键滚动都不能用了.

折腾模式开启了,主要参考了以下资料.

  1. http://www.x.org/archive/X11R7.7/doc/man/man5/xorg.conf.5.xhtml#heading9
  2. http://www.x.org/archive/X11R7.5/doc/man/man4/evdev.4.html
  3. https://wiki.ubuntu.com/X/Config/Input

首先用 xinput list 列出输入设备,查找设备的ID.指点杆设备是在 “Virtual core pointer” 节点下,另外个同名的设备为键盘.

$ xinput list
⎡ Virtual core pointer                      id=2015[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4[slave  pointer  (2)]
⎜   ↳ Lenovo ThinkPad Compact USB Keyboard with TrackPointid=9[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)]
    ↳ Lenovo ThinkPad Compact USB Keyboard with TrackPointidid=8[slave  keyboard (3)]

再用 xinput test 9 测试键值,命令中的9为你的测试的输入设备的ID. 测试发现,按下中键会打印出 “button press 2”,在不释放中键的同时触摸指点杆,提示 “button press 4” 之类的.
接上一个普通的usb鼠标,再测试,发现滚动的键值都一样. 猜测键值: 1=左键, 2=中键, 3=右键, 4 5 6 7对应着上下左右滚动.
因手边没有ThinkPad电脑,没办法测试上文提到的 .xinitrc 配置的开启 Evdev Wheel Emulation 选项后 xinput-test 打印值的差别.
个人估计,新版的thinkpad键盘直接是硬件上就直接兼容标准的鼠标键值了,而不再需要配置 Wheel Emulation .

所有,解决方案根本不需要管滚动这一块,只需要处理中键粘贴的问题.简单粗爆的方法,直接禁用中键.

方式一是在 .xinitrc 里添加以下行命令.

xinput set-button-map "Lenovo ThinkPad Compact USB Keyboard with TrackPoint" 1 0 3 4 5 6 7 8 9 10 11 12 13

“Lenovo ThinkPad Compact USB Keyboard with TrackPoint” 这个值是通过xinput获取到的, 后面的数值是通过 xinput get-button-map 9获取来的.
设置时,把2的值置为0,这样就禁用掉中键的.

4 5为上下,如果我们把4 5的键值位置对换一下,应该可以实现 Mac 的滚动习惯的.

方式二是通过 xorg configuration 实现,创建一个 /etc/X11/xorg.conf.d/20-thinkpad.conf 文件,内容如下:

Section "InputClass"
    Identifier  "Trackpoint"
    MatchUSBID          "17ef:6047"
    MatchIsPointer      "true"
    Option              "ButtonMapping"         "1 0 3 4 5 6 7 8 9 10 11 12 13"
EndSection

查看 xorg conf 文档,觉得 MatchUSBID 更适合,而不是示例给的 MatchProduct 指令,通过 lsusb 命令查找设备的id. 查看 man evdev 文档,配置 InvertX 选项,应该也可以实现 Mac 的滚动习惯.

xorg conf 还是很强大,可惜不了解 Linux 系统编程.得加油!!!