Як Я МОЮ ВІДПОВІДНО зіставити клавішу клавіатури на кнопку миші?


14

Підсумок запитання: Я хочу, щоб одна з моїх кнопок миші була зареєстрована як ліва кнопка Windows Super_Lна X11.


У своєму вікні менеджера я можу переміщувати вікна навколо, утримуючи «ліву кнопку Windows» (ліва супер) та перетягуючи вікно лівою кнопкою миші. Я хочу бути в змозі зробити це, не торкаючись клавіатури, тому хочу картувати ліву клавішу Супер на кнопку миші 11, щоб я міг утримувати кнопку 11 миші та натиснути + перетягнути вікна.

Найбільш очевидним рішенням є використання xbindkeys та xte на зразок цього ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Це працює так:

  • Коли я натискаю кнопку миші 11, Super_Lтакож натискаємо вниз
  • Коли я відпускаю кнопку 11 миші, Super_Lтакож відпускається

Але є проблема: я не можу переміщувати Windows за допомогою Super_L+, Mouse1якщо я також утримую іншу кнопку миші, як-от кнопку миші 11. Використовуючи рішення вище, кнопка 11 миші все ще реєструється як натиснута та відпущена, і тому жодна з працюють оператори вікна.

Я спробував це , використовуючи як кориця і Приголомшливі WM, і абсолютно ні один з Super_Lроботи комбінації клавіш , утримуючи кнопку миші 10 або 11 проходить вниз.

Subpar хак

Я зараз працюю над цією проблемою, викликаючи натискання миші 11, щоб утримувати Super_Lкнопку протягом певного часу. Таким чином я можу натиснути кнопку миші, а потім на короткий період перетягнути речі:

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

Ще одна спроба

Як запропонував totti, я спробував цю xbindkeysконфігурацію:

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

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

Це не працює. Здається, Super_Lклавіша утримується, тому що як тільки я відпускаю кнопку 10, вона залишається утримувана назавжди (поки я Super_Lзнову не натискаю клавішу на клавіатурі), але кнопка миші все ще реєструється, тому що я не можу натискати та перетягувати вікна . Я не думаю, що я зможу зробити цю роботу за допомогою xbindkeysі xte.


1
Замість того, щоб прив’язувати кнопку миші до супер-клавіші, виконайте перестановку. Для цього використовуйте xmodmap . дивіться сторінку wiki xmodmap для повного налаштування.
тотті

@totti: на сторінці xmodmap арки wiki описано, як зіставляти клавіші на інші клавіші, як змінювати клавіші модифікаторів та як
повертати

@totti: За допомогою xmodmap я можу зіставляти клавіші на інші клавіші, а за допомогою розширення XKB для X (і xkbset) я можу відображати кнопки миші на клавіші клавіатури, але я намагаюся клавішувати клавішу клавіатури на кнопку миші. Я досі не знайшов способу це зробити.
Хубро

спробуйте: на кнопці миші 11 утримуйте, імітуйте супер утримування + кнопку миші 11 випуск. Тепер менеджер вікон може виявити Super & mouse 1, а не мишу 11.
totti

@totti: Спробував і відредагував запитання
Hubro

Відповіді:


5

Повідомлення askubuntu містить відповідь, яку я підсумую нижче.

Проблема полягає в тому, що xbindkeys захоплює всю мишу, роблячи модифікатори + відображення кліка миші невизначеними. У відповіді використовується введення даних через скрипт 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

Для вводу введіть файл /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.

Сценарій нижче вимагає ідентифікацію коду події кнопки:

#!/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. Основна ідея розроблена в суть (є деякі твердо кодовані значення, і я не відновлюю xinputфункцію миші після цього), я зроблю повідомлення в блозі про це з остаточною версією сценарію (і поділіться посиланням тут, коли це буде зроблено. Дякую вам за допомогу! ☺ ♥
змо

Також перевірте мою нову відповідь на інший потік щодо рішення на основі x11 askubuntu.com/a/903389/269589
Максим

1

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

скрипт
Використовуйте xdotoolдля утримування супер клавіші.
Першим натисканням кнопки створіть тимчасовий файл та утримуйте клавішу. Наступним клацанням миші видаліть файл tmp та відпустіть ключ,

оновлення

Згідно з довідковою сторінкою ubuntu (багато клавіш миші, як це зробити) imwheelможна перезавантажити ключ.


Кілька проблем з цим: # 1 Це все ще лише черговий хакер / вирішення, і не відповідає на питання. # 2 xbindkeys не працює, коли утримується клавіша супер. Це так, ніби xbindkeys призупинено, і нічого не реєструє, поки не вийде супер ключ.
Хубро

Ок, після приблизно 5 хвилин дослідження, я відкликаю пункт №2. Я, мабуть, повинен додати + Mod4в конфігурацію xbindkeys, щоб врахувати натиснуту супер-клавішу. Запропонований вами спосіб краще, ніж мій, і я переходжу на нього :-) Але він все ще не відповідає на питання.
Хубро

1

Програма налагодження: Я б спробував відстежувати /dev/input/eventXфайл, щоб побачити, які події створюються при натисканні та відпуску цієї кнопки, особливо в поєднанні з BTN_LEFT. Ось зразок коду для початку роботи. Очевидно, вам доведеться модифікувати його для реєстрації всіх подій, а не лише клавіш.

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

Цілком ймовірно, що ваша миша створює додаткові події відпуску кнопок при натисканні декількох кнопок. У такому випадку вашими варіантами буде використання ключових методів вирішення завдань або модифікація xf86-input-evdevбібліотеки для фільтрації небажаних подій (або моделювання відсутніх). Я щось подібне робив на зворотньому напрямку для сенсорного екрана, який генерував події "клацання" при спробі перетягування. Ідея полягала в тому, щоб відфільтрувати події "випуску", які відбувалися майже одночасно (у невеликому часовому вікні) за допомогою подій "натискання". Якщо моя здогадка є правильною, вам, по суті, потрібно було б реалізувати щось подібне.


1

Я зрозумів це раніше сьогодні за допомогою інших клавіш модифікаторів. Проблема полягає в тому, що ви повинні включити модифікатор у комбінацію кнопок для випуску. Припустимо, що ваш ключ Super відображається на Mod4 (який повинен бути типовим, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDIT: Щойно зрозумів, що це не відповідає повністю на ваше запитання, оскільки ви все одно не зможете використовувати LMB, утримуючи b: 11

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.