প্রচুর পরিশ্রমের পরে, আমি এখনকার জন্য এটি চালিয়ে যাচ্ছি। হয়তো আমি প্রকারের একটি সম্পূর্ণ নিবন্ধ লিখব এবং কোডটি একটি সংগ্রহস্থলের মধ্যে প্রকাশ করব, যদি এটি আগ্রহী হয়।
উদেবের জন্য একটি নতুন নিয়ম সেট আপ করুন:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
নিয়মটি শেল স্ক্রিপ্ট কল করার কথা যখনই দেওয়া হয় যখনই কোনও ডিভাইস বিক্রেতার এবং পণ্য আইডির সংমিশ্রণ সহ কোনও ক্রিয়াকলাপ শুরু করে।
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
নতুন বিধি সেট যোগ করার পরে, উদেব পরিষেবাটি পুনরায় চালু করুন:
sudo service udev restart
দ্রষ্টব্য: আমি সেই ফাইলে আরও নির্দিষ্ট মেলানো নিয়ম সরবরাহ করে নির্ভরযোগ্য ফলাফল অর্জন করতে সক্ষম হইনি। সর্বাধিক উল্লেখযোগ্যভাবে, একটি ACTION
মেলানো নিয়ম যুক্ত করা কার্যকর হয়নি। আমি যতদূর বলতে পারি, স্ক্রিপ্টটি যাইহোক শুরু হয়েছিল। যুক্ত করার সময়ACTION=="add"
, স্ক্রিপ্টটি তখনও ডিভাইসটি সরিয়ে নেওয়ার জন্য ডাকা হত। খুব অদ্ভুত এবং বিভ্রান্তিকর।
তবে যে পদক্ষেপটি উদেব নিয়মকে ট্রিগার করেছিল তা নীচের চিত্রের মতো কথিত স্ক্রিপ্টে উপলব্ধ হবে।
পরবর্তী, লিপি নিজেই। ভাল, বেশ না। wrapper
ফাইলের প্রত্যয়টি নোট করুন । এটি ইঙ্গিত দেয় যে এটি আসল স্ক্রিপ্ট নয় বরং একটি মোড়ক যা স্ক্রিপ্টটি কল করে এবং পটভূমিতে এটি কার্যকর করে যাতে উদেব তার প্রক্রিয়াটি শেষ করতে পারে।
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
ভেরিয়েবলটিতে ACTION
udev ক্রিয়া রয়েছে যা ডিভাইস দ্বারা ট্রিগার হয়েছিল। এটি add
(ডিভাইসটি প্লাগ ইন করা হয়েছিল) এবং remove
(ডিভাইসটি সরানো হয়েছিল ) এর মতো মান দেয় yield আমরা এগুলি পরে ব্যবহার করব।
~/.bin/switch-kb-layout.sh
:
#!/bin/sh
sleep 1
# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
udev_action=$1
log_file="$HOME/switch-kb-layout.log"
if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
echo "Other action. Aborting." >> $log_file
exit 1
fi
internal_kb_layout="de"
internal_kb_variant=""
external_kb_layout="us"
external_kb_variant="altgr-intl"
kb_layout=""
kb_variant=""
if [ "${udev_action}" = "add" ]; then
kb_layout=$external_kb_layout
kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
kb_layout=$internal_kb_layout
kb_variant=$internal_kb_variant
fi
setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
setxkbmap -variant "${kb_variant}"
echo "set variant:" "$kb_variant" >> $log_file
fi
HOME
ভেরিয়েবল সেট করার সময় আমার ব্যবহারকারীর $(whoami)
নামটি আপনার সাথে প্রতিস্থাপন করুন ( এখানে কাজ করবে না, কারণ এটি আপনার ব্যবহারকারীর মাধ্যমে নয় তবে ডাকা হবে root
)।
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
পরীক্ষার উদ্দেশ্যে, আমি কিছু লাইন যুক্ত করেছি যা আমার হোম ডিরেক্টরিতে কোনও ফাইলে নির্দিষ্ট ইভেন্টগুলিতে লগ করে যা কিছু কাজ করে কিনা তা দেখতে। আপনি এগুলি নিরাপদে মুছে ফেলতে পারেন।
অবশেষে, এই স্ক্রিপ্টগুলির কার্যকর করার অনুমতি থাকা দরকার। এছাড়াও এটি উল্লেখ করা গুরুত্বপূর্ণ যে এই স্ক্রিপ্টগুলি root
ব্যবহারকারী দ্বারা ডাকা হবে , সুতরাং সেখানে কী করছেন সে সম্পর্কে সতর্কতা অবলম্বন করুন।
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh