ฉันกำลังพยายามแก้ไขปัญหาแป้นพิมพ์เมื่อเชื่อมต่อกับเดสก์ท็อป Linux โดยใช้ VMWare Horizon View ปัญหานี้ดูเหมือนจะเป็นที่รู้จักและได้รับการอธิบายในปี 2555 เมื่อวันที่ ฐานความรู้ของ VMWare มีอยู่ใน archive.org. ฉันต้องเพิ่มว่าฉันไม่รู้มากเกี่ยวกับวิธีการทำงานของ XKB ดังนั้นการขุดค้นสิ่งนี้จึงเป็นประสบการณ์การเรียนรู้
วิธีแก้ไขที่แสดงรายการบน VMWware KB ไม่เป็นที่น่าพอใจ ฉันสามารถยืนยันคำอธิบายที่ให้ไว้ได้ ว่ามีสิ่งที่ไม่ต้องการเพิ่มเติม Control_L
ตัวละครเมื่อฉันตี AltGr
. เมื่อฉันกด AltGr+7 ฉันคาดว่า {
แต่ฉันกลับได้รับตัวละครหลบหนี 0x1b
. นี่คือลักษณะที่ปรากฏเมื่อเรียกใช้ xev และกด AltGr+7 (ISO_Level3_Shift เป็นการกดปุ่มเมื่อกดปุ่ม AltGr
).
เหตุการณ์ KeyPress, อนุกรม 37, NO สังเคราะห์, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444939915, (157,43), รูท:(388,257),
สถานะ 0x0, คีย์โค้ด 37 (keysym 0xffe3, Control_L), same_screen ใช่
XLookupString ให้ 0 ไบต์:
XmbLookupString ให้ 0 ไบต์:
XFilterEvent ส่งคืน: False
เหตุการณ์ KeyPress, อนุกรม 37, NO สังเคราะห์, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444939920, (157,43), รูท:(388,257),
สถานะ 0x4, คีย์โค้ด 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen ใช่
XKeysymToKeycode ส่งคืนรหัส: 92
XLookupString ให้ 0 ไบต์:
XmbLookupString ให้ 0 ไบต์:
XFilterEvent ส่งคืน: False
เหตุการณ์ KeyPress, อนุกรม 37, NO สังเคราะห์, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444944595, (157,43), รูท:(388,257),
สถานะ 0x84, คีย์โค้ด 16 (keysym 0x7b, สร้อยข้อมือซ้าย), same_screen ใช่
XLookupString ให้ 1 ไบต์: (1b) "
mbLookupString ให้ 1 ไบต์: (1b) "
FilterEvent ส่งคืน: False
เหตุการณ์ KeyRelease, อนุกรม 37, สังเคราะห์ NO, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444944763, (157,43), รูท:(388,257),
สถานะ 0x84, คีย์โค้ด 16 (keysym 0x7b, สร้อยข้อมือซ้าย), same_screen ใช่
XLookupString ให้ 1 ไบต์: (1b) "
FilterEvent ส่งคืน: False
เหตุการณ์ KeyRelease, อนุกรม 37, สังเคราะห์ NO, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444951582, (157,43), รูท:(388,257),
สถานะ 0x84, คีย์โค้ด 37 (keysym 0xffe3, Control_L), same_screen ใช่
XLookupString ให้ 0 ไบต์:
XFilterEvent ส่งคืน: False
เหตุการณ์ KeyRelease, อนุกรม 37, สังเคราะห์ NO, หน้าต่าง 0x3000001,
รูท 0x521, subw 0x0, เวลา 2444951586, (157,43), รูท:(388,257),
สถานะ 0x80, รหัสคีย์ 108 (keysym 0xfe03, ISO_Level3_Shift), หน้าจอเดียวกันใช่
XKeysymToKeycode ส่งคืนรหัส: 92
XLookupString ให้ 0 ไบต์:
XFilterEvent ส่งคืน: 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 "สมบูรณ์" {
...
พิมพ์ "FOUR_LEVEL" {
ตัวดัดแปลง = Shift + ระดับสาม;
แผนที่[Shift]= ระดับ 2;
แผนที่[LevelThree]= Level3;
แผนที่[Shift+LevelThree]= ระดับ 4;
};
};
...
xkb_ symbols "pc+no+inet(evdev)" {
...
คีย์ <AE07> {
พิมพ์= "FOUR_LEVEL",
สัญลักษณ์[Group1]= [ 7, เครื่องหมายทับ, วงเล็บปีกกาซ้าย, การแบ่ง ]
};
...
}
สร้อยข้อมือในคำจำกัดความข้างต้นคือสิ่งที่ฉันพยายามทำงานในขณะนี้ความคิดของฉันคือการกำหนด FOUR_LEVEL ใหม่เพื่อคาดหวัง Control_L ในกรณีที่เหมาะสม เช่นนี้
พิมพ์ "FOUR_LEVEL" {
ตัวดัดแปลง = Shift+LevelThree+LControl;
แผนที่[Shift]= ระดับ 2;
แผนที่[LevelThree+LControl]= Level3;
แผนที่[Shift+LevelThree+LControl]= ระดับ 4;
};
ฉันสร้างการแมปด้วยการตั้งค่านี้ จากนั้นฉันพยายามคอมไพล์และโหลดไฟล์ที่แก้ไขของฉัน:
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 ดังนั้นจึงต้องกำหนดไว้ที่อื่น