[ Пред. ] [ Содержание ] [ След. ]

Управление клавишами мыши

[ @manjaro @mouse @xbindkeys @xev @xdotool ]

 


У меня мышь с дополнительными клавишами. Хочу одну из них назначить на дабл-клик.


Это инструкция для Manjaro. См. то же для Debian — Common:Hardware:Мышь:Управление клавишами мыши


Это дело может быть очень простым, а может оказаться невероятно сложным с далеко идущими последствиями. У меня получилось распознать дополнительную клавишу на мышке и назначить на неё простое действие (открывать новое окно Konsole). Но когда я начал искать возможность назначить даблклик, выяснилось, что команда, которая идентифицирует клавишу, задействует клавишу Win с клавиатуры, а у меня эта Win назначена на вызов с клавиатуры символов третьего ряда, и поломалось сразу две функциональности – и вызов символов третьего ряда, и даблклик.


А после перезагрузки системы дополнительная кнопка на мышке работает как "Свернуть/Развернуть все окна"…


Простой сценарий


  1. Поставить дополнительный софт

a tiny wrapper for Xorg's xev that reports key-codes.

a small utility for Xorg that retrieve the mouse and keyboard events.

a lightweight system utility which simulates or fake keyboard and mouse inputs.


Установка:


sudo pacman -Syu xbindkeys xorg-xev xdotool


Общепринято переназначать действия кнопок через утилиту “xdotool”. Также есть утилита “xte” (отдельно не существует, устанавливается только через пакет “xautomation”, и “xvkbd” (если не ошибаюсь, это из RedHat).


  1. В терминале запустить “xev” для опознания клавиш на мышке

xev | grep ', button'


Откроется маленькое окно для захвата действий мыши. Каждый клик с мыши будет зарегистрирован в журнале событий и отображён на экране.




Можно запустить почти то же самое, но в чуть более расширенном виде:


xev -event button


Можно запустить “xev” целиком, но полный лог каждого движения мыши больше путает, нежели помогает. Будет вот такое:


ButtonPress event, serial 40, synthetic NO, window 0x4e00001,
root 0x6a8, subw 0x4e00002, time 9051645, (64,24), root:(923,501),
state 0x10, button 1, same_screen YES


вместо простого


state 0x10, button 1, same_screen YES




Обычно первая кнопка определяется как “button 1”.


Кнопка "2" — колесо мыши.


Правая кнопка мыши будет определяться как “button 3”.


Если всё работает именно так, и на экране возникнет номер дополнительной кнопки, то задача почти решена. Иногда это не срабатывает.


  1. Добавить изменения в/usr/include/X11/keysymdef.h конфиг

Сбросить настройки xbindkeys в default в файл "~/.xbindkeysrc" (обычно он не существует и его надо создать):


xbindkeys --defaults > ~/.xbindkeysrc


  1. Загрузить в систему новые настройки (прочитать их из нового файла):

xbindkeys -f ~/.xbindkeysrc


  1. Открыть файл "~/.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"

control + b:3


# запустить новое окно Firefox по “Ctrl + Alt + f”
"firefox"

control+alt + f


Некоторые действия лучше назначать на момент, когда клавиши «отпускают» — “release+control+alt + f”.


Также есть мнение, что команды можно снабжать указанием местоположения курсора на экране в момент клика (нулевой пиксель, так сказать):


m:0x0 + control + b:3


Даблклик


xdotool click --repeat 2 1


Здесь “2” — количество повторов, а “1” — номер кнопки на мыши (левая).


  1. Перезапустить xbindkeys

Тут можно застрять надолго, поэтому удобно будет сразу открывать файл с настройками:


killall xbindkeys && xbindkeys -f ~/.xbindkeysrc && mcedit /home/astenix/.xbindkeysrc

Сложный сценарий


Бывают ситуации и посложнее. Например, на моей мыши нажатие дополнительной кнопки в сокращённом логе “xev | grep ', button'” не отображается. А в полном логе видно вот это:


  1. Кнопка нажата

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


  1. Кнопка отжата

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"

control + c:133


Есть проблема. После прописывания настроек полезно вызвать окно со списком забинденных клавиш (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”, а любые изменения будут записаны в него же.


ОСТОРОЖНО с сохранением настроек из этого окна. Приложение перезапишет всё содержимое файла “~/.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”.