Scambiare i tasti AltGr e Spazio in Kali - Firefox non è interessato

Jan 04 2021

Dopo aver provato diversi Spacee AltGrimportanti idee rimappatura, cambiando xkblook più promettenti. Ho letto e utilizzato queste idee relative a xkb:
Rimappare il tasto altgr su AC10 in XKB
Come posso rimappare i tasti della tastiera?

A prima vista le mie correzioni sembrano funzionare nell'editor di testo e nel terminale (il Spacesimbolo è stampato alla AltGrpressione del tasto). Tuttavia, in Firefox non funziona. Guardando più da vicino, ho notato che in tutte e tre le applicazioni le combinazioni di tasti con AltGrfunzionano anche (come se non fosse stata eseguita alcuna rimappatura), tranne che nel terminale e nell'editor di testo la combinazione stampa in aggiunta il carattere spazio. Ad esempio, nel terminale e in FireFox la combinazione AltGr+ Fapre il menu File e nel terminale viene stampato anche uno spazio.

Il mio Spaceè rotto e non lo uso AltGr. Voglio solo cambiare completamente la loro funzionalità. Cosa mi manca? (Io uso Kali Linux.)

Questo è quello che ho fatto:
1.Aperto /usr/share/X11/xkb/symbols/pc
2.Modificato la riga commentata con quella qui sotto:

 // key <SPCE> {    [    space      ]   };
 key <SPCE> {   [ ISO_Level3_Shift  ]   };

3. Aggiunte queste righe:

// Additionally added
key <RALT> {    [    32     ]   };

4.Hai salvato il pcfile.
5.Cancellata la xkbcache in esecuzione rm -rf /var/lib/xkb/*
6.Restarted


Informazioni aggiuntive (dopo le modifiche sopra elencate).

pcFile corrente completo :

default  partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {

    key <ESC>  {    [ Escape        ]   };

    // The extra key on many European keyboards:
    key <LSGT> {    [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {    [ backslash,    bar ]   };
    // key <SPCE> { [    space      ]   };
    key <SPCE> {    [ ISO_Level3_Shift  ]   };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {    [ BackSpace, BackSpace  ]   };

    key  <TAB> {    [ Tab,  ISO_Left_Tab    ]   };
    key <RTRN> {    [ Return        ]   };

    key <CAPS> {    [ Caps_Lock     ]   };
    key <NMLK> {    [ Num_Lock      ]   };

    key <LFSH> {    [ Shift_L       ]   };
    key <LCTL> {    [ Control_L     ]   };
    key <LWIN> {    [ Super_L       ]   };

    key <RTSH> {    [ Shift_R       ]   };
    key <RCTL> {    [ Control_R     ]   };
    key <RWIN> {    [ Super_R       ]   };
    key <MENU> {    [ Menu          ]   };

    // Beginning of modifier mappings.
    modifier_map Shift  { Shift_L, Shift_R };
    modifier_map Lock   { Caps_Lock };
    modifier_map Control{ Control_L, Control_R };
    modifier_map Mod2   { Num_Lock };
    modifier_map Mod4   { Super_L, Super_R };

    // Fake keys for virtual<->real modifiers mapping:
    key <LVL3> {    [ ISO_Level3_Shift  ]   };
    key <MDSW> {    [ Mode_switch       ]   };
    modifier_map Mod5   { <LVL3>, <MDSW> };

    key <ALT>  {    [ NoSymbol, Alt_L   ]   };
    include "altwin(meta_alt)"

    key <META> {    [ NoSymbol, Meta_L  ]   };
    modifier_map Mod1   { <META> };

    key <SUPR> {    [ NoSymbol, Super_L ]   };
    modifier_map Mod4   { <SUPR> };

    key <HYPR> {    [ NoSymbol, Hyper_L ]   };
    modifier_map Mod4   { <HYPR> };
    // End of modifier mappings.

    key <OUTP> { [ XF86Display ] };
    key <KITG> { [ XF86KbdLightOnOff ] };
    key <KIDN> { [ XF86KbdBrightnessDown ] };
    key <KIUP> { [ XF86KbdBrightnessUp ] };

    // Additionally added
    key <RALT> {    [    32     ]   };

};

hidden partial alphanumeric_keys
xkb_symbols "editing" {
    key <PRSC> {
    type= "PC_ALT_LEVEL2",
    symbols[Group1]= [ Print, Sys_Req ]
    };
    key <SCLK> {    [  Scroll_Lock      ]   };
    key <PAUS> {
    type= "PC_CONTROL_LEVEL2",
    symbols[Group1]= [ Pause, Break ]
    };
    key  <INS> {    [  Insert       ]   };
    key <HOME> {    [  Home         ]   };
    key <PGUP> {    [  Prior        ]   };
    key <DELE> {    [  Delete       ]   };
    key  <END> {    [  End          ]   };
    key <PGDN> {    [  Next         ]   };

    key   <UP> {    [  Up           ]   };
    key <LEFT> {    [  Left         ]   };
    key <DOWN> {    [  Down         ]   };
    key <RGHT> {    [  Right        ]   };
};

setxkbmap -print:

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)" };
};

xev( AltGrpremere e rilasciare):

KeyPress event, serial 34, synthetic NO, window 0x3400001,
    root 0x6cb, subw 0x0, time 1249191, (168,-8), root:(797,298),
    state 0x0, keycode 108 (keysym 0x20, space), same_screen YES,
    XLookupString gives 1 bytes: (20) " "
    XmbLookupString gives 1 bytes: (20) " "
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x3400001,
    root 0x6cb, subw 0x0, time 1249261, (168,-8), root:(797,298),
    state 0x8, keycode 108 (keysym 0x20, space), same_screen YES,
    XLookupString gives 1 bytes: (20) " "
    XFilterEvent returns: False

Poiché la Spacechiave della mia tastiera è rotta, non posso mostrarla xev.

Risposte

3 Maik93 Jan 08 2021 at 01:35

In realtà l'ho fatto funzionare anche con xkeymap, la lascio qui come una risposta diversa perché il metodo è strettamente diverso dalla mia soluzione precedente.

Forse ti sei perso qualche occorrenza di AltGrutilizzo.

Cercando di imitare la configurazione, ho esportato il file di configurazione corrente con il comando xkbcomp $DISPLAY current.xkbed averla modificata, eliminando tutti ISO_Level3_Shift, LVL3e Mod5le occorrenze.

Esattamente, quello che ho cancellato è:

interpret ISO_Level3_Shift+AnyOf(all) {
    virtualModifier= LevelThree;
    useModMapMods=level1;
    action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Shift+AnyOfOrNone(all) {
    action= SetMods(modifiers=LevelThree,clearLocks);
};
key <LVL3> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ ISO_Level3_Shift ]
};
key <RALT> {
    type= "ONE_LEVEL",
    symbols[Group1]= [ ISO_Level3_Shift ]
};
modifier_map Mod5 { <LVL3> };

Poi ho inserito:

key <LVL3> {[space]};
key <RALT> {[space]};

Questa configurazione modificata può essere testata caricandola con

xkbcomp new_conf.xkb $DISPLAY
1 Maik93 Jan 07 2021 at 16:56

Non ho trovato alcun riferimento che dimostri che quello che hai proposto non dovrebbe funzionare su Firefox, mentre sembra che Chromium (e quindi Chrome) non si affidi a xkeymaps: è una scelta in via di sviluppo che meglio integra il programma in ChromeOS. Alcune operazioni di rimappatura del sistema possono quindi non essere supportate.

Una soluzione che ha funzionato per me è stata la rimappatura dei codici chiave a livello di kernel. Per ottenere ciò, ho raccolto codici di scansione (l'ID hardware della chiave) e codici chiave (il simbolo in cui sono mappati) sia per lo spazio che per altGr:

# to collect scan-codes
sudo showkey -s
# space press: 0x39
# altGr press: 0xe0 0x38

# to collect key-codes
sudo showkey
# space press: 57
# altGr press: 100

Per quanto ho capito, vorresti rimappare l'altGr nello spazio perché la tua barra spaziatrice è rotta, quindi:

sudo setkeycodes e038 57

dovrebbe fare il trucco.


Al fine di rendere questo permanente sotto Kali Linux, è necessario modificare il file di default xinit, /etc/xdg/xfce4/xinitrc, per far fronte a ~/.xinitrced inserendo sudo setkeycodes e038 57prima che l'istruzione if che contiene exec xfce4-session; sul file predefinito di Kali 20.04, questa istruzione if è sulla riga 86.

Nota che questo richiede di abilitare sudo senza password ), ma per quanto posso ricordare, questa è già l'opzione predefinita in Kali.