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

14

Резюме вопроса: я хочу, чтобы одна из моих кнопок мыши была зарегистрирована в 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.

Hubro
источник
1
Вместо привязки кнопки мыши к супер-ключу, сделайте переназначение. Для этого используйте xmodmap . см. страницу arch wiki xmodmap для полной настройки.
Тот,
@totti: страница arch wiki xmodmap описывает, как сопоставить клавиши с другими клавишами, как поменять местами клавиши-модификаторы и как отменить прокрутку, но не упоминает отображение клавиш клавиатуры на кнопки мыши
Hubro
@totti: С помощью xmodmap я могу сопоставить клавиши другим клавишам, а с расширением XKB для X (и xkbset) я могу сопоставить кнопки мыши с клавишами клавиатуры, но я пытаюсь сопоставить клавиатуру с кнопкой мыши. Я до сих пор не нашел способ сделать это.
Hubro
попробуйте: при удержании кнопки 11 мыши имитируйте супер удержание + отпускание кнопки 11 мыши. Оконный менеджер теперь может определять super & mouse 1, а не mouse 11.
Тот
@totti: пробный и отредактированный вопрос
Hubro

Ответы:

5

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

Проблема в том, что 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{name}=="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 и убедитесь, что он загружается при запуске.

harrymc
источник
Я обновил скрипт назначить неиспользуемый код ключа к кнопкам мыши (я поставил их F13, F14и F15, и отключение функции мыши с помощью xinput. Тогда я просто переназначить эти ключи к тому , что мне нужно , используя простой xmodmap. Основная идея составлен В сущности (есть некоторые жестко закодированные значения, и я не восстанавливаю xinputфункцию мыши после этого), я сделаю сообщение в блоге об этом с окончательной версией скрипта (и поделюсь ссылкой здесь, когда это будет сделано. Спасибо Вы за вашу помощь!
z
Также проверьте мой новый ответ на другой ветке для решения на основе x11 askubuntu.com/a/903389/269589
Максим
1

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


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

Обновить

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

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

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

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

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

Дмитрий Григорьев
источник
1

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

"xte 'keydown Super_L'"
  b:11

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

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

DreadPirateLynx
источник