Come ottenere i codici chiave per xmodmap?


76

Sto provando a utilizzare xmodmapper rimappare Alt/ Supertasti sulla tastiera Dell L100 e ho problemi a ottenere i codici chiave.

Ad esempio, usare xevnon mi dà il codice chiave perAlt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

Per Right Superchiave xeve showkeyfornire codici chiave diversi - 134e 126rispettivamente.

Cosa sta succedendo con questi codici chiave?

Ho provato a ottenere i codici chiave da showkey -k, e usando il xmodmapfile qui sotto, ma questo ha dato una strana mappa che rimappava bchiave:

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R

Ho lo stesso problema con Alt_L non sparare (ma Alt_R va bene), su XUbuntu 14.04. Quale sistema stai usando?
Paul Price,

Risposte:


54

Ci sono molti giocatori tra la tua tastiera e il processo che alla fine gestisce l'evento della tastiera. Tra i principali elementi del panorama vi è il fatto che il sistema X ha il proprio livello di gestione della tastiera e X associa diversi "codici chiave" ai tasti rispetto al sistema base Linux. Il showkeycomando mostra i codici chiave nel linguaggio Linux-base-system. Perché xmodmaphai bisogno dei codici chiave X, che sono ciò che xevviene visualizzato. Finché stai pianificando di lavorare in X e fare la tua combinazione di chiavi con xmodmap, quindi, ignora showkeyse ascolta semplicemente ciò che xevdice.

Quello che vuoi cercare nel tuo xevoutput sono blocchi come questo:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xevtende a generare molto output, specialmente quando si sposta il mouse. Potrebbe essere necessario scorrere indietro per trovare l'output che stai cercando. In uscita precedente, vediamo che la keysym Alt_Lè associato con il codice chiave X 64.


3
Il problema è che non ricevo l'evento KeyPress sul tasto Windows. Ho provato 3 tastiere diverse e lo stesso risultato. Da xev ottengo solo FocusOut, FocusIn e KeymapNotify come visto sopra. Tuttavia, posso andare e impostare scorciatoie tramite Gnome Manager, e vede la chiave di Windows come "Mod4"
Yaroslav Bulatov

Il tasto destro di Windows riporta come Mod4, il tasto sinistro di Windows indica Alt ... il che è confuso perché non ho nemmeno una categoria "Alt" nella mia xmodmap.
Yaroslav Bulatov,

Prova Mod1 per Alt.
dubiousjim,

2
@YaroslavBulatov sembra che l'ambiente desktop stia mangiando la chiave (forse per far apparire il suo menu principale?)
derobert,

3
Puoi filtrare gli eventi che ti dà xev. In questo caso xev -event keyboardsarebbe sufficiente per sbarazzarsi della maggior parte del rumore.
Fredrik Wendt,

24

xev dovrebbe funzionare

Strano, il mio xev dà un evento KeyPress e KeyRelease per alt (e per il tasto Windows, qui chiamato "super"):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

E quello di destra:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Vedo due possibilità:

  1. Qualcos'altro sta mangiando completamente il tasto premuto, o sfocando la finestra su di te premendo alt. Prova a eseguire xev in un server X altrimenti vuoto (ad esempio, esegui xinit -- :1, che dovrebbe farti avere un server X con solo un xterm: non ci sarà nemmeno un gestore di finestre in esecuzione. L'uscita da xterm chiuderà la sessione).
  2. Ti sei appena perso i due eventi in blocco che xev emette.

Un modo semplice, se conosci il nome della chiave

Un'altra possibilità: basta ottenere i codici chiave da xmodmap:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

Ci sono ancora 64 e 108. xmodmap -pmti mostrerà solo la mappa del modificatore, che ti dà anche i numeri (anche se, questa volta, in esadecimale).


15

"Rilevo" tre problemi nella tua domanda:

  1. Perché xeve showkeysegnalare diversi codici chiave per una chiave?
  2. Perché xevnon mostra di Altessere premuto correttamente?
  3. Come scambiare Alte Win?

Per quanto riguarda la prima domanda: in questi giorni, dove il "driver" della tastiera in X non guida l'hardware, potrebbe semplicemente passare i codici chiave dal kernel all'X core, ma non lo fa. Aggiunge 8 al codice chiave prima di trasmetterlo.

Secondo: qualcosa nella tua sessione X sta catturando l' Altevento. Le altre risposte lo riguardano già. (Vale a dire xevnon si ottiene l'evento che si desidera vedere). Il colpevole potrebbe essere correlato al tuo gestore di finestre. Prova una sessione X più nuda.

Terzo: non usare xmodmap. È stato superato da un decennio. I nuovi ragazzi sono XKB e il suo strumento setxkbmap.

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

Per lo scambio Alte Winc'è già un'opzione preparata in XKB. Basta aggiungerlo:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace

Come si rende setxkbmappermanente la modifica?
Steve Kehlet,

Aggiungi la modifica a ~/.xinitrc.
Matthias Braun,

11

Come root, esegui:

showkey -s

... per vedere qual è lo scancode per la tua chiave misteriosa. Ho qualcosa del genere:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

Non so perché sembra che una chiave generi due scancodes. Non è una cosa keydown / keyup, per quanto ne so dal modello. Nota l'avviso, quindi potresti voler eseguire questo in modalità utente singolo.

Immaginai che 0x46 fosse il mio scancode.

Quindi, trova un codice chiave inutilizzato con:

xmodmap -pke | less

Qui puoi vedere il codice chiave 97 non utilizzato sul mio sistema:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

Il codice chiave X utilizzato e il codice chiave utilizzato dal kernel sono OFF BY 8 per "motivi storici". Quindi prendi 97 - 8 = 89 e usa 89 con il comando setkeycodes (di nuovo come root):

# setkeycodes 46 89

E dovresti essere pronto. Conferma con xev che stai ricevendo un evento Keypress con il codice chiave di 97. (anche se una volta ho detto al file chiavi Fluxbox di usare quel codice chiave non ho più ricevuto gli eventi KeyPress - forse perché Fluxbox li ingoia quando li usa?)

Nota che i 'setkeycodes' non sopravvivranno al riavvio, quindi dovrai aggiungerlo ai tuoi script init (es. In /etc/rc.local)


1
Hai un puntatore su "fuori da 8 per motivi storici"?
Robert Siemer,

Ho usato la tua risposta per mappare il blocco maiuscole su un tasto funzione (in particolare F9). Questo mi permette di usare F9 come chiave di prefisso in tmux. Grazie.
Raymond Kroeker il

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "Spesso il numero X sarà 8 in più rispetto al numero Linux." La mia formulazione con "storico" deve provenire da un'altra manpage.
Greg Bell,

11

Stavo cercando di risolverlo da solo e l'ho appena capito.

Il problema principale è che non stai ricevendo l'evento per il tasto premuto. Guardando il registro che hai pubblicato il motivo è evidente.

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

Puoi vedere gli Focus{In,Out}eventi hanno un modedi Notify{Grab,Ungrab}. Ciò indica che una chiave è stata gestita da un altro processo (probabilmente un'applicazione scorciatoia / associazione tasti).

Nel mio caso si trattava di xbindkeys, ma se si utilizza un ambiente desktop probabilmente hanno un sistema di associazione dei tasti. Per vedere questi eventi è xev dovrai fermare / disabilitare l'altro programma.

Se non riesci a determinare quale programma sta rubando gli eventi chiave, la soluzione migliore è avviare un'altra sessione X senza che sia in esecuzione. Esegui il seguente comando per avviare un'altra sessione X sul display :1, se è già stata presa, aumenta il numero alla fine. Ovviamente puoi cambiare il terminale come preferisci o hai installato sul tuo sistema.

xinit /usr/bin/xterm -- :1

Quindi corri di xevnuovo. Questo dovrebbe darti il ​​risultato senza essere catturato da altri programmi. Si noti che il gestore di finestre che viene avviato è attivo al passaggio del mouse, quindi sarà necessario posizionare il cursore sopra la finestra xev affinché i tasti vengano acquisiti.


Come è stato detto in questa eccellente risposta da dubiousjim , il keycode è diverso perché ci sono molti livelli tra xev e il kernel.


4

Ho avuto lo stesso problema con la Alt_Lscomparsa in XUbuntu 14.04 ( Alt_Randava bene). Dopo aver suonato molto, ho osservato che showkeyregistrava la sequenza di tasti, ma xevnon --- doveva essere qualcosa nel sistema di finestre. Ho controllato tutte le impostazioni di "Window Manager" e "Window Manager Tweaks" e non ho trovato nulla. Alla fine, ho trovato un randagio Alt_Lnell'elenco delle scorciatoie da tastiera ( xfce4-keyboard-shortcuts) in "Impostazioni Editor". L'ho "resettato" e ho le Alt_Lspalle! La Alt_Lscorciatoia vagante non si presentava da nessun'altra parte se non nell '"Editor impostazioni".

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.