如何为一个非GTK、非Qt的Python应用程序添加全局菜单支持?

我正在寻找关于如何将全局菜单支持添加到非GTK、非Qt应用程序的良好文档(示例、教程或指南)。在GTK中,这对于主菜单来说是“神奇”的...)。 我想要与kivy一起使用这个工具包,它支持glib-mainloop(例如用于gstreamer),所以原则上所有东西都应该能够正常工作。
我已经看过Dbusmenuhere的API参考,但对于理解机制并不是很有帮助。
有一个简短的示例用于创建包含dbus-menu的launcher-quicklist,但没有针对全局菜单/应用菜单的示例。

有一个维基页面,除了“欢迎支持其他工具包上的应用菜单,但对DX团队来说不是首要任务,需要帮助。”之外,没有任何相关信息。

这个图形来自indicator-appmenu源代码中的一些信息,但是不足够详细,在developer.ubuntu.com上找不到,并且需要更多解释:

enter image description here

所以:
- 如何显示一组菜单项(Dbusmenu.Menuitem)的过程是什么? - 客户端和服务器分别扮演什么角色?(我的应用程序应该运行哪个?还是两者都需要?) 类似问题

也许你可以添加你正在使用的工具包。 - Timo
当然,它就是Kivy工具包。 - xubuntix
1我认为这个问题需要一个来自权威的答案。 - Tachyons
最初,我曾希望dbusmenu-glib(例如Ted Gould)的作者,甚至是libdbusmenu-qt(Aurelien Gateau)能够花一些时间编写他们代码的文档。但是等了4个月后,什么也没有发生。所以我尝试了第二好的选择,试图用我声望的五分之一来“贿赂”社区加入进来。看起来这并不起作用... - xubuntix
建议你直接联系Ted(http://gould.cx/ted/blog)和Aurelien(http://agateau.com/about-me/),@xubuntix。 - fossfreedom
3个回答

一般来说,我建议使用工具包支持的方法将菜单放置在全局菜单栏中...但是,我假设在这一点上说服你已经太晚了 :-) 另外,我要注意的是,即使我们在12.04中使用Dbusmenu和注册,目标是到14.04时转移到GMenuModel并标记窗口及其菜单,因此这些信息将变得过时。当然,工具包插件将会更新;-) (我保证这是最后一次尝试)
涉及的基本原则是我们需要知道哪些菜单与哪个窗口相关联。我们使用其XID跟踪窗口,而菜单是DBus上的Dbusmenu服务器路径。您需要这两个信息才能进行注册。注册接口在DBus上的众所周知的名称为com.canonical.AppMenu.Registrar,它非常简单,您只需将这两个信息传递给注册器即可。
为了说明这个工作原理,你可以看看mock-json-app示例代码,它包含在indicator-appmenu中。这是一个小工具,它会接收由dbusmenu-dumper(位于libdbusmenu-tools)输出的JSON文件,并创建一个窗口,显示相应的菜单。此外,它还处理了一些问题,例如应用程序菜单崩溃,虽然对大多数应用程序来说可能不是必需的(尽管在开发中非常重要 :-))。
创建一个Dbusmenu Server基本上只需要分配对象并告诉它在DBus上的位置(这样你就可以将位置提供给注册器)。对于像appmenu-gtk这样的插件,我们使用生成的路径以避免冲突,但如果你控制应用程序,可能可以使用固定路径。然后,您创建一个Dbusmenu Menuitem对象的树结构。根节点不会显示,但会传递给Dbusmenu Server以启动菜单。根节点下的第一级将显示为Ubuntu Menubar上的项目。
祝好运,感谢所有纠缠我回答这个问题的人们。我仍然相信你应该使用工具包支持(我说过最后一次是撒谎的),但祝你好运!

1非常感谢!还要感谢所有骚扰你的人 :-) 关于工具包的问题:我很想使用工具包支持,但是Kivy没有相应的工具包。而且我不会为了菜单而更换工具包... 切换到GMenuModel会使它无法与其他工具包一起使用吗? - xubuntix
GMenuModel将使在许多工具包中进行上游开发更加容易,因为它的支持直接在GLib中,所以没有额外的依赖项,这一点曾经困扰了一些工具包维护者。 - Ted Gould
@TedGould 很好的回答,Ted!不过,有没有一个没有GTK的例子?尽可能接近只使用Xlib而没有其他内容的例子?你给出的mock-json-app示例很棒,如果使用Gtk的话,但是如果直接使用X11(或者其他工具包),就不太适用。我正在尝试组合一些只使用Glib、libdbusmenu-glib和X11的东西,但看起来我遇到了麻烦。我的目标是什么?我对在SDL应用程序中添加支持感兴趣,并且我一直在考虑GNUstep应用程序没有dbusmenu支持的问题。 - Ivan Vučica
1@TedGould 我的尝试在这里:https://bitbucket.org/ivucica/minidbus-menu 希望你(或其他人!)能花几分钟看一下代码,看看为什么菜单没出现,标题栏为什么显示为“Hud”。 :-) - Ivan Vučica
看起来我成功让我的C代码在12.04版本下运行了。我本不该尝试将独立的项目添加到菜单中,而是应该将它们作为另一个菜单项的子项添加,现在它可以正常工作了。太棒了 ;) - Ivan Vučica


4这正是我在回答中提供的链接,说明我不明白如何使用它! - xubuntix

很遗憾,你找不到一个友好的文档来解决这个问题。全局菜单是为GTK和Qt开发的,虽然从理论上讲可以通过DBus协议实现对其他Webkit的支持,但在提供文档方面付出的努力非常有限。
我能给你的最好建议是查看indicator-appmenuplasma-widget-menubar的源代码。你可以阅读这些代码来了解DBus协议的工作原理。

1获取一些代表性案例的dbus-monitor跟踪对话,这样做可能也有帮助。我对dbusmenu或监控dbus了解不够,但我很想看到一些懂行的人提供的示例。 - nealmcb