แป้นรีแมปแป้นยาก?


19

ฉันกำลังพยายามหาวิธีในการแมปแป้นแป้นใหม่อย่างแน่นหนา
ฉันลองใช้ xmodmap และ setxkbmap แต่มันไม่สามารถใช้งานกับแอปพลิเคชั่นหนึ่ง ๆ ได้ คำสั่งดังกล่าวทำงานได้กับหน้าต่าง / แอพพลิเคชั่นปกติอื่น ๆ บน X tho

ฉันคิดว่าแอปพลิเคชันอาจอ่านข้อมูลดิบของแป้นพิมพ์และไม่สนใจอินพุต X หรือไม่

ดังนั้นจะทำการแมปคีย์ใหม่โดยไม่ใช้ xmodmap และ setxkbmap ได้อย่างไร? หากเป็นไปได้ที่จะใช้ซอฟต์แวร์บางอย่าง

ฉันยังลอง xkeycaps, xkbcomp แต่ไม่ได้ลอง loadkeys เนื่องจากมันทำงานบน X

ฉันพบที่นี่ที่ฉันสามารถลองsetkeycodesได้"เพราะหลังจากกำหนดรหัสคีย์เคอร์เนลปุ่มควรทำงานใน xorg"แต่ฉันก็พบว่า"คุณไม่สามารถใช้ 'setkeycodes' บนแป้นพิมพ์ USB"นั่นเป็นกรณีของฉัน (ฉันสนใจในกรณีนี้ บางคนใช้งานได้กับ ps2 เพราะฉันคิดว่าฉันสามารถใช้อะแดปเตอร์ได้)

นี่ดูเหมือนจะมีแนวโน้ม"แผนที่ scancodes เป็นรหัส"แต่หลังจากการทดสอบสองสามอย่างไม่มีอะไรเปลี่ยนแปลงนี่คือพวกเขา:
ฉันพบ keycode "36" ("j" กุญแจ) ที่ vt1 โดยที่showkey
ฉันพบ scancode "7e" (ปุ่มกด ") ที่ vt1 ด้วยshowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Obs .: ไม่ได้ทำงานกับ: KEYBOARD_KEY_7e=j

วิธีทางเลือกเพิ่มเติม (โดย @ vinc17) เพื่อค้นหาคีย์:
evtest /dev/input/by-id/... หรือ
input-kbd 3(ใส่ดัชนี id ที่พบได้ls -l /dev/input/by-id/*จากอดีต event3)

ป.ล. : * หากคุณสนใจที่จะทดสอบด้วยตัวเองเธรดที่เกี่ยวข้องสำหรับแอปพลิเคชันคือ: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ปัญหาที่ฉัน มีเหมือนกัน: บางคีย์ (KP_Decimal, DownArrow, UpArrow, RightArrow) จะถูกละเว้นและพิจารณาทั้งหมดด้วยค่าเดียวกันนั่น "0x00"


แฟ้มการปรับปรุงควรจะเป็นไม่ได้/etc/udev/hwdb.bin /lib/udev/hwdb.binแต่ถึงแม้ว่าไฟล์นี้จะได้รับการอัพเดตอย่างถูกต้อง แต่ก็ไม่ได้ผลสำหรับฉันเช่นกันแม้หลังจากรีบูตเครื่อง อาจมีบางอย่างขาดหายไปในเอกสารประกอบ เกี่ยวกับสิ่งนี้: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17

@ vinc17 ที่น่าสนใจจริง ๆ ทันทีที่ฉันจะลองอีกครั้งฉันคิดว่าเราต้องค้นหาไฟล์การตั้งค่าและลองเลียนแบบขอบคุณ!
อำนาจกุมภ์

1
ปัญหาของฉันเกิดจากความจริงที่ว่าบรรทัด KEYBOARD_KEY_ เริ่มต้นด้วยช่องว่าง 2 ช่องแทนที่จะเป็นช่องเดียว (นี่ไม่ใช่เอกสารและฉันไม่มีข้อความแสดงข้อผิดพลาด!) ฉันไม่รู้สำหรับคุณ แต่ด้วยแป้นพิมพ์ USB ของฉันshowkey --scancodesไม่ให้ scancodes udev คาดหวัง (ค่าจะแตกต่างกัน); input-kbdยูทิลิตี้ให้ scancodes ที่ถูกต้อง
vinc17

1
evtestยูทิลิตี้นอกจากนี้ยังควรให้คุณ scancodes ที่ถูกต้อง: หลังจากพิมพ์ที่สำคัญที่คุณควรจะได้รับ 2 เส้นและคนแรกที่ควรจะจบกับสิ่งที่อยู่ในรูปแบบcode 4 (MSC_SCAN), value xxxที่xxxเป็น scancode แต่ไดรเวอร์สำหรับแป้นพิมพ์ของฉันมีข้อผิดพลาดและฉันไม่ได้รับMSC_SCANสายนี้สำหรับบางปุ่มที่ฉันต้องการทำการแมปใหม่ นั่นเป็นเหตุผลที่ฉันใช้input-kbdซึ่งแสดงรายการ scancodes ทั้งหมดสำหรับอุปกรณ์ที่เลือก
vinc17

1
ฉันโพสต์ข้อมูลโดยละเอียดในคำตอบ ตอนนี้ฉันไม่แน่ใจว่า 36 หรือ 7002c ทำงานเป็นค่า ฉันคิดว่าคุณต้องการรหัสตัวระบุคีย์ ดูคำตอบของฉัน
vinc17

คำตอบ:


17

ก่อนอื่นให้ทำการค้นหา scancode ของคีย์ที่ต้องทำการแมปใหม่เช่นกับevtestยูทิลิตี้ บรรทัดเช่นบรรทัดต่อไปนี้ ( MSC_SCANภายใน) ควรเป็นเอาต์พุต:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

ตามด้วยคนที่สองให้รหัสคีย์ปัจจุบัน หากไม่มีMSC_SCANบรรทัดที่ถูกส่งออกนี่เป็นเพราะข้อผิดพลาดของไดรเวอร์เคอร์เนล แต่ scancode ยังสามารถพบได้กับinput-kbdยูทิลิตี้; evtestควรให้รหัสหลักเพื่อให้ง่ายต่อการค้นหาบรรทัดที่เกี่ยวข้องในinput-kbdผลลัพธ์ (เช่นโดยใช้grep)

เมื่อกำหนด scancodes ของคีย์ที่จะทำการแมปใหม่แล้วให้สร้างไฟล์เช่น/etc/udev/hwdb.d/98-custom-keyboard.hwdbที่มีการแมปใหม่ จุดเริ่มต้นของไฟล์/lib/udev/hwdb.d/60-keyboard.hwdbให้ข้อมูลบางอย่าง ในกรณีของฉัน (ใช้งานได้) ฉันมี:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(ก่อน udev 220 ฉันต้องใช้keyboard:usb:v05ACp0221*สำหรับบรรทัดแรก)

evdev:สตริงจะต้องเป็นจุดเริ่มต้นของบรรทัด โปรดทราบว่าตัวอักษรในผู้ขายและรหัสผลิตภัณฑ์ควรเป็นตัวพิมพ์ใหญ่ แต่ละKEYBOARD_KEY_การตั้งค่าควรจะมีอีกหนึ่งช่องว่างก่อน (หมายเหตุ: สายโดยไม่มีช่องว่างจะให้ข้อผิดพลาดและสอดคล้องกับสองช่องว่างถูกเงียบไม่สนใจกับรุ่น udev เก่า) KEYBOARD_KEY_ตามด้วย scancode เป็นเลขฐานสิบหก (เหมือนที่ทั้งสองให้evtestและinput-kbdให้) ค่าที่ถูกต้องสามารถได้รับจากทั้งevtestเอาท์พุทหรือinput-kbdเอาท์พุทหรือแม้กระทั่งจาก/usr/include/linux/input.hไฟล์: ตัวอย่างเช่นKEY_102NDจะให้102nd(โดยการลบKEY_และแปลงเป็นตัวพิมพ์เล็ก) ซึ่งฉันใช้ข้างต้น

หลังจากบันทึกไฟล์แล้วให้พิมพ์:

udevadm hwdb --update

เพื่อ (อีกครั้ง) สร้างฐานข้อมูล/etc/udev/hwdb.bin(คุณสามารถตรวจสอบการประทับเวลา) จากนั้น

udevadm trigger --sysname-match="event*"

จะนำการตั้งค่าใหม่มาพิจารณา evtestคุณสามารถตรวจสอบกับ

ในปี 2014 udev ที่เผยแพร่มีข้อมูลที่ไม่สมบูรณ์ / buggy ใน/lib/udev/hwdb.d/60-keyboard.hwdbแต่คุณสามารถดูรุ่นพัฒนาล่าสุดของไฟล์และ / หรือรายงานข้อผิดพลาดและการอภิปรายของฉันเกี่ยวกับเอกสารและปัญหาการเว้นวรรค

หากวิธีนี้ใช้ไม่ได้อาจพบปัญหาหลังจากเพิ่มระดับการบันทึกชั่วคราวudevdด้วยudevadm control(ดูรายละเอียดหน้า udevadm (8) man man)

สำหรับudevเวอร์ชั่นเก่าเช่น 204 วิธีนี้ควรใช้งานได้


เมื่อฉันรันคำสั่ง udevadm ไฟล์ที่ได้รับการอัพเดตคือ/lib/udev/hwdb.binฉันมองด้วยblessและKEYBOARD_KEY_70085จะปรากฏขึ้นที่ปลาย ฉันคิดว่า Ubuntu 14.04 มีการกำหนดค่า (ป้องกัน?) ด้วยวิธีนี้ ฉันพยายามudevadm control --log-priority=debugแล้ว อิงจากlsusb(045e: 0750) คีย์บอร์ดของฉันก็เป็นเหมือนkeyboard:usb:v045ep0750*แต่ฉันก็ลองด้วยkeyboard:usb:v*p*เช่นกัน ฉันเดาว่าสิ่งนี้/etc/udev/hwdb.binควรได้รับการอัปเดต แต่ไม่มีอยู่จริง
กุมภ์กำลัง

เมื่อฉันอ่านที่นี่อาจเป็นเหมือนที่ฉันใช้คำสั่งนี้udevadm hwdb --usr --updateแม้ว่าฉันจะไม่ได้
กุมภ์กำลัง

หลังจากที่udevadm hwdb --updateฉันคัดลอก/lib/udev/hwdb.binไปยัง/etc/udev/hwdb.binและวิ่งstrace udevadm trigger --sysname-match="event*"และhwdb.binดูเหมือนว่าไฟล์ยังไม่ได้อ่าน (ถ้าเป็นเช่นนี้ใช้งานได้)
กุมภ์กุมภ์

1
@AquariusPower ใช่อาจมีข้อผิดพลาดบางอย่างของ Ubuntu (ฉันใช้ Debian / ไม่เสถียร) เพื่อดูว่าฐานข้อมูลจะอ่านเมื่อทำudevadm trigger ...ดูการทดสอบของฉันที่นี่ โปรดทราบว่าก่อนใช้งานudevadm trigger ...คุณต้องตรวจสอบให้แน่ใจว่าเวลาการแก้ไขของไฟล์ได้รับการอัปเดตมิฉะนั้นเวลาเข้าถึงจะไม่ถูกอัปเดตเมื่ออ่านไฟล์
vinc17

1
@AquariusPower udevadm --version: 215 (และรุ่นแพ็คเกจ udev: 215-7) ขอบคุณudevadm trigger ...คุณไม่จำเป็นต้องรีบูตเครื่อง (เว้นแต่คุณต้องการลบการตั้งค่า AFAIK) แต่คุณอาจต้องการลองรีบูตเพื่อดูว่ามีผลกระทบใด ๆ
vinc17
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.