Jak zmapować modyfikatory (np. CTRL) do przycisków myszy za pomocą klawiszy xbindkeys

12

To pytanie już zostało zadane, ale nigdy nie otrzymaliśmy odpowiedzi. Po odprawie z @Seth pytam ponownie. Pozwoli mi to odpowiedzieć i prawdopodobnie zmodyfikować pytanie o wiele łatwiej. Oryginalne pytanie można znaleźć tutaj:

Przyciski Ctrl i Alt na klawisze myszy

Problem:

Chociaż bardzo proste jest odwzorowanie dowolnych naciśnięć klawiszy na przycisk myszy przy użyciu xbindkeys w połączeniu z xdotool lub xte , znacznie trudniej jest mapować klucz modyfikujący (np. ALT , CTRL , SHIFT itd.) do niego.

Końcowy soloution powinien umożliwiać i.a. a CTRL + kliknij (np. aby wybrać wiele pozycji listy) za pomocą myszy.

Kilka możliwych sposobów rozwiązania tego problemu można znaleźć tutaj w Stack Exchange, a także na innych forach związanych z systemem Linux. Ale żaden z nich nie działa zgodnie z oczekiwaniami, ponieważ prowadzą do innych problemów i skutków ubocznych.

Uwagi:

Niektóre z poniższych przykładów dotyczą Guile ze składnią Schemat i polegają na pliku .xbindkeysrc.scm , podczas gdy inne polegają na pliku .xbindkeysrc z odpowiednią składnią. Mam świadomość, że nie będą działać razem.

Ponadto poniższe fragmenty zależą tylko od xdotool , ale jestem otwarty na podejście obejmujące inne aplikacje, np. Także xte - choć wydaje się, że oba prowadzą do tych samych wyników, dlatego używam tutaj tylko% akcji %_de%.

Podejście A:

Aktualizowanie pliku xdotool za pomocą:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

To jest to, co początkowo próbowałem, ale ma efekt uboczny, że modyfikator jest wstrzymywany i nie można go zwolnić.

Podejście B:

Aktualizowanie pliku .xbindkeysrc za pomocą:

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

Znaleziono na link i próbuje aby rozwiązać problem, w którym odbywa się modyfikator (jak opisano przy podejściu a).

Chociaż naprawia to, że działa tylko częściowo, ponieważ nie jest możliwe wykonywanie innych kliknięć myszą podczas naciskania przycisku kciuka.

Podejście C:

Aktualizowanie pliku .xbindkeysrc.scm za pomocą:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

Wypróbowane przez OP połączonego pytania tutaj na askubuntu. Dużo prostsze i bardziej solidne, ponieważ nie obejmuje stanów modyfikujących. Mimo to problem pozostaje, tzn. CTRL + kliknięcie nie jest możliwe.

Wygląda na to, że .xbindkeysrc jest tutaj problemem, ponieważ rozpoznaje kliknięcie, ale go nie uruchamia. Można to sprawdzić za pomocą xbindkeys i xev | grep button :

Normalne kliknięcie myszy zapisane przez xbindkeys -v powinno wyglądać następująco:

state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES

Jak również dla przycisku kciuka:

state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES

Ale gdy powyższa konfiguracja xev jest włączona, nie rejestruje niczego. Chociaż ma sens dla przycisku kciuka, ponieważ jest mapowany na CTRL , a zatem nie jest już przyciskiem myszy, to dziwne jest, że przycisk 1 również nie jest nagrywany. Jest tak prawdopodobnie dlatego, że xbindkeys nie wykonuje go, ale sam go rozpoznaje:

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

Podejście D:

Aktualizowanie pliku xbindkeys za pomocą:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

"xdotool click 1"
  b:1

To zbyt proste ... ale prowadzi do nieskończonej pętli kliknięć.

AKTUALIZACJA:

W międzyczasie kupiłem Logitech G502 i zauważyłem, że po skonfigurowaniu za pomocą sterownika w Windows nie tylko sam profil jest przechowywany w pamięci urządzenia, ale faktyczne naciśnięcie wykonuje się myszą. To faktycznie rozwiązało mój problem w Linuksie!

Jedyną inną myszką, którą pamiętam, było to, że Razer Copperhead wrócił kiedyś. Ale myślę, że są dzisiaj inne myszy, które mogą zrobić to samo.

    
zadawane conceptdeluxe 24.05.2015, 05:39
źródło

3 odpowiedzi

7

Spędziłem dużo czasu próbując wykonać tę wiążącą pracę. W końcu znalazłem rozwiązanie, które jest skomplikowane, ale działa dobrze i nie implikuje oprogramowania stron trzecich. Podzielam go tutaj, mając nadzieję, że pomoże to ludziom. Poza tym wiem, że to nie jest doskonałe pod względem bezpieczeństwa, więc wszelkie konstruktywne opinie są mile widziane.

Istnieją rozwiązania, które są naprawdę fajne, takie, jak tutaj proponowane , ale zawsze cierpią z powodu ograniczenie xbindkeys, które chwyta całą mysz, sprawiając, że mapowanie modów + kliknięcie myszą jest niepewne. Plus rozwiązanie oparte na guile z powyższego łącza użyj ctrl + plus / ctrl + minus, który nie jest rozpoznawany na przykład przez Gimp.

Doszedłem do wniosku, że naszym celem jest przycisk myszy, który działa jak klawiatura, więc użyłem uinput, do którego można uzyskać dostęp przez pythona , napisał skrypt, który monitor / dev / my-mouse dla przycisku kciuka kliknął i wysłał klawisz Ctrl na klawiaturę wirtualną. Oto szczegółowe kroki:

1. Stwórz zasady udev

Chcemy, aby urządzenia były dostępne (prawa i lokalizacja).

Dla myszy:

/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ądzenia rozpoznawanego przez jądro o nazwach takich jak event5, a ja wybieram moją mysz z nazwą. Instrukcja SYMLINK zapewnia, że znajdę moją mysz w / dev / my_mx_mouse. Urządzenie będzie odczytywane przez członka grupy "mxgrabber".

Aby znaleźć informacje o twoim sprzęcie, powinieneś uruchomić coś w rodzaju

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

Dla uinput:

/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

Nie ma potrzeby używania dowiązania symbolicznego, uinput zawsze będzie w $/dev/uinput lub $/dev/input/uinput w zależności od systemu, w którym się znajdujesz. Po prostu daj mu grupę i prawa do czytania i pisania oczywiście.

Musisz odłączyć - podłącz mysz, a nowy link powinien pojawić się w / dev. Możesz zmusić udev do wyzwalania reguł za pomocą $udevadm trigger

2. Aktywuj moduł UINPUT

sudo modprobe uinput

I sprawić, by rozruch był trwały:

/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput

3. Utwórz nową grupę

sudo groupadd mxgrabber

Lub jakkolwiek nazwałeś swoją grupę dostępu. Następnie powinieneś dodać się do niego:

sudo usermod -aG mxgrabber your_login

4. Skrypt w języku Python

Musisz zainstalować bibliotekę python-uinput (oczywiście) i bibliotekę python-evdev . Użyj pip lub swojego pakietu dystrybucyjnego.

Skrypt jest dość prosty, wystarczy, że zidentyfikujesz przycisk event.code swojego 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. Ciesz się!

Teraz potrzebujesz tylko pliku wykonywalnego Pythona i poproś menedżera pulpitu, aby załadował plik podczas uruchamiania. Może też kieliszek wina z okazji dobrej pracy!

6. Dodatek za darmo

Używam xbindkeys dla dodatkowego zachowania. Na przykład poniższa konfiguracja może być przyjemna, jeśli masz mysz z kliknięciami po stronie koła:

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

Aby ta ostatnia kombinacja działała, musisz wyłączyć przycisk skonfigurowany dla skryptu Pythona , w przeciwnym razie nadal będzie on przechwytywany przez xbindkeys. Pozostaje tylko klawisz Ctrl:

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

Załaduj ponownie z $ xmodmap ~/.Xmodmap

7. Wniosek

Jak już wspomniałem na początku, nie jestem całkowicie zadowolony z faktu, że muszę dać sobie prawa do pisania do / dev / uinput, nawet jeśli jest to grupa "mxgrabber". Jestem pewien, że jest to bezpieczniejszy sposób, ale nie wiem jak.

Z drugiej strony działa naprawdę, naprawdę dobrze. Jakakolwiek kombinacja klawisza lub klawisza myszy działa teraz z przyciskiem Ctrl na klawiaturze myszy!

    
odpowiedział Aurélien Cibrario 06.01.2016, 14:31
źródło
3

Znalazłem rozwiązanie z PyUserInput . W końcu jest to dość proste i nie wymaga uprawnień administracyjnych. Po zainstalowaniu Pythona 2 i PyUserInput użyłem następującego skryptu:

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

Po nadaniu prawu do skryptu, nazywam go linią w ~/.xsessionrc , na przykład

~ / path / to / script.py & amp;

Uwaga . nie przeszkadza to zdarzeniu przycisku myszy. W moim przypadku użyłem xinput set-button-map , aby zmienić odwzorowanie przycisku xinput i przypisać numer przycisku, który mnie interesował, do czegoś, co nie było w użyciu.

Na przykład, jeśli chcesz użyć przycisku 8 na myszy, ale przycisk 8 ma już funkcję (na przykład page-next ), możesz użyć następującego .xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$//')
xinput set-button-map $logitech_mouse_id 1 2 3 4 5 6 7 12 9 10 11 12 13 14 15 16 17 18 19 20
./.xbuttonmodifier.py &

dostarczony przycisk 12 nie ma żadnego znaczenia dla systemu operacyjnego i przypisuje funkcję niestandardową do przycisku 12 w .xbuttonmodifier.py , skryptu opisanego powyżej.

    
odpowiedział Maxim 11.04.2017, 01:59
źródło
2

Mam częściowe rozwiązanie. Nie wymyśliłem, jak usunąć istniejące przycisk, więc kończy się kliknięciem przycisku i żądanym modyfikatorem. Więc jeśli ten przycisk myszy ma jakiś istniejący cel, nadal będzie strzelał. Na przykład, remapowanie prawego przycisku myszy na klawisz kontrolny spowoduje sterowanie + kliknięcie są wysyłane.

W każdym razie znalazłem post na forum, który jest podobny do twojego pytania, dla którego odpowiedzią było zainstalowanie btnx i skonfigurowanie przez to modyfikatorów. Wydaje się btnx nie jest już dostępny za pośrednictwem repozytorium. Jest ppa, ale nie robi pracuj dla najnowszego Ubuntu.

Post na forum: post: link

Ale źródło jest dostępne:

Możesz skompilować go ze źródła, ale spowoduje to przeniesienie plików do twojego systemu menedżer pakietów nie może go obsługiwać.

Mianowicie następujące pliki:

/usr/local/sbin/btnx
/etc/init.d/btnx
/usr/share/pixmaps/btnx.png
/usr/share/btnx-config (directory, multiple files)
/usr/share/applications/btnx-config.desktop
/usr/share/omf/btnx-config/btnx-manual-C.omf
/usr/share/locale/de/LC_MESSAGES/btnx-config.mo
/usr/share/locale/fr/LC_MESSAGES/btnx-config.mo
/usr/share/locale/nl/LC_MESSAGES/btnx-config.mo
/usr/share/locale/ru/LC_MESSAGES/btnx-config.mo

Następujące dowiązania symboliczne:

/etc/rc0.d/K49btnx -> ../init.d/btnx
/etc/rc1.d/K49btnx -> ../init.d/btnx
/etc/rc6.d/K49btnx -> ../init.d/btnx
/etc/rc2.d/S49btnx -> ../init.d/btnx
/etc/rc3.d/S49btnx -> ../init.d/btnx
/etc/rc4.d/S49btnx -> ../init.d/btnx
/etc/rc5.d/S49btnx -> ../init.d/btnx

Więc ... jeśli nie masz nic przeciwko budowaniu ze źródła ...

Pobierz zależności dla btnx:

sudo apt-get install libdaemon-dev git

Jeśli nigdy nie budowałeś niczego ze źródła, może być też potrzebne coś istotnego:

sudo apt-get install build-essential

Następnie pobierz i skompiluj btnx:

git clone https://github.com/cdobrich/btnx
cd btnx
./configure
make
sudo make install
cd -

Ma oddzielne narzędzie konfiguracyjne GUI. Uzyskaj zależności dla tego:

sudo apt-get install libgtk2.0-dev libglade2-dev

Teraz zdobądź i skompiluj narzędzie do konfiguracji GUI:

git clone https://github.com/cdobrich/btnx-config
./configure
make
sudo make install

Teraz uruchom narzędzie:

sudo btnx-config

Kliknij Wykryj przyciski myszy Jeśli chcesz móc odczytać wskazówki podczas korzystania z narzędzia, zmień rozmiar okno, które się pojawi, tekst okna zostanie przycięty później, jeśli tego nie zrobisz i jeśli próbujesz zmienić rozmiar podczas wykrywania, to anuluje wykrywanie. Po prostu zrób okno nieco większe.

Kliknij przycisk Naciśnij, aby uruchomić wykrywanie myszy, a następnie nie przesuwaj myszki, dopóki nie pojawi się ikona tekst się zmienia ... Trwa około 5-10 sekund. Tekst się zmieni. Kiedy to robi, zignoruj to, co mówi i kliknij Przekaż.

Kliknij przycisk "Naciśnij, aby uruchomić przycisk wykrywania"

Tutaj kilka razy klikniesz jeden przycisk myszy (aż pasek stanu się zapełni). Następnie ustaw nazwę przycisku na coś, co rozpoznasz później (np. LeftButton) Kliknij przycisk Dodaj.

Powtórz to dla każdego przycisku myszy (nie zapomnij o kółkach przewijania, przewijaj kliknięć, itp). Prawdopodobnie możesz pominąć przyciski, których nie chcesz zmieniać.

Po dodaniu wszystkich przycisków kliknij OK.

W głównym GUI kliknij przyciski, w lewym okienku wybierz przycisk, który chcesz zmienić. Będzie używał nazw wprowadzonych w poprzednich krokach. Dla własnych potrzeb wybierz po prostu modyfikator klawiszy w kombinacji klawiszy po prawej stronie.

Nie klikaj delete na tym ekranie, to usunie przycisk. Będziesz musiał wróć i ponownie wykryj przycisk, jeśli to zrobisz.

Wróć do ekranu Conrigurations i kliknij przycisk restart btnx.

Wypróbuj nowy przycisk.

Jeśli chcesz odinstalować aplikacje, zatrzymaj program btnx, a następnie idź w odpowiednie katalogi sprawdzane przez git i odinstaluj:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -
    
odpowiedział Stephen 24.05.2015, 16:24
źródło

Przeczytaj inne pytania na temat tagów