如何将全局菜单的支持添加到python非gtk,非qt应用程序?

我正在寻找关于如何向非gtk,非qt应用程序添加全局菜单支持的良好文档(示例,教程或指南)。 (在gtk中它对主菜单“神奇地”起作用……)。 我想使用它的工具包是kivy ,它支持glib-mainloop(例如gstreamer),所以原则上所有应该在那里工作。

我已经看过Dbusmenu的API参考和这里 ,但这对理解机制没有多大帮助。

有一个简短的例子来创建一个包含dbus菜单的启动器快速列表 ,但不包含全局菜单/ appmenu。

有一个维基页面不包含任何相关信息,“欢迎支持其他工具包上的其他应用程序菜单,但不是DX团队的优先考虑,需要帮助。”

这个图表中有一些来自indicator-appmenu源代码的信息,但还不够,在developer.ubuntu.com上找不到,需要更多解释:

在此处输入图像描述

所以:

  • 获取一组菜单项(Dbusmenu.Menuitem)的过程是什么?
  • 客户端和服务器扮演什么角色? (其中哪些应该在我的应用程序中运行?或者两者都有?)

类似的问题

一般来说,我建议使用工具包支持的方式将菜单放在全局菜单栏中…但是,我认为现在说服你为时已晚:-)另外,我会注意到,即便想到我们’在12.04使用Dbusmenu并注册,目标是转移到GMenuModel并用14.04的菜单标记窗口,因此这些信息将变得过时。 当然,工具包插件会更新;-)(我上次试试,我保证)

涉及的基本原则是我们需要知道哪个菜单与哪个窗口相关联。 我们使用其XID跟踪窗口,菜单是DBus上Dbusmenu服务器的路径。 您需要注册这两条信息。 注册界面非常简单 ,因为您基本上将这两条信息传递给注册商。 注册商在DBus上众所周知的名称是com.canonical.AppMenu.Registrar 。

有关这如何工作的示例,您可以查看指示器 – appmenu中的mock-json-app示例代码 。 这是一个小工具,它将通过dbusmenu-dumper(位于libdbusmenu-tools中 )输出JSON文件,并创建一个声称具有该菜单的窗口。 它还可以处理appmenu崩溃等问题,这对于大多数应用程序来说可能并不是真正需要的(尽管在开发中非常重要:-))。

要创建Dbusmenu服务器,您基本上只需要分配对象并告诉它在DBus上显示的位置(这样您就可以将位置提供给注册商)。 对于像appmenu-gtk这样的插件,我们使用生成的路径,以便没有冲突,但如果您正在控制应用程序,则可以使用固定路径。 然后创建Dbusmenu Menuitem对象的树结构。 根目录未显示,但传递给Dbusmenu服务器以启动菜单。 下面的第一级将显示为Ubuntu菜单栏中的项目。

祝你好运,感谢所有骚扰我回答这个问题的人。 我仍然相信你应该使用工具包支持(我最后一次撒谎),但祝你好运!

不幸的是,你找不到一份友好的文件。 全局菜单是在考虑GTK和Qt的情况下开发的,虽然理论上可以实现对其他webkits的支持,因为该协议是基于DBus的,但是提供文档的努力很少。

我能给你的最好的指针是指标 – appmenu和plasma-widget-menubar的源代码。 您可以阅读这些内容以了解dbus协议的工作原理。

您可以使用python-dbus绑定,并使用http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.html上为DbusMenu记录的API,与全局菜单栏集成。