Как правильно сопоставить клавиатуру с кнопкой мыши?

5874
Hubro

Резюме вопроса: я хочу, чтобы одна из моих кнопок мыши была зарегистрирована в Super_LX11 как левая кнопка Windows .


В моем оконном менеджере я могу перемещать окна, удерживая «левую кнопку Windows» (Left Super) и перетаскивая окно левой кнопкой мыши. Я хочу сделать это без прикосновения к клавиатуре, поэтому я хочу сопоставить левую супер-клавишу с кнопкой мыши 11, чтобы я мог удерживать кнопку мыши 11 и нажимать + перетаскивать окна.

Наиболее очевидным решением является использование xbindkeys и xte следующим образом ( .xbindkeysrc):

"xte 'keydown Super_L'" b:11  "xte 'keyup Super_L'" b:11 + release 

Это работает так:

  • Когда я нажимаю кнопку мыши 11, Super_Lтакже нажимается вниз
  • Когда я отпускаю кнопку мыши 11, Super_Lтакже отпускается

Но есть проблема: я не могу перемещать окна с помощью Super_L+, Mouse1если я также удерживаю другую кнопку мыши, например, кнопку мыши 11. Используя приведенное выше решение, кнопка мыши 11 по-прежнему регистрируется как нажатая и отпущенная, и поэтому ни одно из работа оконного менеджера.

Я пробовал это использовать Cinnamon и Awesome WM, и абсолютно ни одна из Super_Lкомбинаций клавиш не работает, пока нажата кнопка мыши 10 или 11.

Неподходящий хак

В настоящее время я работаю над этой проблемой, заставляя щелчок мыши 11 удерживать Super_Lкнопку в течение определенного времени. Таким образом, я могу нажать кнопку мыши, а затем перетаскивать вещи вокруг на короткое время:

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'" b:11 

Еще одна попытка

Как предположил тотти, я попробовал эту xbindkeysконфигурацию:

"xte 'mouseup 10' 'keydown Super_L'" b:10  "xte 'keyup Super_L'" b:10 + Release 

Не работает Кажется, что Super_Lклавиша удерживается нажатой, потому что как только я отпускаю кнопку 10, она остается нажатой навсегда (пока я Super_Lснова не нажму клавишу на клавиатуре), но кнопка мыши все еще регистрируется, потому что я не могу щелкать и перетаскивать окна, Я не думаю, что смогу сделать эту работу, используя xbindkeysи xte.

12
Вместо привязки кнопки мыши к супер-ключу, сделайте переназначение. Для этого используйте ** xmodmap **. см. страницу arch wiki xmodmap для полной настройки. totti 9 лет назад 1
@totti: Страница xiki-карты arch wiki описывает, как сопоставить клавиши с другими клавишами, как поменять местами клавиши-модификаторы и как отменить прокрутку, но не упоминает отображение клавиш клавиатуры на кнопки мыши. Hubro 9 лет назад 0
@totti: С помощью xmodmap я могу сопоставить клавиши другим клавишам, а с расширением XKB для X (и xkbset) я могу сопоставить кнопки мыши с клавишами клавиатуры, но я пытаюсь сопоставить клавиатуру с кнопкой мыши. Я до сих пор не нашел способ сделать это. Hubro 9 лет назад 0
попробуйте: при удержании кнопки 11 мыши имитируйте супер удержание + отпускание кнопки 11 мыши. Менеджер окон теперь может обнаруживать super & mouse 1, а не mouse 11. totti 9 лет назад 0
@totti: пробовал и редактировал вопрос Hubro 9 лет назад 0
Поддерживает ли `compiz config setting manager` ваш оконный менеджер? totti 9 лет назад 0
Можете ли вы запустить скрипт по щелчку мыши? totti 9 лет назад 0
@totti: да, я могу Hubro 9 лет назад 0
Я на самом деле ищу подобный хак для повторного связывания кнопок Thinkpad 3 для запуска событий клавиатуры. Я также узнал "xbindkeys" самостоятельно. До сих пор не повезло? zmo 7 лет назад 0
Альтернативная удобная функция - это возможность перемещать окна, перемещая маленькие прямоугольники, которые появляются в настольном пейджере Plasma. С другой стороны, подходит ли решение в [этой теме] (http://askubuntu.com/questions/627555/how-to-map-modifiers-eg-ctrl-to-mouse-thumb-buttons-using-xbindkeys) твой случай? harrymc 7 лет назад 0
В моем комментарии выше [этот ответ] (http://askubuntu.com/a/717658) делает именно то, что вы хотите, и не страдает от того, что xbindkeys захватывает всю мышь. Посмотри, подходит ли оно твоему делу. harrymc 7 лет назад 0
Спасибо @harrymc, твоя ссылка очень помогла, и я знаю, что получил рабочее решение! Если вы сделаете ответ, чтобы дать основные элементы, я дам вам награду ;-) zmo 7 лет назад 0
Сделано в соответствии с просьбой. harrymc 7 лет назад 0

4 ответа на вопрос

5
harrymc

В сообщении аскубунту содержится ответ, который я кратко изложу ниже.

Проблема в том, что xbindkeys захватывает всю мышь, что делает неопределенными модификаторы + отображение щелчков мыши. В ответе используется uinput через скрипт python-uinput для отслеживания /dev/my-mouseнажатия кнопки большого пальца и отправки Ctrlключа на виртуальную клавиатуру. Вот подробные шаги:

1. Сделать правила Udev

Для мыши файл /etc/udev/rules.d/93-mxmouse.conf.rules:

KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input",  ATTRS=="Logitech Performance MX", SYMLINK+="my_mx_mouse",  GROUP="mxgrabber", MODE="640" 

Udev будет искать устройства ядра с такими именами, как event5. SYMLINK предназначен для поиска мыши /dev/my_mx_mouse, читаемой группой mxgrabber.

Чтобы найти информацию об оборудовании, запустите что-то вроде:

udevadm info -a -n /dev/input/eventX 

Для uinput, файл /etc/udev/rules.d/94-mxkey.rules:

KERNEL=="uinput", GROUP="mxgrabber", MODE="660" 

Отключите и подключите мышь, или заставьте udev вызывать правила с помощью udevadm trigger.

2. Активируйте модуль UINPUT

sudo modprobe uinput 

И в /etc/modules-load.d/uinput.conf:

uinput 

3. Создать новую группу

sudo groupadd mxgrabber sudo usermod -aG mxgrabber your_login 

4. Python скрипт

Установите python-uinput libraryи python-evdev library.

Приведенный ниже скрипт требует идентификации event.code кнопки:

#!/usr/bin/python3.5 # -*- coding: utf-8 -*-  """ Sort of mini driver. Read a specific InputDevice (my_mx_mouse), monitoring for special thumb button Use uinput (virtual driver) to create a mini keyboard Send ctrl keystroke on that keyboard """  from evdev import InputDevice, categorize, ecodes import uinput  # Initialize keyboard, choosing used keys ctrl_keyboard = uinput.Device([ uinput.KEY_KEYBOARD, uinput.KEY_LEFTCTRL, uinput.KEY_F4, ])  # Sort of initialization click (not sure if mandatory) # ( "I'm-a-keyboard key" ) ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)  # Useful to list input devices #for i in range(0,15): # dev = InputDevice('/dev/input/event{}'.format(i)) # print(dev)  # Declare device patch. # I made a udev rule to assure it's always the same name dev = InputDevice('/dev/my_mx_mouse') #print(dev) ctrlkey_on = False  # Infinite monitoring loop for event in dev.read_loop(): # My thumb button code (use "print(event)" to find) if event.code == 280 : # Button status, 1 is down, 0 is up if event.value == 1: ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1) ctrlkey_on = True elif event.value == 0: ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0) ctrlkey_on = False 

5. Отделка

Сделайте файл Python исполняемым и убедитесь, что он загружается при запуске.

Я обновил скрипт, чтобы назначить неиспользуемый код клавиши для кнопок мыши (я установил их на `F13`,` F14` и `F15` и отключил функции мыши с помощью` xinput`. Затем я могу просто переназначить эти клавиши на все, что мне нужно, с помощью простого `xmodmap`. Основная идея составлена ​​в [a gist] (https://gist.github.com/guyzmo/12c07a3686282f5896bb2852d9fc204b) (есть некоторые жестко заданные значения, и я не восстанавливаю мышь` xinput` функции), я напишу об этом в блоге с окончательной версией скрипта (и поделюсь ссылкой здесь, когда это будет сделано. Спасибо за вашу помощь! ☺ ♥ zmo 7 лет назад 0
Также проверьте мой новый ответ на другой ветке для решения на основе x11 http://askubuntu.com/a/903389/269589 Maxim 7 лет назад 0
1
totti

Поскольку вы можете запустить скрипт одним щелчком мыши, вы можете использовать следующий трюк.
1. Нажмите кнопку 11, чтобы держать в супер ключ . ( Кнопка 11 запускает скрипт).
2. Перемещайте окна, используя другие кнопки мыши.
3. Снова нажмите кнопку мыши 11, чтобы отпустить супер-клавишу.


Использование скриптаxdotool для удержания суперключа
При первом нажатии кнопки создайте временный файл и удерживайте клавишу. При следующем нажатии удалите файл tmp и отпустите ключ,

Обновить

Согласно справочной странице Ubuntu (многие кнопки мыши, как) imwheelможно переназначить на ключ.

Пара проблем с этим: # 1 Это еще один хак / обходной путь, и он не отвечает на вопрос. # 2 xbindkeys не работает, пока нажата супер-клавиша. Как будто xbindkeys поставлен на паузу и ничего не регистрирует, пока не будет отпущен супер ключ. Hubro 9 лет назад 0
Хорошо, примерно через 5 минут исследования я убираю пункт № 2. Я, очевидно, должен добавить `+ Mod4` в моей конфигурации xbindkeys, чтобы учесть, что супер-ключ удерживается. Обходной путь, который вы предлагаете, лучше моего, и я переключаюсь на него :-) Но он все еще не отвечает на вопрос. Hubro 9 лет назад 0
1
Dmitry Grigoryev

Предложение по отладке: я бы попытался отслеживать /dev/input/eventXфайл, чтобы увидеть, какие события генерируются при нажатии и отпускании этой кнопки, особенно в комбинации с BTN_LEFT. Вот пример кода, с которого можно начать. Вам, очевидно, придется изменить его, чтобы регистрировать все события, а не только нажатия клавиш.

Вы также можете проверить xevвывод, если вы еще этого не сделали. Анализ обоих журналов должен выявить точную проблему, с которой вы столкнулись.

Скорее всего, ваша мышь генерирует дополнительные события отпускания кнопок при нажатии нескольких кнопок. В этом случае ваши варианты будут использовать обходные пути привязки клавиш или изменить xf86-input-evdevбиблиотеку для фильтрации нежелательных событий (или имитировать пропущенные). Некоторое время назад я делал нечто подобное для сенсорного экрана, который генерировал события «щелчка» при попытке перетаскивания. Идея состояла в том, чтобы отфильтровать события «выпуска», которые происходили почти одновременно (в пределах небольшого временного окна), с событиями «щелчка». Если мое предположение верно, вам, по сути, нужно реализовать нечто подобное.

1
DreadPirateLynx

Я понял это ранее сегодня с другими ключами-модификаторами. Проблема в том, что вы должны включить модификатор в комбинацию кнопок для выпуска. Предполагая, что ваш Супер ключ сопоставлен с Mod4 (который должен быть по умолчанию, afaik):

"xte 'keydown Super_L'" b:11  "xte 'keyup Super_L'" Mod4 + b:11 + release 

РЕДАКТИРОВАТЬ: Просто понял, что это не полностью отвечает на ваш вопрос, так как вы все еще не сможете использовать ЛКМ, удерживая нажатой b: 11