<s id="pw6rw"><strike id="pw6rw"><input id="pw6rw"></input></strike></s>
  1. <rp id="pw6rw"></rp>
    首頁>IT > 正文

    優麒麟 Linux正式發布任務欄新版托盤協議

    2021-07-30 09:12:58來源:

    優麒麟官方今天帶來了任務欄新版托盤協議(SNI)介紹。

    在 Linux 操作系統中,“系統托盤區域”是在給定的 X 屏幕上運行的應用程序,可以顯示正在運行的應用程序提供的小圖標。系統托盤是一個 X 客戶端,在給定的屏幕上擁有一個特殊的管理器選擇并提供了容器窗口。Windows 將此功能稱為“通知區域”,舊版托盤協議就是通過 X 服務直接獲取應用信息,在開發上難度很大。

    新版托盤規范定義了可視項的管理,通常是用于向用戶報告應用程序狀態或提供對該應用程序執行的常見操作的快速訪問的圖標。它旨在作為 Freedesktop 的桌面通知規范的補充但不直接相關,旨在替代 Freedesktop 系統托盤規范,更加面向模型視圖,為工作區提供更多自由,如何以圖形方式表示與它的視覺風格語言,這種方式(SNI)是將 systemtray 的調用封裝進 dbus 總線中,提升了開發者的開發效率。

    從用戶角度來看新版托盤協議(SNI)從表面上看不出有什么太大的變化,在開發的角度上是將最上層的應用與下層基礎庫的分離。

    實現方式

    新版托盤協議主要是通過三個庫來實現的:

    dbusmenu 是實現應用程序和面板(#5)之間傳輸協議的庫。dbusmenu 已經被用于開發會話菜單,并且也是在 Lucid 中實現一些新系統菜單的構建塊。

    indicator-applet 是將托管應用程序指示器區域的面板小程序。指示器小程序是作為消息菜單項目的一部分開發的,旨在成為面板指示器的通用容器 。libappindicator 是一個新的庫,用于幫助應用程序端更改;它確實注冊了圖標和菜單,并在內部使用 dbusmenu 通過 dbus 發布上下文菜單。雖然它是 Gnome 桌面的新庫,但它基于在 KDE 項目中設計的用于更新系統托盤協議的協議(上面的“信令協議”部分)。libappindicator 采用并擴展了該協議,并將其與 dbusmenu 連接以提供應用程序遷移其代碼所需的全套服務 。

    SNI 工作流程

    3.1 托盤應用托盤封裝

    通過 dbusmenu,indicator-applet,libappindicator 將托盤應用的屬性,方法,以及信號注冊到 dbus 總線上,在任務欄上進行 dbus 監聽解析來實現與托盤應用交互。

    注冊 item 的方法有:

    屬性有:

    信號有:

    3.2 注冊 dbus 服務

    當拿到了托盤應用的信息然后就需要對信息進行封裝通過 dbus 的方式發送給任務欄,在任務欄上會注冊一個 statusnotifierWatcher 的服務用來檢測托盤信息的,每當托盤應用打開的時候都會調用 statusnotifierWatcher 的 RegisterStatusNotifierItem 方法在任務欄的托盤區域進行按鈕的注冊,當托盤應用關閉的時候會調用任務欄 unRegisterStatusNotifierItem 方法來取消在任務欄上的注冊。

    3.3 調用 dbus 的方法

    當用戶對托盤應用進行操作的時候,會調用相應 dbus 方法,并激活相關事件。例如左鍵點擊會觸發“激活窗口”的事件,右鍵單擊會觸發“顯示右鍵菜單”的事件,懸浮會觸發“顯示提示語”的事件

    SNI 協議使用的方式

    4.1 注冊 statusnotifierHost 的 dbus

    在一個桌面上為了防止托盤應用會在多個地方注冊成托盤,用一個 dbus 來讓托盤應用只能注冊到一個托盤來確保不會出現功能上不穩定。

    4.2 注冊 statusnotifierWatch 的 dbus

    用來檢測托盤應用的打開和關閉,statusnotifierWatch 的 RegisterStatusNotifierItem 和 unRegisterStatusNotifierItem 是協議層與應用層來進行交互的信號,通過 RegisterStatusNotifierItem 方法來獲取應用注冊的 dbus 的服務名。

    4.3 對托盤應用的 dbus 進行調用

    上文說的鼠標事件點擊調用槽函數是一部分,還可以監聽托盤應用的 signal 如圖標變換,提示信息變化等。如果需要托盤應用的窗口以及其他屬性,還可以通過 dbus 來獲取 properties。

    4.4 在優麒麟桌面環境下使用

    Qt 應用程序可以在自己的應用程序里創建一個 QSystemtrayIcon 類,并為這個類似設置圖標和事件槽函數,在任務欄上會自動生成托盤圖標。

    Gtk 程序通過

    來注冊應用為托盤應用,即可實現在任務欄上顯示托盤圖標。

    注意事項

    5.1 在 dbus 調用的時候可能會出現延時,必要的話可以考慮多線程處理,避免界面阻塞。

    5.2 由于 dbus 調用是異步調用出現響應慢問題,在讀取托盤應用信息是可能會需要添加延時讀取,不然會出現信息讀取不到的地方。

    Copyright 2015-2020   三好網  版權所有 聯系郵箱:kefu@646686.com 違法信息舉報:jubao@123777.net.cn 
    天天天干日