যখন ইউএসবি কীবোর্ড প্লাগ ইন হয় তখন ইউদেব কীবোর্ড লেআউটটিকে স্বয়ংক্রিয়ভাবে লোড করতে নিয়ম করে


24

আমি যখন কোনও ইউএসবি কীবোর্ডে প্লাগ করি তখন একটি নতুন কীবোর্ড লেআউট লোড করার চেষ্টা করছি তবে আমার উদেব নিয়মটি কাজ করছে না।

SUBSYSTEM == "ইনপুট", এটিটিআর {idVendor} == "062a", এটিটিআর {আইডিপ্রডাক্ট} == "0201", GOTO = "usb_xmodmap_auto"

লেবেলটি = "usb_xmodmap_auto"
ক্রিয়া == "যোগ করুন", রুন + = "/ ইউএসআর / বিন / এক্সমোডম্যাপ। /। ইউএসবিএক্সমোডম্যাপ"
ক্রিয়া == "সরান", রুন + = "/ ইউএসআর / বিন / এক্সমোডম্যাপ। / .PndXmodmap"

আমি নিয়মগুলি ব্যবহার করে পুনরায় লোড করেছি:

> sudo udevadm নিয়ন্ত্রণ - পুনরায় লোড করুন

এবং সিস্টেমটি পুনরায় চালু করার মাধ্যমে আমি যখন ইউএসবি কীবোর্ডে প্লাগ করি তখন অরগিনাল এক্সমোডাম্যাপটি এখনও লোড হয় এবং এইভাবে কীবোর্ড বিন্যাসটি ভুল হয়, তবে যদি আমি টার্মিনালে কমান্ডটি চালিত করি

> / usr / bin / xmodmap ~ / .usbXmodmap
অথবা
> / usr / bin / xmodmap ~ / .pndXmodmap

তারা ঠিক কাজ করে।

আশা করি সোনোন সাহায্য করতে পারে

সম্পাদনা:

কেবলমাত্র আরও সাহায্যের জন্য আমি কিছু উডেবাডম পরীক্ষা চালিয়েছি:

> udevadm পরীক্ষা - ক্রিয়াকলাপ = যোগ / ডিভাইস / প্ল্যাটফর্ম /ehci-omap.0/usb1/1-2/1-2.3/1-2.3 प्रशंसा.1/ ইনপুট / ইনপুট 10

আউটপুট:

রান_কমন্ড: কলিং: পরীক্ষা
udevadm_test: সংস্করণ 151
এই প্রোগ্রামটি শুধুমাত্র ডিবাগিংয়ের জন্য, এটি কোনও প্রোগ্রাম চালায় না,
একটি রুন কী দ্বারা নির্দিষ্ট করা। এটি ভুল ফলাফলগুলি দেখাতে পারে, কারণ
কিছু মান পৃথক হতে পারে, বা সিমুলেশন রানে উপলভ্য নয়।

[...]
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 এর মধ্যে দেবপথ রয়েছে '/ ডিভাইসস / প্ল্যাটফর্ম / এহসিওমোপ.0 / ইউএসবি 1/1-2/1-2.3/1-2.3 प्रशंसा ./ ইনপুট / ইনপুট 10'
udev_rules_apply_to_event: RUN '/ sbin / Modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event: RUN 'সকেট: @ / org / ফ্রিডেস্কটপ / হাল / udev_event' /etc/udev/rules.d/90-hal.rulesferences
udev_rules_apply_to_event: RUN '/ sbin / Modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules31
udev_rules_apply_to_event: RUN 'সকেট: / org / কার্নেল / udev / মনিটর' /etc/udev/rules.d/run.rules আমার
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 / ইনপুট / ইনপুট 10
udevadm_test: PRODUCT = 3 / 62a / 201/110
udevadm_test: NAME = "ইউএসবি-অনুগত কীবোর্ড"
udevadm_test: PHYS = "ইউএসবি-এহিসি-ওম্যাপ.0-2.3 / ইনপুট 1"
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, কে 71,72,73,74,77,77,80,82,83,85,86,88,89,8A, 8 বি, 8 সি, 8E, 8F, 90,96,98,9B, 9c, 9E, 9F, A1 থেকে A3, A4, A5, থেকে A6, A7, A8, A9, এবি, এসি, আদ, ই, B1, B2, B5, সিই, সিএফ, D0, D1, D2 গ্রাহকের, D5, D9, ডিবি, E2, ইএ প্রিন্সিপাল, 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,4, 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, এবি, এসি, আদ, ই, বি 1 , B2 তে, B5, সিই, সিএফ, D0, D1, D2 গ্রাহকের, D5, D9, ডিবি, E2, ইএ প্রিন্সিপাল, 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 / ফ্রিডেস্কটপ / হাল / udev_event'
udevadm_test: চালান: '/ sbin / modprobe ইনপুট: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,88,89,8A , 8B, 8C, 8E, 8F, 90,96,98,9B, 9c, 9E, 9F, A1 থেকে A3, A4, A5, থেকে A6, A7, A8, A9, এবি, এসি, আদ, ই, B1, B2 , B5, সিই, সিএফ, D0, D1, D2 গ্রাহকের, D5, D9, ডিবি, E2, ইএ প্রিন্সিপাল, 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 / কার্নেল / udev / মনিটর'
udevadm_test: চালান: '/ usr / bin / xmodmap ~ / .usbXmodmap'

এবং

> udevadm পরীক্ষা - ক্রিয়াকলাপ = অপসারণ / ডিভাইস / প্ল্যাটফর্ম /ehci-omap.0/usb1/1-2/1-2.3/1-2.3 प्रशंसा.1/ ইনপুট / ইনপুট 10

আউটপুট:

রান_কমন্ড: কলিং: পরীক্ষা
udevadm_test: সংস্করণ 151
এই প্রোগ্রামটি শুধুমাত্র ডিবাগিংয়ের জন্য, এটি কোনও প্রোগ্রাম চালায় না,
একটি রুন কী দ্বারা নির্দিষ্ট করা। এটি ভুল ফলাফলগুলি দেখাতে পারে, কারণ
কিছু মান পৃথক হতে পারে, বা সিমুলেশন রানে উপলভ্য নয়।

[...]
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 এর মধ্যে দেবপথ রয়েছে '/ ডিভাইসস / প্ল্যাটফর্ম / এহসিওমোপ.0 / ইউএসবি 1/1-2/1-2.3/1-2.3 प्रशंसा ./ ইনপুট / ইনপুট 10'
udev_rules_apply_to_event: RUN 'সকেট: @ / org / ফ্রিডেস্কটপ / হাল / udev_event' /etc/udev/rules.d/90-hal.rulesferences
udev_rules_apply_to_event: RUN 'সকেট: / org / কার্নেল / udev / মনিটর' /etc/udev/rules.d/run.rules আমার
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rules:5
udevadm_test: UDEV_LOG = 6
udevadm_test: DEVPATH = / ডিভাইস / প্ল্যাটফর্ম / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / ইনপুট / ইনপুট 10
udevadm_test: PRODUCT = 3 / 62a / 201/110
udevadm_test: NAME = "ইউএসবি-অনুগত কীবোর্ড"
udevadm_test: PHYS = "ইউএসবি-এহিসি-ওম্যাপ.0-2.3 / ইনপুট 1"
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, কে 71,72,73,74,77,77,80,82,83,85,86,88,89,8A, 8 বি, 8 সি, 8E, 8F, 90,96,98,9B, 9c, 9E, 9F, A1 থেকে A3, A4, A5, থেকে A6, A7, A8, A9, এবি, এসি, আদ, ই, B1, B2, B5, সিই, সিএফ, D0, D1, D2 গ্রাহকের, D5, D9, ডিবি, E2, ইএ প্রিন্সিপাল, 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: চালান: 'সকেট: @ / org / ফ্রিডেস্কটপ / হাল / udev_event'
udevadm_test: চালান: 'সকেট: / org / কার্নেল / udev / মনিটর'
udevadm_test: চালান: '/ usr / bin / xmodmap ~ / .pndXmodmap'

যা দেখে মনে হচ্ছে এটি কাজ করা উচিত তবে এটি আশা করে না যে এটি উত্তর পেতে সহায়তা করবে।


উত্তর:


16

আমি এটিকে ঘিরে কাজ করার একটি উপায় খুঁজে পেয়েছি, যদিও এটি সামান্য হ্যাকি।

আমি আজ ঠিক একই জায়গায় পৌঁছে গেছি উদেব, সেটেক্সকব্যাম্যাপ, এবং এক্সপুট - তালিকার সাথে দুটি কীবোর্ড স্থাপন করার এবং তাদের ইউএসবি হটপ্লাগিংয়ের সাথে কাজ করার জন্য। আমি চারদিকে কীগুলি অদলবদল করছি, বিন্যাসটি পরিবর্তন করছি না, তবে এটি হ'ল একবার, আপনি যখন হটপ্লাগে আপনার কীবোর্ড শনাক্ত করেন এবং সেটেক্সকব্যাম্যাপকে সমবেতভাবে কল করতে পারেন, তারপরে আপনার নির্দিষ্ট করা কীবোর্ডের ভাষা সেট করতে সক্ষম হবেন । কীবোর্ড লেআউটগুলির তালিকাটি এখানে পাওয়া যাবে ls -l /usr/share/kbd/keymaps/i386/এবং আপনি নিজের ডিভাইসের নামটি গ্রেড করে দেখতে পারেন xinput -list

  1. আপনি rizumuআপনার ব্যবহারকারীর নামটি দিয়ে প্রতিস্থাপন করতে চাইবেন , কারণ আমি পেয়েছি যে স্পষ্ট না করে এটি করার কোনও উপায় সম্ভব ছিল না।
  2. yourকীবোর্ডের নামটি আপনি গ্রেপ করেছেন তা নিশ্চিত করুন ।
  3. lsusbআপনাকে udev নিয়মে যে হার্ডওয়ার আইডি সেট করতে হবে তা আবিষ্কার করতে ব্যবহার করুন । আমার ডাস কীবোর্ডটি এর মতো দেখাচ্ছেBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.

আমি প্রথমে উদেব বিধিটি তৈরি করেছি যা কীবোর্ডটি স্বয়ংক্রিয়ভাবে পরীক্ষা করার জন্য একটি ইউদেব নিয়ম তৈরি করে:

ফাইলটিতে /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 / বিন / কেবিডি এবং ~ / বিন / কেবিডি_দেব। তাদের সঠিক অনুমতি আছে তা নিশ্চিত করুনchmod 755 ~/bin/kbd*

~/bin/kbd_udevস্ক্রিপ্ট রয়েছে:

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

এবং আপনি লক্ষ্য করবেন যে এটি যা কিছু করে তা ~/bin/kbdপটভূমিতে কল করা, যাতে উদেব তার প্রক্রিয়াটি সম্পূর্ণ করতে এবং কীবোর্ড সক্রিয় করতে পারে activ ~/bin/kbdস্ক্রিপ্টের অভ্যন্তরে আমরা এক সেকেন্ডের জন্য ঘুমাই, কারণ কীবোর্ডটি সক্রিয় হওয়া পর্যন্ত আমাদের অপেক্ষা করতে হবে যাতে আমরা এক্সপুট ব্যবহার করে ডিভাইস আইডি পেতে পারি। এই পটে যাবেন আমি কিছু ভেরিয়েবল সেট এবং তাদের রপ্তানি করেছি যাতে xinput setxkbmap Thier কাজ করতে পারেন: 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

আমার নিজের প্রশ্নের উত্তরটি আমাকে জিজ্ঞাসাবাদ করার জন্য সাহায্য করার জন্য অনেক ধন্যবাদ: জিজ্ঞাসাবাবু
সাদি

এবং আমি অবাক হয়েছি আপনি যদি এই স্ক্রিপ্টের (যেমন 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আপনার "/ হোম / রিজুমু / বিন / কেবিডি" এর সাথে মিলে স্ক্রিপ্ট ব্যবহার করে চালাতে পারছি না । কেন হবে?
জেরেমিয়া

5

আপনার ডিস্ট্রোর উপর নির্ভর করে আপনার ইতিমধ্যে /lib/udev/rules.d/64-xorg-xkb.rules- এ কীবোর্ডগুলির জন্য একটি udev নিয়ম থাকতে পারে। উবুন্টুতে, এটি আমদানি করে / ইত্যাদি / ডিফল্ট / কীবোর্ড, যার প্রায়শই বিকল্প রয়েছে:

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

আমার সেটআপের জন্য, আমি দেখতে পেয়েছি যে এই অন্তর্নির্মিত নিয়মটি আমার কাস্টম উদেব নিয়মের পরে কার্যকর হচ্ছে এবং আমার সেটিংসকে ওভাররাইড করছে। পরিবর্তে আমি XKBOPTIONS কে / ইত্যাদি / ডিফল্ট / কীবোর্ডে পরিবর্তন করেছি:

XKBOPTIONS="-option ctrl:nocaps"

"ক্যাপস লকটি নিয়ন্ত্রণ" আচরণ পেতে আমি সমস্ত কীবোর্ডে চেয়েছিলাম।


2
ভালো বুদ্ধি! খনিটি স্রেফ কাজ করেXBKOPTIONS="ctrl:nocaps"
রাসমুসডাব্লুএল

3

আপনি যদি জিনোম চালাচ্ছেন তবে আপনার কীবোর্ড পরিচালনা প্লাগইনটি অক্ষম করতে হবে যাতে এটি আপনার লেআউট পরিবর্তনগুলি ওভাররাইড না করে।

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

এটি পছন্দসইভাবে সক্ষম করতে আবার একই কমান্ডটি চালান।


আমি অ্যাংস্ট্রোম চালাচ্ছি। এই কাজ করবে?
জেক আইচিসন

আপনি কি জঞ্জালমে জিনোম ব্যবহার করছেন?
Ignacio Vazquez-Abram

না, আমি xfce 4.6.1 ব্যবহার করছি
জেক আইচিসন

1
আমার উবুন্টু 13.04, এই হল dconfঅধীনে /org/gnome/settings-daemon/plugins/keyboard/active
এনএইচ 2

1
এবং উবুন্টু 13.04 এর জন্য আদেশটি হ'ল:gsettings set org.gnome.settings-daemon.plugins.keyboard active false
সাদি

3

এটা কাজের কারণ না udevএবং xmodmapআপনার ব্যবহারে X11 প্রদর্শনে অ্যাক্সেস না থাকে। আসলে, udevএমনকি যদি সেখানে জানে না হয় সক্রিয় ব্যবহারে X11 প্রদর্শন।

  • দ্রষ্টব্য: প্রদর্শন , বহুবচন এটা তোলে করতে পারবে না "" ব্যবহারে X11 প্রদর্শন ব্যবহার করুন কারণ একাধিক হতে পারে। উদাহরণস্বরূপ, আপনি যদি "দ্রুত ব্যবহারকারী স্যুইচিং" ব্যবহার করেন।

তাহলে আমি কীভাবে এই কাজটি করতে পারি?
জ্যাক আইচিসন

আমি জানি কিভাবে আমি এই ঠিক করতে পারি?
জেক আইচিসন

1
আমি সেটেক্সকেব্যাম্যাপ কল করতে উদেব পেয়েছি। উদেব নিয়ম এমন স্ক্রিপ্টকে কল করে যা অন্য স্ক্রিপ্টটির ব্যাকগ্রাউন্ড করে (যাতে উদেব সম্পূর্ণ করতে পারে)। দ্বিতীয় স্ক্রিপ্ট একটি সেকেন্ডের জন্য বিরতি দেয়, প্রত্যাশিত এক্স 11 ভেরিয়েবল সেট আপ করে এবং সেটএক্সবিব্যাপকে ট্রিগার করে। আরও তথ্যের জন্য মূল প্রশ্নের আমার উত্তরটি দেখুন।
থমাস শ্রায়বার

@রিজুমু: আহ, শুভকামনা যদিও এটি জিডিএম নিয়ে কাজ করবে।
মাধ্যাকর্ষণ

3

আমি মনে করি এটির কনফিগার করার অনেক পরিস্কার উপায় পেয়েছি, যার জন্য বিশেষ এক্স 11 হ্যাকের প্রয়োজন নেই।

এর পিছনে ধারণাটি হ'ল udevকেবল নতুন কীবোর্ড ইনপুটটি সনাক্ত করতে এবং প্রতিটি বিন্যাসের জন্য একটি সিমিলিংক তৈরি inotifyকরবে , তারপরে ইউজারস্পেসে নতুন বিন্যাসের সন্ধান করবে।

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/input/by-layoutইউজারস্পেস স্ক্রিপ্টগুলিতে পরিবর্তনগুলি দেখার জন্য আমার কাছে ডেভ ( ) এর অধীনে একটি ডিরেক্টরি রয়েছে ।

কে-ডি-ই-র জন্য ইউজারস্পেস স্ক্রিপ্ট

উদাহরণস্বরূপ, কেডিএ ব্যবহার করার সময় আমার এই স্ক্রিপ্টটি চলছে (স্বয়ংক্রিয়):

#!/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

এক্স.আরগ কনফিগারেশন সম্পর্কে কী? জেন্টু উইকি থেকে : এক্স.আরজি / ইনপুট_ড্রাইভারস - উদেব :

উদাহরণ: আপনার যদি সুইজারল্যান্ডের ফরাসী অংশের জন্য লজিটেক অ্যাক্সেস কীবোর্ড থাকে তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

ফাইল: /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

আর্কউইকি xorg.conf এ একই সিনট্যাক্স ব্যবহার করে দেখিয়েছে তবে উল্লেখ করেছে যে "আজকাল আপনার /etc/X11/xorg.conf.d/90-keyboard-layouts.conf এর মতো একটি আলাদা কনফিগার ফাইল তৈরি করা উচিত"। আমি আর্কটি ব্যবহার করি এবং আমার নিজস্ব ইউএসবি কীবোর্ডটি বিদ্যমান /etc/X11/xorg.conf.d/vim 10-evdev.conf এ আমার জন্য কাজ করেছেন।

@রিজুমু: চতুর কুঁচকে, ভাগ করে নেওয়ার জন্য ধন্যবাদ।


1
আমার লিনাক্স মিন্টে 18.2
ম্যাক্স এন

2

চলমান প্রদর্শন অ্যাক্সেস সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আপনি স্ক্রিপ্টে উপযুক্ত DISPLAY ভেরিয়েবলটি রফতান করতে পারবেন, ধরে নিই যে প্রদর্শনের জন্য অনুমতিগুলি সঠিকভাবে সেট করা আছে। ( man xsetপ্রদর্শন অনুমতি জন্য।)

অনেকগুলি সাধারণ ক্ষেত্রে আপনি কেবল export DISPLAY=:0কমান্ডের জন্য পারেন , কারণ এটি কোনও একক ব্যবহারকারী সিস্টেমে প্রথম প্রদর্শন। সরাসরি এক্সমোডম্যাপের চেয়ে স্ক্রিপ্টটি চালানো সম্ভবত সবচেয়ে সহজ, কারণ এটি আপনাকে পরিবেশের ভেরিয়েবল এবং বাকী অংশগুলির উপর আরও নিয়ন্ত্রণ রাখতে দেয়। (সুতরাং আপনার নিয়মে "/ usr / bin / xmodmap ~ / .usbXmodmap" কে "/usr/local/bin/keyboard_plug.sh" দিয়ে প্রতিস্থাপন করুন এবং ডায়ালপ ভেরিয়েবলের সাথে সেই স্ক্রিপ্টে উপযুক্ত কমান্ডগুলি রেখে দিন))

উপরে উল্লিখিত হিসাবে, যদিও, আপনি যদি DISPLAY =: 0 ধরে নেন তবে আপনার যদি একাধিক ব্যবহারকারী বা ডিসপ্লে থাকে তবে পরে সমস্যা হতে পারে। আপনি উপযুক্ত ডিসপ্লে সনাক্ত করতে স্ক্রিপ্ট লিখতে পারেন, তবে সেক্ষেত্রে আপনি নিজেরাই রয়েছেন (যতদূর এই উত্তরটির সাথে সম্পর্কিত)। :)


1

যেহেতু আমি হ্যাকগুলি উদেব নিয়মগুলি তৈরি করতে পারি না, তাই 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()

আমি তখন এই সিস্টেমড ইউজার ইউনিট ফাইলটি এটি চালিয়ে যেতে ব্যবহার করি ( 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.