控制注册键盘事件的蓝牙鼠标手势


9

tl; dr

我刚买了罗技T630。这是一种蓝牙鼠标,通过手势(PDF)支持多个键盘事件。这些手势既好看又花哨,但我没有用。我要摆脱它们真是太糟糕了。

我要按照优先级从高到低的顺序执行以下操作:

  1. 禁用这些手势
  2. 重新映射手势(我认为如果不破解固件或对Windows / OS X设备驱动程序进行反向工程,则不可能)

我不想:

  • 使用Windows
  • 禁用所有手势

有关更多信息,请继续阅读...

按钮和手势

十三种可能的鼠标事件是:

  1. 左击
  2. 中间点击
  3. 右键点击
  4. 向上滚动
  5. 向下滚动
  6. 向左滚动
  7. 向右滚动
  8. 向左滑动边缘
  9. 向右滑动边缘
  10. 向左滑动两根手指
  11. 两根手指向右滑动
  12. 双击
  13. 两指双击

前七个按操作系统映射它们的顺序排列。

只有前三个是机械的,其他所有都使用触摸表面:

触摸手势

GUI选项

Kubuntu Trusty中进行设置很容易,但是它几乎不支持配置其他手势。

这些手势与以下内容无关:

  • 触摸板(synaptics未运行)
  • 可及性
  • 热点
  • 标准鼠标手势

与这些设置相关的所有设置均已选中,并且全部关闭。

命令行设置

lomoco

lomoco用于配置Logitech USB鼠标特殊功能的实用程序不适用。

xinput

我认为xinput可能会提供一些帮助:

$ xinput --list | grep pointer
 Virtual core pointer                          id=2    [master pointer  (3)]
    Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
    Ultrathin Touch Mouse                     id=13   [slave  pointer  (2)]
$ xinput --list-props 13
Device 'Ultrathin Touch Mouse':
    Device Enabled (144):   1
    Coordinate Transformation Matrix (146): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (266): 0
    Device Accel Constant Deceleration (267):   1.000000
    Device Accel Adaptive Deceleration (268):   1.000000
    Device Accel Velocity Scaling (269):    10.000000
    Device Product ID (261):    1133, 45069
    Device Node (262):  "/dev/input/event11"
    Evdev Axis Inversion (270): 0, 0
    Evdev Axes Swap (272):  0
    Axis Labels (273):  "Rel X" (154), "Rel Y" (155), "Rel Horiz Wheel" (746), "Rel Vert Wheel" (265)
    Button Labels (274):    "Button Left" (147), "Button Middle" (148), "Button Right" (149), "Button Wheel Up" (150), "Button Wheel Down" (151), "Button Horiz Wheel Left" (152), "Button Horiz Wheel Right" (153), "Button Side" (1032), "Button Extra" (1033), "Button Unknown" (264), "Button Unknown" (264), "Button Unknown" (264), "Button Unknown" (264)
    Evdev Middle Button Emulation (275):    0
    Evdev Middle Button Timeout (276):  50
    Evdev Third Button Emulation (277): 0
    Evdev Third Button Emulation Timeout (278): 1000
    Evdev Third Button Emulation Button (279):  3
    Evdev Third Button Emulation Threshold (280):   20
    Evdev Wheel Emulation (281):    0
    Evdev Wheel Emulation Axes (282):   0, 0, 4, 5
    Evdev Wheel Emulation Inertia (283):    10
    Evdev Wheel Emulation Timeout (284):    200
    Evdev Wheel Emulation Button (285): 4
    Evdev Drag Lock Buttons (286):  0

请注意13个按钮标签:

$ xinput --get-button-map "Ultrathin Touch Mouse"
1 2 3 4 5 6 7 8 9 10 11 12 13

关闭它们并没有帮助:

$ xinput --set-button-map "Ultrathin Touch Mouse" 1 2 3 4 5 6 7 0 0 0 0 0 0

即使,例如,它可以将鼠标中键变成左键单击:

$ xinput --set-button-map "Ultrathin Touch Mouse" 1 1 3 4 5 6 7 0 0 0 0 0 0

xmodmap

与相似xinput,结果相同:

$ xmodmap -e "pointer = 1 2 3 4 5 6 7 0 0 0 0 0 0"

inputkbd

下面的elmicha建议,它在内核级别起作用,试图使手势导致空键盘事件。应该通过以下过程工作,但在这里也没有运气:

$ sudo input-kbd 4 > keymap # note the 4 is from /dev/input/event4
# edit the keymap to map any combination of keys to either 0 or 240 (KEY_UNKNOWN)
# e.g. change this:
# 0x700e0 =  29 # KEY_LEFTCTRL
# to this:
# 0x700e0 =   0 # KEY_LEFTCTRL
# or this:
# 0x700e0 = 240 # KEY_LEFTCTRL
$ sudo input-kbd -f keymap 4
$ sudo input-kbd 4 # should return the updated keymap

完成此操作后,键盘映射不会显示任何更改。

xkbcomp

X输入黑客彼得·哈特勒Peter Hutterer)提出了这一建议,他当然是一个应该知道他在做什么的人。不过,还是没有运气:

$ xkbcomp -xkb $DISPLAY t630.xkb
# edit the keyboard description and replace the definition of any key to NoSymbol or VoidSymbol
# e.g. change this:
#     key <LCTL> {         [       Control_L  ] };
# to this:
#     key <LCTL> {         [       NoSymbol   ] };
# or this:
#     key <LCTL> {         [       VoidSymbol ] };
$ sudo xkbcomp -i 8 t630.xkb $DISPLAY # here the 8 is the id in xinput, names don't work
$ xkbcomp -xkb -i 8 $DISPLAY - # should return the updated keyboard description

完成此操作后,键盘说明将保持不变。

彼得认为这很可能是由于对X设备作为键盘或鼠标的本质感到困惑,有点像这个带有相反问题的错误。这可以解释为什么所有其他预期项目都不起作用。但是,他还说,evdev出于相同的原因,使用不应起作用。

evdev

乍一看似乎可行,但两者都不可行。这试图X通过将以下内容附加到/usr/share/X11/xorg.conf.d/10-evdev.conf或来利用通用输入驱动程序来设置按钮映射/etc/X11/xorg.conf.d/10-evdev.conf

# custom for Logitech Ultrathin Touch mouse

Section "InputDevice"
    Identifier "Logitech bluetooth Touch Mouse"
    Driver "evdev"
    Option "Name"   "Ultrathin Touch Mouse"
    Option "ButtonMapping" "1 2 3 4 5 6 7 0 0 0 0 0 0"
EndSection

Section "InputClass"
    Identifier  "Ultrathin Touch Mouse"
    Option "ButtonMapping" "1 2 3 4 5 6 7 0 0 0 0 0 0"
EndSection

这似乎可以正常工作/var/log/Xorg.0.log(使用grep EE),并且可以xinput确认按钮映射,但不会产生期望的效果。

但是,已知这用于T631。

键盘事件

我认为问题在于这些手势会产生键盘事件:

$ sudo evemu-record /dev/input/event4 | grep "E: "
# swipe edge right
E: 0.000000 0004 0004 458976    # EV_MSC / MSC_SCAN             458976
E: 0.000000 0001 001d 0001      # EV_KEY / KEY_LEFTCTRL         1
E: 0.000000 0004 0004 458979    # EV_MSC / MSC_SCAN             458979
E: 0.000000 0001 007d 0001      # EV_KEY / KEY_LEFTMETA         1
E: 0.000000 0004 0004 458795    # EV_MSC / MSC_SCAN             458795
E: 0.000000 0001 000f 0001      # EV_KEY / KEY_TAB              1
E: 0.000000 0000 0000 0000      # ------------ SYN_REPORT (0) ----------
E: 0.002980 0004 0004 458976    # EV_MSC / MSC_SCAN             458976
E: 0.002980 0001 001d 0000      # EV_KEY / KEY_LEFTCTRL         0
E: 0.002980 0004 0004 458979    # EV_MSC / MSC_SCAN             458979
E: 0.002980 0001 007d 0000      # EV_KEY / KEY_LEFTMETA         0
E: 0.002980 0004 0004 458795    # EV_MSC / MSC_SCAN             458795
E: 0.002980 0001 000f 0000      # EV_KEY / KEY_TAB              0
E: 0.002980 0000 0000 0000      # ------------ SYN_REPORT (0) ----------
# swipe edge left
E: 3.306977 0004 0004 458978    # EV_MSC / MSC_SCAN             458978
E: 3.306977 0001 0038 0001      # EV_KEY / KEY_LEFTALT          1
E: 3.306977 0004 0004 458979    # EV_MSC / MSC_SCAN             458979
E: 3.306977 0001 007d 0001      # EV_KEY / KEY_LEFTMETA         1
E: 3.306977 0004 0004 458866    # EV_MSC / MSC_SCAN             458866
E: 3.306977 0001 00c1 0001      # EV_KEY / KEY_F23              1
E: 3.306977 0000 0000 0000      # ------------ SYN_REPORT (0) ----------
E: 3.310979 0004 0004 458978    # EV_MSC / MSC_SCAN             458978
E: 3.310979 0001 0038 0000      # EV_KEY / KEY_LEFTALT          0
E: 3.310979 0004 0004 458979    # EV_MSC / MSC_SCAN             458979
E: 3.310979 0001 007d 0000      # EV_KEY / KEY_LEFTMETA         0
E: 3.310979 0004 0004 458866    # EV_MSC / MSC_SCAN             458866
E: 3.310979 0001 00c1 0000      # EV_KEY / KEY_F23              0
E: 3.310979 0000 0000 0000      # ------------ SYN_REPORT (0) ----------
# two finger double tap
E: 10.225976 0004 0004 458983   # EV_MSC / MSC_SCAN             458983
E: 10.225976 0001 007e 0001     # EV_KEY / KEY_RIGHTMETA        1
E: 10.225976 0000 0000 0000     # ------------ SYN_REPORT (0) ----------
E: 10.229986 0004 0004 458983   # EV_MSC / MSC_SCAN             458983
E: 10.229986 0001 007e 0000     # EV_KEY / KEY_RIGHTMETA        0
E: 10.229986 0000 0000 0000     # ------------ SYN_REPORT (0) ----------
# two finger swipe left
E: 27.934977 0004 0004 589828   # EV_MSC / MSC_SCAN             589828
E: 27.934977 0001 0113 0001     # EV_KEY / BTN_SIDE             1
E: 27.934977 0000 0000 0000     # ------------ SYN_REPORT (0) ----------
E: 27.937983 0004 0004 589828   # EV_MSC / MSC_SCAN             589828
E: 27.937983 0001 0113 0000     # EV_KEY / BTN_SIDE             0
E: 27.937983 0000 0000 0000     # ------------ SYN_REPORT (0) ----------
# two finger swipe right
E: 32.513990 0004 0004 589829   # EV_MSC / MSC_SCAN             589829
E: 32.513990 0001 0114 0001     # EV_KEY / BTN_EXTRA            1
E: 32.513990 0000 0000 0000     # ------------ SYN_REPORT (0) ----------
E: 32.516994 0004 0004 589829   # EV_MSC / MSC_SCAN             589829
E: 32.516994 0001 0114 0000     # EV_KEY / BTN_EXTRA            0
E: 32.516994 0000 0000 0000     # ------------ SYN_REPORT (0) ----------

就键映射而言,这些指的是:

$ sudo input-kbd 4 | grep -e KEY_LEFTCTL -e KEY_LEFTMETA -e KEY_TAB -e KEY_LEFTALT -e KEY_F23 -e KEY_RIGHTMETA -e BTN_SIDE -e BTN_EXTRA
0x700e2 =  56  # KEY_LEFTALT
0x700e3 = 125  # KEY_LEFTMETA
0x700e7 = 126  # KEY_RIGHTMETA
0x7002b =  15  # KEY_TAB
0x70072 = 193  # KEY_F23
0x700e2 =  56  # KEY_LEFTALT
0x700e3 = 125  # KEY_LEFTMETA
0x700e7 = 126  # KEY_RIGHTMETA
0x90004 = 275  # BTN_SIDE
0x90005 = 276  # BTN_EXTRA

双击似乎无能为力。

其他参考

如果上述鼠标不在密码数据库中,则可能会指出在错误中对类似问题的引用gnome-bluetooth。毋庸置疑,对该问题的进一步评论正式存在于该Bug报告中,但是参考文献可能有助于增加对该问题性质的一些看法。

evemu-describe /dev/input/event4FWIW 的输出。

蓝牙适配器

FWIW我使用了两个不同的USB蓝牙适配器:

$ lsusb | grep Bluetooth
Bus 007 Device 010: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
$ lsusb | grep Bluetooth
Bus 007 Device 011: ID 0a5c:21e8 Broadcom Corp. BCM20702A0 Bluetooth 4.0

2
评论不作进一步讨论;此对话已转移至聊天
米奇

所以我发现了一个问题:我认为您需要安装到Windows VM-标准Windows Logitech驱动程序,并参考vmmouse_detect实用程序。xmodmap并且xinput甚至xorg.conf在您的Kubuntu下很有用,但在Windows VM下却没有用。因此,在WinVM下,您应该能够使用Windows的标准Logitech实用程序配置鼠标。
迅速

你有解决过这个吗?
塞斯

不,它尚未修复。有想法吗?
wxl 2015年

Answers:


3

经过一番痛苦之后,我设法创建了一个有用的键映射。

首先,请注意上一个答案:

  1. Mr备份提供的fixMouse脚本不起作用,因为有时鼠标的Keyboard条目在xinput中出现了错误的名称,即在我的情况下显示为:

    ⎡ Virtual core pointer                          id=2    [master pointer  (3)]
    ...
    ⎜   ↳ Ultrathin Touch Mouse                     id=11   [slave  pointer  (2)]
    ⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    
    ...
        ↳ AT Translated Set 2 keyboard              id=12   [slave  keyboard (3)]
    

    另一方面,您可以使用input-utils中的lsinput查找正确的ID:

    lsinput 2>&1|grep -B5 "Ultrathin Touch Mouse"
    /dev/input/event12
       bustype : BUS_BLUETOOTH
       vendor  : 0x46d
       product : 0xb00d
       version : 1792
       name    : "Ultrathin Touch Mouse"
    
  2. 由于某些原因,在为鼠标转储地图时,会重复一些代码(介于0x700e0和0x700e7之间的代码),请小心查找并消除它们,否则您会发疯。

  3. 将所有键码替换为KEY_UNKNOWN可以防止出现随机字符,但会使特殊的触摸操作无用。相反,我发现您可以将某些手势重新映射为有用的组合。特别是“从左扫入”发送代码0x700e0 + 0x700e3 + 0x7002b,而“从右扫入”发送代码0x700e3 + 0x700e3 + 0x70072。我将两个手势共有的0x700e3映射到KEY_UNKNOW,以使其摆脱干扰。然后,我使用其余的键代码制作CTRL + F8(桌面网格)和ALT-F2(运行器),但是您当然可以生成任何两个键的任意组合。这是我的地图,在复制/粘贴时要小心,不要留空行和初始空格(它们会破坏input-kbd):

    0x700e3 = KEY_UNKNOWN
    0x700e0 = KEY_LEFTCTRL
    0x7002b = KEY_F8
    0x700e2 = KEY_LEFTALT
    0x70072 = KEY_F2
    0x70004 = KEY_UNKNOWN
    0x70005 = KEY_UNKNOWN
    0x70006 = KEY_UNKNOWN
    0x70007 = KEY_UNKNOWN
    0x70008 = KEY_UNKNOWN
    0x70009 = KEY_UNKNOWN
    0x7000a = KEY_UNKNOWN
    0x7000b = KEY_UNKNOWN
    0x7000c = KEY_UNKNOWN
    0x7000d = KEY_UNKNOWN
    0x7000e = KEY_UNKNOWN
    0x7000f = KEY_UNKNOWN
    0x70010 = KEY_UNKNOWN
    0x70011 = KEY_UNKNOWN
    0x70012 = KEY_UNKNOWN
    0x70013 = KEY_UNKNOWN
    0x70014 = KEY_UNKNOWN
    0x70015 = KEY_UNKNOWN
    0x70016 = KEY_UNKNOWN
    0x70017 = KEY_UNKNOWN
    0x70018 = KEY_UNKNOWN
    0x70019 = KEY_UNKNOWN
    0x7001a = KEY_UNKNOWN
    0x7001b = KEY_UNKNOWN
    0x7001c = KEY_UNKNOWN
    0x7001d = KEY_UNKNOWN
    0x7001e = KEY_UNKNOWN
    0x7001f = KEY_UNKNOWN
    0x70020 = KEY_UNKNOWN
    0x70021 = KEY_UNKNOWN
    0x70022 = KEY_UNKNOWN
    0x70023 = KEY_UNKNOWN
    0x70024 = KEY_UNKNOWN
    0x70025 = KEY_UNKNOWN
    0x70026 = KEY_UNKNOWN
    0x70027 = KEY_UNKNOWN
    0x70028 = KEY_UNKNOWN
    0x70029 = KEY_UNKNOWN
    0x7002a = KEY_UNKNOWN
    0x7002c = KEY_UNKNOWN
    0x7002d = KEY_UNKNOWN
    0x7002e = KEY_UNKNOWN
    0x7002f = KEY_UNKNOWN
    0x70030 = KEY_UNKNOWN
    0x70031 = KEY_UNKNOWN
    0x70032 = KEY_UNKNOWN
    0x70033 = KEY_UNKNOWN
    0x70034 = KEY_UNKNOWN
    0x70035 = KEY_UNKNOWN
    0x70036 = KEY_UNKNOWN
    0x70037 = KEY_UNKNOWN
    0x70038 = KEY_UNKNOWN
    0x70039 = KEY_UNKNOWN
    0x7003a = KEY_UNKNOWN
    0x7003b = KEY_UNKNOWN
    0x7003c = KEY_UNKNOWN
    0x7003d = KEY_UNKNOWN
    0x7003e = KEY_UNKNOWN
    0x7003f = KEY_UNKNOWN
    0x70040 = KEY_UNKNOWN
    0x70041 = KEY_UNKNOWN
    0x70042 = KEY_UNKNOWN
    0x70043 = KEY_UNKNOWN
    0x70044 = KEY_UNKNOWN
    0x70045 = KEY_UNKNOWN
    0x70046 = KEY_UNKNOWN
    0x70047 = KEY_UNKNOWN
    0x70048 = KEY_UNKNOWN
    0x70049 = KEY_UNKNOWN
    0x7004a = KEY_UNKNOWN
    0x7004b = KEY_UNKNOWN
    0x7004c = KEY_UNKNOWN
    0x7004d = KEY_UNKNOWN
    0x7004e = KEY_UNKNOWN
    0x7004f = KEY_UNKNOWN
    0x70050 = KEY_UNKNOWN
    0x70051 = KEY_UNKNOWN
    0x70052 = KEY_UNKNOWN
    0x70053 = KEY_UNKNOWN
    0x70054 = KEY_UNKNOWN
    0x70055 = KEY_UNKNOWN
    0x70056 = KEY_UNKNOWN
    0x70057 = KEY_UNKNOWN
    0x70058 = KEY_UNKNOWN
    0x70059 = KEY_UNKNOWN
    0x7005a = KEY_UNKNOWN
    0x7005b = KEY_UNKNOWN
    0x7005c = KEY_UNKNOWN
    0x7005d = KEY_UNKNOWN
    0x7005e = KEY_UNKNOWN
    0x7005f = KEY_UNKNOWN
    0x70060 = KEY_UNKNOWN
    0x70061 = KEY_UNKNOWN
    0x70062 = KEY_UNKNOWN
    0x70063 = KEY_UNKNOWN
    0x70064 = KEY_UNKNOWN
    0x70065 = KEY_UNKNOWN
    0x70066 = KEY_UNKNOWN
    0x70067 = KEY_UNKNOWN
    0x70068 = KEY_UNKNOWN
    0x70069 = KEY_UNKNOWN
    0x7006a = KEY_UNKNOWN
    0x7006b = KEY_UNKNOWN
    0x7006c = KEY_UNKNOWN
    0x7006d = KEY_UNKNOWN
    0x7006e = KEY_UNKNOWN
    0x7006f = KEY_UNKNOWN
    0x70070 = KEY_UNKNOWN
    0x70071 = KEY_UNKNOWN
    0x70073 = KEY_UNKNOWN
    0x70074 = KEY_UNKNOWN
    0x70075 = KEY_UNKNOWN
    0x70076 = KEY_UNKNOWN
    0x70077 = KEY_UNKNOWN
    0x70078 = KEY_UNKNOWN
    0x70079 = KEY_UNKNOWN
    0x7007a = KEY_UNKNOWN
    0x7007b = KEY_UNKNOWN
    0x7007c = KEY_UNKNOWN
    0x7007d = KEY_UNKNOWN
    0x7007e = KEY_UNKNOWN
    0x7007f = KEY_UNKNOWN
    0x70080 = KEY_UNKNOWN
    0x70081 = KEY_UNKNOWN
    0x70082 = KEY_UNKNOWN
    0x70083 = KEY_UNKNOWN
    0x70084 = KEY_UNKNOWN
    0x70085 = KEY_UNKNOWN
    0x70086 = KEY_UNKNOWN
    0x70087 = KEY_UNKNOWN
    0x70088 = KEY_UNKNOWN
    0x70089 = KEY_UNKNOWN
    0x7008a = KEY_UNKNOWN
    0x7008b = KEY_UNKNOWN
    0x7008c = KEY_UNKNOWN
    0x7008d = KEY_UNKNOWN
    0x7008e = KEY_UNKNOWN
    0x7008f = KEY_UNKNOWN
    0x70090 = KEY_UNKNOWN
    0x70091 = KEY_UNKNOWN
    0x70092 = KEY_UNKNOWN
    0x70093 = KEY_UNKNOWN
    0x70094 = KEY_UNKNOWN
    0x70095 = KEY_UNKNOWN
    0x70096 = KEY_UNKNOWN
    0x70097 = KEY_UNKNOWN
    0x70098 = KEY_UNKNOWN
    0x70099 = KEY_UNKNOWN
    0x7009a = KEY_UNKNOWN
    0x7009b = KEY_UNKNOWN
    0x7009c = KEY_UNKNOWN
    0x7009d = KEY_UNKNOWN
    0x7009e = KEY_UNKNOWN
    0x7009f = KEY_UNKNOWN
    0x700a0 = KEY_UNKNOWN
    0x700a1 = KEY_UNKNOWN
    0x700a2 = KEY_UNKNOWN
    0x700a3 = KEY_UNKNOWN
    0x700a4 = KEY_UNKNOWN
    0x700a5 = KEY_UNKNOWN
    0x700a6 = KEY_UNKNOWN
    0x700a7 = KEY_UNKNOWN
    0x700a8 = KEY_UNKNOWN
    0x700a9 = KEY_UNKNOWN
    0x700aa = KEY_UNKNOWN
    0x700ab = KEY_UNKNOWN
    0x700ac = KEY_UNKNOWN
    0x700ad = KEY_UNKNOWN
    0x700ae = KEY_UNKNOWN
    0x700af = KEY_UNKNOWN
    0x700b0 = KEY_UNKNOWN
    0x700b1 = KEY_UNKNOWN
    0x700b2 = KEY_UNKNOWN
    0x700b3 = KEY_UNKNOWN
    0x700b4 = KEY_UNKNOWN
    0x700b5 = KEY_UNKNOWN
    0x700b6 = KEY_UNKNOWN
    0x700b7 = KEY_UNKNOWN
    0x700b8 = KEY_UNKNOWN
    0x700b9 = KEY_UNKNOWN
    0x700ba = KEY_UNKNOWN
    0x700bb = KEY_UNKNOWN
    0x700bc = KEY_UNKNOWN
    0x700bd = KEY_UNKNOWN
    0x700be = KEY_UNKNOWN
    0x700bf = KEY_UNKNOWN
    0x700c0 = KEY_UNKNOWN
    0x700c1 = KEY_UNKNOWN
    0x700c2 = KEY_UNKNOWN
    0x700c3 = KEY_UNKNOWN
    0x700c4 = KEY_UNKNOWN
    0x700c5 = KEY_UNKNOWN
    0x700c6 = KEY_UNKNOWN
    0x700c7 = KEY_UNKNOWN
    0x700c8 = KEY_UNKNOWN
    0x700c9 = KEY_UNKNOWN
    0x700ca = KEY_UNKNOWN
    0x700cb = KEY_UNKNOWN
    0x700cc = KEY_UNKNOWN
    0x700cd = KEY_UNKNOWN
    0x700ce = KEY_UNKNOWN
    0x700cf = KEY_UNKNOWN
    0x700d0 = KEY_UNKNOWN
    0x700d1 = KEY_UNKNOWN
    0x700d2 = KEY_UNKNOWN
    0x700d3 = KEY_UNKNOWN
    0x700d4 = KEY_UNKNOWN
    0x700d5 = KEY_UNKNOWN
    0x700d6 = KEY_UNKNOWN
    0x700d7 = KEY_UNKNOWN
    0x700d8 = KEY_UNKNOWN
    0x700d9 = KEY_UNKNOWN
    0x700da = KEY_UNKNOWN
    0x700db = KEY_UNKNOWN
    0x700dc = KEY_UNKNOWN
    0x700dd = KEY_UNKNOWN
    0x700de = KEY_UNKNOWN
    0x700df = KEY_UNKNOWN
    0x700e1 = KEY_UNKNOWN
    0x700e4 = KEY_UNKNOWN
    0x700e5 = KEY_UNKNOWN
    0x700e6 = KEY_UNKNOWN
    0x700e7 = KEY_UNKNOWN
    0x700e8 = KEY_UNKNOWN
    0x700e9 = KEY_UNKNOWN
    0x700ea = KEY_UNKNOWN
    0x700eb = KEY_UNKNOWN
    0x700ec = KEY_UNKNOWN
    0x700ed = KEY_UNKNOWN
    0x700ee = KEY_UNKNOWN
    0x700ef = KEY_UNKNOWN
    0x700f0 = KEY_UNKNOWN
    0x700f1 = KEY_UNKNOWN
    0x700f2 = KEY_UNKNOWN
    0x700f3 = KEY_UNKNOWN
    0x700f4 = KEY_UNKNOWN
    0x700f5 = KEY_UNKNOWN
    0x700f6 = KEY_UNKNOWN
    0x700f7 = KEY_UNKNOWN
    0x700f8 = KEY_UNKNOWN
    0x700f9 = KEY_UNKNOWN
    0x700fa = KEY_UNKNOWN
    0x700fb = KEY_UNKNOWN
    0x700fc = KEY_UNKNOWN
    0x700fd = KEY_UNKNOWN
    0x700fe = KEY_UNKNOWN
    0x700ff = KEY_UNKNOWN
    0x90001 = 272  # BTN_LEFT
    0x90002 = 273  # BTN_RIGHT
    0x90003 = 274  # BTN_MIDDLE
    0x90004 = 275  # BTN_SIDE
    0x90005 = 276  # BTN_EXTRA
    

我无法为两指滑动获得正确的代码,但是我也不在乎,因为这些手势无法执行。

PS:如果您想尝试自定义其他手势,请按照以下步骤操作:

  1. 我对地图条目进行了排序,清理了重复项,并注意到它包含252个符号(外加5个按钮)。

  2. 我将前十个符号设置为KEY_A,将后十个符号设置为KEY_B,依此类推,直到最后两个符号变成KEY_Z。然后我加载了这张地图。

  3. 我在文本窗口中执行手势(或者您可以使用“ xbindkeys -mk”)并记下产生的字母。

  4. 在地图中,我将所有未生成的字母更改为KEY_UNKNOWN,其余三个字母更改为KEY_A,KEY_B,KEY_C .. KEY_Z,KEY_1 ... KEY_4,然后加载此新MAP。

  5. 我再次执行手势,注意产生的字母/数字:这是可以定义为进行特定组合键所需的代码。


2

您可以尝试input-kbdinput-utils包中使用:

$ apropos input-kbd
input-kbd (8)        - print or modify keyboard maps for input devices

使用输入设备索引(例如,4代表/dev/input/event4,可以通过lsinput它找到,该ID必须与中使用的ID有所不同xinput),您可以通过使用-f开关将文件输入文件来重新配置键盘映射,例如

$ sudo input-kbd -f some-file 4

其中some-file采用的形式scancode = keycode|keyname,其中以下是等效的:

0x0001 = KEY_F9
0x0001 = 67

您可以使用查找当前地图sudo input-kbd 4。由于您需要从中打开文件/dev,因此您确实需要使用超级用户来进行事件读取。

另请注意,尽管它的名称显然具有误导性,但它也适用于鼠标。


您可能使用了正确的机制,但是不幸的是,查看键映射表,尚不清楚要更改哪些扫描码,特别是考虑到某些键名是完全未定义的。也许,如果您能找到找出键名定义的机制,那将很有帮助。+1可以拉近距离。
wxl

如果将所有KEY_ *都映射到0或KEY_UNKNOWN值之一(例如240),会发生什么?还是会禁用您要保留的某些手势?要生成新地图,您可以通过传递当前地图awk '/KEY_/ { $3 = 240 } { print }'
Elmicha 2015年

我想这个问题是,我在哪里可以找到的定义KEY_UNKNOWN,或为此事,BTN_EXTRA
wxl 2015年

您可以使用sudo input-events 4查看哪个鼠标按钮。KEY_UNKNOWN(希望如此)不会打印或触发任何操作。
Elmicha 2015年

1
密钥名称的定义在/usr/include/linux/input.h中,该名称指出这些名称是在USB HUT 1.12之后建模的,USB HUT 1.12表示密钥代码232-65535是“保留的”。input-kbd使用name.sh那里来反转键名->代码映射,以使input_kbd可以打印键码的名称。
Elmicha 2015年

2

要禁用手势,可以使用evdev驱动程序更改按钮映射,以使最后6个“按钮”都被禁用,如下所示:

  1. 将以下内容附加到/usr/share/X11/xorg.conf.d/10-evdev.conf/etc/X11/xorg.conf.d/10-evdev.conf取决于您拥有的内容:

    # custom for Logitech Ultrathin Touch mouse
    
    Section "InputDevice"
        Identifier "Logitech bluetooth Touch Mouse"
        Driver "evdev"
        Option "Name"   "Ultrathin Touch Mouse"
        Option "ButtonMapping" "1 2 3 4 5 6 7 0 0 0 0 0 0"
    EndSection
    
    Section "InputClass"
        Identifier  "Ultrathin Touch Mouse"
        Option "ButtonMapping" "1 2 3 4 5 6 7 0 0 0 0 0 0"
    EndSection
  2. 使用以下命令重新启动X服务器sudo service lightdm restart

  3. 确认 xinput --get-button-map "Ultrathin Touch Mouse"

您可以根据需要更改的值InputDevice Identifier,但务必将InputDevice Name和的值保留InputClass Identifier为“ Ultrathin触摸鼠标”,因为这是xinput识别它的方法。

经过Mac版T631测试。

如果您想了解更多信息evdev,Joe Shaw的这篇博客文章特别了解如何使其适合整个输入堆栈。


这可能是一个很好的解决方案。但是,我讨厌使用X配置文件,尤其是全局定义的配置文件。某些升级路径将覆盖这些路径,这是不理想的。此外,这并不理想,因为尚不清楚如何重新映射键。我并不是说这不是一个有效的解决方案,但是当涉及到赏金时,其他答案可能会胜出。☺最后,令人遗憾的是,没有重新启动就无法实现。也许您能找到evdev直接处理的方法,那可能很好,但是我没有发现。
wxl 2015年

恭喜,我认为您要求太多。但是无论如何,我并没有发布赏金计划,只是为了帮助那些有类似问题的人。如果他们对解决方案的约束比您少,那么对他们来说应该是有用的。就是说,我确定如果您要重新启动X,则无需重新启动就可以达到相同的结果。只会有点混乱。但是我听到有关升级的消息。我必须非常小心,不要在更新过程中破坏内容。
steev 2015年

1
恭喜,我同意,但我的希望始终是提供帮助,而不仅仅是我自己。话虽这么说,我非常感谢您的回答,这就是我为此+1的原因!
wxl

好吧,恭喜,因为您的实际工作;)
wxl

1
天哪,我错了。它似乎表现良好,但是我没有真正进行测试evemu-record。不起作用:(
wxl 2015年

1

我设法使用xbindkeys配置了“向左滑动”和“向右滑动”手势;这也可能适用于两指滑动,但是我并没有打扰那些手指,因为我发现它们仍然很难执行。

这是我的.xbindkeysrc

    #Right edge swipe (Send Alt+F2)
    "xte 'keydown Alt_L' 'key F2' 'keyup Alt_L'"
     Alt+Mod4+XF86TouchpadOff
    #Left edge swipe (Send CTRL+F8)
    "xte 'keydown Control_L' 'key F8' 'keyup Control_L'"
     Control+Mod4 + Tab

我已经将它们映射到有用的KDE快捷方式,当然您可以执行其他任何操作。您需要在登录时运行xbindkeys,正如所有xbindkeys教程中所述,我已经创建了.desktop文件:

    #./.config/autostart/xbindkeys.desktop
    [Desktop Entry]
    Comment[en_GB]=
    Comment=
    Exec=xbindkeys
    GenericName[en_GB]=
    GenericName=
    Icon=system-run
    MimeType=
    Name[en_GB]=
    Name=
    Path=
    StartupNotify=true
    Terminal=false
    TerminalOptions=
    Type=Application
    X-DBUS-ServiceName=
    X-DBUS-StartupType=
    X-KDE-SubstituteUID=false
    X-KDE-Username=

高温超导


1

我对这件事感到沮丧,因为尽管提供了所有解决方案,包括实际编写X输入代码的人提供的解决方案,但我始终无法使它起作用。也就是说,我走开了它,只是使用了普通的有线鼠标。

昨天,我找到了Ultrathin,并决定再次尝试一下它,它就是Just Works™。至少在某种意义上说这是正确的,原因是这个问题的原因是这些手势以奇怪的方式被解释并且弄乱了我的工作流程。现在它们似乎没有任何实际效果,只不过左边缘滑动使我可以在Firefox中最后使用的选项卡之间交换。

奇怪的是,手势实际上并没有被禁用。所有13个“按钮”均由返回xinput --get-button-map "Ultrathin Touch Mouse"。也grep Ultrathin /usr/share/X11/xorg.conf.d不会返回任何内容。没有与相关的NoSymbols(也没有相关的VoidSymbol),xkbcomp也没有与相关的KEY_UNKNOWNs input-kbd

另一方面,evemu-record除了双击手势被视为简单BTN_LEFT事件外,其他所有内容都相同。

就是说,与此相关的事情已经发生了变化,但是我不确定是什么。

另外,我还没有测试过重新映射的内容,但这实际上不在原始问题的范围内。


0

我已经阅读了所有答案,并围绕input-kbd(input-utils的一部分)编写了一个脚本来自动修复此问题。

您应该在每次登录后从该存储库中运行fixMouse 。它会:

  1. 听这只老鼠的dbus
  2. 所有击键配置为KEY_UNKNOWN

标准鼠标功能(向左键;滚动等)仍然可以正常工作。只停止怪异的键盘键。

它可以幸免于暂停,蓝牙睡眠,鼠标开启等。

这个对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.