ฉันกำลังพยายามแก้ไขปัญหาแป้นพิมพ์เมื่อเชื่อมต่อกับเดสก์ท็อป Linux โดยใช้ VMWare Horizon View ปัญหาที่ดูเหมือนว่าจะเป็นที่รู้จักและได้รับการอธิบายไว้ในปี 2012 ในฐานความรู้ของ VMware ที่มีอยู่บน archive.org ฉันต้องเสริมว่าฉันไม่รู้วิธีการทำงานของ XKB มากนัก ดังนั้นการได้ลองศึกษาสิ่งนี้จึงเป็นประสบการณ์การเรียนรู้
วิธีแก้ปัญหาตามรายการบน VMWware KB ไม่เป็นที่น่าพอใจ เราสามารถยืนยันได้คำอธิบายที่กำหนดว่ามีที่ไม่พึงประสงค์เพิ่มเติมตัวละครเมื่อกดControl_L
AltGr
เมื่อฉันกด AltGr+7 ฉันคาดหวัง a {
แต่ฉันได้รับอักขระหลีก0x1b
แทน นี่คือสิ่งที่ดูเหมือนเมื่อเรียกใช้ xev และกดปุ่ม AltGr+7 (ISO_Level3_Shift เป็นการกดปุ่มที่คาดไว้เมื่อกดปุ่มAltGr
)
KeyPress event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444939915, (157,43), root:(388,257),
state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444939920, (157,43), root:(388,257),
state 0x4, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444944595, (157,43), root:(388,257),
state 0x84, keycode 16 (keysym 0x7b, braceleft), same_screen YES,
XLookupString gives 1 bytes: (1b) "
mbLookupString gives 1 bytes: (1b) "
FilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444944763, (157,43), root:(388,257),
state 0x84, keycode 16 (keysym 0x7b, braceleft), same_screen YES,
XLookupString gives 1 bytes: (1b) "
FilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444951582, (157,43), root:(388,257),
state 0x84, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x3000001,
root 0x521, subw 0x0, time 2444951586, (157,43), root:(388,257),
state 0x80, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XFilterEvent returns: False
มีข้อเสนอแนะเกี่ยวกับ VMWare KB ให้กดAltGr
จากนั้นกดและปล่อยทางซ้ายCtrl
เพื่อทริกเกอร์เหตุการณ์ KeyRelease สำหรับ Control_L หลังจากนั้นฉันสามารถกด7
และรับผลลัพธ์ที่ต้องการ: XLookupString/XmbLookupString ในกรณีนั้น คืนค่า 7b ซึ่ง เป็นไป{
ตามคาด
หลังจากยืนยันปัญหาแล้ว ฉันได้ตรวจสอบวิธีแก้ปัญหาใน Linux แล้ว ฉันวิ่งxkbcomp
เพื่อรับคำจำกัดความคีย์แมปแบบสดโดยเรียกใช้:
xkbcomp $DISPLAY out.xkb
หลังจากดูการสร้างout.xkb
ฉันคิดว่าอาจเป็นไปได้ที่จะกำหนดคีย์แมปใหม่เพื่อให้มี Control_L นอกเหนือจากคีย์อื่นๆ ดังนั้นเพื่อเลือกบางส่วนที่เกี่ยวข้อง out.xkb ของฉันจึงมี:
xkb_types "complete" {
...
type "FOUR_LEVEL" {
modifiers= Shift+LevelThree;
map[Shift]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
};
};
...
xkb_symbols "pc+no+inet(evdev)" {
...
key <AE07> {
type= "FOUR_LEVEL",
symbols[Group1]= [ 7, slash, braceleft, division ]
};
...
}
วงเล็บปีกกาในคำจำกัดความข้างต้นคือสิ่งที่ฉันพยายามจะทำงานในขณะนี้ ความคิดของฉันคือการกำหนด FOUR_LEVEL ใหม่ให้คาดหวัง Control_L ในกรณีที่เหมาะสมเช่นนี้:
type "FOUR_LEVEL" {
modifiers= Shift+LevelThree+LControl;
map[Shift]= Level2;
map[LevelThree+LControl]= Level3;
map[Shift+LevelThree+LControl]= Level4;
};
ฉันสร้างการแมปด้วยการตั้งค่านี้ จากนั้นฉันพยายามคอมไพล์และโหลดไฟล์ที่แก้ไขของฉัน:
xkbcomp ctrl-hack.xkb
xkbcomp ctrl-hack.xkm $DISPLAY
น่าเสียดายที่การเปลี่ยนแปลงของฉันไม่ได้ผลอย่างที่ฉันหวังไว้ ฉันไม่ได้รับข้อผิดพลาดใดๆ แต่ฉันยังคงได้รับอักขระ0x1b
แทน{
เมื่อกด AltGr+7 อะไรจะเกิดขึ้น?
อีกทางหนึ่ง ฉันเห็นว่าอักขระอื่นๆ บางตัว (เช่น€
และ$
) ดูเหมือนจะทำงานได้แม้จะต้องใช้AltGr
ตัวปรับแต่งด้วย และได้รับ Control_L ที่ไม่คาดคิดเพิ่มเติม แต่การทดสอบขณะกด Control_L ด้วยตนเอง ฉันเห็นว่าใช้€
งานได้ทั้งแบบมีและไม่มีการกด Control_L ดังนั้นจึงดูเหมือนว่าจะมีคำจำกัดความทางเลือกสำหรับสัญลักษณ์นี้ที่ไม่ชัดเจนในxkbcomp
ผลลัพธ์ ฉันยังไม่ได้คิดออกว่ามันทำงานอย่างไร เป็นไปได้ไหมที่จะกำหนดทางเลือกที่คล้ายกันสำหรับสัญลักษณ์ที่ฉันหายไป บางทีอาจเป็นมรดกบางอย่างจากการกำหนดค่าแป้นพิมพ์คอนโซลเป็นต้น นี่อาจมาจากที่เดียวกับ0x1b
ตัวละครที่ฉันได้รับเมื่อกด Ctrl-AltGr-7 ฉันหาไม่พบใน XKB-config จึงต้องกำหนดไว้ที่อื่น