Come rimappare i tasti sotto Linux solo per una tastiera specifica


18

Di recente ho acquistato una tastiera Unicomp che viene fornita con i tasti alt alt destro e Windows scambiati. La tastiera si identifica in questo modo su lsusb:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

C'è un modo per far scambiare il kernel (cioè non basato su xmodmap) i tasti alt-right e windows in modo che ogni applicazione li veda nei punti scambiati anche se ottengono input da tastiera grezzi (lo scambio di cose con xmodmap non lo farà) ? C'è un modo per averlo solo per questa tastiera?


Ho il sospetto che potresti farlo con udev abbinando il numero seriale della tastiera e quindi chiamando uno script che esegue il remapping. Probabilmente avresti bisogno di uno script simile per essere richiamato al momento del distacco perché il dispositivo lo rimetta.
marmellata

1
@jam Rimapparebbe tutte le tastiere collegate? Non riesco a immaginare che Linux sia così inflessibile da poter gestire solo una tabella di mappatura per tutte le tastiere (USB) collegate.
FUZxxl,

@jam Inoltre, mi aiuteresti davvero se potessi descrivere come effettuare lo scambio reale. Non sono riuscito a trovare nulla di utile su questo, solo roba xmodmap (che non voglio usare).
FUZxxl,

Se non vuoi usare xmodmap, quello che stai chiedendo sembra essere troppo specifico per le mie conoscenze per aiutarti a scusarti. Il metodo che ho proposto userebbe xmodmap per scambiare i codici chiave per quei tasti per tutti i dispositivi, per la durata in cui è collegata la tua tastiera specifica, e poi rimetterlo. Ti aspetti di utilizzare più tastiere contemporaneamente?
marmellata

@jam Se usassi Xmodmap, i programmi X visualizzerebbero comunque i codici chiave errati poiché il server X invia anche codici chiave non tradotti al client. Questo è importante, ad esempio, per i videogiochi. Dovrebbe esserci una soluzione nel kernel che non mi rende la vita più complicata con le applicazioni che leggono i codici di scansione.
FUZxxl,

Risposte:


27

Sì, è possibile utilizzare XKB. A differenza di xmodmap, XKB può rimappare le tue chiavi per singoli dispositivi.

Nota: assicurati di avere xkbcomp> 1.2.0

Prima elenca i tuoi dispositivi con:

xinput list

Otterrai qualcosa del genere:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [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)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Identifica la stringa del tuo dispositivo e modifica il seguente script della shell, cambiando la linea sed con una adatta al nome del tuo dispositivo. Quindi cambia le chiavi che devi modificare.

Esempio: carica xeve premi un tasto che vuoi rimappare. Supponiamo di scoprire che è il codice chiave 84. Ricerca 84 in https://gist.github.com/zoqaeski/3880640 . Il nome chiave c'è <KP5>. Quindi cerca la chiave da cui desideri sostituirla (nello stesso link, più avanti ) e copia cosa c'è tra parentesi. Ripeti la procedura per tutte le chiavi che desideri.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Quindi cercalo (puoi aggiungerlo al tuo .xinitrc). Tutto fatto! Ora premendo i tasti si dovrebbe generare l'output desiderato, solo per il dispositivo specificato.

Modifica : Di recente, ho notato che, per qualche motivo, la nuova configurazione non viene applicata immediatamente. Devi prima premere un tasto sull'altra tastiera, quindi testare i tasti configurati sulla tastiera modificata. Non so perché questo accada, forse una sorta di cache.


Fammi provare questo lunedì quando torno al computer dove uso questa tastiera.
FUZxxl

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c) Sì, è necessario testarlo prima sostituendolo $remote_idcon il numero ID. Nota che ci sono due riferimenti $remote_idlì, hai cambiato entrambi?
Watcom,

1
Oh, e durante il test del codice hard $remote_id, assicurati di commentare la riga [ "$remote_id" ] || exitse non l'hai già fatto altrimenti verrà salvata.
Watcom,

1
@ stats-hb $9non funzionerà, intendevi 9?
Watcom,


6

Per chiunque venga qui fuori da Google e desidera una risposta più in linea con ciò che inizialmente l'interrogatore sperava, sono a conoscenza di due modi per rimappare gli eventi a evdevlivello in modo che la modifica si applichi a tutte le applicazioni:

  1. udev fornisce un'API per modificare le voci del database hardware che controllano i mapping tra scancode e keycode. Questa pagina di ArchiWiki , che contiene istruzioni, dice esplicitamente che funzionerà sia per l'X11 che per l'input della console.

    L'essenza è che si crea una voce personalizzata in /etc/udev/hwdb.d/cui sono presenti un modello di corrispondenza del dispositivo e alcune definizioni di rimappatura da scancode a codice chiave, quindi si esegue systemd-hwdb updateper ricostruire il database e udevadm triggerapplicarlo senza riavviare.

  2. Dato che Wayland non utilizza il sottosistema di tastiera di X11 e i principali compositori di Wayland come GNOME Shell e Weston non implementano le interfacce utente per configurare gli aspetti rilevanti di libinput, qualcuno ha scritto un demone chiamato evdevremapkeys che risolve il problema in modo simile al driver di spazio utente G15Daemon per Logitech Tastiere da gioco G15.

    (Ingoia gli eventi che intende rimappare, quindi nient'altro in ascolto sul dispositivo può vederli, quindi emette gli eventi corretti tramite l' uinputAPI per creare dispositivi di input a livello di kernel dallo spazio utente.)


Vengo qui al largo di DuckDuckGo, ma grazie comunque per la risposta (:
sm4rk0

0

Per coloro che non sono riusciti con l'opzione @Watcom, basta inserire il tuo nuovo file di mappatura, come:

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

su / usr / share / X11 / xkb / simboli / come forse root (ubuntu, potrebbe differire per il tuo distrib), chiama il file 'custom'. Richiedi la stringa di layout corrente con setxkbmap -device <device id> -print | grep xkb_symbolse aggiungi+custom . Imposta nuovo layout con chiavi rimappate con e stringa di layout modificata:

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

L'effetto non è permanente e purtroppo si ripristina quando è collegata un'altra tastiera, non ho ancora capito come risolverlo. Puoi aggiungere il comando sopra al tuo .bashrc, quindi, se necessario, le chiavi vengono scambiate al riavvio.

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.