xmodmap dla kombinacji klawiszy - jak przełączyć zachowanie Fn?

9

W przypadku klawiatury Logitech K290 przez USB klawisze F. nie są domyślnie dostępne i muszę je nacisnąć Fnprzed użyciem, co tak naprawdę nie jest użyteczne.

Sam Fnklucz nie uruchamia żadnego zdarzenia xev.

Naciśnięcie F1bez Fnwyzwalania dwóch kluczowych zdarzeń, kodu 50 ( Shift_L) i kodu 133 ( Super_L) i wyświetla komunikat „Touchpad wyłączony” na moim Kubuntu (ten sam komunikat dla każdego klawisza F1przez F4)

Chociaż większość klawiszy multimediów działa, wolałbym mieć bezpośredni dostęp do klawiszy F. Czy znasz jakiś sposób zmiany Fnzachowania?

Oto wynik, gdy naciskam F1bez Fn:

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638420, (-352,274), root:(1462,621),
    state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638420, (-352,274), root:(1462,621),
    state 0x11, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 40, synthetic NO, window 0x0,
    keys:  4294967238 0   0   0   0   0   4   0   0   0   0   0   0   0   0   0   
           32  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638436, (-352,274), root:(1462,621),
    state 0x51, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638436, (-352,274), root:(1462,621),
    state 0x50, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

MappingNotify event, serial 40, synthetic NO, window 0x0,
    request MappingPointer, first_keycode 0, count 0

I dla F2(wciąż nie Fn):

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782724, (-202,438), root:(1491,799),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782724, (-202,438), root:(1491,799),
    state 0x18, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 40, synthetic NO, window 0x0,
    keys:  4294967238 0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   
           32  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782780, (-202,438), root:(1491,799),
    state 0x58, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782780, (-202,438), root:(1491,799),
    state 0x50, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

F1z Fndaje oczekiwany wynik:

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64820204, (-856,-213), root:(1097,247),
    state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64820284, (-856,-213), root:(1097,247),
    state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
użytkownik55574
źródło
2
Zwykle <kbd> Fn </kbd> działa na poziomie sprzętowym klawiatury. Mam nadzieję , że kody klawiszy , w przeciwieństwie do klawiszy , klawiszy F nadal się różnią, gdy nie są naciśnięte. Czy możesz xevponownie uruchomić i wkleić dane wyjściowe dla dwóch różnych klawiszy funkcyjnych?
9000
Natknąłem się na ten sam problem :(. Ta odpowiedź ( askubuntu.com/a/285604/121193 ) może być przydatna, ale przydałoby się coś ... prostszego.
Ash
1
Niestety, Solaar działa tylko w przypadku emiterów bezprzewodowych, a nie przewodowych :(
user55574,
Zacznę od przejrzenia ustawień BIOS-u. Niektóre pozwalają na zamianę klawisza Fn, np. Klawisze F domyślnie ..
Jonas Berlin,
naprawdę paskudne, że F1 ponownie używa kodu 50, więc nie można po prostu zmienić tego, co 50 robi ..: P
Jonas Berlin

Odpowiedzi:

1

Ten sam wynik uzyskałem, zamieniając kody klawiszy pomiędzy Fn+Fxi Fxgdzie x jest 1,2,...12.

  1. Użyj, xmodmap -pkeaby uzyskać listę bieżących kodów klawiszy i symboli kluczy.
  2. Następnie uruchom xevi naciśnij F1poprzez F12utrzymywanie uwagę jego kodu dostępu.
  3. Następnie dokonaj wymiany w swoim ~/.Xmodmappliku.

Na przykład w moim systemie wynik (1):

keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode 68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
keycode 69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
keycode 70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
...

keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute
..

Potem zamieniłem ~/.Xmodmap:

keycode 121 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode 122 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
keycode 123 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
keycode 198 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
...


keycode 67 = XF86AudioMute NoSymbol XF86AudioMute
keycode 68 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 69 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
keycode 70 = XF86AudioMicMute NoSymbol XF86AudioMicMute
...

Następnie wziąć wpływ na bieg xmodmap ~/.Xmodmap.

rajames
źródło
0

xevnie można wyświetlić zdarzeń przechwyconych przez środowisko pulpitu. Lepszym sposobem testowania kluczy jest użycie showkeypolecenia (w konsoli Linux, a nie w X11). Domyślam się, że system operacyjny otrzymuje kombinację Shift + Super + jakaś kombinacja klawiszy.

Chociaż możliwe jest ponowne przypisanie tej kombinacji do klawisza F, prawdopodobnie byłoby to kłopotliwe: trzeba by było „zwolnić” klawisz Shift (ponieważ klawiatura symuluje jego naciśnięcie), a sprawienie, aby Shift + F1 działało, byłoby jeszcze bardziej skomplikowane , ponieważ wymagałoby to uprzedniego przytrzymania klawisza Shift.

Ten problem jest bardzo powszechny na laptopach, które często mają kombinację klawiszy do przełączania skrótów multimedialnych lub opcję w BIOS / firmware. Ale jak wspomniałeś, że chodzi o konkretny model klawiatury zewnętrznej, patrząc online, znalazłem ten projekt:

https://github.com/milgner/k290-fnkeyctl

Opis projektu stwierdza, że ​​„zmienia on sposób działania klawiszy funkcyjnych na klawiaturach Logitech K290”, więc warto spróbować.

Vladimir Panteleev
źródło