ساخت افزونه برای گنوم

در این مقاله ابتدا ساختار گنوم و قسمت‌های مختلف آن را در راستای توسعه گنوم و افزونه‌‌های آن بررسی می‌‌کنیم و در نهایت به نحوه ایجاد یک افزونه‌ در گنوم می‌‌پردازیم. در مراحل ایجاد یک افزونه‌ با کاربرد قسمت‌های مختلف گنوم مانند GTK+ ،Cairo ،Clutter ،ATK ،Pango ،Webkit و کارایی‌های آن‌ها بیشتر آشنا می‌‌شویم.
نسخه ۳ گنوم یک میزکار جدید را معرفی می‌‌کند. نسخه‌ای ظریف و زیبا، با هدف قادر ساختن کاربران برای انجام کارها با سهولت، راحتی و کنترل. نسخه ۳ تداوم تمرکز پروژه گنوم بر روی فراهم کردن محیط گرافیکی ساده‌ایست که برای تمام افراد قابل استفاده باشد. گنوم میزبان امکانات و تغییرات عمده‌ای است. گنوم هر ۶ ماه یک‌بار منتشر می‌‌شود. با توجه به آمار‌های گذشته از زمان انتشار گنوم ۳.۲، حدودا ۱,۲۷۵ نفر چیزی در حدود ۴۱,۰۰۰ تغییر در Webkit، Pango و کارایی آن‌ها بیشتر آشنا می‌شویم.

بخش‌های محیط گرافیکی
محیط گرافیکی گنوم از چندین بخش تشکیل شده است که در تصاویر زیر قابل مشاهده می‌باشند.


افزونه‌های گنوم ۳
افزونه‌های (extensions) گنوم برای سفارشی کردن گنوم استفاده می‌‌شود، می‌‌توان توسط افزونه‌ها، ظاهر و حتی کارایی قسمت‌های مختلف را تغییر داد، همچنین می‌‌توانیم قسمت‌های جدیدی را ایجاد نماییم.
می‌توانیـــد از آدرس https://extensions.gnome.org افزونه‌‌های گنوم را مشاهده و نصب نمایید و به طور مثال می‌‌توانیم توسط افزونه‌ Persian calendar از تقویم شمسی در محیط گنوم استفاده کنیم.

توسعه گنوم ۳ و نوشتن افزونه‌ها
راه‌های مختلفی برای ایجاد یک افزونه‌ وجود دارد، یک راه ساده استفاده از دستور زیر است:

gnome-shell-extension-tool --create-extension

بعد از وارد کردن این دستور، اطلاعات نام، توضیح و نام منحصر به فرد (uuid) دریافت می‌‌شود و فایل‌های مورد نیاز را در آدرس زیر که محل قرار گیری افزونه‌ها است، به صورت خودکار ایجاد می‌‌گردد.

~/.local/share/gnome-shell/extensions


فایل‌های موجود در شاخه ساخته شده به صورت زیر است:

  • extension.js: توابع و دستورات اصلی هر افزونه
  • metadata.js: مشخصات افزونه
  • stylesheet.css: اطلاعات ظاهر (توسط CSS)

فایل‌ها در پوشه‌ای با همان نامی که در uuid وارد شده ساخته می‌‌شود.
افزونه ساخته شده شامل مثال ساده‌ Hello word است.
بعد از ساخت افزونه، حالا باید افزونه را فعال کنیم، ابتدا برای مشاهده افزونه‌های فعال از دستور زیر استفاده می‌‌کنیم:

gsettings get org.gnome.shell enabled-extensions

در ادامه برای فعال کردن یک افزونه می‌‌توانیم از دستور زیر استفاده کنیم و نام UUID را در قسمت مربوطه قرار دهیم:

gsettings set org.gnome.shell enabled-extensions '["your_uuid@goes.here.example.com"]'

به طور مثال:

gsettings set org.gnome.shell enabled-extensions '["hello-word@hydrogenws.com"]'

البته برای فعال کردن و مدیریت افزونه‌‌ها راه‌‌های دیگری مانند استفاده از نرم‌افزار Tweak tool یا پیوند https://extensions.gnome.org/local نیز هست.
با فعال شدن افزونه مورد نظر، باید گنوم را نیز Restart کنیم، برای اینکار می‌‌توانیم کلید Alt+F2 را بزنیم و در پنجره باز شده کاراکتر R را وارد نماییم تا گنوم ری‌استارت شود.
با مراحل یاد شده، افزونه‌ ساده‌ hello-word ساخته می‌‌شود و می‌‌توانیم توسط آیکن چرخ‌دهنده که در System status ایجاد شده، آن را اجرا کنیم.

اجزای توسعه در گنوم
گنوم ۳ از اجزای مختلف که به زبان جاوا‌اسکریپت نوشته شده است برای اجرا و انجام برنامه‌ها استفاده می‌‌کند، که در تصویر زیر بیشتر آن‌ها نشان داده شده است.


تصویر فوق اجزای مختلف را نمایش می‌‌دهد که هر کدام در کجا‌ها استفاده می‌‌شود ولی قسمت‌های دیگری نیز وجود درد که گنوم از آن‌ها برای برنامه‌های مختلف استفاده می‌کند.

Graphics and Multimedia

  • +GTK: ابزار‌های ایجاد رابط گرافیکی
  • Clutter: گرافیک و پویانمایی با رابط API
  • WebKit: از HTML5 تشکیل شده است (از HTML5 قدرت گرفته است)، و اجزا وب را تشکیل می‌‌دهد.
  • Gstreamer: سازنده و پخش‌کننده صوت و تصویر و دیگر رسانه‌ها
  • GUPnP: رابط و ابزار‌های کار با UPnP framework که برای محیط‌های گرافیکی استفاده می‌‌شود.

Core Application Support

  • GIO Files: دریافت‌کننده اطلاعات فایل‌ها و آدرس‌ها و دسترسی‌ها
  • GIO Networking: از GIO stream classes ساخته شده و برای شبکه استفاده می‌‌شود.
  • D-Bus: استاندار استفاده از D-Bus، کنترل‌کننده D-Bus

Application Technologies:

  • Canberra: رابط کنترل‌کننده صوتی برای پیغام‌ها و رویداد‌ها
  • (notifications and events)
  • Evolution Data Server: هماهنگ‌سازی آدرس‌ها و تقویم‌ها
  • GDA: رابط ارتباط با پایگا‌ه‌های داده
  • Help: راهنما سیستمی گنوم که بر اساس Topic-oriented است.
  • Keyring: نگهدانده گذرواژه‌ها و اطلاعات امنیتی
  • Notify: ارتباط و ارسال پیغام به قسمت اعلام پیغام‌های گنوم
  • Telepathy: ارتباط‌های real-time را انجام می‌‌دهد.
  • Under the Hood
  • ATK: پشتیبانی و کنترل screen و برنامه‌های در دسترس کاربر
  • Pango: کنترل و سازنده (render) لایه متن‌ها
  • Cairo: کنترل‌کننده vectorها و بخش‌های دو بعدی

GDK: کنترل پنجره‌های‌ اصلی
این‌ها بخشی از اجزای گنوم جهت توسعه بودند که برای برنامه‌های مختلف استفاده می‌‌شوند، برای توسعه گنوم و نوشتن افزونه‌‌ها باید از چنین قسمت‌هایی استفاده کرد که در بخش‌های بعدی این مقاله توضیح داده می‌‌شود.

API
برای کار با API به دلیل مستندات ناقص، بهترین راه مشاهده کد‌ها است. با توجه به در حال توسعه بودن گنوم، مستندات کاملی وجود ندارد و معمولا مشاهده کد‌ها پیشنهاد شده است.
تجربه شخصی توسعه‌دهنده‌های افزونه‌های گنوم هم مشاهده کد‌های افزونه‌های دیگر و پایه‌ای سیستم جهت توسعه هست.
البته توسط نمودار‌های زیر می‌‌توانید کلاس‌ها، اشیا‌ء و اجزا توسعه را مشاهده و درک کنید تا در توسعه از آن استفاده کنید.
به طور مثال در تصویر زیر می‌توانید محل قرارگیری Button و Label را جهت استفاده مشاهده کنید.


در تصویر زیر overview و work spaceها را مشاهده می‌کنید.


همچنین تصویر زیر نیز جهت استفاده از Messageها است.

افزونه اطلاع‌رسانی سلام دنیا
در این قسمت افزونه‌ای که در ابتدا مقاله ساختیم را به افزونه‌ای برای اطلاع‌رسانی مجله‌های جدید سلام دنیا تبدیل می‌‌نماییم.
متن (source) کامل افزونه مورد نظر را می‌‌توانید از این پیوند زیر دریافت کنید، این افزونه فقط جهت آشنایی شما با کدنویسی افزونه‌‌ها ساخته شده و شما می‌‌توانید آن را توسعه دهید.
برای مثال یکی از قسمت‌های اصلی این افزونه‌ ارتباط با سایت سلام دنیا هست که مانند کد زیر یک تابع برای گرفتن json می‌‌نویسم و آن فانکشن را در تابع init توسط connect به button اضافه می‌‌کنیم.

function getData() {
let message = Soup.Message.new("GET", url);
httpSession.queue_message(
message,
function (session, message) {
callback(message.status_code, message.response_body.data);
}
);
}

در ادامه باید json که از سایت می‌‌گیریم را بررسی و آخرین شماره مجله را پیدا و نمایش دهیم. توسط تابع callback که داخل کد بالا آن را استفاده کردیم json را دریافت و آن را نمایش می‌‌دهیم.

function callback(status, data) {
let msg;
if (status == 200) {
let dataObj = JSON.parse(data);
let id = format( dataObj[dataObj.length - 1].id.toString() );
let url = dataObj[dataObj.length - 1].url.toString();
msg = "شماره " + id + " مجله سلام دنیا برای دریافت آماده هست";
msg += "\n";
msg += "پیوند دریافت: " + url;
}
else {
msg = status;
}