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

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

[ @manjaro @hardware @mouse @xbindkeys @xev @xdotool @изображения ]

 


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


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


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


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


sudo aptitude install xbindkeys xdotool


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.


Ещё нужна утилита ’xev’, но похоже, что она уже установлена в составе какого-то другого пакета. Ну ок.


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


Опознать клавиши на мышке


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”.


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


Но если на этом шаге дополнительные кнопки мыши не распознаются, следует перейти к сложному сценарию.


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


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


xbindkeys --defaults > ~/.xbindkeysrc


Загрузить в систему новые настройки xbindkeys


Прочитать их из нового файла:


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"

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” — номер кнопки на мыши (левая).


Перезапустить 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



Похоже, что нам в логе записали нажатие по кнопке и её возвращение в исходное состояние.


Понятно только то, что дополнительная клавиша отзывается так:


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”.