ความสัมพันธ์ของรูปแบบแป้นพิมพ์และ xmodmap


12

ฉันใช้ Xubuntu ก่อนเข้าสู่ระบบฉันสามารถเลือกรูปแบบแป้นพิมพ์ ฉันกำลังใช้xmodmapเพื่อแมปแป้นบางปุ่มใหม่

ฉันสนใจสองสิ่ง:

  1. สถานะของการแมปแป้นพิมพ์เปลี่ยนแปลงอย่างไร (a) เมื่อฉันเปิดแล็ปท็อป (b) ในระหว่างกระบวนการบูตและ (c) เข้าสู่ระบบ (ในสามขั้นตอน) และเมื่อทำงานกับระบบ (เข้าสู่ระบบ)
  2. อะไรคือสาเหตุที่สัญลักษณ์ใดจะปรากฏบนหน้าจอ (และปุ่มควบคุมที่ส่ง) ระหว่างแต่ละเฟส เมื่อฉันกดปุ่มมันจะส่งสัญญาณบางอย่างไปยังไดรเวอร์แป้นพิมพ์ (?) จากนั้นจะต้องมีกระบวนการตัดสินใจบางอย่าง (แอปพลิเคชันและไฟล์การกำหนดค่า) ที่กำหนดว่าสัญลักษณ์ใดบ้างที่จะแสดง คำตอบสำหรับคำถามนี้ควรเป็นรายการแอปพลิเคชันและเส้นทางไปยังไฟล์การกำหนดค่าเหล่านั้น (ฉันสนใจ Ubuntu เป็นพิเศษ (ระบบที่ใช้เดเบียน) แต่คุณสามารถอธิบายระบบอื่น ๆ ได้ แต่ต้องการ Ubuntu มากกว่า)

คำตอบ:


25

มีสองเลเยอร์ที่นี่การแมป KEYCODE กับ KEYSYM และ KEYSYM กับการแมปข้อความ มีเลเยอร์มากกว่านี้ถ้าคุณนับเคอร์เนลซึ่งต้องแม็ป AT Keyboard scancodes กับ KEYCODE สไตล์ XT หรือรหัส HID Keyboard USB กับ KEYCODE KEYCODE เป็นเพียงจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อซึ่งเคอร์เนลของระบบปฏิบัติการจะส่งผ่านไปยังเซิร์ฟเวอร์ X11 มันสามารถแตกต่างกันระหว่างระบบปฏิบัติการเช่น Linux และ Solaris บน Linux KEYCODE เหล่านี้มักจะเป็นหมายเลขเดียวกับที่ใช้กับคีย์บอร์ด PC XT เก่า คอมพิวเตอร์รุ่นใหม่ที่มีแป้นพิมพ์ AT, PS / 2 หรือ USB มักจะจับคู่แป้นพิมพ์เหล่านั้นกับรหัส XT เก่าเพื่อให้ปุ่มใช้งานง่าย

รหัสแป้นพิมพ์แบบ Raw ไม่ว่าจะเป็น XT, AT, PS / 2 หรือ USB แสดงถึงตำแหน่งทางกายภาพบนแป้นพิมพ์ แป้นพิมพ์ XT ส่งหมายเลข 8 บิตเดียวเมื่อกดหรือปล่อยปุ่มเท่านั้น ปุ่ม q บนแป้นพิมพ์ US / British XT ส่งหมายเลข 16 บนแป้นพิมพ์ภาษาฝรั่งเศสที่มีรหัสทางกายภาพเดียวกันติดป้าย a แต่ยังคงส่งหมายเลข 16 เป็นชั้นที่สูงกว่าในระบบปฏิบัติการที่กำหนดความหมายที่แท้จริง เมื่อปล่อยปุ่มบนแป้นพิมพ์ XT รหัสเดียวกันจะถูกส่งบวก 128 ตัวอย่างเช่นเมื่อกด q จะส่ง 16 ครั้ง แต่จะปล่อยเมื่อส่งหมายเลข 142 (16 + 128) AT Keyboards ใช้ scancodes ซึ่งเป็นตัวเลขและอาจยาวได้ การปล่อยคีย์เพิ่มรหัสเพิ่มเติม ตัวอย่างเช่น scancode สำหรับหยุดชั่วคราวคือ E1, 1D, 45, E1, 9D, C5 ระบบปฏิบัติการส่วนใหญ่รวมถึง DOS, Windows, Linux, FreeBSD และ BIOS สแกนแผนที่ทั้งหมดเป็น scancodes สไตล์ XT ที่ง่ายกว่ามาก นอกจากนี้ยังช่วยให้ง่ายขึ้นในการสนับสนุนคีย์บอร์ดรุ่นใหม่ที่ใช้รหัสต่าง ๆ เช่นคีย์บอร์ด USB ที่ส่งรหัส HID รหัสทั้งหมดจะถูกแมปเข้ากับชุดรหัสที่สอดคล้องกันโดยระบบปฏิบัติการก่อน X11 หรือแอปพลิเคชันมองเห็น

X11 ไม่รู้ส่วนนี้ของกระบวนการมันเพิ่งได้รับ KEYCODE จากเคอร์เนลและใช้การทำแผนที่ของตัวเองเพื่อแปลง KEYCODE นั้นเป็น KEYSYM Xmodmapเป็นเครื่องมือมาตรฐานสำหรับการควบคุมการทำแผนที่นั้น พฤติกรรมส่วนใหญ่ของการแมปคีย์บอร์ดนั้นสามารถกำหนดค่าได้ แต่มีหลายกรณีพิเศษเช่น Num Lock, Mode Switch และ Caps Lock / Shift Lock ที่ฮาร์ดโค้ดไว้ใน X11 ด้านอื่น ๆ เช่น Shift สามารถกำหนดค่าได้จริง คีย์ใด ๆ ที่สามารถแมปเพื่อทำหน้าที่เป็นกะซึ่งแตกต่างจาก Mode Switch หรือ Num Lock

KEYCODE แสดงถึงฟิสิคัลคีย์ที่ส่งโดยเคอร์เนลของระบบปฏิบัติการ KEYCODE ทุกรายการสามารถแมปกับ KEYSYM ที่เป็นไปได้ 8 รายการ ใช้ 4 เท่านั้นและบางครั้งเรียกว่าระดับ 1-4 ระดับ 1 ระบุ KEYSYM ที่ได้รับการพิมพ์เมื่อไม่มีตัวดัดแปลงใดทำงาน ตัวอักษรและตัวเลขเหล่านี้มักเป็นตัวพิมพ์เล็ก โมเดอเรเตอร์คือ KEYCODE ที่แก้ไข KEYSYM ที่สร้างโดย KEYCODE อื่น ๆ เมื่อโมดิฟายเออร์ทำงานอยู่ (กดหรือเปิดใช้งาน) โมเดอเรเตอร์ของคีย์จะถูกควบคุมผ่าน Xmodmap ระดับ 2 ระบุ KEYSYM ที่จะส่งเมื่อกด shift shift ระดับ 3 ถูกเปิดใช้งานทุกครั้งที่กดสวิตช์โหมด KEYSYM ระดับ 4 ถูกเปิดใช้งานเมื่อทั้งปุ่ม Shift และสวิตช์โหมดทำงาน

เมื่อ KEYSYM ถูกสร้างขึ้นสิ่งนี้อาจตีความได้โดยตรง แต่ส่วนใหญ่จะถูกแปลงเป็นข้อความ ไม่ใช่ KEYSYM ทั้งหมดที่เปลี่ยนเป็นข้อความหรืออาจมีผลกับ KEYSYM ในอนาคตเท่านั้น ตัวอย่างหนึ่งคือ Shift_L ซึ่งแน่นอนว่าไม่มีการแสดงข้อความ แต่ยังมี KEYSYM จำนวนหนึ่งที่ใช้ในการเขียนอักขระอื่น /usr/share/X11/locale/en_US.UTF-8/Composeรายชื่อของพวกเขาในระบบของฉันอยู่ภายใต้ ตัวอย่างหนึ่งดังกล่าวคือ dead_acute KEYSYM ซึ่งเมื่อกดจะพยายามแปลง KEYSYM ถัดไปเป็นอักษรเน้นเสียงแบบเฉียบพลัน มีการแมปมาตรฐานสำหรับเปลี่ยน KEYSYM เป็น Unicode

ตอนนี้สิ่งนี้ได้ถูกกล่าวไว้แล้วโปรดทราบว่า Xmodmap นั้นล้าสมัยและถูกแทนที่ด้วย XKB ซึ่งมีความซับซ้อนกว่ามาก สิ่งนี้มีผลต่อวิธีที่ KEYCODE นั้นถูกแมปกับ KEYSYM แต่ไม่ใช่ว่าเคอร์เนลสร้าง KEYCODE อย่างไรและวิธีที่ KEYSYM นั้นถูกแปลงเป็นข้อความหรือการแต่งซึ่งยังคงเหมือนเดิม XKB สามารถปิดใช้งานการเรียกคืนพฤติกรรม Xmodmap นอกจากนี้ยังมีเลเยอร์ความเข้ากันได้เพื่อรองรับ Xmodmap แต่ก็สามารถมีปัญหาตามที่มันเข้ากันไม่ได้อย่างสมบูรณ์ กฎ XKB อยู่ภายใต้/usr/share/X11/xkb/และมีความซับซ้อนมากขึ้น มีเอกสารที่ดีบางส่วนเกี่ยวกับวิธีสร้างเค้าโครงแป้นพิมพ์สำหรับการจับคู่ KEYCODE กับ KEYSYM

สำหรับคอนโซล Linux มันมีรูปแบบแป้นพิมพ์ของตัวเองซึ่งถูกจัดเก็บ/usr/share/keymapsและโหลดด้วยloadkeysคำสั่ง เมื่ออยู่ในไบออสและบูตเดอร์ขั้นตอนก่อนหน้ารวมถึง GRUB2 การจับคู่คีย์บอร์ดเป็นสิ่งที่หมายเลข BIOS ตัดสินใจในการจับคู่กุญแจ


ขอบคุณสำหรับคำอธิบายที่ดีและข้อมูลใหม่ คุณรู้หรือไม่ว่ามีแอปพลิเคชั่นใดบ้างที่เริ่มต้นในกระบวนการบูท (พุ่งพรวดหรือ initscript) ซึ่งทำให้การตัดสินใจบนคีย์บอร์ดและสิ่งที่เกิดขึ้นเมื่อเข้าสู่ระบบในขั้นตอนที่ฉันสามารถเลือกเค้าโครง โปรแกรมใดโต้ตอบกับมันและเก็บไว้ในระบบไฟล์ที่ไหน? หลังจากล็อกอิน xmodmap หรือ xkb จะเขียนทับเลย์เอาต์เริ่มต้นที่เลือกในกระบวนการเข้าสู่ระบบหรือไม่
xralf

เคอร์เนลคีย์แมปตามที่ฉันพูดถูกโหลดloadkeysโดยหนึ่งในสคริปต์ init เผยให้เห็นไฟล์grep loadkeys /etc/init.d/* keymap.shX11 มีการสร้างคีย์ของตัวเองซึ่งโดยปกติ Xmodmap จะถูกโหลดจากสคริปต์ Xsession start-up ตัวใดตัวหนึ่ง ทุกวันนี้เมื่อใช้ XKB แทน Xmodmap การตั้งค่าเริ่มต้นจะถูกตั้งค่าไว้ใน Xorg.conf ผ่านทางตัวเลือก Xkb ต่างๆหรือผ่านทาง HAL เมื่อโหลดเครื่องมือจัดการจอแสดงผลของ Gnome หรือ KDE แล้วพวกเขาอาจโหลดเค้าโครงของตัวเองผ่านsetxkbmapคำสั่ง สภาพแวดล้อมเดสก์ท็อปของผู้ใช้อาจตั้งเลย์เอาต์ที่แตกต่างออกไป
penguin359

ฉันลองใช้คำสั่งgrep loadkeys /etc/init.d/*แล้วlocate keymap.shก็ไม่พบอะไรเลย ไม่พบไฟล์ Xorg.conf เช่นกัน มันขึ้นอยู่กับรุ่น Ubuntu ของฉันซึ่งเป็น 10.04 หรือไม่
xralf

หน้าต่างประเภทใดที่จะได้รับเหตุการณ์ เหตุการณ์ที่มี KEYSYM และแอปพลิเคชันแปลง KEYSYM เป็นข้อความด้วยวิธีใด Xorg มีอินเตอร์เฟส IPC / RPC สำหรับแอปที่แปลง KEYSYM เป็นข้อความหรือไม่? หรือแอพต้องทำด้วยตัวเองอย่างหมดจด?
炸鱼薯条德里克
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.