কনটেন্টে যান

শেল প্লাগিন

OmarOS ডেস্কটপটি omaros-shell নামের একটি একক দীর্ঘজীবী Quickshell প্রসেস হিসেবে চলে, এবং আপনি স্ক্রিনে যা দেখেন তার প্রায় সবই এর ভেতরে একটি প্লাগিন। বারটি একটি প্লাগিন। তা-ই তার থেকে নিচে নামা প্যানেলগুলো, ইমোজি পিকার ও ক্লিপবোর্ড ম্যানেজারের মতো পূর্ণস্ক্রিন ওভারলে, OmarOS মেনু নিজে, লক স্ক্রিন, polkit ডায়ালগ এবং আপনার ব্যাটারির দিকে নজর রাখা ও রাতে আপনার স্ক্রিন উষ্ণ করা হেডলেস পরিষেবাগুলো।

এটি শুধু কোনো বাস্তবায়নের খুঁটিনাটি নয়। এর মানে হলো আপনি OmarOS-এর সোর্সের একটি লাইনও না ছুঁয়েই ডেস্কটপের অংশগুলো বন্ধ করে দিতে, সেগুলো বদলে দিতে অথবা নিজেরটা লিখতে পারেন।

প্রথম-পক্ষের প্লাগিনগুলো OmarOS-এর সঙ্গে আসে এবং $OMAROS_PATH/shell/plugins/-এ থাকে। আপনি নিজে যা যোগ করেন — আপনার নিজের পরীক্ষা-নিরীক্ষা, অথবা GitHub-এ পাওয়া কিছু — তা ~/.config/omaros/plugins/-এ থাকে। দুটোই চালুর সময় একইভাবে আবিষ্কৃত হয়, তবে অন্তর্নির্মিতগুলো বিশ্বস্ত শেল ইন্টারফেস পায় আর তৃতীয়-পক্ষের প্লাগিনগুলো তাদের নিজের পরিষেবা ও জীবনচক্রে সীমাবদ্ধ একটি সীমিত ইন্টারফেস পায়। অন্তর্নির্মিতগুলোর ক্লোন আসল আচরণের জন্য প্রয়োজনীয় উৎস-নির্দিষ্ট কনফিগারেশন ও UI কলগুলোই শুধু রাখে।

আপনার কাছে কী আছে তা দেখা

omaros plugin list

এটি আবিষ্কৃত প্রতিটি প্লাগিন তার আইডি, সেটি সক্রিয় কিনা, এটি প্রথম-পক্ষের নাকি তৃতীয়-পক্ষের, এর ধরনগুলো এবং এর প্রদর্শিত নামসহ ছাপে। আপনি এটি অন্য কিছুকে খাওয়াতে চাইলে --json যোগ করুন।

প্লাগিন আইডিগুলো নেমস্পেসযুক্ত। অন্তর্নির্মিতগুলো সব omaros. দিয়ে শুরু হয় — omaros.clock, omaros.network, omaros.notifications — এবং সেই নেমস্পেসটি সংরক্ষিত, ফলে তৃতীয়-পক্ষের কোনো প্লাগিন কখনও তা দাবি করতে পারে না।

সেগুলো চালু ও বন্ধ করা

omaros plugin enable omaros.tailscale
omaros plugin disable omaros.weather

অথবা মেনু ব্যবহার করুন: সেটআপ > Plugins-এ Enable, Disable, Add, Clone এবং Remove আছে, যার প্রতিটির একটি পিকার আছে যা শুধু সেই কাজের জন্য যুক্তিসংগত প্লাগিনগুলোই দেয়।

সক্রিয় অবস্থা ~/.config/omaros/shell.json-এ সংরক্ষিত থাকে, এবং দুই ধরনের প্লাগিনের জন্য নিয়মটি সামান্য আলাদা। একটি তৃতীয়-পক্ষের প্লাগিন ঠিক তখনই সক্রিয় থাকে যখন তার আইডি সেই ফাইলের কোথাও দেখা যায় — একটি বারের লেআউট এন্ট্রি হিসেবে, plugins[]-এ একটি এন্ট্রি হিসেবে, অথবা bar.id হিসেবে। বার উইজেট নয় এমন প্রথম-পক্ষের প্লাগিনগুলো উল্টোটা: তারা ডিফল্টভাবে চালু থাকে এবং শুধু disabledPlugins[]-এ তালিকাভুক্ত হলেই বন্ধ হয়।

একটি পূর্ণ বার প্লাগিনের কোনো বন্ধ অবস্থাই নেই। সবসময় ঠিক একটিই বার থাকে, ফলে আপনি অন্য একটি সক্রিয় করেই এটিকে বদলান। বার উইজেটের placement উপরের বার-এ আলোচনা করা হয়েছে।

git থেকে একটি প্লাগিন যোগ করা

একটি তৃতীয়-পক্ষের প্লাগিন হলো শুধু একটি git রিপো যার রুটে একটি manifest.json আছে।

omaros plugin add https://github.com/acme/omaros-weather.git --enable

এটি কিছু করার আগে, এটি আপনাকে স্পষ্টভাবে বলে যে প্লাগিনগুলো আপনার দীর্ঘজীবী শেল প্রসেসের ভেতরে নির্বিচার, স্যান্ডবক্সবিহীন কোড হিসেবে চলে, আপনাকে URLটি দেখায় এবং নিশ্চিত করতে বলে। এটিকে গুরুত্ব দিন। তৃতীয়-পক্ষের প্লাগিন ইন্টারফেসটি সরাসরি প্রমাণীকরণ পরিষেবাগুলো উন্মুক্ত করে না, এবং একটি বিকল্প বার শুধু কনফিগার করা অ-প্রমাণীকরণ UI-এর জন্য সীমিত সক্ষমতা পায়। দৃশ্যমান প্লাগিনগুলো এখনও শেলের QML দৃশ্যটি ভাগ করে এবং সাধারণ প্যারেন্ট অবজেক্টগুলো ঘুরে দেখতে পারে, আর সব প্লাগিন কোড আপনার ব্যবহারকারী অ্যাকাউন্ট যা কিছুতে পৌঁছতে পারে সবসহ চলে। সেই পরিষেবাগুলোকে পৌঁছনোযোগ্য হোস্ট অবজেক্ট গ্রাফের বাইরে রেখে প্রমাণীকরণ অবস্থা আলাদাভাবে সুরক্ষিত থাকে। শুধু এমন রিপোই যোগ করুন যেগুলো আপনি চালাতে রাজি, এবং সেগুলো সক্রিয় করার আগে পড়ে নিন।

একটি বিকল্প বার ইনস্টল করা উইজেটগুলো রেন্ডার করতে পারে, তবে পরিষেবা-সমর্থিত তৃতীয়-পক্ষের উইজেটগুলোর সেখানে কার্যকারিতা হ্রাস পেতে পারে কারণ বারটিকে অন্য প্লাগিনের লাইভ পরিষেবা অবজেক্টের জন্য অনুরোধ করার অনুমতি দেওয়া হয় না। এমন কোনো উইজেটের তার সঙ্গী পরিষেবাটির প্রয়োজন হলে অন্তর্নির্মিত omaros.bar-এ ফিরে যান।

তারপর এটি রিপোটিকে একটি স্টেজিং ডিরেক্টরিতে ক্লোন করে, ম্যানিফেস্টটি যাচাই করে, অন্য কোনো প্লাগিন ইতিমধ্যে সেই আইডি দাবি করে থাকলে ইনস্টলটি প্রত্যাখ্যান করে, এবং এটিকে ~/.config/omaros/plugins/<id>/-তে সরিয়ে নেয়। --enable ছাড়া এটি জিজ্ঞেস করে আপনি এখনই এটি চালু চান কিনা, এবং আপনি না বলে আগে গিয়ে কোডটি পড়ে আসতে পারেন। এটি প্লাগিন থেকে কখনও কিছু চালায় না, কখনও কোনো ইনস্টল হুক চালায় না এবং কখনও sudo চায় না — এটি ফাইল ক্লোন করে, ম্যানিফেস্ট যাচাই করে এবং IPC-এর মাধ্যমে একটি বিট বদলে দেয়।

আপডেট করা হলো সেই একই চেকআউটটির একটি ফাস্ট-ফরোয়ার্ড পুল:

omaros plugin update acme.weather
omaros plugin update

কোনো আইডি ছাড়া এটি আপনার প্রতিটি git-পরিচালিত প্লাগিন আপডেট করে। এটি প্রয়োগ করার আগে আপনাকে diffটি দেখায়, আপনার এগিয়ে যাওয়া যায় না এমন স্থানীয় বদল থাকলে আপডেট করতে অস্বীকার করে, এবং নতুন সংস্করণটি যাচাইয়ে ব্যর্থ হলে ফিরিয়ে নেয়।

omaros plugin remove acme.weather

সরানোর মাধ্যমে প্রথমে প্লাগিনটি নিষ্ক্রিয় করা হয়, তারপর এটি একটি git চেকআউট হলে মুছে ফেলা হয় (রিপোটি এখনও আপস্ট্রিমে আছে) অথবা এটি একটি সিমলিংক হলে আনলিংক করা হয়। কোনো git রিপো ছাড়া হাতে বানানো প্লাগিন ফোল্ডার সরাসরি মুছে ফেলার পরিবর্তে প্লাগিন ডিরেক্টরির ভেতরে একটি সময়-স্ট্যাম্পযুক্ত ব্যাকআপে সরিয়ে নেওয়া হয়।

বদল করতে একটি অন্তর্নির্মিত ক্লোন করা

এটি আমার প্রিয় অংশ। আপনি কোনো অন্তর্নির্মিত উইজেটের আচরণ বদলাতে চাইলে, $OMAROS_PATH-এর অধীনে ফাইলগুলো সম্পাদনা করবেন না — সেগুলো প্যাকেজের এবং পরের আপডেটে সেগুলো উপর দিয়ে লেখা হবে। এর পরিবর্তে এটিকে ক্লোন করুন:

omaros plugin clone omaros.clock

এটি পুরো প্লাগিনটিকে ~/.config/omaros/plugins/omar.clock-এ কপি করে (আপনার ব্যবহারকারীর নাম, আমার নয়), এটিকে "My Clock" নাম দেয়, এটিকে সক্রিয় করে, এবং শেলটিকে অন্তর্নির্মিতটি থেকে আপনার কপিটিতে নিয়ে যায় — একটি বিদ্যমান বার উইজেটের অবস্থান ও সেটিং রেখে। নতুন ডিরেক্টরিটি সঙ্গে সঙ্গে আপনার $EDITOR-এ খুলতে --edit যোগ করুন, যা মেনুর সেটআপ > Plugins > Clone Plugin আপনার জন্য করে।

ব্যবহারকারীর নামের প্রিফিক্সটি আপনার ক্লোনের আইডিটিকে আপনারই রাখে, ফলে এটি ভাগ করলে অন্য কারওটির সঙ্গে সংঘর্ষ হয় না। আসল অন্তর্নির্মিত আইডিতে করা কলগুলো আপনার ক্লোনে পাঠিয়ে দেওয়া হয়, ফলে যা কিছু omaros.clock-এর কথা বলেছিল তার কোনোটিরই আপডেটের প্রয়োজন নেই। আর আপনি এটি এলোমেলো করে ফেললে, omaros plugin remove omar.clock অন্তর্নির্মিতটিকে ফিরিয়ে আনে।

~/.config/omaros/plugins/-এর অধীনে কোথাও একটি ফাইল সংরক্ষণ করলে প্লাগিন কোডটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হয়, ফলে আপনি এডিটরটি খোলা রেখে আপনার বদলগুলো কার্যকর হতে দেখতে পারেন।

নিজেরটা লেখা

একটি প্লাগিন হলো একটি manifest.json এবং কিছু QML সহ একটি ডিরেক্টরি। ম্যানিফেস্টটি schemaVersion: 1, একটি id, name, version, এক বা একাধিক kinds, এবং প্রতিটি ধরনের জন্য QML ফাইলটির দিকে নির্দেশ করা একটি entryPoints অবজেক্ট ঘোষণা করে:

Kind What it is
bar-widget এমন একটি উপাদান যা সক্রিয় বার কোনো বিভাগে বসাতে পারে
panel একটি স্থায়ী বা ডাকা ভাসমান উইন্ডো
overlay একটি পূর্ণস্ক্রিন ওভারলে
menu একটি ডাকা মেনু পৃষ্ঠ
service কোনো UI ছাড়া একটি হেডলেস সিঙ্গলটন
bar একটি পূর্ণ বার যা অন্তর্নির্মিতটিকে বদলে দেয়

একটি প্লাগিন একসঙ্গে কয়েকটি ধরন ঘোষণা করতে পারে — মিডিয়া প্লাগিনটি একই সঙ্গে একটি service এবং একটি bar-widget। বার উইজেটগুলো একটি অতিরিক্ত barWidget ব্লক পায় যাতে একটি প্রদর্শিত নাম, একটি বিভাগ, একটি ঐচ্ছিক defaultSection এবং allowMultiple থাকে, যা বলে বারে একাধিক থাকাটা যুক্তিসংগত কিনা। বেশিরভাগ উইজেট এটিকে false সেট করে; স্পেসার ও সূচকগুলো এটিকে true সেট করে।

কিছু প্রকাশ করার আগে, এটি যাচাই করুন:

omaros plugin validate ./my-plugin

এটি লোডের সময় শেল যেসব যাচাই চালায় সেগুলোই চালায়: স্কিমার সংস্করণ, আবশ্যিক ক্ষেত্রগুলো, সংরক্ষিত নয় এমন একটি আইডি, নিরাপদ আপেক্ষিক পাথ এবং আসলে বিদ্যমান এন্ট্রি পয়েন্ট, আপনি দাবি করা প্রতিটি ধরনের জন্য একটি এন্ট্রি পয়েন্ট এবং ফোল্ডারের ভেতরে কোথাও কোনো সিমলিংক না থাকা।

প্লাগিন ডেভেলপমেন্টের জন্য, শেল রেফারেন্স এবং প্রথম-পক্ষের প্লাগিন ক্যাটালগ দেখুন।

নিজেরটা বিশ্বের সঙ্গে ভাগ করা

আপনি পছন্দ করেন এমন কিছু বানিয়ে ফেললে, এটিকে একটি পাবলিক git রিপোতে রাখুন। এটাই পুরো বিতরণ ব্যবস্থা — তখন যে কেউ আপনার URL-এর বিপরীতে omaros plugin add চালিয়ে কয়েক সেকেন্ডেই এটি চালু করে ফেলতে পারে।