当前位置: 首页 > Linux

优麒麟-任务栏新托盘协议(SNI)简介

时间:2023-04-07 00:31:06 Linux

1.什么是TaskbarNewVersionTrayProtocol(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.SNIWorkflow3.1Tray应用Tray封装通过dbusmenu、indicator-applet、libappindicator,将tray应用的属性、方法、信号注册到dbus总线上,对taskbar进行dbus监控分析,实现与托盘应用程序。注册item的方法有:Attributes:Signals: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上面提到的鼠标事件点击调用槽函数是其中的一部分,它还可以监听托盘应用的信号,比如图标变化,提示信息变化等。如果需要窗口托盘应用的其他属性,也可以通过dbus获取属性。4.4在优麒麟桌面环境下使用Qt应用程序,可以在自己的应用程序中创建一个QSystemtrayIcon类,为该类设置图标和事件槽函数,任务栏上会自动生成托盘图标。Gtk程序可以通过将应用程序注册为托盘应用程序来在任务栏上显示托盘图标。5.注意事项5.1调用dbus可能会有延迟。必要时可以考虑多线程处理,避免接口阻塞。5.2由于dbus调用是异步调用,存在响应慢的问题,可能需要加延迟读取托盘申请信息,否则会出现无法读取信息的地方。