Theppitak's blog

My personal blog.

15 กรกฎาคม 2551

Thai XIM and NumLock/CapsLock Bug

บั๊กที่เกิดจากปุ่ม CapsLock/NumLock ใน input method ภาษาไทยนี่ ผมตามแก้โค้ดตัวเองมาหลายที่ละ ทั้งใน gtk-im-libthai, ใน GTK+ stock immodule แล้วก็ล่าสุด ใน Xlib เอง ทั้งนี้เพราะผมใช้โค้ดเดิม ๆ ซ้ำในแพตช์ที่ส่งไป โดยในระหว่างทำแพตช์นั้น ผมใช้แป้นพิมพ์ของโน้ตบุ๊ก เลยไม่เคยใช้ NumLock/CapsLock เลย จนกระทั่ง MrChoke รายงานมาเป็นครั้งแรกใน gtk-im-libthai เมื่อนานมาแล้ว

ล่าสุด (ก็หลายเดือนมาแล้วเหมือนกัน) ทีมสุริยันเจอบั๊กนี้อีกใน XIM คือถ้า NumLock/CapsLock ติดอยู่ XIM ภาษาไทยจะไม่กรองลำดับอักขระเลย ผมเคยเจอปัญหาและทางแก้จาก GTK+ immodule แล้ว ก็เลยเสนอแพตช์ลักษณะเดียวกันเข้า Xlib แต่ปรากฏว่า มันไม่ง่ายอย่างที่คิด

CapsLock นั้น ไม่มีปัญหา แป้นพิมพ์แทบทุกระบบจะใช้ modifier mask ตรงกัน คือใช้แมโคร LockMask ใน <X11/X.h> ได้เลย แต่สำหรับ NumLock นั้น ไม่ได้มีในแป้นพิมพ์ทุกรุ่น แถมแต่ละรุ่นก็ยัง map modifier แตกต่างกันไป การที่ผมใช้ xev จับ keyboard event ได้ mask เป็น Mod2Mask นั้น บังเอิญใช้ได้แค่บนลินุกซ์เท่านั้น แต่ในระบบอื่น เช่น AIX มีคนบอกว่า map เป็น Mod5 และวิธีที่ปลอดภัยที่สุด คือ ตรวจสอบกับ X server ด้วย XkbGetVirtualMods

อ่าน man page ก็แล้ว อ่าน spec และ โพรโทคอล ของ XKB ก็แล้ว นั่งทดลองไปมาก็ไม่สำเร็จซะที ดูเหมือนจะมีปัญหาเกี่ยวกับ config บางอย่างของ XKB ที่ทำให้ฟังก์ชันมัน return BadAlloc มาตลอด ราวกับ X server ไม่รองรับ XKB เลย สุดท้าย เลยโกงนิดหน่อย ด้วยการแอบดูโค้ดของชาวบ้าน คือ NumLockX และ gkleds (Debian: gkrellm-leds)

แกะไปแกะมา NumLockX นั้น เขามีสองวิธี คือใช้ XKB ก่อน ถ้าเหลวก็มาใช้ XGetModifierMapping แทน ซึ่งหลังจาก trace ดูแล้ว มันทำงานได้ผลด้วยวิธีหลัง ไม่ใช่เพราะ XKB ส่วน gkleds นั้น ไม่มีอะไรเกี่ยวกับ modifier mask เลย เพราะมันมีหน้าที่แค่แสดง indicator เท่านั้น ไม่ใช่เซ็ต NumLock ด้วยเหมือน NumLockX ก็เลยไม่มีโค้ดอะไรที่เกี่ยวข้อง

ก็เลยดัดแปลงวิธีของ NumLockX มาใช้ แล้ว update patch ใน Freedesktop #12517 เสีย

หุ ๆ โอเพนซอร์สก็ดียังงี้แหละ ขัดสนอะไรก็หยิบยืม/ต่อยอดกันได้ (โดยไม่ต้องแจ้งเป็นลายลักษณ์อักษร :P) ต้องขอบคุณ NumLockX ที่ทำให้ได้ solution

ตอนนี้ xorg เขายังไม่รับแพตช์ครับ รอรีวิวต่อไป..

ป้ายกำกับ:

0 ความเห็น:

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem