[ @manjaro @mouse @xbindkeys @xev @xdotool ]
У меня мышь с дополнительными клавишами. Хочу одну из них назначить на дабл-клик.
Это инструкция для Manjaro. См. то же для Debian — Common:Hardware:Мышь:Управление клавишами мыши
Это дело может быть очень простым, а может оказаться невероятно сложным с далеко идущими последствиями. У меня получилось распознать дополнительную клавишу на мышке и назначить на неё простое действие (открывать новое окно Konsole). Но когда я начал искать возможность назначить даблклик, выяснилось, что команда, которая идентифицирует клавишу, задействует клавишу Win с клавиатуры, а у меня эта Win назначена на вызов с клавиатуры символов третьего ряда, и поломалось сразу две функциональности – и вызов символов третьего ряда, и даблклик.
А после перезагрузки системы дополнительная кнопка на мышке работает как "Свернуть/Развернуть все окна"…
Простой сценарий
- Поставить дополнительный софт
- xbindkeys
- xorg xev
- xdottool
Установка:
sudo pacman -Syu xbindkeys xorg-xev xdotool
Общепринято переназначать действия кнопок через утилиту “xdotool”. Также есть утилита “xte” (отдельно не существует, устанавливается только через пакет “xautomation”, и “xvkbd” (если не ошибаюсь, это из RedHat).
- В терминале запустить “xev” для опознания клавиш на мышке
xev | grep ', button'
Откроется маленькое окно для захвата действий мыши. Каждый клик с мыши будет зарегистрирован в журнале событий и отображён на экране.
root 0x6a8, subw 0x4e00002, time 9051645, (64,24), root:(923,501),
state 0x10, button 1, same_screen YES
Обычно первая кнопка определяется как “button 1”.
Если всё работает именно так, и на экране возникнет номер дополнительной кнопки, то задача почти решена. Иногда это не срабатывает.
- Добавить изменения в/usr/include/X11/keysymdef.h конфиг
Сбросить настройки xbindkeys в default в файл "~/.xbindkeysrc" (обычно он не существует и его надо создать):
xbindkeys --defaults > ~/.xbindkeysrc
- Загрузить в систему новые настройки (прочитать их из нового файла):
xbindkeys -f ~/.xbindkeysrc
- Открыть файл "~/.xbindkeysrc" и добавить новые настройки.
mcedit ~/.xbindkeysrc
Что именно добавить – зависит от ситуации. Вот примеры с использованием “xdtool” — здесь в каждом случае вызывается “xdotool” с какими-то параметрами. Список возможных команд для xdtool см. в файле "/usr/include/X11/keysymdef.h". Файл на 2500 строк, открывать его через cat нет смысла – сразу через mcedit.
Вместо “xdtool” можно написать название утилиты вроде kcalc или путь к исполняемому sh-файлу.
# Mouse Button Forward -- #8 # Show main menu "xdotool key super" b:8 # Mouse Button Back -- #9 # Show all applications "xdotool key super+a" b:9
# запустить новое окно Konsole по “Ctrl + правая кнопка мыши” "konsole"
# запустить новое окно Firefox по “Ctrl + Alt + f” "firefox"
Некоторые действия лучше назначать на момент, когда клавиши «отпускают» — “release+control+alt + f”.
Также есть мнение, что команды можно снабжать указанием местоположения курсора на экране в момент клика (нулевой пиксель, так сказать):
m:0x0 + control + b:3
Даблклик
xdotool click --repeat 2 1
Здесь “2” — количество повторов, а “1” — номер кнопки на мыши (левая).
- Перезапустить xbindkeys
Тут можно застрять надолго, поэтому удобно будет сразу открывать файл с настройками:
killall xbindkeys && xbindkeys -f ~/.xbindkeysrc && mcedit /home/astenix/.xbindkeysrc
Сложный сценарий
Бывают ситуации и посложнее. Например, на моей мыши нажатие дополнительной кнопки в сокращённом логе “xev | grep ', button'” не отображается. А в полном логе видно вот это:
- Кнопка нажата
KeyPress event, serial 40, synthetic NO, window 0x4c00001,
root 0x6a8, subw 0x4c00002, time 9767181, (56,41), root:(915,518),
state 0x10, keycode 133 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 40, synthetic NO, window 0x4c00001,
root 0x6a8, subw 0x4c00002, time 9767181, (56,41), root:(915,518),
state 0x90, keycode 40 (keysym 0xb0, degree), same_screen YES,
XLookupString gives 2 bytes: (c2 b0) "°"
XmbLookupString gives 2 bytes: (c2 b0) "°"
XFilterEvent returns: False
- Кнопка отжата
KeyRelease event, serial 41, synthetic NO, window 0x4c00001,
root 0x6a8, subw 0x4c00002, time 9767413, (56,41), root:(915,518),
state 0x90, keycode 133 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 41, synthetic NO, window 0x4c00001,
root 0x6a8, subw 0x4c00002, time 9767413, (56,41), root:(915,518),
state 0x10, keycode 40 (keysym 0x64, d), same_screen YES,
XLookupString gives 1 bytes: (64) "d"
XFilterEvent returns: False
Можно и так
xbindkeys --multikey
Дополнительная кнопка на моей мыши отображается так:
"(Scheme function)"
m:0x90 + c:133
Mod2+Mod5 + ISO_Level3_Shift
"(Scheme function)"
m:0x10 + c:40
Mod2 + d
The first line represents a command (.
The second line contains the state (0x8) and keycode (32) as reported by the tool xev.
The third line contains the keysyms associated with the given keycodes.
https://wiki.archlinux.org/title/Xbindkeys
Похоже, что это нажатие по кнопке и её возвращение.
Понятно только то, что дополнительная клавиша отзывается так:
keycode 133 (keysym 0xfe03, ISO_Level3_Shift)
В файле “~/.xbindkeysrc” её можно указать как “c:133”.
# запустить новое окно Konsole по “Ctrl + правая кнопка мыши” "konsole"
Есть проблема. После прописывания настроек полезно вызвать окно со списком забинденных клавиш (Ctrl+Shift+q) или это можно сделать в консоли “xbindkeys -s”.
Вызов кнопки “c:133” всегда сопровождается дополнительной командой. На картинке видно, что сразу после вызова “c:133” отображается ещё одно сочетание клавиш — “Control + Super_L”.

А “Super_L” это левая кнопка “Win”. И если нажать “Ctrl + Win” то откроется новое окно Konsole, как и прописано в файле.
Можно указать команду 0xfe03, ISO_Level3_Shift)”
Для отлова клика кнопки можно задействовать gui-приложение:
sudo pacman -Syu xbindkeys_config-gtk2
Запускается по ”xbindkeys_config”. Содержимое окна взято из уже знакомого нам файла “~/.xbindkeysrc”, а любые изменения будут записаны в него же.
А можно запустить только детектор кнопки мыши:
xbindkeys --key
Инструкция:
Press combination of keys or/and click under the window. You can use one of the two lines after "NoCommand" in $HOME/.xbindkeysrc to bind a key.
В моём случае отловилось это:
"(Scheme function)" m:0x90 + c:133 Mod2+Mod5 + ISO_Level3_Shift
Ок, будем считать, что нажатие нужной мне кнопки определяется как “Mod2+Mod5 + ISO_Level3_Shift”.