Come rimappare automaticamente i pulsanti del mouse all'avvio?


Risposte:


47

Ho un mouse Logitech con 9 pulsanti e la pressione del "pulsante centrale" (# 2) implica il clic della rotella di scorrimento. Non mi piace perché sono goffo e in genere finisco per scorrere la finestra in cui mi trovo quando provo a fare clic sulla rotellina. Quindi volevo rimappare automaticamente il pulsante laterale superiore (n. 9 in questo caso) sul pulsante centrale (n. 2). Volevo anche mappare il pulsante in basso (# 8) in modo che eseguisse un doppio clic sul pulsante sinistro (# 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

Sarà necessario xinputinstallato per questa attività. Questo può essere fatto interamente nel tuo .xsessionrcfile. Innanzitutto, utilizzare xinputper scoprire il nome assegnato al mouse, che è quindi correlato a un ID dispositivo di input. Di seguito sono riportati alcuni esempi 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 Mousee viene mostrato come id=11. Il tuo mouse avrà un nome diverso; capire che è lasciato fuori come esercizio per il lettore.

Mentre conosci ancora l'ID del dispositivo in questa sessione, scopri quanti pulsanti pensa che il gestore di input abbia il tuo mouse, usando . Questo potrebbe essere diverso dal numero di pulsanti che appare sul dispositivo.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"

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

Data la natura dell'USB, questo ID può cambiare ogni volta che riavvii, quindi non è sufficiente eseguire lo script di qualcosa che è staticamente codificato su un ID che scopri una volta. Dovrai analizzarlo dinamicamente all'avvio ed eseguire la tua nuova mappa sulla base dell'ID corrente.

Ora che conosci il suo nome, puoi usare xinput testper capire quale chiave rimappare. Premi i pulsanti del mouse che desideri 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-map li inverte 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 # 9 (lato, in alto) al pulsante # 2 (al centro).

Ora che sai come si chiama il tuo mouse e quali pulsanti vuoi modificare, puoi scrivere uno ~/.xsessionrcscript che invoca xinputper eseguire la mappatura dei pulsanti all'avvio. Di seguito è 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].*$/\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

La prima riga qui imposta una variabile di sessione temporanea uguale all'ID del mouse come riportato da xinput. Questo viene fatto greping dal nome noto del mouse nel report da xinput, quindi usando sedper estrarre il numero ID da quel id=xxxtoken nel report. Questo valore viene quindi utilizzato in una xinput set-button-mapdirettiva, che esegue la nuova mappatura. Nell'esempio sopra, l'unica modifica è che il pulsante n. 9 viene mappato nuovamente per simulare il pulsante n. 2. Tutti gli altri rimangono alle impostazioni predefinite.

Aggiornamento: come indicato da @Lokasenna di seguito , se il dispositivo si segnala sia come mouse che come tastiera, potrebbe essere necessario limitare il conteggio dei risultati grepdell'utilizzo -m 1.

Mappatura dei pulsanti del mouse su funzioni arbitrarie

Vedi anche questa risposta .

Avrete bisogno xinput, xbindkeyse xautomation(compreso xte) installato per questo compito.

Utilizzare xinput liste xinput testper scoprire l'ID del dispositivo del mouse e il numero del pulsante che si desidera assegnare. Nel mio caso, volevo mappare il pulsante laterale in basso (# 8) con un doppio clic sul pulsante sinistro (# 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 xtecomponente di xautomationper 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 associa una sequenza di due clic del mouse sul pulsante n. 1 al rilascio del pulsante n. 8. (In teoria immagino che tu possa mappare qualsiasi comando a un pulsante del mouse, ma questo è il caso più comune. Vedi questa risposta per altri esempi pratici.)

Aggiornamento per 16.04 Ubuntu

Per gli utenti con più mouse collegati al sistema, è necessario passare anche 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 modificare il file .xbindkeysrc facendo riferimento al valore id = dall'output del comando (id = 9 in questo esempio):

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

7
Grazie per l'informazione. Il tuo awk sembra che dovrebbe cambiare in base al numero di parole nel dispositivo. Ho usatosed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112 il

Secondo il tasto xinput test, il pollice attiva tre diverse pressioni dei tasti: come collegarle tutte insieme in .xbindkeysrc?
axltop,

@ jbo5112 Ho appena iniziato a utilizzare più mouse sul mio laptop di lavoro e ho avuto buone ragioni per rivisitare il tuo commento. Ora ho sostituito la mia vecchia awkaffermazione con la tua sedaffermazione nei miei esempi. Grazie per il miglioramento!
zerobandwidth,

2
Non è necessario utilizzare un ID in set-button-map; ad esempio:xinput set-button-map "Logitech Trackball" 1 3 3
Jaustin,

Problema insolito suppongo: xinputmostra il mio mouse due volte, in questo modo: ↳ MOUSE OTTICO USB id = 12 [puntatore slave (2)] ↳ MOUSE OTTICO USB id = 13 [puntatore slave (2)] Solo l'ID 13 catturerà i comandi con xinput test. Lo script rileverà sempre il primo ID. Ma perché è due volte comunque? Entrambi scompaiono quando disconnetto questo mouse e riappaiono quando sono connessi.
w-sky

6

Brevi passaggi per questo sono:

C'è un'utilità chiamata xinput. xinput listo semplicemente xinputmostrerà tutti i dispositivi di input X e i loro ID. Qui trovi l'ID del mouse che vuoi rimappare.

Userò il mio ID come esempio, dalla mia configurazione, che è 21, quindi xinput --get-button-map 21verrà emesso

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

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

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

Eccoci, la rimappatura è fatta.

Per eseguirlo all'avvio, basta inserirlo in un file:

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

dare il permesso eseguibile

chmod +x leftmouseremap.sh 

Infine, aggiungilo manualmente all'applicazione Statrtup dalla GUI o, se lo desideri dalla CLI, inserisci il testo qui sotto (cambia i percorsi del tuo) in un file nel tuo ~/.config/autostart, ecco il 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=

Tieni presente che con KDE il percorso sarebbe simile ~/.kde/Autosart, per altri desktop manager questo potrebbe essere visivamente diverso. In alternativa, l'avvio può essere eseguito con un approccio generale usando /etc/rc.local.


Questo ha risolto il mio problema di fuoriuscita di acqua. Ho i pulsanti sinistro / destro sotto il touchpad del mio laptop. Ho versato acqua e ora entrambi i pulsanti inviano un segnale di clic centrale al sistema operativo (l'ho scoperto usando l'app 'keymon'). Ho usato il tuo metodo per rimappare il clic centrale con il tasto sinistro, quindi posso almeno godermi un'esperienza del tasto sinistro. Non utilizzo mai il clic centrale, quindi per me funziona perfettamente :) Grazie per le semplici istruzioni. Il mio ID dispositivo di input era 11, quindi ho eseguito "xinput --set-button-map 11 1 1 3" Grazie !!
Vahid Pazirandeh,

3

Quando si utilizza la risposta ottimale di zerobandwidth , alcuni dispositivi, come MX Ergo di Logitech, vengono visualizzati sia come puntatore che come 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 rovina tutti i pulsanti del mouse.

La correzione è semplice: basta usare grepl'argomento conteggio massimo -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

Ottimo consiglio; Ho modificato la risposta per includerla. Grazie!
zerobandwidth

1

Sono stato in grado di cambiare la mappatura del pulsante centrale del mio mouse Logitech in 'Return' usando Easystroke Gesture Recognition che ho scaricato da Ubuntu Software Center. Modifica: Nell'applicazione, seleziona Aggiungi azione, Assegna un nome, seleziona il tipo di chiave, fai clic su Dettagli e premi Invio, premi Registra tratto e durante il prompt premi il pulsante centrale.


1
Benvenuto in AskUbuntu. Devi fornire maggiori dettagli con la tua risposta.
David,

Ok, vedi sopra modifica.
atr15,

Buona pesca. Ma ciò che hai descritto non funziona secondo le tue istruzioni: in realtà il pulsante centrale è il pulsante predefinito per mettere l'app in 'modalità di riconoscimento dei gesti': quando la premi, l'app inizia a riconoscere il gesto che stai facendo. Tuttavia, +1 perché quell'app ha un modulo per rivelare gli ID dei pulsanti del mouse; questo aiuta quando vogliamo usare i xinputpulsanti che non vengono visualizzati durante l'uso xinput list <devID>.
1111161171159459134,

1
Oh, questo è arrivato 1 anno dopo - la tua risposta vale +1
1111161171159459134

1

Prima del 12.04 c'era un semplice strumento grafico chiamato "btnx" nel repository standard, che veniva aggiunto come "Proprietà pulsante" in Configurazione di sistema. Purtroppo però è stato lasciato cadere. Un PPA "non attendibile" attualmente gestito per 14.04, 16.04 e 18.04 è qui: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (disponibile su https://launchpad.net/ubuntu/xenial/+source / btnx )

Non si integra con le impostazioni di sistema, ma funziona abbastanza bene sul mio laptop con un mouse a 5 pulsanti economico. Può rimappare anche a sequenze di tasti e comandi e la configurazione è molto più semplice che con qualsiasi altro metodo!


Mi chiedo se lo strumento stia apportando le stesse modifiche, solo in background. ^ _ ^
zerobandwidth

0

Ho HP elitebook 2570p, Ubuntu 18.04.2. Qui ho un trackpoint che è inutile per me e qui ci sono 2 pulsanti trackpoint inutili sotto lo spazio

Non uso questi tasti perché ce l'ho sotto il touchpad. Vorrei rimappare questi pulsanti su left = back_button (Alt_L + Left), quello destro = middle_mouse_button. Il trackpoint in "xinput" è id = 11 e il pulsante sinistro è il numero 1, la destra è 3.

Qualcuno potrebbe scrivermi il giusto codice per copiarlo sul terminale? Ho combinato con xbindkeysrc ma questo imposta qualsiasi azione su entrambi i pulsanti (trackpoint e touchpad)


L'ho fatto e l'ho fatto semplicemente: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Rende i miei pulsanti touchpoint (id 11) rende la sinistra come 8 ° pulsante, il centro come clic sinistro (n. 1) e il clic destro come quello centrale e poi 'codice' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'tasto Sinistra' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' Imposta il pulsante n. 8 (b: 8) su Alt_L + Sinistra => torna indietro :) Ora ho 2 pulsanti del mouse utili
Atom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.