To pytanie zostało już zadane, ale nigdy nie udzielono właściwej odpowiedzi. Po odprawie w @Seth pytam teraz ponownie. Pozwoli mi to odpowiedzieć i ewentualnie zmodyfikować pytanie o wiele łatwiej. Oryginalne pytanie można znaleźć tutaj:
Mapuj Ctrl i Alt na przyciskach myszy
Kwestia:
Chociaż bardzo proste jest przypisanie dowolnego naciśnięcia klawisza do przycisku myszy za pomocą xbindkeys
w połączeniu z xdotool
lub xte
wydaje się o wiele bardziej problematyczne mapowanie klawisza modyfikującego (np. ALT , CTRL , SHIFT itp.).
Ostateczne rozwiązanie powinno pozwolić m.in. na CTRL + kliknięcie (np. W celu wybrania wielu pozycji listy) za pomocą myszy.
Kilka możliwych sposobów rozwiązania tego problemu można znaleźć tutaj na Stack Exchange oraz na innych forach związanych z Linuksem. Ale żaden z nich nie działa zgodnie z oczekiwaniami, ponieważ prowadzi do innych problemów i skutków ubocznych.
Uwagi:
Niektóre z poniższych przykładów dotyczą Guile ze składnią Scheme i polegają na .xbindkeysrc.scm
pliku, podczas gdy inne polegają na .xbindkeysrc
pliku z odpowiednią składnią. Wiem, że nie będą ze sobą współpracować.
Ponadto poniższe fragmenty polegają xdotool
tylko na, ale jestem otwarty na podejścia obejmujące inne aplikacje, takie jak np xte
. - chociaż wydaje się, że oba prowadzą do tych samych rezultatów i dlatego używam xdotool
tutaj tylko akcji.
Podejście A:
Aktualizacja .xbindkeysrc
pliku za pomocą:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + b:8
Tak początkowo próbowałem, ale ma efekt uboczny, że modyfikator jest trzymany i nie można go zwolnić.
Podejście B:
Aktualizacja .xbindkeysrc.scm
pliku 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")
Znaleziony na http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html i próbuje rozwiązać problem związany z trzymaniem modyfikatora (zgodnie z opisem w podejściu za).
Chociaż naprawia to, że działa tylko częściowo, ponieważ nie można wykonywać innych kliknięć myszą, gdy przycisk kciuka jest wciśnięty.
Podejście C:
Aktualizacja .xbindkeysrc
pliku za pomocą:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
Wypróbowane przez OP powiązanego pytania tutaj na askubuntu. O wiele prostsze i bardziej solidne, ponieważ nie obejmuje stanów modyfikatora. Niemniej jednak problem pozostaje, tzn. CTRL + kliknięcie nie jest możliwe.
Wygląda na to, że xbindkeys
sam tutaj jest problem, ponieważ rozpoznaje kliknięcie, ale go nie wykonuje. Można to przetestować za pomocą xev | grep button
i xbindkeys -v
:
Zapisane normalne kliknięcie myszy xev
powinno wyglądać następująco:
state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES
Podobnie jak w przypadku przycisku kciuka:
state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES
Ale po włączeniu powyższej xbindkeys
konfiguracji nic nie nagrywa. Chociaż ma to sens dla przycisku kciuka, ponieważ jest odwzorowany na CTRL, a zatem nie jest już przyciskiem myszy, dziwne jest, że przycisk 1 również nie jest rejestrowany. Jest to prawdopodobne, ponieważ xbindkeys
nie wykonuje go, ale sam je 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:
Aktualizacja .xbindkeysrc
pliku za pomocą:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
"xdotool click 1"
b:1
Po prostu 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 systemie Windows nie tylko sam profil jest przechowywany w pamięci urządzenia, ale faktyczne naciśnięcie klawisza odbywa się za pomocą myszy. To faktycznie rozwiązało mój problem z Linuksem!
Jedyna inna mysz, jaką pamiętam, która była w stanie to zrobić, to Razer Copperhead w tamtych czasach. Sądzę jednak, że dostępne są inne myszy, które mogą zrobić to samo.
Odpowiedzi:
Spędziłem dużo czasu, próbując sprawić, by to wiązanie zadziałało. W końcu znalazłem rozwiązanie, które jest skomplikowane, ale działa dobrze i nie oznacza oprogramowania innych firm. Podzielę się tutaj z nadzieją, że pomoże ludziom. Poza tym wiem, że nie jest to doskonałe pod względem bezpieczeństwa, więc wszelkie konstruktywne opinie są mile widziane.
Istnieją rozwiązania, które są naprawdę miłe, takie jak zaproponowane tutaj , ale zawsze cierpią z powodu ograniczenia klawiszy xbindkeys, które chwytają całą mysz, co powoduje, że modyfikatory + mapowanie kliknięcia myszy są niepewne. Dodatkowo oparte na podstępach rozwiązanie z powyższego linku używa ctrl + plus / ctrl + minus, co na przykład Gimp nie rozpoznaje.
Doszedłem do wniosku, że to, czego chcemy, to przycisk myszy, który działa jak klawiatura, więc użyłem uinput, do którego można uzyskać dostęp przez python , napisałem skrypt monitorujący / dev / my-mouse dla kliknięcia przycisku kciuka i wysłania klawisza Ctrl do wirtualnej klawiatury. Oto szczegółowe kroki:
1. Ustaw zasady udev
Chcemy, aby urządzenia były dostępne (prawa i lokalizacja).
Dla myszy:
Udev wyszuka urządzenie rozpoznawane przez jądro o nazwach takich jak event5, a ja wybieram mysz z tą 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 swoim sprzęcie, powinieneś uruchomić coś takiego
Dla wejścia:
Nie ma potrzeby tworzenia dowiązania symbolicznego, wejście zawsze będzie w
$/dev/uinput
lub w$/dev/input/uinput
zależności od systemu, w którym się znajdujesz. Po prostu daj mu grupę i prawo do czytania ORAZ pisania oczywiście.Musisz odłączyć - podłącz mysz, a nowy link powinien pojawić się w / dev. Możesz zmusić udev do uruchomienia reguł
$udevadm trigger
2. Aktywuj moduł UINPUT
Aby uczynić go odpornym na rozruch:
3. Utwórz nową grupę
Lub jakkolwiek nazwałeś swoją grupę dostępu. Następnie powinieneś się do tego dodać:
4. Skrypt Python
Musisz zainstalować bibliotekę python-uinput (oczywiście) i bibliotekę python-evdev . Użyj pipa lub pakietu dystrybucyjnego.
Skrypt jest dość prosty, wystarczy zidentyfikować kod zdarzenia swojego przycisku.
5. Ciesz się!
Wszystko, czego potrzebujesz teraz, to wykonanie pliku python i poproś swojego menedżera pulpitu, aby załadował plik podczas uruchamiania. Może także kieliszek wina z okazji dobrej pracy!
6. Dodatkowe za darmo
Używam xbindkeys do dodatkowego zachowania. Na przykład poniższa konfiguracja może być przydatna, jeśli masz mysz z kliknięciami kół:
Aby ta ostatnia kombinacja zadziałała, musisz wyłączyć przycisk skonfigurowany dla skryptu python , w przeciwnym razie nadal będzie on przechwytywany przez xbindkeys. Pozostaje tylko klawisz Ctrl:
Załaduj ponownie za pomocą
$ xmodmap ~/.Xmodmap
7. Wnioski
Jak powiedziałem na początku, nie jestem całkowicie zadowolony z faktu, że muszę dać sobie prawo do pisania do / dev / uinput, nawet jeśli uważa się to za grupę „mxgrabber”. Jestem pewien, że jest to bezpieczniejszy sposób, ale nie wiem jak.
Z drugiej strony działa naprawdę bardzo dobrze. Każde połączenie klawisza lub klawisza myszy, jak działa z klawiszem Ctrl na klawiaturze, teraz działa z jednym z myszy !!
źródło
Znalazłem rozwiązanie z PyUserInput . W rezultacie jest to dość proste i nie wymaga uprawnień administracyjnych. Po zainstalowaniu Python 2 i PyUserInput użyłem następującego skryptu:
Po udzieleniu skryptu praw do wykonywania wywołuję go
~/.xsessionrc
na przykład z wejściem liniowym~ / path / to / script.py &
Uwaga . nie uniemożliwia to uruchomienia zdarzenia przycisku myszy. W moim przypadku
xinput set-button-map
zmieniłem mapowanie przycisków xinput i przypisałem numer interesującego mnie przycisku do czegoś, co nie było używane.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ących.xsessionrc
pod warunkiem przycisk
12
niesie żadnego znaczenia dla systemu operacyjnego i przypisać funkcję niestandardowego przycisku12
w.xbuttonmodifier.py
skrypt opisałem powyżej.źródło
xinput
. Zobacz edytowane pytanie.Mam częściowe rozwiązanie. Nie wymyśliłem, jak usunąć mapowanie istniejącego przycisku, więc kończysz kliknięciem przycisku i pożądanym modyfikatorem. Więc jeśli ten przycisk myszy ma jakiś istniejący cel, nadal będzie strzelał. Na przykład ponowne przypisanie prawego przycisku myszy do klawisza sterującego spowoduje wysłanie kontroli + kliknięcia.
W każdym razie znalazłem post na forum podobny do twojego pytania, na który odpowiedzią było zainstalowanie btnx i skonfigurowanie przez to twoich modyfikatorów. Wygląda na to, że btnx nie jest już dostępny w repozytorium. Istnieje ppa, ale nie działa na najnowszym Ubuntu.
Post na forum: post: http://ubuntuforums.org/showthread.php?t=1245930
Ale źródło jest dostępne:
Możesz skompilować go ze źródła, ale spowoduje to umieszczenie w systemie plików, których menedżer pakietów nie będzie w stanie utrzymać.
Mianowicie następujące pliki:
Następujące dowiązania symboliczne:
Więc ... jeśli nie masz nic przeciwko budowaniu ze źródła ...
Uzyskaj zależności dla btnx:
Jeśli nigdy nie budowałeś niczego ze źródła, być może potrzebujesz też niezbędnych do kompilacji:
Następnie pobierz i skompiluj btnx:
Ma osobne narzędzie do konfiguracji GUI. Uzyskaj zależności:
Teraz pobierz i skompiluj narzędzie do konfiguracji GUI:
Teraz uruchom narzędzie:
Kliknij Wykryj przyciski myszy Jeśli chcesz móc odczytać wskazówki podczas korzystania z narzędzia, zmień rozmiar okna, które się pojawi, tekst okna dialogowego zostanie przycięty później, jeśli tego nie zrobisz, a jeśli spróbujesz zmienić rozmiar podczas wykrywania, anuluje wykrycie. Po prostu powiększ okno.
Kliknij przycisk Naciśnij, aby rozpocząć wykrywanie myszy, a następnie spróbuj nie poruszać myszą, dopóki tekst się nie zmieni ... Zajmie to około 5–10 sekund. Tekst się zmieni. Gdy to zrobisz, zignoruj to, co mówi, i kliknij przycisk Przekaż.
Kliknij przycisk „Naciśnij, aby rozpocząć wykrywanie przycisku”
W tym miejscu klikasz kilka razy 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, kliknięciach przewijania itp.). Prawdopodobnie możesz pominąć wszystkie przyciski, których nie chcesz ponownie mapować.
Po dodaniu wszystkich przycisków kliknij przycisk OK.
W głównym GUI kliknij przycisk Przyciski, w lewym okienku wybierz przycisk, który chcesz ponownie przypisać. Użyje nazw wprowadzonych w poprzednich krokach. Do swoich celów będziesz chciał wybrać tylko modyfikator klucza w kombinacji klawiszy po prawej stronie.
Nie klikaj przycisku Usuń na tym ekranie, spowoduje to usunięcie przycisku. Jeśli to zrobisz, musisz wrócić i ponownie wykryć przycisk.
Wróć do ekranu Konfiguracje i kliknij ponownie uruchom btnx.
Wypróbuj nowy przycisk.
Jeśli chcesz odinstalować aplikacje, zatrzymaj program btnx, a następnie przejdź do odpowiednich katalogów sprawdzonych przez git i wykonaj odinstalowanie:
źródło