Přeskočit na obsah

Fvwm/Meta key

Z Wikiverzity

Problém: fvwm/Meta key

Meta key

[editovat]

Na kombinaci Ctrl-Meta-šipka mám namapovaný přesun na vedlejší pracovní stránku (GotoPage). To mi ale při přechodu na Ubuntu/Lucid a připojení externí USB klávesnice k notebooku najednou přestalo fungovat. V čem je chyba?

Divné také bylo, že při držení Alt a mačkání šipek Up, Down, Right, Left se mi na terminálu psala písmena A, B, C, D. Když to dělám na klávesnici notebooku, je to ale jiné.

Inspiruji se článkem http://www.abclinuxu.cz/clanky/hardware/multimedialni-a-jinak-vylepsene-klavesnice

Zjistím, jaké eventy mi jdou do X-ek:

xev

Tak to vypadá OK, vlevo od mezerníku mám namapované klávesy Control_L, Meta_L, Alt_L

Ale je divné, že u šipek na notebooku mám eventy Prior, Next, Home, End. To vypadá na zapnutý NumLock na notebooku (přes funkční klávesu Fn). Vypnu ho a je to OK.

A kupodivu zjišťuji, že mi pak funguje i přepínání workspace. Tak to by mě tedy nenapadlo! Nastavení NumLocku na klávesnici notebooku mi ovlivní chování připojené USB klávesnice!

Problém jsem řešil skoro celý den, málem jsem si překonfiguroval kvůli tomu celý systém.

Nicméně tento problém se vyskytuje i u běžné PC klávesnice, kde potřebuji mít NumLock zapnutý a přitom mít možnost používat kombinace Ctrl-Meta-šipka na přesun mezi Stránkami (GotoPage).

Zkusím obezličku a přemapovat přesun na vedlejší na klávesy Ctrl+Super_L+šipka. Klávesa Super_L je ta klávesa mezi Ctrl a Alt, často se symbolem Windows. Výše uvedená utilita xev mi to ověří:

KeyPress event, serial 41, synthetic NO, window 0x7e00001,
    root 0x293, subw 0x0, time 8120478, (161,176), root:(207,280),
    state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 41, synthetic NO, window 0x7e00001,
    root 0x293, subw 0x0, time 8120782, (161,176), root:(207,280),
    state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Teď se podívám, jak mám namapované modifikátory kláves:

xmodmap -help
xmodmap xmodmap -pm
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Super_L má kód 133 = 0x85 a mapuje se na mod4.

Tady čtu, jak se to dělá: Re: FVWM: Using 'Super_L' as a key modifier

Takže zkusím přidat do ~/.fvwm/config řádky:

Key Left   A C4 GotoPage -1p +0p
Key Right  A C4 GotoPage +1p +0p
Key Up     A C4 GotoPage +0p -1p
Key Down   A C4 GotoPage +0p +1p

Bezva, Ctrl+Super_L funguje, jenže zase jen v případě, že není aktivní NumLock. Co s tím?

Hledám: NumLock site:fvwm.org

fvwm: Why do NumLock, CapsLock and ScrollLock interfere with ClickToFocus and/or my mouse bindings? – čtu, že ty všelijaké Locky s tím můžou interferovat. Co s tím?

Co je to za blbou klávesu, ten NumLock?

xev
KeyPress event, serial 41, synthetic NO, window 0x7400001,
    root 0x293, subw 0x0, time 9914420, (151,172), root:(178,238),
    state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 41, synthetic NO, window 0x7400001,
    root 0x293, subw 0x0, time 9914988, (151,172), root:(178,238),
    state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

keycode 77 = 0x4D

Tady je nějaká obezlička – nechat NumLock MumLockem a přemapovat si číslice na padu rovnou pomocí xmodmap:

 xmodmap -e "keysym KP_Up = KP_8"
 xmodmap -e "keysym KP_Left = KP_4"
# ...

Tedy, dotaženo do konce:

xmodmap -e "keysym KP_Delete = period"
xmodmap -e "keysym KP_Insert = KP_0"
xmodmap -e "keysym KP_End = KP_1"
xmodmap -e "keysym KP_Down = KP_2"
xmodmap -e "keysym KP_Next = KP_3"
xmodmap -e "keysym KP_Left = KP_4"
xmodmap -e "keysym KP_Begin = KP_5"
xmodmap -e "keysym KP_Right = KP_6"
xmodmap -e "keysym KP_Home = KP_7"
xmodmap -e "keysym KP_Up = KP_8"
xmodmap -e "keysym KP_Prior = KP_9"

Obezlička funguje.

Ještě se podívám, co je to vlastně za příkaz clear Lock: stackoverflow: xmodmap clear command

Tak tedy ještě zkusím:

xmodmap -e "clear Lock"