xmodmap untuk kombinasi tombol - cara beralih perilaku Fn?

9

Dengan keyboard Logitech K290 via USB, tombol F. tidak dapat diakses secara default, dan saya perlu menekan Fnsebelum menggunakannya, yang sebenarnya tidak bisa digunakan.

The Fnkey saja tidak api setiap peristiwa di xev.

Menekan F1tanpa Fnmenyalakan dua peristiwa utama, kode kunci 50 ( Shift_L) dan kode kunci 133 ( Super_L) dan menampilkan pesan "Touchpad dinonaktifkan" di Kubuntu saya (pesan yang sama untuk setiap tombol yang F1dilewati F4)

Meskipun sebagian besar tombol media berfungsi, saya lebih suka memiliki akses tombol F. langsung. Apakah Anda tahu cara untuk mengubah Fnperilaku?

Ini adalah output ketika saya menekan F1tanpa 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

Dan untuk F2(masih belum 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

F1dengan Fnmemberikan hasil yang diharapkan:

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
pengguna55574
sumber
2
Biasanya <kbd> Fn </kbd> bekerja pada level perangkat keras keyboard. Mudah-mudahan kode kunci , berbeda dengan keysyms, dari F-keys masih berbeda ketika tidak ditekan. Bisakah Anda menjalankan xevsekali lagi dan menempelkan output untuk dua tombol F yang berbeda?
9000
Saya telah menemukan masalah yang sama :(. Jawaban ini ( askubuntu.com/a/285604/121193 ) mungkin berguna, tetapi akan menyenangkan untuk sesuatu ... lebih sederhana.
Ash
1
Sayangnya, Solaar hanya berfungsi untuk penghasil emisi nirkabel, bukan yang kabel :(
user55574
Saya akan mulai dengan melihat pengaturan BIOS. Beberapa mengizinkan swapping kunci Fn misalnya F-keys-by-default ..
Jonas Berlin
benar-benar jahat bahwa F1 menggunakan kembali kode kunci 50, jadi Anda tidak bisa hanya mengubah apa yang dilakukan 50 juga ..: P
Jonas Berlin

Jawaban:

1

Saya memperoleh hasil yang sama dengan menukar kode kunci antara Fn+Fxdan di Fxmana x berada 1,2,...12.

  1. Gunakan xmodmap -pkeuntuk memperoleh daftar kode kunci dan simbol saat ini.
  2. Kemudian jalankan xevdan tekan F1melalui F12menjaga catatan keycode nya.
  3. Kemudian buat swap di ~/.Xmodmapfile Anda .

Untuk misalnya dalam sistem saya hasil dari (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
..

Kemudian saya menukar ~/.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
...

Kemudian untuk menjalankan lari xmodmap ~/.Xmodmap.

rajames
sumber
0

xevtidak dapat menampilkan acara yang ditangkap oleh lingkungan desktop. Cara yang lebih baik untuk menguji kunci adalah menggunakan showkeyperintah (di konsol Linux, bukan di dalam X11). Saya menduga bahwa OS sebenarnya menerima kombinasi beberapa tombol + Shift + Super +.

Meskipun Anda bisa mengubah kombinasi kata menjadi hanya tombol F, kemungkinan akan merepotkan: Anda harus "melepaskan" tombol Shift (karena keyboard mensimulasikan menekannya), dan membuat kerja Shift + F1 akan menjadi lebih rumit , karena akan membutuhkan pelacakan jika tombol Shift ditekan sebelumnya.

Masalah ini sangat umum pada laptop, yang sering memiliki kombinasi tombol untuk beralih hotkey multimedia, atau opsi di BIOS / firmware mereka. Tetapi ketika Anda menyebutkan bahwa ini menyangkut model keyboard eksternal tertentu, mencari online saya menemukan proyek ini:

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

Deskripsi proyek menyatakan bahwa ia "mengkonfigurasi ulang cara fungsi tombol pada keyboard Logitech K290 bekerja", jadi mungkin patut dicoba.

Vladimir Panteleev
sumber