Come faccio a rimappare automaticamente i pulsanti sul mio mouse all'avvio?

21

Ho faticato con questo durante il fine settimana e ho bisogno di rimappare i pulsanti del mio mouse.

    
posta zerobandwidth 07.07.2014 - 15:13

4 risposte

37

Ho un mouse Logitech con 9 pulsanti e premendo il "pulsante centrale" (n. 2) è necessario fare clic sulla rotella di scorrimento. Non mi piace perché sono goffa e in genere finisco per scorrere la finestra in cui mi trovo quando cerco di fare clic sulla ruota. Quindi volevo rimappare automaticamente il pulsante laterale superiore (n. 9 in questo caso) al pulsante centrale (n. 2). Volevo anche mappare il pulsante sul lato inferiore (n. 8) in modo che esegua un doppio clic del pulsante sinistro (n. 1).

Sebbene i miei obiettivi fossero specifici, le soluzioni seguenti possono essere generalizzate a qualsiasi situazione in cui si desidera rimappare automaticamente i pulsanti del mouse all'avvio.

Mappatura dei pulsanti del mouse su altri pulsanti del mouse

Avrai bisogno di xinput installato per questa attività. Questo può essere fatto interamente nel tuo file .xsessionrc . Innanzitutto, usa xinput per scoprire il nome assegnato al tuo mouse, che è quindi correlato a un ID dispositivo di input. Di seguito è riportato un esempio di output dal mio laptop:

⎡ 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)]

Il mio mouse si chiama Logitech USB Laser Mouse e viene visualizzato come id=11 . Il tuo mouse avrà un nome diverso; capire che viene lasciato come esercizio per il lettore.

Mentre conosci ancora l'ID del dispositivo nella sessione questa , scopri quanti tasti il ​​gestore di input pensa che il tuo mouse abbia, utilizzando xinput list deviceID . Questo potrebbe essere diverso dal numero di pulsanti apparenti sul dispositivo.

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"

Con il mio mouse, ci sono solo 9 pulsanti fisici ovvi, ma xinput riporta 16.

Data la natura dell'USB, questo ID può cambiare ogni volta che si riavvia, quindi non è sufficiente scrivere qualcosa che è statisticamente digitato su un ID che si scopre una volta. Dovrai analizzarlo dinamicamente all'avvio ed eseguire la ri-mappa in base all'ID corrente.

Ora che conosci il suo nome, puoi usare xinput test per capire quale chiave rimappare. Premi i pulsanti del mouse che vuoi mappare da e verso, per ottenere i loro indici. (Per riferimento, 1, 2 e 3 "sempre" (cioè, di solito) si riferiscono ai pulsanti sinistro, centrale e destro di un mouse a 3 pulsanti. Una comune re-mappa inverte questi per rendere il mouse mancino. )

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

In questo caso ho scoperto che voglio mappare il pulsante n. 9 (laterale, in alto) al pulsante n. 2 (al centro).

Ora che sai come viene chiamato il tuo mouse e quali pulsanti vuoi modificare, puoi scrivere uno script ~/.xsessionrc che richiama xinput per eseguire il re-mapping del pulsante all'avvio. Di seguito è riportato il mio script completo.

# 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].*$//')
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

La prima riga qui imposta una variabile di sessione temporanea uguale all'ID del mouse come riportato da xinput . Questo viene fatto da grep ing per il nome noto del mouse nel report da xinput , quindi usando sed per estrarre il numero ID da quel token id=xxx nel report. Questo valore viene quindi utilizzato in una direttiva xinput set-button-map , che esegue il re-mapping. Nell'esempio sopra, l'unica modifica è che il pulsante n. 9 viene mappato nuovamente per simulare il pulsante n. Tutti gli altri rimangono alle impostazioni predefinite.

Aggiornamento: come @Lokasenna sottolinea sotto , se il tuo dispositivo si presenta come un mouse e una tastiera, potresti dover limitare il conteggio dei risultati di grep utilizzando -m 1 .

Mappatura dei pulsanti del mouse sulle funzioni arbitrarie

Vedi anche questa risposta .

Avrai bisogno di xinput , xbindkeys e xautomation (incluso xte ) installato per questa attività.

Utilizza xinput list e xinput test per scoprire l'ID dispositivo del tuo mouse e il numero del pulsante che desideri assegnare. Nel mio caso, volevo mappare il pulsante sul lato inferiore (n. 8) con un doppio clic del pulsante sinistro (n. 1).

Crea o modifica ~/.xbindkeysrc . Il formato di questo file è una serie di linee accoppiate. La prima riga è un comando da eseguire per un evento; la seconda riga è la descrizione dell'evento. Utilizzeremo il componente xte di xautomation per inviare eventi direttamente al gestore di input.

Per creare un evento doppio clic quando viene rilasciato un pulsante, ho aggiunto quanto segue:

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

Questa configurazione mappa una sequenza di due clic del mouse sul pulsante # 1 per il rilascio del pulsante # 8. (In teoria, suppongo che potresti mappare il comando qualsiasi a un pulsante del mouse, ma questo è il caso più comune. Vedi questa risposta per altri esempi pratici.)

Aggiornamento per Ubuntu 16.04

Per gli utenti con più mouse collegati al sistema, è necessario anche passare l'ID del dispositivo. Questo potrebbe non essere applicabile a tutti gli utenti ed è stato scoperto su Ubuntu 16.04 con 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)]

Quindi modifica il file .xbindkeysrc facendo riferimento a id = value dall'output del comando (id = 9 in questo esempio):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
    
risposta data zerobandwidth 07.07.2014 - 15:13
2

I brevi passi per questo sono:

Esiste un'utilità chiamata xinput . xinput list o solo xinput mostrerà tutti i dispositivi di input X e i relativi ID. Qui trovi l'ID del mouse che desideri rimappare.

Userò il mio ID come esempio, dal mio setup, che è 21, quindi verrà visualizzato xinput --get-button-map 21

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

Ora, se vuoi, ad esempio, scambiare i pulsanti sinistro e destro, esegui semplicemente

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

Eccoci, il remapping è fatto.

Per eseguirlo all'avvio basta inserirlo in un file:

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

dargli il permesso eseguibile

chmod +x leftmouseremap.sh 

Infine, aggiungi questo alla Statrtup Application manualmente dalla GUI o, se lo vuoi dalla CLI, metti il ​​testo qui sotto (cambia percorso al tuo) in un file in ~/.config/autostart , qui è mio ( 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=

Ricorda che con KDE il percorso sarebbe come ~/.kde/Autosart , per altri Desktop manager questo potrebbe essere visivamente diverso. In alternativa, l'avvio di avvio può essere eseguito con approccio generale utilizzando /etc/rc.local .

    
risposta data Ruslan Gerasimov 06.07.2017 - 10:30
1

Sono stato in grado di modificare la mappatura del pulsante centrale del mio mouse Logitech in "Ritorno" utilizzando Easystroke Gesture Recognition che ho scaricato dal Software Center di Ubuntu. Modifica: Nell'applicazione, selezionare Aggiungi azione, Assegnare un nome, selezionare il tipo di chiave, fare clic su Dettagli e premere Invio, premere Registra tratto e durante la richiesta premere il pulsante centrale.

    
risposta data atr15 13.09.2015 - 20:02
1

Quando si utilizza l'ottima risposta di zerobandwidth , alcuni dispositivi, come ad esempio MX Ergo di Logitech, si presentano come entrambi puntatore e un dispositivo tastiera :

⎡ 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)]

Di conseguenza, grep "Logitech MX Ergo" finisce per restituire due valori. Quest'ultimo finisce per essere incluso come primo elemento nella stringa di mappatura e svita tutti i pulsanti del mouse.

La correzione è semplice: basta utilizzare l'argomento di conteggio massimo di grep , -m 1 :

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$//')
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
    
risposta data Lokasenna 15.08.2018 - 15:54

Leggi altre domande sui tag