作者:admin 日期:2023-09-10 瀏覽: 次
優(yōu)麒麟 Linux 發(fā)布任務(wù)欄新版托盤(pán)協(xié)議
IT之家 7 月 29 日消息 優(yōu)麒麟官方今天帶來(lái)了任務(wù)欄新版托盤(pán)協(xié)議(SNI)介紹。
在 Linux 操作系統(tǒng)中,“系統(tǒng)托盤(pán)區(qū)域”是在給定的 X 屏幕上運(yùn)行的應(yīng)用程序,可以顯示正在運(yùn)行的應(yīng)用程序提供的小圖標(biāo)。系統(tǒng)托盤(pán)是一個(gè) X 客戶(hù)端,在給定的屏幕上擁有一個(gè)特殊的管理器選擇并提供了容器窗口。Windows 將此功能稱(chēng)為“通知區(qū)域”,舊版托盤(pán)協(xié)議就是通過(guò) X 服務(wù)直接獲取應(yīng)用信息,在開(kāi)發(fā)上難度很大。
新版托盤(pán)規(guī)范定義了可視項(xiàng)的管理,通常是用于向用戶(hù)報(bào)告應(yīng)用程序狀態(tài)或提供對(duì)該應(yīng)用程序執(zhí)行的常見(jiàn)操作的快速訪(fǎng)問(wèn)的圖標(biāo)。它旨在作為 Freedesktop 的桌面通知規(guī)范的補(bǔ)充但不直接相關(guān),旨在替代 Freedesktop 系統(tǒng)托盤(pán)規(guī)范,更加面向模型視圖,為工作區(qū)提供更多自由,如何以圖形方式表示與它的視覺(jué)風(fēng)格語(yǔ)言,這種方式(SNI)是將 systemtray 的調(diào)用封裝進(jìn) dbus 總線(xiàn)中,提升了開(kāi)發(fā)者的開(kāi)發(fā)效率。
從用戶(hù)角度來(lái)看新版托盤(pán)協(xié)議(SNI)從表面上看不出有什么太大的變化,在開(kāi)發(fā)的角度上是將最上層的應(yīng)用與下層基礎(chǔ)庫(kù)的分離。
新版托盤(pán)協(xié)議主要是通過(guò)三個(gè)庫(kù)來(lái)實(shí)現(xiàn)的:
dbusmenu 是實(shí)現(xiàn)應(yīng)用程序和面板(#5)之間傳輸協(xié)議的庫(kù)。dbusmenu 已經(jīng)被用于開(kāi)發(fā)會(huì)話(huà)菜單,并且也是在 Lucid 中實(shí)現(xiàn)一些新系統(tǒng)菜單的構(gòu)建塊。
indicator-applet 是將托管應(yīng)用程序指示器區(qū)域的面板小程序。指示器小程序是作為消息菜單項(xiàng)目的一部分開(kāi)發(fā)的,旨在成為面板指示器的通用容器 。libappindicator 是一個(gè)新的庫(kù),用于幫助應(yīng)用程序端更改;它確實(shí)注冊(cè)了圖標(biāo)和菜單,并在內(nèi)部使用 dbusmenu 通過(guò) dbus 發(fā)布上下文菜單。雖然它是 Gnome 桌面的新庫(kù),但它基于在 KDE 項(xiàng)目中設(shè)計(jì)的用于更新系統(tǒng)托盤(pán)協(xié)議的協(xié)議(上面的“信令協(xié)議”部分)。libappindicator 采用并擴(kuò)展了該協(xié)議,并將其與 dbusmenu 連接以提供應(yīng)用程序遷移其代碼所需的全套服務(wù) 。
3.1 托盤(pán)應(yīng)用托盤(pán)封裝
通過(guò) dbusmenu,indicator-applet,libappindicator 將托盤(pán)應(yīng)用的屬性,方法,以及信號(hào)注冊(cè)到 dbus 總線(xiàn)上,在任務(wù)欄上進(jìn)行 dbus 監(jiān)聽(tīng)解析來(lái)實(shí)現(xiàn)與托盤(pán)應(yīng)用交互。
注冊(cè) item 的方法有:
屬性有:
信號(hào)有:
3.2 注冊(cè) dbus 服務(wù)
當(dāng)拿到了托盤(pán)應(yīng)用的信息然后就需要對(duì)信息進(jìn)行封裝通過(guò) dbus 的方式發(fā)送給任務(wù)欄,在任務(wù)欄上會(huì)注冊(cè)一個(gè) statusnotifierWatcher 的服務(wù)用來(lái)檢測(cè)托盤(pán)信息的,每當(dāng)托盤(pán)應(yīng)用打開(kāi)的時(shí)候都會(huì)調(diào)用 statusnotifierWatcher 的
RegisterStatusNotifierItem 方法在任務(wù)欄的托盤(pán)區(qū)域進(jìn)行按鈕的注冊(cè),當(dāng)托盤(pán)應(yīng)用關(guān)閉的時(shí)候會(huì)調(diào)用任務(wù)欄
unRegisterStatusNotifierItem 方法來(lái)取消在任務(wù)欄上的注冊(cè)。
3.3 調(diào)用 dbus 的方法
當(dāng)用戶(hù)對(duì)托盤(pán)應(yīng)用進(jìn)行操作的時(shí)候,會(huì)調(diào)用相應(yīng) dbus 方法,并激活相關(guān)事件。例如左鍵點(diǎn)擊會(huì)觸發(fā)“激活窗口”的事件,右鍵單擊會(huì)觸發(fā)“顯示右鍵菜單”的事件,懸浮會(huì)觸發(fā)“顯示提示語(yǔ)”的事件
4.1 注冊(cè) statusnotifierHost 的 dbus
在一個(gè)桌面上為了防止托盤(pán)應(yīng)用會(huì)在多個(gè)地方注冊(cè)成托盤(pán),用一個(gè) dbus 來(lái)讓托盤(pán)應(yīng)用只能注冊(cè)到一個(gè)托盤(pán)來(lái)確保不會(huì)出現(xiàn)功能上不穩(wěn)定。
4.2 注冊(cè) statusnotifierWatch 的 dbus
用來(lái)檢測(cè)托盤(pán)應(yīng)用的打開(kāi)和關(guān)閉,statusnotifierWatch 的
RegisterStatusNotifierItem 和
棲霞數(shù)據(jù)恢復(fù)unRegisterStatusNotifierItem 是協(xié)議層與應(yīng)用層來(lái)進(jìn)行交互的信號(hào),通過(guò)
RegisterStatusNotifierItem 方法來(lái)獲取應(yīng)用注冊(cè)的 dbus 的服務(wù)名。
4.3 對(duì)托盤(pán)應(yīng)用的 dbus 進(jìn)行調(diào)用
上文說(shuō)的鼠標(biāo)事件點(diǎn)擊調(diào)用槽函數(shù)是一部分,還可以監(jiān)聽(tīng)托盤(pán)應(yīng)用的 signal 如圖標(biāo)變換,提示信息變化等。如果需要托盤(pán)應(yīng)用的窗口以及其他屬性,還可以通過(guò) dbus 來(lái)獲取 properties。
4.4 在優(yōu)麒麟桌面環(huán)境下使用
Qt 應(yīng)用程序可以在自己的應(yīng)用程序里創(chuàng)建一個(gè) QSystemtrayIcon 類(lèi),并為這個(gè)類(lèi)似設(shè)置圖標(biāo)和事件槽函數(shù),在任務(wù)欄上會(huì)自動(dòng)生成托盤(pán)圖標(biāo)。
Gtk 程序通過(guò)
泰州數(shù)據(jù)恢復(fù)來(lái)注冊(cè)應(yīng)用為托盤(pán)應(yīng)用,即可實(shí)現(xiàn)在任務(wù)欄上顯示托盤(pán)圖標(biāo)。
5.1 在 dbus 調(diào)用的時(shí)候可能會(huì)出現(xiàn)延時(shí),必要的話(huà)可以考慮多線(xiàn)程處理,避免界面阻塞。