Zamiana klawiszy AltGr i spacja w Kali - nie ma to wpływu na Firefox

Jan 04 2021

Po wypróbowaniu kilku Spacei AltGrkluczowych pomysłów na zmianę map, zmiana xkbwygląda najbardziej obiecująco. Przeczytałem i wykorzystałem te pomysły związane z xkb:
Przemapuj klawisz altgr na AC10 w XKB Jak mogę zmienić przypisanie
klawiszy klawiatury?

Na pierwszy rzut oka moje poprawki wydają się działać w edytorze tekstu i na terminalu ( Spacesymbol jest drukowany po AltGrnaciśnięciu klawisza). Jednak w Firefoksie to nie działa. Przyglądając się dokładniej, zauważyłem, że we wszystkich trzech aplikacjach kombinacje klawiszy AltGrrównież działają (jakby nie było remapowania), z tym że w terminalu iw edytorze tekstu kombinacja dodatkowo wypisuje znak spacji. Np. W terminalu iw FireFox kombinacja AltGr+ Fotwiera menu Plik, aw terminalu również drukowany jest znak spacji.

Mój Spacejest zepsuty i nie używam AltGr. Chcę tylko całkowicie zamienić ich funkcjonalność. czego mi brakuje? (Używam Kali Linux.)

Oto, co zrobiłem:
1.Otwarte /usr/share/X11/xkb/symbols/pc
2.Zmieniono skomentowaną linię na poniższą:

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

3. Dodano te wiersze:

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

4.Zapisano pcplik.
5.Wyczyszczono xkbpamięć podręczną uruchomioną rm -rf /var/lib/xkb/*
6.ponownie


Dodatkowe informacje (po zmianach wymienionych powyżej).

Pełny bieżący pcplik:

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( AltGrprasa i publikacja):

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

Ponieważ Spaceklawisz mojej klawiatury jest uszkodzony, nie mogę go pokazać xev.

Odpowiedzi

3 Maik93 Jan 08 2021 at 01:35

Właściwie to działało nawet z xkeymap, zostawiam to tutaj jako inną odpowiedź, ponieważ metoda jest zupełnie inna niż moje poprzednie rozwiązanie.

Może przeoczyłeś jakieś AltGrużycie.

Próbując naśladować konfiguracji, mam eksportowane bieżący plik konfiguracyjny za pomocą polecenia xkbcomp $DISPLAY current.xkbi edytować je przez wyprowadzenie wszystkich ISO_Level3_Shift, LVL3i Mod5wystąpień.

Dokładniej, to, co usunąłem, to:

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

Następnie wstawiłem:

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

Tę edytowaną konfigurację można przetestować, ładując ją za pomocą

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

Nie znalazłem żadnego odniesienia, które dowodzi, że to, co zaproponowałeś, nie powinno działać w Firefoksie, podczas gdy wydaje się, że Chromium (a tym samym Chrome) nie polega na xkeymaps: jest to rozwijający się wybór, który lepiej integruje program w ChromeOS. Dlatego niektóre zmiany mapowania systemu nie mogą być obsługiwane.

Rozwiązaniem, które zadziałało, jest zmiana mapowania kodów klawiszy na poziomie jądra. Aby to osiągnąć, zebrałem kody skanowania (identyfikator sprzętu klucza) i kody kluczy (symbol, w którym są odwzorowane) zarówno dla spacji, jak i 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

O ile zrozumiałem, chciałbyś przemapować altGr na spację, ponieważ spacja jest zepsuta, dlatego:

sudo setkeycodes e038 57

powinien załatwić sprawę.


Aby uczynić to stałym w Kali Linux, musisz edytować domyślny plik xinit /etc/xdg/xfce4/xinitrc, kopiując go do ~/.xinitrci wstawiając sudo setkeycodes e038 57przed instrukcją if zawierającą exec xfce4-session; w domyślnym pliku Kali 20.04, jeśli instrukcja znajduje się w linii 86.

Zauważ, że wymaga to włączenia sudo bez hasła ), ale o ile pamiętam, jest to już domyślna opcja w Kali.