মূল লেখায়

উইন্ডোজের জন্য লেআউট সুইচার

আমি লিনাক্স ডেস্কটপে Super+Space শর্টকাট দিয়ে কিবোর্ডের লেআউট ইংরেজি<->বাংলাতে টগল করি। তবে অনেক সময় উইন্ডোজেও কাজ করতে হয়, কিন্তু সেখানে লেআউট পরিবর্তনের জন্য Super+Space (উইন্ডোজের ভাষায় Windows+Space) শর্টকাটটা কাজ লাগানোর সুযোগ নাই।

কিন্তু সুযোগ না থাকলে সুযোগ তৈরি করে নিতে হয়। 😎

উইন্ডোজের বিভিন্ন ধরণের ছোটখাট অটোমেশনের জন্য অটোহটকি নামের একটা পাগলাটে সিনট্যাক্সের স্ক্রিপ্টিং ল্যাংগুয়েজ রয়েছে। এর বিভিন্ন সুবিধার মধ্যে একটা ফিচার হচ্ছে ইচ্ছামত বিভিন্ন শর্টকাটের সাথে স্ক্রিপ্ট অ্যাটাচ করা যায়। অতএব আমার কাজটা খুব সহজ: Windows+Space শর্টকাটটার সঙ্গে এমন একটা স্ক্রিপ্ট জুড়ে দেয়া, যা লেআউট টগল করতে পারে।

তাই আমি সফটওয়্যারটা ডাউনলোড করে windows-layout-switcher.ahk নামে একটা স্ক্রিপ্ট লেখা শুরু করলাম। শর্টকাট ডিফাইন করার সিনট্যাক্সটা এরকম:

hotkey::
  functions to run
Return

অটোহটকি স্ক্রিপ্টে মডিফায়ার কী গুলোর জন্য বিশেষ ক্যারেক্টার বসাতে হয়, যেমন SHIFT এর জন্য +, WINDOWS এর জন্য ^, ইত্যাদি। তাই এই শর্টকাটটা এভাবে ডিফাইন করতে হবে:

^Space::
  layout_switch_function
Return

অটোহটকি অবশ্য আমার প্রয়োজনমত জন্য কোন রেডিমেড ফাংশন সরবরাহ করে না।

একটু রিসার্চ করে জানতে পারলাম উইন্ডোজ নিজেও সরাসরি কোন ফাংশন কল করে না বরং চলমান উইন্ডোগুলিতে লেআউট পরিবর্তনের জন্য একটা বিশেষ মেসেজ বা সিগনাল পাঠায়। মেসেজটা হচ্ছে:

0x0050

😆 আসলে এইরকম একেকটা কোড দিয়েই একেকটা মেসেজ বুঝায়। তবে এরকম কোড মানুষের পক্ষে মুখস্ত রাখা সুখের বিষয় না, তাই এর একটা তুলনামূলক সহজবোধ্য গালভরা ডাকনাম আছে, WM_INPUTLANGCHANGEREQUEST। এই মেসেজের সাথে আবার দুইটা প্যারামিটার থাকে, wParam আর lParam, কোন লেআউট থেকে কোনটায় টগল করতে হবে ইত্যাদি জানানোর জন্য। ওই 0x0050 মেসেজের বর্ণনা পড়ে বুঝলাম wParam0x0002 ভ্যালুটা পাঠিয়ে চক্রাকারে লেআউট পাল্টানো যায়। জটিল ব্যাপার স্যাপার, তবে লক্ষ্যের দিকেই এগুচ্ছি মনে হচ্ছে।

পরে এধরনের মেসেজ পাঠানোর জন্য অটোহটকিতে PostMessage নামের একটা ফাংশন পেয়ে গেলাম যা পুরো কাজটাকেই একদম সোজা করে দেয়। PostMessage এর সিনট্যাক্স জেনে নিয়ে বোঝা গেল আমার স্ক্রিপ্টটা হবে একদম সহজ সরল:

^Space::
  PostMessage, 0x0050, 0x0002,,, A
Return

ব্যাস! এই ছোট্ট স্ক্রিপ্টটা অটোহটকি দিয়ে চালিয়ে দিলেই হয়ে গেল! Super+Space দিয়ে লেআউট সুইচ করতে পারছি উইন্ডোজেও!

আসলে এইটা চালালে কিছুই হবে না, ফট করে বন্ধ হয়ে যাবে, কারণ স্ক্রিপ্টটাকে চলমান থাকতে বলিনি। এ জন্য শুরুতে #Persistent কমান্ডটা যোগ করতে হবে। আর ভুলে স্ক্রিপ্টটা কয়েকবার চালিয়ে ফেললে যাতে লেআউট টগলে পাগলামি শুরু না হয়ে যায়, সেজন্য একে সবসময় সর্বোচ্চ একটা ইনস্ট্যান্স হিসাবে চলতে নির্দেশ দেয়ার জন্য #SingleInstance Force এই কমান্ডটাও যোগ করে দিলাম। তাছাড়া রোবোটের মত অক্টাল হেক্সাডেসিমাল সংখ্যা নিয়ে নাড়াচাড়ার ইচ্ছা নাই, তাই মেসেজ কোডগুলিকে সহজবোধ্য ভ্যারিয়েবল করে নিলাম। আরও কিছু টুকটাক কনফিগারেশন কমান্ডসহ পুরো স্ক্রিপ্টটা দাঁড়ালো এইরকম: একে windows-layout-switcher.ahk নামে সেভ করে অটোহকি এর মূল এক্সিকিউটেবল দিয়ে চালালেই আমার উদ্দেশ্যটা অবশেষে পূরণ হয়ে যাচ্ছে।

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


স্ক্রিপ্টের কিছু দুর্বলতা আছে, যেমন আধুনিক উইন্ডোজে সুপার+স্পেস শর্টকাটটা অন্য কাজের জন্য ডিফাইন করা থাকে, সেক্ষেত্রে সুপার কি আগে চেপে ধরা, স্পেস বার আগে ছেড়ে দেয়া, এ জাতীয় নিখুঁত টাইমিংয়ে প্রেস করতে হয় কখনো কখনো। তবে আমি প্রয়োজন পড়লে উইন্ডোজ সেভেনই চালাই (এখনও!), তাই সমস্যায় না পড়া পর্যন্ত স্ক্রিপ্টের সরলতা নিয়ে চিন্তিত নই।


hmmm… তো দেখা যাচ্ছে প্রধানত লিনাক্স নিয়ে লিখার জন্য ব্লগ খুলে উইন্ডোজ এর বিষয়েই রচনা লেখা শুরু করলাম। 😅