วิธีตั้งค่าใหม่คีย์ภายใต้ Linux สำหรับแป้นพิมพ์เฉพาะเท่านั้น


18

ฉันเพิ่งซื้อแป้นพิมพ์ Unicomp ที่มาพร้อมกับแป้นสลับขวา - ขวาและ Windows แป้นพิมพ์ระบุเช่นนี้ใน lsusb:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

มีวิธีที่จะให้เคอร์เนล (เช่นไม่ใช่ xmodmap-based) สลับปุ่ม right-alt และ windows ดังนั้นทุก ๆ แอปพลิเคชั่นจะเห็นมันในสถานที่ที่ถูกสับเปลี่ยนแม้ว่าพวกเขาจะได้รับการป้อนข้อมูลด้วยแป้นพิมพ์ดิบ ? มีวิธีการที่มีเฉพาะสำหรับแป้นพิมพ์นี้หรือไม่?


ฉันสงสัยว่าคุณสามารถทำได้ด้วย udev โดยจับคู่หมายเลขซีเรียลของคีย์บอร์ดแล้วโทรหาสคริปต์ที่ทำการแมปใหม่ คุณอาจต้องการสคริปต์ที่คล้ายกันเพื่อเรียกใช้แยกเพื่อให้อุปกรณ์นำกลับมาใช้
jam

1
@jam นี่จะทำแป้นพิมพ์ที่แนบมาทั้งหมดหรือไม่ ฉันนึกไม่ออกเลยว่า Linux นั้นยืดหยุ่นได้เพียงจัดการตารางการแมปหนึ่งตารางสำหรับแป้นพิมพ์ (USB) ที่ต่อพ่วงทั้งหมด
FUZxxl

@jam นอกจากนี้คุณจะช่วยฉันจริงๆถ้าคุณสามารถอธิบายวิธีการแลกเปลี่ยนที่เกิดขึ้นจริง ฉันไม่ได้จัดการเพื่อค้นหาสิ่งที่มีประโยชน์กับสิ่งนี้เพียงสิ่ง xmodmap (ซึ่งฉันไม่ต้องการใช้)
FUZxxl

หากคุณไม่ต้องการใช้ xmodmap สิ่งที่คุณขอดูเหมือนจะเฉพาะเจาะจงมากเกินไปสำหรับความรู้ของฉันที่จะช่วยคุณขอโทษ วิธีที่ฉันเสนอจะใช้ xmodmap เพื่อสลับรหัสสำหรับคีย์เหล่านั้นสำหรับอุปกรณ์ทั้งหมดในช่วงระยะเวลาที่แป้นพิมพ์เฉพาะของคุณเชื่อมต่อจากนั้นนำกลับมาใช้ใหม่ คุณคาดหวังว่าจะใช้คีย์บอร์ดหลายตัวพร้อมกันหรือไม่?
jam

@jam หากฉันใช้ Xmodmap โปรแกรม X จะยังคงเห็นรหัสคีย์ผิดเนื่องจากเซิร์ฟเวอร์ X ยังส่งรหัสคีย์ที่ไม่แปลต่อไปยังไคลเอนต์ เรื่องนี้เป็นตัวอย่างสำหรับวิดีโอเกม ควรจะมีวิธีแก้ปัญหาในเคอร์เนลที่ไม่ทำให้ชีวิตของฉันซับซ้อนขึ้นด้วยแอปพลิเคชันที่อ่านรหัสการสแกน
FUZxxl

คำตอบ:


27

ใช่เป็นไปได้โดยใช้ XKB ซึ่งแตกต่างจาก xmodmap, XKB สามารถทำการแมปคีย์ของคุณสำหรับอุปกรณ์แต่ละตัวได้

หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณมี xkbcomp> 1.2.0

รายการอุปกรณ์ของคุณด้วย:

xinput list

คุณจะได้รับสิ่งนี้:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

ระบุสตริงของอุปกรณ์ของคุณและแก้ไขเชลล์สคริปต์ต่อไปนี้เปลี่ยนบรรทัด sed ด้วยอันที่เหมาะกับชื่ออุปกรณ์ของคุณ จากนั้นเปลี่ยนคีย์ที่คุณต้องการแมปใหม่

ตัวอย่าง: โหลดxevและกดปุ่มที่คุณต้องการทำการแมปใหม่ สมมติว่าคุณหามัน keycode 84. การค้นหา 84 https://gist.github.com/zoqaeski/3880640 <KP5>ชื่อคีย์มี จากนั้นค้นหาคีย์ที่คุณต้องการแทนที่ด้วย (ในลิงก์เดียวกันไกลออกไปด้านล่าง ) และคัดลอกสิ่งที่อยู่ในวงเล็บ ทำขั้นตอนนี้ซ้ำสำหรับปุ่มทั้งหมดที่คุณต้องการ

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

จากนั้นแหล่งที่มา (คุณสามารถเพิ่มลงใน. xinitrc ของคุณ) เสร็จหมดแล้ว! ตอนนี้กดปุ่มควรสร้างผลลัพธ์ที่ต้องการเฉพาะสำหรับอุปกรณ์ที่คุณระบุ

แก้ไข : เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่าด้วยเหตุผลบางอย่างการกำหนดค่าใหม่จะไม่ถูกนำมาใช้ทันที คุณต้องกดปุ่มบนแป้นพิมพ์อื่นก่อนจากนั้นทดสอบคีย์ที่กำหนดค่าไว้บนแป้นพิมพ์ที่ปรับเปลี่ยน ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นบางทีแคชบางประเภท


ให้ฉันลองทำวันจันทร์เมื่อฉันกลับไปที่คอมพิวเตอร์ที่ใช้แป้นพิมพ์นี้
FUZxxl

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c)ใช่คุณควรทดสอบก่อนแทนที่$remote_idด้วยรหัสประจำตัว โปรดทราบว่ามีการอ้างอิงสองข้อที่$remote_idนั่นคุณเปลี่ยนทั้งสองหรือไม่
Watcom

1
โอ้และเมื่อทำการทดสอบฮาร์ดโค้ด$remote_idตรวจสอบให้แน่ใจว่าคุณใส่ความคิดเห็นออกบรรทัด[ "$remote_id" ] || exitถ้าคุณยังไม่ได้อย่างอื่นก็จะประกันตัวออก
Watcom

1
@ stats-hb $9จะไม่ทำงานคุณหมายถึง9อะไร
Watcom

1
สิ่งนี้ใช้ได้กับฉันlampjs.wordpress.com/2015/06/26/…
usil

6

สำหรับคนอื่นที่มาที่นี่นอก Google และต้องการคำตอบที่สอดคล้องกับสิ่งที่ผู้ถามหวังไว้ในตอนแรกฉันรู้วิธีสองวิธีในการแมปเหตุการณ์ในevdevระดับเพื่อให้การเปลี่ยนแปลงมีผลกับแอปพลิเคชันทั้งหมด:

  1. udev จัดเตรียม API สำหรับการแก้ไขรายการฐานข้อมูลฮาร์ดแวร์ที่ควบคุมการแมประหว่าง scancodes และ keycodes หน้า ArchiWiki นี้ซึ่งมีคำแนะนำบอกอย่างชัดเจนว่ามันจะทำงานได้ทั้ง X11 และอินพุตคอนโซล

    ส่วนสำคัญคือคุณสร้างรายการที่กำหนดเอง/etc/udev/hwdb.d/ซึ่งประกอบด้วยรูปแบบการจับคู่อุปกรณ์และนิยาม remapping scancode-to-keycode จากนั้นรันsystemd-hwdb updateเพื่อสร้างฐานข้อมูลใหม่และudevadm triggerใช้โดยไม่ต้องรีบูต

  2. เนื่องจาก Wayland ไม่ได้ใช้ระบบย่อยของแป้นพิมพ์ X11 และผู้เรียบเรียง Wayland หลักเช่น GNOME Shell และ Weston ไม่ได้ใช้ UIs เพื่อกำหนดค่าแง่มุมที่เกี่ยวข้องของ libinput บางคนเขียน daemon ชื่อevdevremapkeysซึ่งแก้ไขปัญหาคล้ายกับไดรเวอร์ G15Daemon สำหรับผู้ใช้ Logitech คีย์บอร์ดเกม G15

    (มันกลืนเหตุการณ์ที่ตั้งใจจะทำการแมปใหม่ดังนั้นจึงไม่มีอะไรที่ฟังบนอุปกรณ์สามารถมองเห็นได้จากนั้นปล่อยเหตุการณ์ที่แก้ไขผ่านuinputAPI สำหรับการสร้างอุปกรณ์อินพุตระดับเคอร์เนลจากพื้นที่ผู้ใช้)


ฉันมาที่นี่นอก DuckDuckGo แต่ขอบคุณสำหรับคำตอบต่อไป (:
sm4rk0

0

สำหรับผู้ที่ไม่ประสบความสำเร็จกับตัวเลือก @Watcom เพียงแค่ใส่ไฟล์แผนที่ใหม่ของคุณ smth like:

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

ถึง / usr / share / X11 / xkb / symbols / อาจจะเป็นรูท (Ubuntu อาจแตกต่างกันสำหรับ distrib ของคุณ) ให้เรียกไฟล์ 'custom' ขอสตริงรูปแบบปัจจุบันของคุณด้วยsetxkbmap -device <device id> -print | grep xkb_symbolsและเพิ่ม+customเข้าไป ตั้งค่าเค้าโครงใหม่ด้วยปุ่มที่แมปใหม่ด้วยและสตริงรูปแบบที่แก้ไข:

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

เอฟเฟกต์ไม่ได้ถาวรและน่าเสียดายเมื่อเชื่อมต่อแป้นพิมพ์อื่นไม่ได้คิดวิธีการแก้ไข คุณสามารถเพิ่มคำสั่งด้านบนลงในของคุณได้.bashrcดังนั้นคีย์จะถูกสลับเมื่อรีสตาร์ทหากจำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.