วิธีรับรหัสสำหรับ xmodmap


76

ฉันพยายามใช้xmodmapเพื่อทำการแมปใหม่Alt/ Superแป้นบนแป้นพิมพ์ Dell L100 และมีปัญหาในการรับรหัส

ตัวอย่างเช่นการใช้xevไม่ได้ให้รหัสกุญแจแก่ฉันAlt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

สำหรับRight Superรหัสxevและshowkeyให้รหัสที่แตกต่างกัน - 134และ126ตามลำดับ

เกิดอะไรขึ้นกับรหัสคีย์เหล่านี้

ฉันลองรับรหัสจากshowkey -kและใช้xmodmapไฟล์ด้านล่าง แต่นั่นให้แผนที่แปลก ๆ ซึ่งbคีย์remapped :

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R

ฉันมีปัญหาเดียวกันกับ Alt_L ที่ไม่ได้ทำการยิง (แต่ Alt_R ใช้ได้) บน XUbuntu 14.04 คุณใช้ระบบอะไร
ราคาพอล

คำตอบ:


54

มีผู้เล่นจำนวนมากระหว่างแป้นพิมพ์ของคุณและกระบวนการที่จัดการกับเหตุการณ์แป้นพิมพ์ในที่สุด ในบรรดาภูมิทัศน์ที่สำคัญคือความจริงที่ว่าระบบ X มีเลเยอร์การจัดการแป้นพิมพ์ของตัวเองและ X เชื่อมโยง "คีย์โค้ด" ที่แตกต่างกับคีย์มากกว่าระบบฐาน Linux ของคุณ showkeyคำสั่งแสดงการพิมพ์ซ้ำในศัพท์แสงที่ใช้ Linux ฐานระบบ สำหรับxmodmapคุณต้องการรหัส X ซึ่งเป็นสิ่งที่xevแสดง ตราบใดที่คุณกำลังวางแผนที่จะทำงานใน X และทำการxmodmapปฏิเสธกุญแจของคุณด้วยให้เพิกเฉยshowkeysและฟังสิ่งที่xevพูด

สิ่งที่คุณต้องการค้นหาในxevผลลัพธ์ของคุณคือบล็อกแบบนี้:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xevมีแนวโน้มที่จะสร้างผลลัพธ์จำนวนมากโดยเฉพาะเมื่อคุณเลื่อนเมาส์ คุณอาจต้องเลื่อนกลับไปสักครู่เพื่อค้นหาผลลัพธ์ที่คุณต้องการ ในการส่งออกก่อนหน้านี้เราจะเห็นว่าkeysym Alt_Lมีความเกี่ยวข้องกับ X 64keycode


3
ปัญหาคือว่าฉันไม่ได้รับเหตุการณ์ KeyPress ในคีย์ Windows ฉันลองแป้นพิมพ์ 3 แบบและใช้ผลลัพธ์เดียวกัน จาก xev ฉันได้รับเฉพาะ FocusOut, FocusIn และ KeymapNotify ตามที่เห็นด้านบน อย่างไรก็ตามฉันสามารถไปและตั้งค่าทางลัดผ่านตัวจัดการ Gnome และเห็นปุ่ม Windows เป็น "Mod4"
Yaroslav Bulatov

รายงานคีย์ Windows ที่ถูกต้องเป็น Mod4 ปล่อยให้รายงานคีย์ Windows เป็น Alt ... ซึ่งทำให้สับสนเพราะฉันไม่มีหมวดหมู่ "Alt" ใน xmodmap ของฉัน
Yaroslav Bulatov

ลอง Mod1 สำหรับ Alt
dubiousjim

2
@YaroslavBulatov ฟังดูเหมือนว่าสภาพแวดล้อมเดสก์ท็อปของคุณกำลังกินคีย์อยู่ (อาจจะนำเมนูหลักมาใช้)
derobert

3
คุณสามารถกรองเหตุการณ์ที่ xev มอบให้คุณได้ ในกรณีนี้xev -event keyboardจะเพียงพอที่จะกำจัดเสียงส่วนใหญ่
Fredrik Wendt

24

xev ควรทำงาน

แปลก xev ของฉันให้เหตุการณ์ KeyPress และ KeyRelease สำหรับ alt (และสำหรับปุ่ม Windows ที่นี่เรียกว่า "super"):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

และมือขวา:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

ฉันเห็นความเป็นไปได้สองอย่าง:

  1. มีอย่างอื่นที่กินแป้นพิมพ์อย่างสมบูรณ์หรือทำให้หน้าต่างเบลอเมื่อคุณกด alt ลองใช้ xev ในเซิร์ฟเวอร์ X ที่ว่างเปล่าเป็นอย่างอื่น (เช่นเรียกใช้xinit -- :1ซึ่งควรให้คุณ X server มี xterm เพียงอย่างเดียว - จะไม่มีตัวจัดการหน้าต่างทำงานอยู่การออกจาก xterm จะเป็นการปิดเซสชัน)
  2. คุณเพิ่งพลาดสองเหตุการณ์ในกลุ่มที่ xev พ่นออกมา

วิธีที่ง่ายถ้าคุณรู้จักชื่อคีย์

ความเป็นไปได้อื่น: เพิ่งได้รับรหัสจาก xmodmap:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

มี 64 และ 108 อีกครั้ง xmodmap -pmจะแสดงให้คุณเห็นเพียงแค่แผนที่ตัวปรับซึ่งจะให้ตัวเลขกับคุณด้วย


15

ฉัน "ตรวจจับ" สามประเด็นในคำถามของคุณ:

  1. ทำไมxevและshowkeyรายงานรหัสที่แตกต่างกันสำหรับคีย์?
  2. ทำไมกดปุ่มxevไม่แสดงAltอย่างถูกต้อง?
  3. วิธีการแลกเปลี่ยนAltและWin?

เกี่ยวกับคำถามแรก:วันนี้ที่แป้นพิมพ์ "ไดรเวอร์" ใน X ไม่ได้ขับฮาร์ดแวร์จริงๆมันสามารถส่งผ่านรหัสคีย์จากเคอร์เนลไปยังแกน X แต่ไม่ได้ มันเพิ่ม 8 ในรหัสก่อนที่จะผ่าน

ข้อที่สอง:มีบางสิ่งในเซสชัน X ของคุณดึงดูดAltเหตุการณ์ คำตอบอื่น ๆ ครอบคลุมถึงเรื่องนี้อยู่แล้ว ( xevเช่นไม่ได้รับกิจกรรมที่คุณต้องการดู) ผู้ร้ายอาจเกี่ยวข้องกับตัวจัดการหน้าต่างของคุณ ลองเซสชั่น X ที่เปลือยเปล่ามากขึ้น

ที่สาม:xmodmapอย่าใช้ มันล้าสมัยมาเป็นสิบปีแล้ว คนใหม่ที่มี XKB setxkbmapและเครื่องมือของมัน

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

สำหรับการแลกเปลี่ยนAltและWinมีตัวเลือกเตรียมไว้แล้วใน XKB เพียงเพิ่ม:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace

คุณทำการsetxkbmapเปลี่ยนแปลงแบบถาวรได้อย่างไร
Steve Kehlet

~/.xinitrcเพิ่มการเปลี่ยนแปลง
Matthias Braun

11

ในฐานะที่เป็น root ให้เรียกใช้:

showkey -s

... เพื่อดูว่า scancode สำหรับกุญแจลึกลับของคุณคืออะไร ฉันได้รับสิ่งนี้:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

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

ฉันเดาว่า 0x46 เป็นสิ่งที่น่ารังเกียจของฉัน

ถัดไปค้นหารหัสที่ไม่ได้ใช้ด้วย:

xmodmap -pke | less

ที่นี่คุณสามารถดู keycode 97 ไม่ได้ใช้ในระบบของฉัน:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

keycode X ใช้และ keycode ที่เคอร์เนลใช้คือ OFF BY 8 สำหรับ "เหตุผลเชิงประวัติ" ดังนั้นใช้ 97 - 8 = 89 และใช้ 89 กับคำสั่ง setkeycodes (อีกครั้งเป็น root):

# setkeycodes 46 89

และคุณควรตั้งค่า ยืนยันด้วย xev ว่าคุณได้รับกิจกรรม Keypress ด้วยรหัส 97 (แต่เมื่อฉันบอกไฟล์ Fluxbox keys ให้ใช้รหัสนั้นฉันไม่ได้รับเหตุการณ์ KeyPress อีกต่อไป - อาจเป็นเพราะ Fluxbox กลืนพวกเขาเมื่อมันใช้มัน)

โปรดทราบว่า 'setkeycodes' จะไม่สามารถรีบูตได้ดังนั้นคุณจะต้องเพิ่มลงในสคริปต์เริ่มต้นของคุณ (เช่นใน /etc/rc.local)


1
คุณมีตัวชี้เกี่ยวกับการ "ปิดด้วย 8 ด้วยเหตุผลทางประวัติศาสตร์" หรือไม่?
Robert Siemer

ฉันใช้คำตอบของคุณเพื่อจับคู่ caps-lock บนปุ่มฟังก์ชั่น (โดยเฉพาะ F9) สิ่งนี้ทำให้ฉันใช้ F9 เป็นคีย์คำนำหน้าใน tmux ขอบคุณ
Raymond Kroeker

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "บ่อยครั้งที่หมายเลข X จะเป็น 8 มากกว่าหมายเลข Linux" ข้อความของฉันที่มี "historical" จะต้องมาจาก manpage อื่น
Greg Bell

11

ฉันพยายามที่จะแก้ปัญหานี้ด้วยตัวเองและฉันก็คิดออก

ปัญหาหลักคือคุณไม่ได้รับเหตุการณ์สำหรับการกดปุ่ม ดูบันทึกที่คุณโพสต์เหตุผลนั้นชัดเจน

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

คุณสามารถดูที่Focus{In,Out}เหตุการณ์ที่เกิดขึ้นมีการmode Notify{Grab,Ungrab}สิ่งนี้บ่งชี้ว่ามีการจัดการคีย์โดยกระบวนการอื่น (อาจเป็นแอปพลิเคชันทางลัด / การผูกคีย์)

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

หากคุณไม่สามารถระบุได้ว่าโปรแกรมใดกำลังขโมยเหตุการณ์สำคัญทางออกที่ดีที่สุดคือเริ่มเซสชัน X อีกครั้งโดยที่ไม่ต้องเรียกใช้ เรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นเซสชัน X อีกครั้งบนจอแสดงผล:1หากมีการใช้งานแล้วเพียงเพิ่มหมายเลขที่ส่วนท้าย แน่นอนคุณสามารถเปลี่ยนเทอร์มินัลเป็นสิ่งที่คุณต้องการหรือติดตั้งในระบบของคุณ

xinit /usr/bin/xterm -- :1

จากนั้นเรียกใช้xevอีกครั้ง ที่ควรให้ผลลัพธ์โดยไม่ถูกจับโดยโปรแกรมอื่น โปรดทราบว่าตัวจัดการหน้าต่างที่เริ่มต้นใช้งานนั้นเป็นแบบโฮเวอร์โฟกัสดังนั้นคุณจะต้องวางเคอร์เซอร์ไว้เหนือหน้าต่าง xev เพื่อให้สามารถจับกุญแจได้


ดังที่ได้กล่าวไว้ในคำตอบที่ยอดเยี่ยมนี้โดย dubiousjim คีย์โค้ดนั้นแตกต่างกันเนื่องจากมีเลเยอร์จำนวนมากระหว่าง xev และเคอร์เนล


4

ฉันมีปัญหาเดียวกันกับที่Alt_Lหายไปใน XUbuntu 14.04 (ไม่Alt_Rเป็นไร) หลังจากเล่นมาหลายครั้งฉันสังเกตว่าshowkeyบันทึกการกดแป้น แต่xevไม่ได้ --- มันต้องมีอะไรบางอย่างในระบบหน้าต่าง ฉัน scoured การตั้งค่า "Window Manager" และ "Window Manager Tweaks" ทั้งหมด แต่ไม่พบอะไรเลย ในที่สุดฉันก็พบหลงทางAlt_Lในรายการแป้นพิมพ์ลัด ( xfce4-keyboard-shortcuts) ใน "ตัวแก้ไขการตั้งค่า" ฉัน "รีเซ็ต" และฉันก็Alt_Lกลับมาแล้ว! ทางAlt_Lลัดจรจัดไม่ปรากฏขึ้นที่อื่นยกเว้นใน "ตัวแก้ไขการตั้งค่า"

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