जब यूएसबी कीबोर्ड प्लग में udv ऑटो लोड कीबोर्ड लेआउट के लिए नियम


24

जब मैं एक usb कीबोर्ड में प्लग करता हूं, लेकिन एक नया कीबोर्ड लेआउट लोड करने की कोशिश कर रहा हूं, लेकिन मेरा udv नियम काम नहीं कर रहा है।

SUBSYSTEM == "इनपुट", ATTR {idVendor} == "062a", ATTR {idProduct} == "0201", GOTO = "usb_xmodmap_auto"

लेबल = "usb_xmodmap_auto"
कार्रवाई == "जोड़ें", RUN + = "/ usr / बिन / xmodmap ~ / .usbXxodod"।
कार्रवाई == "हटाएं", RUN + = "/ usr / बिन / xmodmap ~ / .pndXxodod"।

मैंने नियमों का उपयोग करके पुनः लोड किया है:

> सूद udvadm नियंत्रण - लोड-नियम

और सिस्टम को रीस्टार्ट करके लेकिन जब मैं USB कीबोर्ड में प्लग करता हूं तो ऑरिजिनल xmodmap अभी भी लोड होता है और इस तरह कीबोर्ड लेआउट गलत होता है, लेकिन अगर मैं टर्मिनल में कमांड चलाता हूं

> / usr / bin / xmodmap ~ / .usbXmodmap
या
> / usr / bin / xmodmap ~ / .pndXmodmap

वे ठीक काम करते हैं।

आशा है कि मदद कर सकता है।

संपादित करें:

बस और अधिक मदद करने के लिए मैंने कुछ udvadm परीक्षण चलाए:

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

आउटपुट:

run_command: कॉलिंग: टेस्ट
udvadm_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.31-1-2:1.1/input/input10' है
udev_rules_apply_to_event: RUN '/ sbin / modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rules
udev_rules_apply_to_event: RUN 'सॉकेट: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules2
udev_rules_apply_to_event: RUN '/ sbin / modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules:31
udev_rules_apply_to_event: RUN 'सॉकेट: / org / कर्नेल / udev / मॉनिटर' /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
udvadm_test: UDEV_LOG = 6
udvadm_test: DEVPATH = / devices / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / इनपुट / इनपुट 10
udvadm_test: PRODUCT = 3 / 62a / 201/110
udvadm_test: NAME = "USB-अनुरूप कीबोर्ड"
udvadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udvadm_test: UNIQ = ""
udvadm_test: EV == 1f
udvadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udvadm_test: REL == 143
udvadm_test: ABS == 1 0
udvadm_test: MSC == 10
udvadm_test: MODALIAS = इनपुट: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8C, 8E, 8F, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, बी 1, बी 2, B5, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, E2, ईए, ईबी, 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
udvadm_test: ACTION = जोड़ें
udvadm_test: SUBSYSTEM = इनपुट
udvadm_test: run: '/ sbin / modprobe -b इनपुट: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,87,89,89 , 8A, 8 बी, 8C, 8E, 8F, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, बी 1 , बी 2, B5, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, E2, ईए, ईबी, 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 '
udvadm_test: run: 'सॉकेट: @ / org / freedesktop / hal / udevmee'
udvadm_test: run: '/ sbin / modprobe इनपुट: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,889A , 8 बी, 8C, 8E, 8F, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, बी 1, बी 2 , B5, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, E2, ईए, ईबी, 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 '
udvadm_test: run: 'सॉकेट: / org / कर्नेल / udev / मॉनिटर'
udvadm_test: run: '/ usr / bin / xmodmap ~ / .usbXmodup'

तथा

> udvadm test --action = निकालें /devices/platform/ehci-omap.0/usb1/1-2/1-2.33/1-2.3:1.1/input/input10

आउटपुट:

run_command: कॉलिंग: टेस्ट
udvadm_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.31-1-2:1.1/input/input10' है
udev_rules_apply_to_event: RUN 'सॉकेट: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules2
udev_rules_apply_to_event: RUN 'सॉकेट: / org / कर्नेल / udev / मॉनिटर' /etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rn.com
udvadm_test: UDEV_LOG = 6
udvadm_test: DEVPATH = / devices / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / इनपुट / इनपुट 10
udvadm_test: PRODUCT = 3 / 62a / 201/110
udvadm_test: NAME = "USB-अनुरूप कीबोर्ड"
udvadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udvadm_test: UNIQ = ""
udvadm_test: EV == 1f
udvadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udvadm_test: REL == 143
udvadm_test: ABS == 1 0
udvadm_test: MSC == 10
udvadm_test: MODALIAS = इनपुट: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8C, 8E, 8F, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, बी 1, बी 2, B5, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, E2, ईए, ईबी, 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
udvadm_test: ACTION = निकालें
udvadm_test: SUBSYSTEM = इनपुट
udvadm_test: run: 'सॉकेट: @ / org / freedesktop / hal / udevmee'
udvadm_test: run: 'सॉकेट: / org / कर्नेल / udev / मॉनिटर'
udvadm_test: run: '/ usr / bin / xmodmap ~ / .pndXmodup'

जो यह दिखाने के लिए काम करना चाहिए लगता है, लेकिन यह एक जवाब पाने में मदद करता है उम्मीद नहीं है।


जवाबों:


16

मुझे इसके आस-पास काम करने का एक तरीका मिला, हालाँकि यह थोड़ा हैकरी था।

मुझे उसी सटीक बिंदु पर आज udev, setxkbmap और xinput --list के साथ दो कीबोर्ड सेट करने की कोशिश में और usb हॉटप्लगिंग के साथ काम करने के लिए मिला। मैं चारों ओर कुंजियों की अदला-बदली कर रहा हूं, लेआउट को नहीं बदल रहा है, लेकिन इसके सभी समान हैं, एक बार जब आप अपने कीबोर्ड को हॉटप्लग पर पहचान लेते हैं और conditonally को setxkbmap कह सकते हैं, तो आपको केवल उस कीबोर्ड की भाषा सेट करने में सक्षम होना चाहिए जिसे आपने निर्दिष्ट किया है । कीबोर्ड लेआउट की सूची यहां मिल सकती है ls -l /usr/share/kbd/keymaps/i386/और आप अपने डिवाइस का नाम ढूंढ सकते हैं xinput -list

  1. आप rizumuअपने उपयोगकर्ता नाम के साथ प्रतिस्थापित करना चाहते हैं , क्योंकि मैंने पाया कि यह स्पष्ट होने के बिना ऐसा करना संभव नहीं था।
  2. सुनिश्चित करें कि आप yourकीबोर्ड नाम पर grep हैं ।
  3. lsusbहार्डवेयर आईडी की खोज करने के लिए उपयोग करें जिसे आपको udv नियम में सेट करने की आवश्यकता है। मेरा दास कीबोर्ड ऐसा दिखता हैBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.

मैंने पहली बार udev नियम को कीबोर्ड को ऑटोडेटक्ट करने के लिए सेट किया है एक 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कुछ पृष्ठभूमि में कॉल है, ताकि udv अपनी प्रक्रिया को पूरा कर सके और कीबोर्ड को सक्रिय कर सके। ~/bin/kbdस्क्रिप्ट के अंदर हम एक सेकंड के लिए सोते हैं, क्योंकि हमें कीबोर्ड के सक्रिय होने तक प्रतीक्षा करने की आवश्यकता होती है ताकि हम xinput का उपयोग करके डिवाइस आईडी प्राप्त कर सकें। इस हासिल करने के लिए मैं कुछ चर सेट और उन्हें निर्यात किया है तो xinput setxkbmap उनके काम कर सकते हैं: DISPLAY, XAUTHORITY, HOME, और एक daskb_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/…
सादी

और मुझे आश्चर्य है कि यदि आप इस स्क्रिप्ट (जैसे notify-send "USB Keyboard is plugged in and ready for use now." -i gtk-dialog-info -t 1000 -u normal) के अंत में एक अधिसूचना संदेश जोड़ने में मेरी मदद कर सकते हैं । जैसा कि मुझे स्क्रिप्टिंग के बारे में अधिक जानकारी नहीं है, मैंने इसे "फाई" से पहले या बाद में डालने की कोशिश की, लेकिन दोनों ही मामलों में अधिसूचना संदेश बार-बार दिखाई देता रहा :-(
साडी

OWNERइस उपकरण के लिए सेटिंग क्यों ?
लिम्बो पेंग

1
xset r rate 200 30रेखा क्या करती है? xsetमेरे उबंटू 17.04 स्थापना पर उपलब्ध नहीं है।
क्लेनफ्रेंड जूल

1
मैं xmodmap $HOME/.Xmodmapआपके "/ home / rizumu / bin / kbd" के अनुरूप एक स्क्रिप्ट का उपयोग करने में सक्षम नहीं हूं । ऐसा क्यों होगा?
गेरीमिया

5

आपके डिस्ट्रो के आधार पर, आपके पास पहले से ही /lib/udev/rules.d/64-xorg-xkb.rules में कीबोर्ड के लिए एक udv नियम हो सकता है। उबंटू पर, यह आयात / आदि / डिफ़ॉल्ट / कीबोर्ड, जिसमें इस तरह के विकल्प हैं:

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

मेरे सेटअप के लिए, मैंने पाया कि यह बिल्ट-इन नियम मेरे कस्टम udev नियम के बाद निष्पादित हो रहा था, और मेरी सेटिंग्स को ओवरराइड कर रहा था। इसके बजाय मैंने XKBOPTIONS को / etc / डिफ़ॉल्ट / कीबोर्ड में बदल दिया:

XKBOPTIONS="-option ctrl:nocaps"

"कैप्स लॉक कंट्रोल है" व्यवहार प्राप्त करने के लिए मैं सभी कीबोर्ड पर चाहता था।


2
महान विचार! मेरा बस के साथ काम करता हैXBKOPTIONS="ctrl:nocaps"
RasmusWL

3

यदि आप GNOME चला रहे हैं, तो आपको इसके कीबोर्ड प्रबंधन प्लगइन को निष्क्रिय करना होगा ताकि यह आपके लेआउट परिवर्तनों को ओवरराइड न करे।

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

वांछित के रूप में सक्षम करने के लिए फिर से वही कमांड चलाएँ।


im चल रहा है। यह काम करेगा?
जेक ऐचिसन

क्या आप öngström पर GNOME का उपयोग कर रहे हैं?
इग्नासियो वाज़केज़-अब्राम्स

nope im xfce 4.6.1 के उपयोग से
Jake Aitchison

1
मेरे Ubuntu 13.04 में, इस में है dconfके तहत /org/gnome/settings-daemon/plugins/keyboard/active
nh2

1
और उबंटू 13.04 के लिए कमांड है:gsettings set org.gnome.settings-daemon.plugins.keyboard active false
सादी

3

यह काम नहीं करता है क्योंकि udev और xmodmapआपके X11 डिस्प्ले तक पहुंच नहीं है। वास्तव में, udevभले ही पता नहीं है कर रहे हैं सक्रिय X11 प्रदर्शित करता है।

  • नोट: प्रदर्शित करता है , बहुवचन। यह "X11" प्रदर्शन का उपयोग नहीं कर सकता क्योंकि एक से अधिक हो सकते हैं। उदाहरण के लिए, यदि आप "फास्ट यूजर स्विचिंग" का उपयोग करते हैं।

तो मैं यह काम कैसे कर सकता हूं?
जेक एचीसन

क्या कोई व्यक्ति जानता है कि इसे कैसे ठीक किया जाए?
जेक एचीसन

1
मुझे सेटxkbmap कॉल करने के लिए udev मिल गया है। Udev नियम एक स्क्रिप्ट को कॉल करता है जो एक अन्य स्क्रिप्ट को पृष्ठभूमि में रखता है (इसलिए udev पूरा कर सकता है)। दूसरी स्क्रिप्ट एक सेकंड के लिए रुक जाती है, अपेक्षित X11 वैरिएबल सेट करती है, और setxkbmap को ट्रिगर करती है। अधिक विवरण के लिए मुख्य प्रश्न के लिए मेरा उत्तर देखें।
थॉमस श्रेइबर

@rizumu: आह, सौभाग्य है कि GDM के साथ काम करने के लिए हालांकि।
१५:११

3

मुझे लगता है कि मुझे इसे कॉन्फ़िगर करने का एक बहुत साफ तरीका मिला, जिसे विशेष X11 हैक की आवश्यकता नहीं है।

इसके पीछे विचार यह है कि udevकेवल नए कीबोर्ड इनपुट के लिए पता लगाया जाएगा और प्रत्येक लेआउट के लिए एक सिमलिंक बनाया inotifyजाएगा , फिर यूजरस्पेस में नए लेआउट के लिए देखेगा।

udv नियम

#/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/input/by-layout) में एक निर्देशिका है जो उपयोगकर्ताओं की स्क्रिप्ट में परिवर्तन देखने के लिए है।

केडीई के लिए यूजरस्पेस स्क्रिप्ट

उदाहरण के लिए, 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सिस्टम इनिट स्क्रिप्ट का उपयोग करके किया जा सकता है।


धन्यवाद, इससे मुझे एहसास हुआ कि मैं inotifywaitकिसी भी बदलाव पर सेटअप स्क्रिप्ट चलाने के लिए उपयोग कर सकता हूं /dev/input, क्योंकि स्क्रिप्ट स्वयं ही एक आदर्श है।
चार्ली गोरीचानाज़

3

X.Org कॉन्फ़िगरेशन के बारे में क्या? से Gentoo विकी: X.Org/Input_drivers - udev :

उदाहरण: यदि आपके पास स्विट्जरलैंड के फ्रांसीसी भाग के लिए लॉजिटेक एक्सेस कीबोर्ड है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

फ़ाइल: /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"। मैं आर्क का उपयोग करता हूं और मौजूदा /etc/X11/xorg.conf.d/vim 10-evdev.conf में अपने स्वयं के यूएसबी कीबोर्ड को कॉन्फ़िगर करता हूं।

@rizumu: चतुर कीचड़, साझा करने के लिए धन्यवाद।


1
मैं एक x.org.conf.d निर्देशिका लिनक्स टकसाल पर 18.2 की जरूरत नहीं है
मैक्स एन

2

चल रहे प्रदर्शन तक पहुँचने के बारे में अपने प्रश्न का उत्तर देने के लिए, आप स्क्रिप्ट में उपयुक्त प्रदर्शन चर का निर्यात कर सकते हैं, यह मानते हुए कि प्रदर्शन के लिए अनुमतियाँ सही ढंग से सेट हैं। ( man xsetप्रदर्शन अनुमतियों के लिए।)

कई सामान्य मामलों में आप बस कर सकते हैं export DISPLAY=:0 कमांड के लिए , क्योंकि यह एकल उपयोगकर्ता प्रणाली पर पहला प्रदर्शन है। सीधे तौर पर xmodmap की बजाय किसी स्क्रिप्ट को चलाना सबसे आसान है, क्योंकि इससे आपको पर्यावरण चर और बाकी हिस्सों पर अधिक नियंत्रण मिल सकेगा। (इसलिए "/ usr / bin / xmodmap ~ / .usbXmodmap" को अपने नियम में "/usr/local/bin/keyboard_plug.sh" से बदल दें और उपयुक्त स्क्रिप्ट को DISPLAY चर के साथ उस स्क्रिप्ट में डालें।)

जैसा कि ऊपर उल्लेख किया गया है, हालांकि, यदि आप DISPLAY =: 0 मान लेते हैं, तो आप बाद में समस्याओं में चल सकते हैं यदि आपके पास कई उपयोगकर्ता या डिस्प्ले हैं। आप उपयुक्त प्रदर्शन का पता लगाने के लिए स्क्रिप्ट लिख सकते हैं, लेकिन उस स्थिति में आप अपने दम पर हैं (जहाँ तक इस उत्तर का सवाल है)। :)


1

चूंकि मुझे udev नियमों को काम करने के लिए हैक्स नहीं मिला, इसलिए मैंने 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 सेकंड तक ट्रिगर नहीं हो रही थी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.