Jak automatycznie ponownie przypisać przyciski myszy podczas uruchamiania?


Odpowiedzi:


47

Mam mysz Logitech z 9 przyciskami, a naciśnięcie „środkowego przycisku” (# 2) wymaga kliknięcia kółka przewijania. Nie podoba mi się to, ponieważ jestem niezdarny i zwykle przewijam okno, w którym jestem, gdy próbuję kliknąć koło. Chciałem więc automatycznie przypisać górny przycisk boczny (w tym przypadku nr 9) do środkowego przycisku (nr 2). Chciałem również zmapować dolny przycisk boczny (# 8), aby wykonał dwukrotne kliknięcie lewym przyciskiem (# 1).

Chociaż moje cele były konkretne, poniższe rozwiązania można uogólnić na każdą sytuację, w której chcesz automatycznie przypisać ponownie przyciski myszy podczas uruchamiania.

Mapowanie przycisków myszy na inne przyciski myszy

Będziesz musiał xinputzainstalować to zadanie. Można to zrobić całkowicie w .xsessionrcpliku. Najpierw użyj, xinputaby odkryć nazwę przypisaną do myszy, która następnie jest skorelowana z identyfikatorem urządzenia wejściowego. Poniżej znajduje się przykładowe dane wyjściowe z mojego laptopa:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

Moja mysz wywołuje się Logitech USB Laser Mousei jest wyświetlana jako id=11. Twoja mysz będzie miała inną nazwę; ustalenie, że jest to ćwiczenie dla czytelnika.

Chociaż nadal znasz identyfikator urządzenia w tej sesji, dowiedz się, ile przycisków ma obsługiwać wejście za pomocą myszy . Może się różnić od liczby przycisków widocznych na urządzeniu.xinput list deviceID

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

Moja mysz ma tylko 9 oczywistych fizycznych przycisków, ale xinputraporty 16.

Biorąc pod uwagę naturę USB, ten identyfikator może się zmieniać przy każdym ponownym uruchomieniu, więc nie jest wystarczające, aby wykonać skrypt, który jest statycznie przypisany do identyfikatora, który odkryjesz raz. Będziesz musiał dynamicznie przeanalizować to podczas uruchamiania i wykonać ponownie mapę w oparciu o bieżący identyfikator.

Teraz, gdy znasz jego nazwę, możesz xinput testdowiedzieć się, który klucz ma zostać przypisany ponownie. Naciśnij przyciski myszy, z których chcesz mapować od i do, aby uzyskać ich indeksy. (Dla odniesienia, 1, 2 i 3 „zawsze” (tj. Zwykle) odnoszą się do lewego, środkowego i prawego przycisku myszy z trzema przyciskami. Wspólna zmiana mapy odwraca je, aby mysz była leworęczna. )

button press   2
button release 2
button press   9
button release 9

W tym przypadku stwierdziłem, że chcę zmapować przycisk nr 9 (z boku, u góry) na przycisk nr 2 (w środku).

Teraz, gdy wiesz, jak nazywa się Twoja mysz i które przyciski chcesz zmienić, możesz napisać ~/.xsessionrcskrypt, który wywołuje xinputponowne mapowanie przycisków podczas uruchamiania. Poniżej znajduje się mój pełny skrypt.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

Pierwszy wiersz tutaj ustawia tymczasową zmienną sesji równą identyfikatorowi myszy zgłoszonemu przez xinput. Odbywa się to poprzez grepwpisanie znanej nazwy myszy w raporcie xinput, a następnie użycie seddo wyodrębnienia numeru identyfikacyjnego z tego id=xxxtokena w raporcie. Ta wartość jest następnie używana w xinput set-button-mapdyrektywie, która wykonuje ponowne mapowanie. W powyższym przykładzie jedyną zmianą jest to, że przycisk nr 9 jest ponownie mapowany na przycisk naśladowania nr 2. Wszystkie pozostałe pozostają w ustawieniach domyślnych.

Aktualizacja: Jak wskazuje @Lokasenna poniżej , jeśli twoje urządzenie zgłasza się jako mysz i klawiatura, być może będziesz musiał ograniczyć liczbę wyników grepużycia -m 1.

Mapowanie przycisków myszy na dowolne funkcje

Zobacz także tę odpowiedź .

Będziesz potrzebował xinput, xbindkeysi xautomation(w tym xte) zainstalowany do tego zadania.

Użyj xinput listi, xinput testaby odkryć identyfikator urządzenia myszy i numer przycisku, który chcesz przypisać. W moim przypadku chciałem zmapować dolny przycisk boczny (# 8) do dwukrotnego kliknięcia lewym przyciskiem (# 1).

Utwórz lub edytuj ~/.xbindkeysrc. Format tego pliku to seria sparowanych linii. Pierwszy wiersz to polecenie, które należy wykonać dla zdarzenia; druga linia to opis zdarzenia. Będziemy używać xtekomponentu xautomationdo wysyłania zdarzeń bezpośrednio do modułu obsługi danych wejściowych.

Aby utworzyć zdarzenie dwukrotnego kliknięcia po zwolnieniu przycisku, dodałem następujące elementy:

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

Ta konfiguracja odwzorowuje sekwencję dwóch kliknięć myszą przycisku nr 1 na zwolnienie przycisku nr 8. (Teoretycznie wydaje mi się, że można przypisać dowolne polecenie do przycisku myszy, ale jest to najczęstszy przypadek. Zobacz tę odpowiedź w celu uzyskania innych praktycznych przykładów.)

Aktualizacja do 16.04 Ubuntu

W przypadku użytkowników z wieloma myszami podłączonymi do systemu musisz także podać identyfikator urządzenia. To może nie dotyczyć wszystkich użytkowników i zostało odkryte w Ubuntu 16.04 z Unity.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

Następnie zmodyfikuj plik .xbindkeysrc, odwołując się do wartości id = z danych wyjściowych komendy (w tym przykładzie id = 9):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

7
Dzięki za informację. Wygląda na to, że awk wymagałoby zmiany w zależności od liczby słów w urządzeniu. Użyłemsed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

Według testu xinput, kciuk klawisz uruchamia trzy różne naciśnięcia klawisza - jak powiązać je wszystkie razem w .xbindkeysrc?
axltop

@ jbo5112 Właśnie zacząłem używać wielu myszy na moim laptopie roboczym i miałem dobry powód, by ponownie przeczytać Twój komentarz. W moich przykładach zastąpiłem teraz moje stare awkoświadczenie swoim sedoświadczeniem. Dzięki za ulepszenie!
zerobandwidth

2
Nie ma potrzeby używania identyfikatora w mapie przycisku-zestawu; np .:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

Chyba nietypowy problem: xinputpokazuje moją mysz dwukrotnie: like USB OPTICAL MOUSE id = 12 [wskaźnik slave (2)] ve USB OPTICAL MOUSE id = 13 [wskaźnik slave (2)] Tylko ID 13 będzie przechwytywał polecenia xinput test. Skrypt zawsze przechwytuje pierwszy identyfikator. Ale dlaczego tak jest dwa razy? Oba znikają po odłączeniu myszy i pojawiają się ponownie po podłączeniu.
w-sky,

6

Krótkie kroki w tym celu:

Istnieje narzędzie o nazwie xinput. xinput listlub po prostu xinputpokaże wszystkie urządzenia wejściowe X i ich identyfikatory. Tutaj znajdziesz identyfikator myszy, którą chcesz odwzorować.

Użyję mojego identyfikatora jako przykładu z konfiguracji, która wynosi 21, a następnie xinput --get-button-map 21wyprowadzę

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Teraz, jeśli chcesz, powiedzmy, zamienić lewy i prawy przycisk, po prostu uruchom

xinput --set-button-map 21 3 2 1

Tutaj jesteśmy, zmiana mapowania jest zakończona.

Aby uruchomić go podczas uruchamiania, po prostu włóż to do pliku:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

daj mu uprawnienia do pliku wykonywalnego

chmod +x leftmouseremap.sh 

Na koniec dodaj to ręcznie do aplikacji Statrtup z GUI lub, jeśli chcesz z CLI, umieść tekst poniżej (zmień ścieżki na swój) w pliku w swoim pliku ~/.config/autostart, oto mój ( less .config/autostart/leftmouseremap.sh.desktop):

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

Pamiętaj, że w KDE ścieżka wyglądałaby podobnie ~/.kde/Autosart, w przypadku innych menedżerów pulpitu może to wyglądać inaczej. Alternatywnie uruchomienie systemu można wykonać za pomocą ogólnego podejścia przy użyciu /etc/rc.local.


To rozwiązało mój problem z wyciekiem wody. Mam przyciski lewego / prawego przycisku poniżej panelu dotykowego mojego laptopa. Wylałem wodę i teraz oba przyciski wysyłają sygnał kliknięcia środkowym kliknięciem do systemu operacyjnego (odkryłem to za pomocą aplikacji „keymon”). Użyłem twojej metody, aby zmienić mapowanie środkowego kliknięcia na lewe kliknięcie, dzięki czemu mogę przynajmniej cieszyć się wrażeniem kliknięcia lewym przyciskiem. Nigdy nie używam środkowego kliknięcia, więc działa to dla mnie idealnie :) Dzięki za proste instrukcje. Mój identyfikator urządzenia wejściowego to 11, więc uruchomiłem „xinput - set-button-map 11 1 1 3” Dzięki !!
Vahid Pazirandeh

3

Korzystając ze świetnej odpowiedzi zerobandwidth , niektóre urządzenia, takie jak Logitech MX Ergo, wyświetlają się zarówno jako wskaźnik, jak i klawiatura :

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

W rezultacie grep "Logitech MX Ergo"zwraca dwie wartości. Ten ostatni zostaje uwzględniony jako pierwszy element w ciągu odwzorowującym i psuje wszystkie przyciski myszy.

Poprawka jest łatwa - wystarczy użyć grepargumentu maksymalnej liczby -m 1:

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

Świetna wskazówka; Zredagowałem odpowiedź, aby ją uwzględnić. Dzięki!
zerobandwidth

1

Udało mi się zmienić mapowanie środkowego przycisku myszy Logitech na „Return” za pomocą Easystroke Gesture Recognition, którą pobrałem z Centrum oprogramowania Ubuntu. Edycja: w aplikacji wybierz Dodaj akcję, Nazwij ją, wybierz typ klucza, kliknij Szczegóły i naciśnij Enter, naciśnij Record Stroke, a podczas pytania naciśnij środkowy przycisk.


1
Witamy w AskUbuntu. W odpowiedzi musisz podać więcej szczegółów.
David

Ok, patrz wyżej edycja.
atr15

Dobry chwyt Ale to, co opisałeś, nie działa zgodnie z instrukcją: w rzeczywistości środkowy przycisk jest domyślnym przyciskiem, aby wprowadzić tę aplikację w „tryb rozpoznawania gestów”: po naciśnięciu aplikacja zaczyna rozpoznawać wykonywany gest. Jednak +1, ponieważ ta aplikacja ma moduł do ujawniania identyfikatorów przycisków myszy; pomaga to, gdy chcemy używać xinputz przyciskami, które nie pokazują się podczas używania xinput list <devID>.
1111161171159459134

1
Och, to przyszło 1 rok później - twoja odpowiedź jest warta +1
1111161171159459134

1

Przed 12.04 w standardowym repozytorium znajdowało się łatwe narzędzie graficzne o nazwie „btnx”, które dodawano jako „Właściwości przycisku” w konfiguracji systemu. Niestety jednak została porzucona. „Niezaufany” PPA obecnie utrzymywany dla 14.04, 16.04 i 18.04 jest tutaj: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (znaleziony na https://launchpad.net/ubuntu/xenial/+source / btnx )

Nie zintegruje się z ustawieniami systemu, ale działa całkiem dobrze na moim laptopie z tanią 5-przyciskową myszą. Może także zmieniać przypisania do klawiszy i poleceń, a konfiguracja jest znacznie prostsza niż w przypadku jakiejkolwiek innej metody!


Zastanawiam się, czy narzędzie wprowadza te same zmiany, tylko w tle. ^ _ ^
zerobandwidth

0

Mam HP EliteBook 2570p, Ubuntu 18.04.2. Tutaj mam trackpoint, który jest dla mnie bezużyteczny, a tutaj są 2 bezużyteczne przyciski trackpoint pod przestrzenią

Nie używam tych klawiszy, ponieważ mam go pod touchpadem. Chciałbym zmienić przypisanie tych przycisków do przycisku left = back_button (Alt_L + Left), prawy = middle_mouse_button. Punkt ścieżki w „xinput” to id = 11, a lewy przycisk to numer 1, a prawy to 3.

Czy ktoś mógłby napisać do mnie odpowiedni kod, aby po prostu skopiować na terminal? Mam połączenie z xbindkeysrc, ale to ustawia dowolną akcję dla obu przycisków (trackpoint i touchpad)


Zrobiłem to i uczyniłem to po prostu: <kod> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Sprawia, że ​​moje przyciski dotykowe (id 11) ustawiają lewy jako ósmy przycisk, środkowy jak lewy przycisk myszy (nr 1), a prawy przycisk jako środkowy, a następnie „kod” echo -e „\” / usr / bin / xte „keydown Alt_L” klawisz lewy klawisz „klawisz up Alt_L” & amp; \ „\ nb: 8” >> ~ / .xbindkeysrc 'code' Ustawia przycisk nr 8 (b: 8) na Alt_L + lewy => cofnij :) Teraz mam przydatne 2 przyciski myszy
Atom
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.