Jak PRAWIDŁOWO mapować klawisz klawiatury na przycisk myszy?

14

Podsumowanie pytań: Chcę, aby jeden z moich przycisków myszy został zarejestrowany jako lewy przycisk Windows Super_Ldo X11.


W moim menedżerze okien mogę przesuwać okna, przytrzymując „lewy przycisk Windows” (Left Super) i przeciągając okno lewym przyciskiem myszy. Chcę to zrobić bez dotykania klawiatury, więc chcę zmapować lewy klawisz Super do przycisku myszy 11, w ten sposób mogę przytrzymać przycisk myszy 11 i kliknąć + przeciągnąć okno.

Najbardziej oczywistym rozwiązaniem jest użycie xbindkeys i xte w ten sposób ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Działa to tak:

  • Kiedy naciskam przycisk myszy 11, Super_Ljest również wciśnięty
  • Po zwolnieniu przycisku myszy 11 Super_Lzostaje zwolniony

Ale jest problem: nie mogę przenosić okien za pomocą Super_L+, Mouse1jeśli przytrzymuję również inny przycisk myszy, np. Przycisk myszy 11. Używając powyższego rozwiązania, przycisk myszy 11 nadal jest rejestrowany jako wciśnięty i zwolniony, a więc żaden z działają operacje menedżera okien.

Próbowałem tego przy użyciu zarówno Cinnamon, jak i Awesome WM, i absolutnie żadna z Super_Lkombinacji klawiszy nie działa, gdy przycisk myszy 10 lub 11 jest wciśnięty.

A hack

Obecnie pracuję nad tym problemem, powodując, że kliknięcie myszą 11 przytrzymuje Super_Lprzycisk przez określony czas. W ten sposób mogę kliknąć przycisk myszy, a następnie przeciągać różne rzeczy przez krótki czas:

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

Kolejna próba

Zgodnie z sugestią totti wypróbowałem tę xbindkeyskonfigurację:

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

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

To nie działa Wygląda na to, że Super_Lklawisz jest przytrzymywany, ponieważ jak tylko zwolnię przycisk 10, pozostaje on wciśnięty na zawsze (dopóki nie Super_Lnacisnę ponownie klawisza na klawiaturze), ale przycisk myszy jest nadal rejestrowany, ponieważ nie mogę kliknąć i przeciągnąć okna . Nie sądzę, że będę w stanie sprawić, by ta praca działała przy użyciu xbindkeysi xte.

Hubro
źródło
1
Zamiast przypisywać przycisk myszy do superklucza, wykonaj mapowanie. W tym celu użyj xmodmap . zobacz stronę arch wiki xmodmap, aby uzyskać pełną konfigurację.
totti
@totti: Arch xmodmap strona arch wiki opisuje, jak mapować klawisze na inne klawisze, jak zamieniać klawisze modyfikujące i jak przewijać do tyłu, ale nie wspomina o mapowaniu klawiszy klawiatury na klawisze myszy
Hubro
@totti: Za pomocą xmodmap mogę mapować klawisze na inne klawisze, a za pomocą rozszerzenia XKB dla X (i xkbset) mogę mapować przyciski myszy na klawisze klawiatury, ale próbuję mapować klawisz klawiatury na przycisk myszy. Nadal nie znalazłem sposobu, aby to zrobić.
Hubro,
spróbuj: Przy przytrzymaniu przycisku myszy 11, symuluj super trzymanie + zwolnienie przycisku myszy 11. Menedżer okien może teraz wykryć super & mysz 1, a nie mysz 11.
totti
@totti: Próbowałem i zredagowałem pytanie
Hubro,

Odpowiedzi:

5

Post askubuntu zawiera odpowiedź , którą streszczę poniżej.

Problem polega na tym, że xbindkeys chwyta całą mysz, co powoduje, że modyfikatory + mapowanie kliknięcia myszy są niepewne. Odpowiedź wykorzystuje uinput za pomocą skryptu python-uinput do monitorowania /dev/my-mousekliknięcia przycisku kciuka i wysłania Ctrlklucza do wirtualnej klawiatury. Oto szczegółowe kroki:

1. Ustaw zasady udev

W przypadku myszy plik /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 będzie szukał urządzeń jądra o nazwach takich jak event5. SYMLINK służy do znajdowania myszy /dev/my_mx_mouse, którą może odczytać grupa mxgrabber.

Aby znaleźć informacje o sprzęcie, uruchom coś takiego:

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

Dla uinput plik /etc/udev/rules.d/94-mxkey.rules:

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

Odłącz i podłącz mysz lub zmuś udev do uruchomienia reguł udevadm trigger.

2. Aktywuj moduł UINPUT

sudo modprobe uinput

I w /etc/modules-load.d/uinput.conf:

uinput

3. Utwórz nową grupę

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Skrypt Python

Zainstaluj python-uinput libraryi python-evdev library.

Poniższy skrypt wymaga zidentyfikowania kodu zdarzenia przycisku:

#!/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. Wykończenie

Ustaw plik wykonywalny Pythona i upewnij się, że jest ładowany podczas uruchamiania.

harrymc
źródło
I został uaktualniony skrypt przypisać nieużywany kod dostępu do przycisków myszy (I ustawić je do F13, F14i F15, i wyłączanie funkcji myszy za pomocą xinput. Następnie można po prostu przypisać te klucze do tego, co mi potrzeba, stosując prostą xmodmap. Główną ideą jest zredagowany w skrócie (istnieją pewne zakodowane wartości, a xinputpotem nie przywracam funkcji myszy), opublikuję post na blogu na ten temat wraz z ostateczną wersją skryptu (i udostępnię link tutaj, kiedy to będzie zrobione. Dziękuję ty za pomoc! ☺ ♥
zmo
Sprawdź także moją nową odpowiedź w drugim wątku w poszukiwaniu rozwiązania opartego na x11 askubuntu.com/a/903389/269589
Maxim
1

Ponieważ skrypt można uruchomić jednym kliknięciem myszy, można użyć następującej sztuczki.
1. Naciśnij przycisk 11 , aby trzymać się z super-klucz . ( Przycisk 11 uruchamia skrypt)
2. Przesuń okna za pomocą innych przycisków myszy
3. Naciśnij ponownie przycisk myszy 11, aby zwolnić super klawisz

skrypt
Użyj, xdotoolaby przytrzymać superklucz
Przy pierwszym kliknięciu przycisku utwórz plik tymczasowy i przytrzymaj klawisz. Przy następnym kliknięciu usuń plik tmp i zwolnij klucz,

aktualizacja

Według strony pomocy Ubuntu (jak wiele przycisków myszy) imwheelmożna zmienić przypisanie do klucza.

Totti
źródło
Kilka problemów z tym: # 1 To wciąż kolejny hack / obejście i nie odpowiada na pytanie. # 2 xbindkeys nie działa podczas przytrzymywania klawisza super. To tak, jakby xbindkeys został wstrzymany i niczego nie rejestrował, dopóki nie zostanie zwolniony superklucz.
Hubro
Ok, po około 5 minutach badań wycofuję punkt 2. Najwyraźniej muszę dodać + Mod4w konfiguracji xbindkeys, aby uwzględnić przytrzymanie superklucza. Sugerowane przez ciebie obejście jest lepsze niż moje i przechodzę do niego :-) Ale nadal nie odpowiada na pytanie.
Hubro
1

Sugestia debugowania: próbowałbym monitorować /dev/input/eventXplik, aby zobaczyć, jakie zdarzenia są generowane po naciśnięciu i zwolnieniu tego przycisku, szczególnie w połączeniu z BTN_LEFT. Oto przykładowy kod na początek. Oczywiście będziesz musiał go zmodyfikować, aby rejestrować wszystkie zdarzenia, nie tylko naciśnięcia klawiszy.

Możesz także sprawdzić xevwyniki, jeśli jeszcze tego nie zrobiłeś. Analiza obu dzienników powinna ujawnić dokładny problem.

Możliwe, że twoja mysz generuje dodatkowe zdarzenia zwolnienia przycisku po naciśnięciu wielu przycisków. W takim przypadku opcją byłoby użycie obejścia wiązania klucza lub zmodyfikowanie xf86-input-evdevbiblioteki w celu filtrowania niepożądanych zdarzeń (lub symulacji brakujących). Powtórzyłem jakiś czas temu ekran dotykowy, który generował zdarzenia „kliknięcia” podczas próby przeciągania i upuszczania. Pomysł polegał na filtrowaniu zdarzeń „zwolnienia”, które nadeszły prawie jednocześnie (w niewielkim przedziale czasowym) za pomocą zdarzeń „kliknięcia”. Jeśli moje przypuszczenie jest słuszne, w zasadzie musisz zaimplementować coś podobnego.

Dmitrij Grigoriew
źródło
1

Zrozumiałem to dzisiaj dzisiaj z innymi klawiszami modyfikującymi. Problem polega na tym, że musisz uwzględnić modyfikator w kombinacji przycisków dla wydania. Zakładając, że twój klucz Super jest mapowany na Mod4 (który powinien być domyślny, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDYCJA: Właśnie zdałem sobie sprawę, że to nie do końca odpowiada na twoje pytanie, ponieważ nadal nie będziesz w stanie używać LMB, trzymając wciśnięty b: 11

DreadPirateLynx
źródło