我想(以编程方式)访问 GNOME 3.6 下 Ubuntu 平视显示器(HUD)菜单服务的结果。我一直在尝试使用 HUD 的 DBus 界面并取得了一些成功,但无法让它在 Unity 之外工作。例如,以下 Python 脚本在 Unity 下登录时从终端运行时会显示一些结果:
#!/usr/bin/env python
import dbus
session_bus = dbus.SessionBus()
proxy_obj = session_bus.get_object('com.canonical.hud', '/com/canonical/hud')
hud_iface = dbus.Interface(proxy_obj, dbus_interface='com.canonical.hud')
query_result = hud_iface.StartQuery("ope", 5)
for res in query_result[1]:
print res[0].encode('utf8')
hud_iface.CloseQuery(query_result[2])
在 Unity 下运行它(在 12.10 中)我得到:
$ ./hud.py
File > <b>Open</b> Tab
File > <b>Open</b> Terminal
dropbox > <b>Open</b> Dropbox Folder
View > Zoom <b>Out</b>
Terminal > Set Character Encoding > Add <b>or</b> Remove…
...但是在 GNOME 3.6 下我没有得到任何结果(没有错误,什么都没有)。
看起来涉及到这些服务,因为它们在 Unity 而不是 GNOME 下不断运行:
/usr/lib/indicator-appmenu/hud-service
/usr/lib/x86_64-linux-gnu/indicator-application-service
/usr/lib/indicator-(whatever)/indicator-(whatever)-service
但是如果我在 GNOME 下启动它们,它们很快就会退出
$ /usr/lib/indicator-session/indicator-session-service
(process:4921): libindicator-WARNING **: No watchers, service timing out.
如果我设法在那个狭窄的时间窗口内运行我的脚本,那么我就会得到结果!但是如何让这些服务保持运行呢?首先是什么开始了他们?它们是否包含应用程序菜单内容,还是由其他服务提供?