Я хотел бы переназначить "кнопку Windows" на MS Sculpt Comfort Mouse на другую кнопку (например, кнопку "Назад") на моем компьютере с Linux (Linux Mint 18.2 "Sonya").

Согласно xinput list , мышь распознается как указательное устройство (id = 12).

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Microsoft Sculpt Comfort Mouse            id=12   [slave  pointer  (2)]
⎜   ↳ FocalTechPS/2 FocalTech FocalTech Touchpad    id=15   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=9    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=10   [slave  keyboard (3)]
    ↳ USB2.0 UVC HD Webcam                      id=11   [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]

В соответствии с xinput test 12 клавиша Super_L (код клавиши 133) генерируется мышью при нажатии на кнопку "кнопка Windows".

key press   133 
key release 133 

Теперь мне нужно переназначить ключ для этого конкретного устройства на другой ключ. Я бы сделал это с помощью инструмента setxkbmap (описанного в разделе Как переназначить клавиши в Linux только для конкретной клавиатуры).

Мой сценарий выглядит следующим образом:

remote_id=$(
    xinput list | sed -n 's/.*Microsoft Sculpt Comfort Mouse.*id=\([0-9]*\).*/\1/p'
)
[ "$remote_id" ] || exit

# remap Windows button on MS Sculpt Mouse to Back button

mkdir -p /tmp/xkb/symbols
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
    key <LWIN> { [ XF86Back ]        };
};
EOF

setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Я также попробовал аналогичный подход, описанный в Remap/ изменить ваши вторичные / USB-клавиатуры. Пытался поменять коды например. для <LWIN> и <VOL+> . Но безуспешно, клавиша Windows мыши все равно интерпретируется как клавиша Windows

Затем я попытался переназначить клавишу Windows (поменять местами) на клавиатуре USB (id = 9), используя второй подход (чистый xkbcomp), и это сработало, НО также изменил поведение кнопки мыши аналогичным образом (независимо от того, как была кнопка отображается для мыши). Странно то, что когда я нажимаю кнопку Windows на встроенной клавиатуре ноутбука (не переназначается), а затем на мыши, она интерпретируется как кнопка Windows. Когда я нажимаю кнопку Windows на клавиатуре USB (переназначается на VOL+), а затем на мышь, она интерпретируется как VOL+. Может быть связано с ошибкой 91571 - xkb, установленный через xkbcomp, похоже, не применяется к -i (или не привязывается, если используется на обычном устройстве).

К сожалению, я не могу переназначить кнопку только для конкретного устройства.

1) Может ли инструмент xkbcomp корректно работать только с устройствами «подчиненная клавиатура»? (Не с указателем раба)

2) Есть ли способ рассматривать эту мышь как «подчиненную клавиатуру»?

3) Или есть другой способ переназначить «кнопку Windows» только для этого конкретного устройства (а не для основной клавиатуры USB)?

1 ответ1

2

Отвечая на мой собственный вопрос № 3: udev может это сделать. Мой файл /etc/udev/hwdb.d/10-ms-sculpt-back.hwdb :

# remap MS Sculpt Comfort Mouse (Bluetooth) Windows key to Back key
evdev:input:b0005v045Ep07A2*
 KEYBOARD_KEY_700e3=back

Благодаря сопоставлению кодов сканирования с кодами клавиш и как найти заголовок .hwdb обычного устройства ввода?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .