优麒麟电源管理浅析(二)
1、优麒麟电源管理程序的组成和介绍
电源管理模块从程序上来说,主要分为下面三个部分:
ukui-power-backlight-helper ----- 设置和获取亮度程序。
ukui-power-manager ------------- 守护程序。(主要源文件:gpm-main.c)
ukui-power-statistics --------- 显示程序。(主要源文件:gpm-statistics.c)
下面这个图标和菜单选择就是 ukui-power-manager 这个程序提供的,注意到托盘图标,菜单项图标和文字是根据设备的当前状况进行动态更新。
图1
点击“可用电源”可以方便的调用显示程序 ukui-power-statistics,显示程序分为了左右两侧,左侧列出了当前的设备,在本例中是交流电适配器和某型号的电池。右侧是选中设备的信息。每种设备的信息种类和信息量多少是不一样的。比如交流电适配器只有一个标签页来表示就够了,但是电池就包含了三个标签页,分别是详细,历史,统计。详细标签页列出了电池的类型,功率,型号,充放电状态,充放电时间等;历史标签页绘制了四种图表,分别反映了电量,功率,充电时间,放电时间四种类型的数据,每种数据又可以根据不同的时间来选择范围。统计标签包含了四种类型数据,分别是充电,充电精度,放电,放电精度。此外,每种图表都可以选择是否显示数据点,是否绘制平滑曲线。
图2
点击“电源选项”可以方便调用控制面板的电源选项 ukui-control-center。控制中心实现了三组功能的设置。最上面一组是设置空闲多久显示器和计算机进入睡眠和笔记本盖子合上的动作,分为使用电源和使用电池两种情况。中间一组是按下电源物理键的动作,可以选择询问或者挂起等。最下面一组设置了托盘图标的显示策略,选择总是显示会在托盘一直存在一个程序图标,选择仅使用电池则只有电池存在才会显示托盘程序图标。
图3
通过下面控制面板的滑动条就会调用 ukui-power-backlight-helper 程序,滑动条向右滑动可以增大屏幕亮度。背后其实是调用了 ukui-power-backlight-helper 程序。
2、优麒麟电源管理程序和其他程序的dbus交互
a、以笔记本盖子合上的过程作为例子来说明:
当笔记本盖子合上,org.freedesktop.UPower 这个后台程序发送回来lid_is_closed 属性改变的信号,ukui.power.manager 对这个信息做出反应。先判断是否允许盖子合上的功能。再获取gsettings的设置和是否使用电池,据此调用服务 org.freedesktop.login1 的功能函数,比如:suspend,hibernate,shutdown 等。
流程图如下:
图4
b、还有其他的一些 dbus 进程交互。例如 upower 服务端,screensaver,login1 和 SessionManager。
和其他dbus服务的交互 | |||||
org.freedesktop.UPower | |||||
服务名称 | org.freedesktop.UPower | 对象 | /org/freedesktop/UPower | ||
接口名称 | org.freedesktop.UPower | ||||
连接的信号 | device-added 参数string object_path | device-removed 参数string object_path | notify device-monitor 参数:GParamSpec | ||
连接dbus服务org.ukui.ScreenSaver | |||||
对象 | / | 接口 | org.ukui.ScreenSaver | ||
接口调用函数 | Lock in参数(none) out参数(none) | Throttle in参数(s,s) out参数(uint) | UnThrottle in参数(unit) | ||
接口调用函数 | GetActive in参数(none) out参数(bool) | SimulateUserActivity | UnThrottle in参数(unit) | ||
关机休眠等功能函数调用的服务org.freedesktop.login1 | |||||
对象 | /org/freedesktop/login1
| 接口 | org.freedesktop.login1.Manager
| ||
接口调用函数 | Suspend 参数(b) | PowerOff 参数(b) | Hibernate 参数(b) | ||
接口调用函数 | Inhibit 参数"(ssss)" | ||||
dbus服务org.ukui.ScreenSaver | |||||
对象 | / | 接口 | org.ukui.ScreenSaver | ||
接口调用函数 | Lock in参数(none) out参数(none) | Throttle in参数(s,s) out参数(uint) | UnThrottle in参数(unit) | ||
接口调用函数 | GetActive in参数(none) out参数(bool) | SimulateUserActivity | UnThrottle in参数(unit) | ||
org.gnome.SessionManager dbus服务 | |||||
对象名称 | /org/gnome/SessionManager | ||||
接口名称 | org.gnome.SessionManager | ||||
连接的信号 | IsInhibited | shutdown | inhibitorAdded inhibitorRemoved | ||
功能作用 | 获取空闲和挂起的禁止策略 | ||||
对象名称 | /org/gnome/SessionManager | ||||
接口名称 | org.freedesktop.DBus.Properties | ||||
方法调用 | Get | ||||
功能作用 | 获取空闲的状态 | ||||
对象名称 | /org/gnome/SessionManager/Presence | ||||
接口名称 | org.gnome.SessionManager.Presence | ||||
连接的信号 | StatusChanged |
以上就是对电源管理模块组成和交互的一些分析和理解,还有很多知识没有介绍到,有兴趣研究源码的可以到这个代码链接看看:https://github.com/ukui/ukui-power-manager。