共计 1881 个字符,预计需要花费 5 分钟才能阅读完成。
1、什么是任务栏新版托盘协定(SNI)
在 Linux 操作系统中,“系统托盘区域”是在给定的 X 屏幕上运行的应用程序,能够显示正在运行的应用程序提供的小图标。系统托盘是一个 X 客户端,在给定的屏幕上领有一个非凡的管理器抉择并提供了容器窗口。Windows 将此性能称为“告诉区域”,旧版托盘协定就是通过 X 服务间接获取利用信息,在开发上难度很大。
新版托盘标准定义了可视项的治理,通常是用于向用户报告应用程序状态或提供对该应用程序执行的常见操作的快速访问的图标。它旨在作为 Freedesktop 的桌面告诉标准的补充但不间接相干,旨在代替 Freedesktop 系统托盘标准,更加面向模型视图,为工作区提供更多自在,如何以图形形式示意与它的视觉格调语言,这种形式(SNI)是将 systemtray 的调用封装进 dbus 总线中,晋升了开发者的开发效率。
从用户角度来看新版托盘协定(SNI)从外表上看不出有什么太大的变动,在开发的角度上是将最上层的利用与上层根底库的拆散。
2、实现形式
新版托盘协定次要是通过三个库来实现的:
dbusmenu 是实现应用程序和面板(#5)之间传输协定的库。dbusmenu 曾经被用于开发会话菜单,并且也是在 Lucid 中实现一些新零碎菜单的构建块。
indicator-applet 是将托管应用程序指示器区域的面板小程序。指示器小程序是作为音讯菜单项目标一部分开发的,旨在成为面板指示器的通用容器。libappindicator 是一个新的库,用于帮忙应用程序端更改;它的确注册了图标和菜单,并在外部应用 dbusmenu 通过 dbus 公布上下文菜单。尽管它是 Gnome 桌面的新库,但它基于在 KDE 我的项目中设计的用于更新系统托盘协定的协定(下面的“信令协定”局部)。libappindicator 采纳并扩大了该协定,并将其与 dbusmenu 连贯以提供应用程序迁徙其代码所需的全套服务。
3、SNI 工作流程
3.1 托盘利用托盘封装
通过 dbusmenu,indicator-applet,libappindicator 将托盘利用的属性,办法,以及信号注册到 dbus 总线上,在任务栏上进行 dbus 监听解析来实现与托盘利用交互。
注册 item 的办法有:
属性有:
信号有:
3.2 注册 dbus 服务
当拿到了托盘利用的信息而后就须要对信息进行封装通过 dbus 的形式发送给任务栏,在任务栏上会注册一个 statusnotifierWatcher 的服务用来检测托盘信息的,每当托盘利用关上的时候都会调用 statusnotifierWatcher 的 RegisterStatusNotifierItem 办法在任务栏的托盘区域进行按钮的注册,当托盘利用敞开的时候会调用任务栏 unRegisterStatusNotifierItem 办法来勾销在任务栏上的注册。
3.3 调用 dbus 的办法
当用户对托盘利用进行操作的时候,会调用相应 dbus 办法,并激活相干事件。例如左键点击会触发“激活窗口”的事件,右键单击会触发“显示右键菜单”的事件,悬浮会触发“显示提醒语”的事件。
4、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、注意事项
5.1 在 dbus 调用的时候可能会呈现延时,必要的话能够思考多线程解决,防止界面阻塞。
5.2 因为 dbus 调用是异步调用呈现响应慢问题,在读取托盘利用信息是可能会须要增加延时读取,不然会呈现信息读取不到的中央。