กฎ udev สำหรับการวางเค้าโครงแป้นพิมพ์อัตโนมัติเมื่อเสียบแป้นพิมพ์ usb


24

ฉันกำลังพยายามโหลดเค้าโครงแป้นพิมพ์ใหม่เมื่อฉันเสียบแป้นพิมพ์ usb แต่กฎ udev ของฉันไม่ทำงาน

SUBSYSTEM == "อินพุต", ATTR {idVendor} == "062a", ATTR {idProduct} == "0201", GOTO = "usb_xmodmap_auto"

LABEL = "usb_xmodmap_auto"
ACTION == "เพิ่ม", RUN + = "/ usr / bin / xmodmap ~ / .usbXmodmap"
ACTION == "remove", RUN + = "/ usr / bin / xmodmap ~ / .pndXmodmap"

ฉันได้รีโหลดกฎโดยใช้:

> sudo udevadm control --reload-rules

และโดยการรีสตาร์ทระบบ แต่เมื่อฉันเสียบแป้นพิมพ์ usb xmodmap เดิมยังคงโหลดอยู่และทำให้รูปแบบแป้นพิมพ์ผิด แต่ถ้าฉันเรียกใช้คำสั่งในเทอร์มินัล

> / usr / bin / xmodmap ~ / .usbXmodmap
หรือ
> / usr / bin / xmodmap ~ / .pndXmodmap

พวกเขาทำงานได้ดี

หวังว่าคนจะช่วยได้

แก้ไข:

เพียงเพื่อช่วยเพิ่มเติมฉันวิ่งทดสอบ udevadm:

> udevadm test --action = เพิ่ม /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10

เอาท์พุท:

run_command: การเรียก: ทดสอบ
udevadm_test: รุ่น 151
โปรแกรมนี้ใช้สำหรับการดีบักเท่านั้นมันไม่ได้รันโปรแกรมใด ๆ
ระบุโดยคีย์ RUN มันอาจแสดงผลลัพธ์ที่ไม่ถูกต้องเพราะ
ค่าบางอย่างอาจแตกต่างกันหรือไม่สามารถใช้ได้ในการจำลอง

[ ... ]
parse_file: การอ่าน '/etc/udev/rules.d/usb-keyboard.rules' เป็นไฟล์กฎ
udev_rules_new: กฎใช้โทเค็น 100572 ไบต์ (8381 * 12 ไบต์) บัฟเฟอร์ 21523 ไบต์
udev_rules_new: ดัชนีชั่วคราวที่ใช้ 35380 ไบต์ (1769 * 20 ไบต์)
udev_device_new_from_syspath: อุปกรณ์ 0x3b4d8 มี devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10'
udev_rules_apply_to_event: RUN '/ sbin / modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rulesu
udev_rules_apply_to_event: ซ็อกเก็ตของ RUN: @ / org / freedesktop / hal / udev_event '/etc/udev/rules.d/90-hal.rules:2
udev_rules_apply_to_event: RUN '/ sbin / modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules:31
udev_rules_apply_to_event: ซ็อกเก็ตของ RUN: / org / kernel / udev / monitor '/etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .usbXmodmap' /etc/udev/rules.d/usb-keyboard.rules:4
udevadm_test: UDEV_LOG = 6
udevadm_test: DEVPATH = / อุปกรณ์ / แพลตฟอร์ม / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10
udevadm_test: PRODUCT = 3 / 62a / 201/110
udevadm_test: NAME = "แป้นพิมพ์ที่รองรับ USB"
udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udevadm_test: UNIQ = ""
udevadm_test: EV == 1f
udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udevadm_test: REL == 143
udevadm_test: ABS == 1 0
udevadm_test: MSC == 10
udevadm_test: MODALIAS = อินพุต: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,73,74,77,86,87,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F, 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1ad, 1AE, 1B0,1B1,1B7, r0,1,6,8, A20, M4, lsfw
udevadm_test: ACTION = เพิ่ม
udevadm_test: SUBSYSTEM = อินพุต
udevadm_test: เรียกใช้: '/ sbin / modprobe -b อินพุต: b0003v062Ap0201e0110-e0,1,2,3,3, k71,72,73,74,77,80,82,83,85,86,87,88,89 , 8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1 , B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D , 17F, 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1ad, 1AE, 1B0,1B1,1B7, r0,1 , 6,8, A20, M4, lsfw'
udevadm_test: เรียกใช้: 'ซ็อกเก็ต: @ / org / freedesktop / hal / udev_event'
udevadm_test: เรียกใช้: '/ sbin / modprobe อินพุต: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,85,86,87,88,89,8A , 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2 , B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F , 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1ad, 1AE, 1B0,1B1,1B7, r0,1,6 , 8, A20, M4, lsfw'
udevadm_test: run: 'socket: / org / kernel / udev / monitor'
udevadm_test: เรียกใช้: '/ usr / bin / xmodmap ~ / .usbXmodmap'

และ

> udevadm test --action = remove /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10

เอาท์พุท:

run_command: การเรียก: ทดสอบ
udevadm_test: รุ่น 151
โปรแกรมนี้ใช้สำหรับการดีบักเท่านั้นมันไม่ได้รันโปรแกรมใด ๆ
ระบุโดยคีย์ RUN มันอาจแสดงผลลัพธ์ที่ไม่ถูกต้องเพราะ
ค่าบางอย่างอาจแตกต่างกันหรือไม่สามารถใช้ได้ในการจำลอง

[ ... ]
parse_file: การอ่าน '/etc/udev/rules.d/usb-keyboard.rules' เป็นไฟล์กฎ
udev_rules_new: กฎใช้โทเค็น 100572 ไบต์ (8381 * 12 ไบต์) บัฟเฟอร์ 21523 ไบต์
udev_rules_new: ดัชนีชั่วคราวที่ใช้ 35380 ไบต์ (1769 * 20 ไบต์)
udev_device_new_from_syspath: อุปกรณ์ 0x3b4d8 มี devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10'
udev_rules_apply_to_event: ซ็อกเก็ตของ RUN: @ / org / freedesktop / hal / udev_event '/etc/udev/rules.d/90-hal.rules:2
udev_rules_apply_to_event: ซ็อกเก็ตของ RUN: / org / kernel / udev / monitor '/etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rulesu
udevadm_test: UDEV_LOG = 6
udevadm_test: DEVPATH = / อุปกรณ์ / แพลตฟอร์ม / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10
udevadm_test: PRODUCT = 3 / 62a / 201/110
udevadm_test: NAME = "แป้นพิมพ์ที่รองรับ USB"
udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udevadm_test: UNIQ = ""
udevadm_test: EV == 1f
udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udevadm_test: REL == 143
udevadm_test: ABS == 1 0
udevadm_test: MSC == 10
udevadm_test: MODALIAS = อินพุต: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,73,74,77,86,87,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F, 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1ad, 1AE, 1B0,1B1,1B7, r0,1,6,8, A20, M4, lsfw
udevadm_test: ACTION = remove
udevadm_test: SUBSYSTEM = อินพุต
udevadm_test: เรียกใช้: 'ซ็อกเก็ต: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: 'socket: / org / kernel / udev / monitor'
udevadm_test: เรียกใช้: '/ usr / bin / xmodmap ~ / .pndXmodmap'

ซึ่งดูเหมือนว่าจะแสดงว่าควรใช้งานได้ แต่ไม่หวังว่าจะได้รับคำตอบ


1
ที่เกี่ยวข้อง

คำตอบ:


16

ฉันพบวิธีแก้ไขปัญหานี้แม้ว่าจะเป็นเรื่องแฮ็คเล็กน้อย

ฉันได้มาถึงจุดเดียวกันในวันนี้ในการพยายามตั้งค่าสองคีย์บอร์ดด้วย udev, setxkbmap และ xinput - รายการและเพื่อให้สามารถทำงานกับ usb hotplugging ได้ ฉันเปลี่ยนแป้นไปรอบ ๆ ไม่เปลี่ยนเค้าโครง แต่ทั้งหมดเหมือนเดิมเมื่อคุณระบุแป้นพิมพ์ของคุณบน hotplug และสามารถเรียก setxkbmap อย่างย่อได้จากนั้นคุณควรจะสามารถตั้งค่าภาษาของแป้นพิมพ์ที่คุณระบุเท่านั้น . รายชื่อของรูปแบบแป้นพิมพ์ที่สามารถพบได้ที่นี่ls -l /usr/share/kbd/keymaps/i386/และคุณสามารถหาชื่ออุปกรณ์ของคุณเพื่อ GRE xinput -listกับ

  1. คุณจะต้องการแทนที่rizumuด้วยชื่อผู้ใช้ของคุณเนื่องจากฉันพบว่าเป็นไปไม่ได้ที่จะทำสิ่งนี้โดยไม่ต้องแจ้งให้ทราบชัดเจน
  2. ตรวจสอบให้แน่ใจว่าคุณ grep ที่yourชื่อแป้นพิมพ์
  3. ใช้lsusbเพื่อค้นหา ID ฮาร์ดแวร์ที่คุณต้องตั้งค่าในกฎ udev แป้นพิมพ์ das ของฉันดูเหมือนว่านี้Bus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.

ฉันแรกตั้งค่ากฎ udev เพื่อ autodetct แป้นพิมพ์โดยการสร้างกฎ udev:

ในไฟล์/etc/udev/rules.d/00-usb-keyboards.rules:

ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2013", RUN+="/home/rizumu/bin/kbd_udev", OWNER="rizumu"

ฉันมีสองไฟล์ ~ / bin / kbd และ ~ / bin / kbd_udev ตรวจสอบให้แน่ใจว่าพวกเขามีสิทธิ์ที่เหมาะสมchmod 755 ~/bin/kbd*

~/bin/kbd_udevสคริปต์ประกอบด้วย:

#!/bin/bash
/home/rizumu/bin/kbd &

และคุณจะสังเกตเห็นว่าสิ่งที่มันทำมีเพียงการโทร~/bin/kbdในพื้นหลังเพื่อให้ udev สามารถดำเนินการให้เสร็จสิ้นและเปิดใช้งานแป้นพิมพ์ ภายใน~/bin/kbdสคริปต์ที่เรานอนหลับเป็นวินาทีเพราะเราต้องรอจนกว่าเปิดใช้งานแป้นพิมพ์เพื่อให้เราสามารถรับรหัสอุปกรณ์โดยใช้ xinput เพื่อให้บรรลุนี้ผมได้ตั้งค่าตัวแปรบางอย่างและส่งออกพวกเขาเพื่อให้ XInput setxkbmap สามารถทำผลงานของพวกเขา: DISPLAY, XAUTHORITY, HOMEและหนึ่งdaskb_idสำหรับ ID ของ daskeyboard ของฉัน:

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/rizumu/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
daskb_id=`xinput -list | grep -i 'daskeyboard' | grep -o id=[0-9]. | grep -o [0-9]. | head -1`

xset r rate 200 30
setxkbmap -layout colemak
setxkbmap -option ctrl:nocaps
if [ "${daskb_id}" ]; then
    setxkbmap -device "${daskb_id}" -option altwin:swap_lalt_lwin
fi

ขอบคุณมากที่ช่วยฉันตอบคำถามของฉันคือ AskUbuntu: askubuntu.com/questions/337411/…
Sadi

และฉันสงสัยว่าคุณสามารถช่วยฉันเพิ่มข้อความแจ้งเตือนในตอนท้ายของสคริปต์นี้ (เช่นnotify-send "USB Keyboard is plugged in and ready for use now." -i gtk-dialog-info -t 1000 -u normal) เนื่องจากฉันไม่ค่อยรู้เกี่ยวกับการเขียนสคริปต์ฉันจึงพยายามแทรกก่อนหรือหลัง "fi" แต่ในทั้งสองกรณีข้อความแจ้งเตือนยังคงปรากฏซ้ำแล้วซ้ำอีก :-(
Sadi

ทำไมการตั้งค่าOWNERสำหรับอุปกรณ์นี้
Limbo Peng

1
อะไรxset r rate 200 30สายทำอย่างไร xsetไม่พร้อมใช้งานในการติดตั้ง Ubuntu 17.04 ของฉัน
kleinfreund

1
ฉันไม่สามารถรันxmodmap $HOME/.Xmodmapโดยใช้สคริปต์ที่คล้ายคลึงกับ "/ home / rizumu / bin / kbd" ของคุณ ทำไมถึงเป็นเช่นนั้น?
Geremia

5

คุณอาจมีกฎ udev สำหรับคีย์บอร์ดใน /lib/udev/rules.d/64-xorg-xkb.rules ทั้งนี้ขึ้นอยู่กับ distro ของคุณ บน Ubuntu การนำเข้า / etc / default / keyboard นี้มีตัวเลือกคร่าวๆดังนี้:

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

สำหรับการตั้งค่าของฉันฉันพบว่ากฎในตัวนี้กำลังทำงานหลังจากกฎ udev ที่กำหนดเองของฉันและกำลังแทนที่การตั้งค่าของฉัน แต่ฉันเปลี่ยน XKBOPTIONS ใน / etc / default / keyboard เป็น:

XKBOPTIONS="-option ctrl:nocaps"

เพื่อให้ได้ลักษณะการทำงาน "Caps Lock คือการควบคุม" ฉันต้องการบนคีย์บอร์ดทั้งหมด


2
ความคิดที่ดี! ฉันทำงานได้กับ JustXBKOPTIONS="ctrl:nocaps"
RasmusWL

3

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

gconftool-2 --toggle /apps/gnome_settings_daemon/plugins/keyboard/active

เรียกใช้คำสั่งเดียวกันอีกครั้งเพื่อเปิดใช้งานได้ตามต้องการ


ฉันกำลังทำงานอังสตรอม จะใช้งานได้ไหม
Jake Aitchison

คุณใช้ GNOME ในÅngströmหรือไม่
Ignacio Vazquez-Abrams

ไม่ใช้ xfce 4.6.1
Jake Aitchison

1
ใน Ubuntu 13.04 ของฉันนี้อยู่ในภายใต้dconf /org/gnome/settings-daemon/plugins/keyboard/active
nh2

1
และคำสั่งสำหรับ Ubuntu 13.04 คือ:gsettings set org.gnome.settings-daemon.plugins.keyboard active false
Sadi

3

มันไม่ทำงานเพราะudevและxmodmapไม่สามารถเข้าถึงจอแสดงผล X11 ของคุณ ในความเป็นจริงudevไม่ได้ทราบว่ามีอยู่ใช้งานแสดง X11

  • หมายเหตุ: แสดง , พหูพจน์ มันไม่สามารถใช้ "แสดง" X11 เพราะสามารถมีได้มากกว่าหนึ่ง ตัวอย่างเช่นหากคุณใช้ "การสลับผู้ใช้อย่างเร็ว"

ดังนั้นฉันจะทำให้งานนี้ได้อย่างไร
Jake Aitchison

ไม่มีใครรู้ว่าฉันจะแก้ไขได้อย่างไร
Jake Aitchison

1
ฉันได้รับ udev เพื่อโทรไปยัง setxkbmap กฎ udev เรียกสคริปต์ที่ภูมิหลังสคริปต์อื่น (ดังนั้น udev จึงสามารถทำให้เสร็จ) สคริปต์ที่สองหยุดชั่วคราวหนึ่งวินาทีตั้งค่าตัวแปร X11 ที่คาดไว้และทริกเกอร์ setxkbmap ดูคำตอบของฉันสำหรับคำถามหลักสำหรับรายละเอียดเพิ่มเติม
Thomas Schreiber

@rizumu: อ่าโชคดีที่ได้ทำงานกับ GDM
grawity

3

ฉันคิดว่าฉันพบวิธีการกำหนดค่าที่สะอาดกว่านี้มากซึ่งไม่ต้องการแฮ็ค X11 แบบพิเศษ

ความคิดที่อยู่เบื้องหลังสิ่งนี้คือที่udevจะตรวจหาอินพุตคีย์บอร์ดใหม่และสร้าง symlink สำหรับแต่ละเลย์เอาต์จากนั้นinotifyจะดูเลย์เอาต์ใหม่ใน userspace

กฎ udev

#/etc/udev/rules.d/61-usb-keyboard-layout.rules

# will match my Logitech keyboard with US layout 
SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c31c", GROUP="plugdev", MODE="0660", SYMLINK+="input/by-layout/us"

# will match my Lenovo integrated keyboard with IT layout
SUBSYSTEM=="input", ENV{ID_PATH}=="platform-i8042-serio-0", SYMLINK+="input/by-layout/it"

# force the directory to be recreated, just in case you unplug all input
SUBSYSTEM=="input", RUN="/bin/mkdir -p /dev/input/by-layout"

ด้วยกฎนี้ฉันมีไดเรกทอรีภายใต้ dev ( /dev/input/by-layout) เพื่อดูการเปลี่ยนแปลงในสคริปต์ userspace

สคริปต์ผู้ใช้สำหรับ KDE

ตัวอย่างเช่นเมื่อใช้ KDE ฉันได้เรียกใช้สคริปต์นี้ (อัตโนมัติ):

#!/bin/bash

# In case no link are found, switch to this layout
DEFAULT="it"

switch_layout () {
        [ ! -z "$1" ] || return 0
        /usr/bin/qdbus org.kde.keyboard /Layouts org.kde.KeyboardLayouts.setLayout $1
}

best_layout() {
        local LAYOUT=$(ls -1t /dev/input/by-layout/ | head -n 1)
        if [ -z "$LAYOUT" ] ; then
                LAYOUT=$DEFAULT
        fi
        echo $LAYOUT
}

switch_layout $(best_layout)

while true ; do
        EVENT=$(inotifywait -q -e create -e delete --exclude '.*tmp.*' /dev/input/by-layout/)

        if echo "$EVENT" | grep -qe CREATE ; then
                LAYOUT=${EVENT#?*CREATE }
        fi

        if echo "$EVENT" | grep -qe DELETE ; then
                LAYOUT=$(best_layout)
        fi

        switch_layout $LAYOUT
done

มันใช้งานได้เหมือนเสน่ห์ของฉัน หากต้องการเปลี่ยนเค้าโครงของระบบ (ซึ่งฉันไม่ต้องการในตอนนี้) สคริปต์ที่คล้ายกันซึ่งการใช้งานloadkeysสามารถถูกทำลายได้โดยใช้สคริปต์ init ของระบบ


ขอบคุณสิ่งนี้ทำให้ฉันรู้ว่าฉันสามารถใช้inotifywaitเพื่อเรียกใช้สคริปต์การตั้งค่าเมื่อมีการเปลี่ยนแปลงใด ๆ/dev/inputเนื่องจากสคริปต์นั้นเป็น idempotent
Charlie Gorichanaz

3

แล้ว X.Org configuration ล่ะ? จากGentoo Wiki: X.Org/Input_drivers - udev :

ตัวอย่าง: หากคุณมีแป้นพิมพ์ Logitech Access สำหรับส่วนภาษาฝรั่งเศสของสวิตเซอร์แลนด์คุณสามารถใช้สิ่งต่อไปนี้:

ไฟล์: /etc/X11/xorg.conf.d/10-keyboard.conf

Section "InputClass"
    Identifier             "evdev keyboard catchall"
    MatchIsKeyboard        "on"
    MatchDevicePath        "/dev/input/event*"
    Driver                 "evdev"
    Option                 "XkbModel" "logiaccess"
    Option                 "XkbLayout" "ch"
    Option                 "XkbVariant" "fr"
EndSection

สำหรับคำอธิบายในเชิงลึกอ่าน:

man xorg.conf

และ:

man evdev

ArchWikiสาธิตการใช้ไวยากรณ์เดียวกันใน xorg.conf แต่โปรดสังเกตว่า "ทุกวันนี้คุณควรสร้างไฟล์ปรับแต่งแยกต่างหากเช่น /etc/X11/xorg.conf.d/90-keyboard-layouts.conf" ฉันใช้ Arch และกำหนดค่าแป้นพิมพ์ USB ของฉันเองใน /etc/X11/xorg.conf.d/vim 10-evdev.conf ที่มีอยู่ใช้งานได้สำหรับฉัน

@rizumu: kludge ฉลาดขอบคุณสำหรับการแบ่งปัน


1
ฉันไม่มีไดเรกทอรี x.org.conf.d ใน Linux Mint 18.2
สูงสุด N

2

ในการตอบคำถามของคุณเกี่ยวกับการเข้าถึงหน้าจอแสดงผลที่ทำงานคุณสามารถส่งออกตัวแปร DISPLAY ที่เหมาะสมในสคริปต์โดยสมมติว่าสิทธิ์ในการแสดงผลถูกตั้งค่าอย่างถูกต้อง ( man xsetสำหรับสิทธิ์การแสดงผล)

ในหลายกรณีปกติคุณสามารถexport DISPLAY=:0ใช้คำสั่งได้เนื่องจากเป็นจอแสดงผลแรกในระบบผู้ใช้เดียว มันอาจเป็นวิธีที่ง่ายที่สุดในการรันสคริปต์แทนที่จะเป็น xmodmap โดยตรงเนื่องจากจะทำให้คุณสามารถควบคุมตัวแปรสภาพแวดล้อมและส่วนที่เหลือได้มากขึ้น (ดังนั้นแทนที่ "/ usr / bin / xmodmap ~ / .usbXmodmap" ในกฎของคุณด้วย "/usr/local/bin/keyboard_plug.sh" และใส่คำสั่งที่เหมาะสมในสคริปต์นั้นพร้อมกับตัวแปร DISPLAY)

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


1

เนื่องจากฉันไม่สามารถแฮ็กเพื่อให้กฎ udev ทำงานได้ฉันจึงเขียนสคริปต์ Python ขนาดเล็กpyudevเพื่อใช้ตรวจสอบกิจกรรมอินพุต

#! /usr/bin/env python3

import pyudev
import time
import subprocess

ctx = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(ctx)
monitor.filter_by("input")

def defer_xmodmap():
    time.sleep(1) # not sure if there's a race here, but it feels like there could be.
    subprocess.run("xmodmap ~/dotfiles/.xmodmap", shell=True)


for device in iter(monitor.poll, None):
    # there might be a way to add the action condition to the filter, but I couldn't find it
    if device.action != "add":
        continue

    # ensure the KB is initialized -- not sure if this is actually a needed check
    if not device.is_initialized:
        continue

    # my keyboard, from the output of `lsusb`
    if not "045E:07A5" in device.device_path:
        continue

    # it's the keyboard being added.
    defer_xmodmap()

จากนั้นฉันจะใช้ไฟล์หน่วยผู้ใช้ systemd นี้เพื่อให้มันทำงาน ( systemctl --user enable name_of_service_file):

[Unit]
Description=udev xmodmap monitor

[Service]
ExecStart=/usr/bin/env python3 %h/local/bin/monitor_kb_udev
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

inotifywaitวิธีการแก้ปัญหาจาก @ giosh94mhz pyudevน้อยที่เรียบง่ายและหลีกเลี่ยงการพึ่งพา อย่างไรก็ตามด้วยเหตุผลบางอย่างฉันพบว่าinotifyเหตุการณ์ไม่ได้ถูกเรียกใช้เป็นเวลา 10-20 วินาทีหลังจากที่เชื่อมต่อแป้นพิมพ์ของฉัน

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