Intercambio de teclas AltGr y Space en Kali: Firefox no se ve afectado

Jan 04 2021

Después de probar varios Spacey AltGrclave Ideas localización, el cambio de xkbapariencia más prometedores. Leí y usé estas ideas relacionadas con xkb:
Reasignar la tecla altgr a AC10 en XKB
¿Cómo puedo reasignar las teclas del teclado?

Desde el primer vistazo, mis correcciones parecen funcionar en el editor de texto y en el terminal (el Spacesímbolo está impreso al AltGrpresionar la tecla). Sin embargo, en Firefox no funciona. Mirando más de cerca, he notado que en las tres aplicaciones las combinaciones de teclas con AltGrtambién funcionan (como si no se hubiera realizado una reasignación), excepto que en el terminal y en el editor de texto la combinación imprime adicionalmente el carácter de espacio. Por ejemplo, en el terminal y en FireFox la combinación AltGr+ Fabre el menú Archivo y en el terminal también se imprime un carácter de espacio.

Mi Spaceestá roto y no lo uso AltGr. Solo quiero intercambiar completamente su funcionalidad. ¿Qué me estoy perdiendo? (Yo uso Kali Linux).

Esto es lo que hice:
1.Abierto /usr/share/X11/xkb/symbols/pc
2.Cambié la línea comentada con la siguiente:

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

3. Agregó estas líneas:

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

4.Guardado el pcarchivo.
5.Borró el xkbcaché ejecutándose rm -rf /var/lib/xkb/*
6.Reiniciado


Información adicional (después de las modificaciones enumeradas anteriormente).

pcArchivo actual 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( AltGrpresione y suelte):

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

Como la Spacetecla de mi teclado está rota, no puedo mostrarla xev.

Respuestas

3 Maik93 Jan 08 2021 at 01:35

De hecho, lo hice funcionar incluso con xkeymap, lo dejo aquí como una respuesta diferente porque el método es estrictamente diferente de mi solución anterior.

Tal vez se haya perdido alguna ocurrencia de AltGruso.

Tratando de imitar su configuración, he exportado el archivo de configuración actual con el comando xkbcomp $DISPLAY current.xkby editado por la eliminación de todos ISO_Level3_Shift, LVL3y Mod5ocurrencias.

Precisamente, lo que he eliminado es:

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> };

Entonces he insertado:

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

Esta configuración editada se puede probar cargándola con

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

No encontré ninguna referencia que demuestre que lo que propusiste no debería funcionar en Firefox, mientras que parece que Chromium (y por lo tanto Chrome) no se basa en xkeymaps: es una opción en desarrollo que integra mejor el programa en ChromeOS. Por lo tanto, es posible que no se admitan algunas reasignaciones de sistemas.

Una solución que funcionó para mí es reasignar códigos de teclas a nivel de kernel. Para lograr esto, he recopilado códigos de escaneo (el ID de hardware de la clave) y códigos clave (el símbolo en el que están asignados) tanto para el espacio como para 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

Por lo que tengo entendido, le gustaría reasignar altGr al espacio porque su barra espaciadora está rota, por lo tanto:

sudo setkeycodes e038 57

debería hacer el truco.


Para hacer esto permanente en Kali Linux, debe editar el archivo xinit predeterminado /etc/xdg/xfce4/xinitrc, copiándolo ~/.xinitrce insertándolo sudo setkeycodes e038 57antes de la instrucción if que contiene exec xfce4-session; en el archivo predeterminado de Kali 20.04, esta instrucción if está en la línea 86.

Tenga en cuenta que esto requiere habilitar sudo sin contraseña ), pero hasta donde puedo recordar, esta ya es la opción predeterminada en Kali.