背景:
这不适用于application-indicators而是system-indicators。
图片来自:https ://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators
目标是在 Greeter/Lock/Ubiquity 屏幕中显示指标系统监视器。有一个解决方法:
C原始代码:(工作正常)
我已经用 C 语言工作了,请参阅我的另一个问题:
但是,
indicator-sysmonitor
已经在 Python 中开发了许多其他应用程序指标。我不喜欢开发人员必须将他们的项目移植到 C 或编写 Python-C 代理的想法,如果他们想在欢迎/锁定/普遍性屏幕中显示指示器。相反,让 indicator-sysmonitor 直接从 python 创建一个系统指标将是最好的解决方案(没有变通方法,它将是当前使用 appindicator 的所有 python 项目的通用解决方案)。
Python 代码:(我尝试将 c 代码移植到 python 失败)
我正在努力将其移植到 Python 中。这是我当前不起作用的代码。它确实为菜单和操作创建 DBus 对象。它列在 XFCE 指标插件中。但没有显示在面板上。
/usr/lib/indicator-test/indicator-test-service
#!/usr/bin/python2 import os import sys import gi from gi.repository import Gio, GLib APPLICATION_ID = 'local.sneetsher.indicator.test' DBUS_MENU_PATH = '/local/sneetsher/indicator/test/desktop' DBUS_ACTION_PATH = '/local/sneetsher/indicator/test' def callback(): print ok def quit_callback(notification, loop): global connection global exported_action_group_id global exported_menu_model_id connection.unexport_action_group (exported_action_group_id) connection.unexport_menu_model (exported_menu_model_id) loop.quit() def cancel (notification, action, data): if action == "cancel": print "Cancel" else: print "That should not have happened (cancel)!" def bus_acquired(bus, name): # menu submenu = Gio.Menu() submenu.append("Show", "show") item = Gio.MenuItem.new(None, "_header") item.set_attribute([("x-canonical-type","s","com.canonical.indicator.root")]) item.set_submenu(submenu) menu = Gio.Menu() menu.append_item (item) actions = Gio.SimpleActionGroup.new() action1 = Gio.SimpleAction.new("_header", None) actions.insert(action1) action2 = Gio.SimpleAction.new('show', None) actions.insert(action2) action2.connect("activate",callback) global connection connection = bus global exported_action_group_id exported_action_group_id = connection.export_action_group(DBUS_ACTION_PATH, actions) global exported_menu_model_id exported_menu_model_id = connection.export_menu_model(DBUS_MENU_PATH, menu) def setup (): #bus connection Gio.bus_own_name(Gio.BusType.SESSION, APPLICATION_ID, 0, bus_acquired, None, None) if __name__ == '__main__': connection = None exported_menu_model_id = 0 exported_action_group_id = 0 password = "" loop = GLib.MainLoop() setup () loop.run()
local.sneetsher.indicator.test
[Indicator Service] Name=indicator-test ObjectPath=/local/sneetsher/indicator/test [desktop] ObjectPath=/local/sneetsher/indicator/test/desktop [desktop_greeter] ObjectPath=/local/sneetsher/indicator/test/desktop [desktop_lockscreen] ObjectPath=/local/sneetsher/indicator/test/desktop
local.sneetsher.indicator.test.service
[D-BUS Service] Name=local.sneetsher.indicator.test Exec=/usr/lib/indicator-test/indicator-test-service
90_unity-greeter.gschema.override
[com.canonical.unity-greeter] indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'local.sneetsher.indicator.test', 'application']
问题:
我期待原因,我没有像_header
在原始 C 代码中那样创建菜单结构或其元(伪项,如 )。
任何人都可以用 C 语言将此系统指标代码移植到 Python 吗?
我刚刚上传了一个从@user.dz C 示例移植的原始“工作”Python 示例。这是源代码存储库:
我会随时更新它,但欢迎任何贡献。
感谢您提供有用的信息!
移植主脚本的源代码。注意:这是初始副本,因为将来链接可能会断开。有关完整的软件包和最后一次更新,请点击上面的链接。
系统指标服务
嗯,它真的比我预期的要简单。它没有特定的 API。因为它只是一个 GSimpleActionGroup & 并通过 DBus 导出了相应的 GMenu,所以使用放入的同名声明文件告知 Unity 它们的存在
/usr/share/unity/indicators/
。不需要任何其他库。这是一个非常小的 C 语言示例:
tests/indicator-test-service.c
从libindicator
源获取副本. 指标测试服务.c没有变化
com.canonical.indicator.test修改为添加锁定和欢迎模式
com.canonical.indicator.test.service从文件名中删除 .in 后缀并更改可执行路径
编译它
手动安装
Greeter 的配置,覆盖默认指标列表
90_unity-greeter.gschema.override
安装
测试
如果您希望用户能够随时关闭应用程序,请注意DBus 服务很麻烦。最好使用自动启动,就像默认指标一样。
我在这里上传了准备好的文件:
https://github.com/sneetsher/mysystemindicator_minimum
以及此处的修改副本:
https://github.com/sneetsher/mysystemindicator
我尝试过不同模式的不同菜单。它可以快速安装和测试。
这似乎太简单了,可以很容易地移植到任何其他支持 GIO Gnome lib(包括 DBus)的语言。由于我正在寻找python,我可能会在稍后添加它。
参考: libindicator README:指标服务文件格式https://bazaar.launchpad.net/~indicator-applet-developers/libindicator/trunk.14.04/view/head:/README