xmodmap สำหรับการรวมกันที่สำคัญ - วิธีการสลับพฤติกรรม Fn?


9

เมื่อใช้แป้นพิมพ์ Logitech K290 ผ่านทาง USB ปุ่ม F. จะไม่สามารถเข้าถึงได้โดยค่าเริ่มต้นและฉันต้องกดFnก่อนใช้งานซึ่งไม่สามารถใช้งานได้จริง

Fnสำคัญเพียงอย่างเดียวไม่เหตุการณ์ใด ๆ xevใน

การกดF1โดยไม่ต้องFnยิงเหตุการณ์สำคัญสองเหตุการณ์ keycode 50 ( Shift_L) และ keycode 133 ( Super_L) และแสดงข้อความ "ปิดการใช้งานทัชแพด" ใน Kubuntu ของฉัน (ข้อความเดียวกันสำหรับทุกปุ่มF1ผ่านF4)

แม้ว่าคีย์มีเดียส่วนใหญ่จะใช้งานได้ดีฉันก็ต้องการเข้าถึงคีย์ F. ได้โดยตรง คุณรู้จักวิธีการสลับFnพฤติกรรมหรือไม่?

นี่คือผลลัพธ์เมื่อฉันกดF1ไม่มี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

และสำหรับF2(ยังไม่มี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

F1ด้วยการFnให้ผลลัพธ์ที่คาดหวัง:

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

2
โดยปกติ <kbd> Fn </kbd> ทำงานบนระดับฮาร์ดแวร์ของแป้นพิมพ์ หวังว่าการพิมพ์ซ้ำเมื่อเทียบกับ keysyms, F-คีย์ยังคงแตกต่างกันเมื่อมันไม่ได้กด คุณช่วยกรุณาเรียกใช้xevอีกครั้งและวางผลลัพธ์สำหรับคีย์ F สองตัวที่แตกต่างกันได้หรือไม่
9000

ผมเคยเจอปัญหาเดียวกัน :( คำตอบนี้ (. askubuntu.com/a/285604/121193 ) อาจจะมีประโยชน์ แต่มันจะดีสำหรับบางสิ่งบางอย่าง ... ง่าย.
แอช

1
น่าเศร้า Solaar ใช้งานได้เฉพาะกับตัวส่งสัญญาณไร้สายไม่ใช่ตัวเชื่อมต่อแบบมีสาย :(
user55574

ฉันจะเริ่มต้นด้วยการดูในการตั้งค่า BIOS บางแห่งอนุญาตให้สลับปุ่ม Fn เช่นปุ่ม F โดยเริ่มต้น ..
โจนัสเบอร์ลิน

น่ารังเกียจจริงๆที่ F1 นำรหัสคีย์ 50 มาใช้ใหม่ดังนั้นคุณจึงไม่สามารถเปลี่ยนสิ่งที่ 50 ทำได้เช่นกัน .. : P
Jonas Berlin

คำตอบ:


1

ฉันได้รับผลเหมือนกันโดยการแลกเปลี่ยนระหว่างการพิมพ์ซ้ำFn+FxและFxที่ x 1,2,...12คือ

  1. ใช้xmodmap -pkeเพื่อรับรายการของรหัสปัจจุบันและ keyymbols
  2. จากนั้นเรียกใช้xevและกดF1ผ่านF12การเก็บบันทึกรหัสของมัน
  3. จากนั้นทำการสลับใน~/.Xmodmapไฟล์ของคุณ

สำหรับเช่นในระบบของฉันผลลัพธ์ของ (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
..

จากนั้นฉันเปลี่ยนมันเป็น~/.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
...

จากนั้นก็ให้ทำการxmodmap ~/.Xmodmapสคริปท์


0

xevไม่สามารถแสดงกิจกรรมที่ถูกจับโดยสภาพแวดล้อมเดสก์ท็อป วิธีที่ดีกว่าในการทดสอบคีย์คือการใช้showkeyคำสั่ง (ที่คอนโซล Linux ไม่ใช่ใน X11) ฉันคาดเดาว่าระบบปฏิบัติการได้รับ Shift + Super + ชุดค่าผสมบางคีย์

แม้ว่าคุณจะสามารถแมปชุดที่เป็นปุ่ม F ได้ แต่มันอาจจะลำบาก: คุณต้อง "ปล่อย" ปุ่ม Shift (เนื่องจากแป้นพิมพ์จำลองการกด) และการทำงาน Shift + F1 จะซับซ้อนกว่า เนื่องจากจะต้องมีการติดตามหากปุ่ม Shift ค้างไว้ก่อนหน้านี้

ปัญหานี้เกิดขึ้นบ่อยมากในแล็ปท็อปซึ่งมักจะมีคีย์ผสมเพื่อสลับปุ่มลัดมัลติมีเดียหรือตัวเลือกใน BIOS / เฟิร์มแวร์ แต่อย่างที่คุณบอกว่านี่เกี่ยวกับคีย์บอร์ดเฉพาะรุ่นภายนอกดูออนไลน์ฉันพบโครงงานนี้:

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

คำอธิบายของโครงการระบุว่า "ตั้งค่าใหม่วิธีการทำงานของปุ่มฟังก์ชั่นบนคีย์บอร์ด Logitech K290" ดังนั้นจึงควรลองดู

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.