如何从 GNOME 下的 HUD DBus 服务中获取结果?

Posted

技术标签:

【中文标题】如何从 GNOME 下的 HUD DBus 服务中获取结果?【英文标题】:How can I get results from the HUD DBus service under GNOME? 【发布时间】:2013-02-26 00:49:48 【问题描述】:

我想(以编程方式)访问 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 &gt; <b>Open</b> Tab
File &gt; <b>Open</b> Terminal
dropbox &gt; <b>Open</b> Dropbox Folder
View &gt; Zoom <b>Out</b>
Terminal &gt; Set Character Encoding &gt; 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.

如果我设法在那个狭窄的时间窗口内运行我的脚本,那么我就会得到结果!但是如何让这些服务保持运行呢?首先是什么开始了他们?它们是否包含应用程序菜单内容,还是由其他服务提供?

【问题讨论】:

【参考方案1】:

您似乎使用了错误的服务名称。我目前没有可用的 GNOME 3.6,但您可以列出 dbus 服务

dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames

此外,您应该在启动 Gnome 之前 export UBUNTU_MENUPROXY=libappmenu.so,或者在 /etc/environment 中定义它

同时检查您是否安装了indicator-appmenu。

不过看了这里here,我猜GNOME桌面并没有使用这样的服务:

因此,我确认您应该寻找另一个针对 Gnome 的 DBus 服务(使用不同的 API)。

【讨论】:

如果我使用了错误的服务名称,为什么它可以在 Unity 下工作?我不会收到 DBUS 错误吗?另外,UBUNTU_MENUPROXY 是根据需要设置的。 我不这么认为。没有错误。在公共汽车上,我希望能够订阅尚未公开但稍后会公开的服务。公共汽车就像一个调解人。这就是总线和客户端-服务器架构之间的区别之一。 顺便说一句,检查您是否安装了 indicator-appmenu,因为它安装了此类服务。 尽管 GNOME 不会自动使用这样的服务,但我想弄清楚的是:Unity 是如何做到的? GNOME 可以通过运行几个命令来复制它的行为,还是比这复杂得多?这就是这个问题的意义所在。 哦,indicator-appmenu 确实安装了。【参考方案2】:

我假设该项目中没有任何活动。然而,很多人真的很喜欢 gnome 的 hud 的想法! 您在此处发布的脚本是否包含了所有相关工作,或者您是否还有一些更好的文件?

【讨论】:

以上是关于如何从 GNOME 下的 HUD DBus 服务中获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

使用 DBus 控制 Gnome 音量

Python dbus 找不到 org.(gnome|freedesktop).ScreenSaver

在 Gnome 中,dbus-monitor 上的啥信号表明用户正在注销?

DBus Python 问题

如何从控制台创建 dbus 服务?

选择跨发行版 DBus 实现