GNU/Linux >> Linux Esercitazione >  >> Linux

Come rimappare i tasti sotto Linux solo per una tastiera specifica

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

Per prima cosa 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 di shell, cambiando la riga sed con una che si adatti al nome del tuo dispositivo. Quindi cambia le chiavi che devi rimappare.

Esempio:carica xev e premi un tasto che vuoi rimappare. Supponiamo di scoprire che è il codice chiave 84. Cerca 84 in https://gist.github.com/zoqaeski/3880640. Il nome della chiave è <KP5> . Quindi cerca la chiave con cui vuoi sostituirla (nello stesso link, più in basso) e copia ciò che c'è tra parentesi. Ripeti il ​​processo 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 procuratene (puoi aggiungerlo al tuo .xinitrc). Tutto fatto! Ora la pressione dei tasti 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 sul tuo altro tastiera, quindi testare i tasti configurati sulla tastiera modificata. Non so perché questo accada, forse una sorta di cache.


Per chiunque altro venga qui da Google e desideri una risposta più in linea con ciò che l'interrogante sperava inizialmente, sono a conoscenza di due modi per rimappare gli eventi al evdev level 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 le mappature tra scancode e keycode. Questa pagina ArchiWiki, che contiene le istruzioni, dice esplicitamente che funzionerà sia per X11 che per input da console.

    L'essenza è che crei una voce personalizzata in /etc/udev/hwdb.d/ che consiste in un modello di corrispondenza del dispositivo e alcune definizioni di rimappatura da scancode a keycode, quindi esegui systemd-hwdb update per ricostruire il database e udevadm trigger applicalo 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 dello 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 uinput API per la creazione di dispositivi di input a livello di kernel dallo spazio utente.)


Linux
  1. Linux:come utilizzare lo spazio di scambio solo per le emergenze?

  2. Linux – Tasti di rimappatura hard della tastiera?

  3. Linux:come grep per una parola specifica e afferrare il testo?

  4. Come disabilitare un comando specifico per un utente specifico in Linux

  5. Come impostare l'ID processo in Linux per un programma specifico

Come navigare nel desktop GNOME Linux con solo una tastiera

Come eseguire un comando per un tempo specifico in Linux

Come installare Setuptools per Python su Linux

Rimappa i tasti della tastiera personalizzati in Linux - Tutorial

Cedilla sotto C (ç) nel layout di tastiera "US internazionale con tasti morti" in Linux

sshd:come abilitare l'autenticazione PAM per utenti specifici in