问题描述
我正在寻找有关如何向非gtk,非qt应用程序添加全局菜单支持的良好文档(示例,教程或指南)。 (在gtk中,主菜单的功能为’magically’ …)。我想与此一起使用的工具包是kivy,它支持glib-mainloop(例如,对于gstreamer),因此原则上都应该在那里工作。
我已经看到了Dbusmenu和here的API参考,但这对理解这些机制不是很有帮助。
有一个简短的示例,用于创建一个包含dbus-menu的launcher-quicklist,但不适用于global-menu /appmenu。
有一个wiki page,其中不包含任何其他信息,而是“希望在其他工具包上支持其他工具包上的其他应用程序菜单工作,但对于DX团队而言,这不是优先事项,需要帮助。”
此图形中有一些来自indicator-appmenu源代码的信息,但还不够,不能在developer.ubuntu.com上找到,需要更多说明:
所以:
-
如何显示一组菜单项(Dbusmenu.Menuitem)的过程是什么?
-
客户端和服务器扮演什么角色? (其中哪些应该在我的应用程序中运行?还是两者都运行?)
最佳方案
通常,我建议使用工具箱支持的方法将菜单放入全局菜单栏中…但是,我认为现在说服您为时已晚:-)另外,我会注意到,即使以为我们正在使用Dbusmenu并在12.04中进行注册,目标是移至GMenuModel并在菜单中标上14.04标记其菜单,因此该信息将成为过时的信息。当然,工具包plug-ins将被更新;-)(我最后一次尝试,我保证)
涉及的基本原理是我们需要知道与哪个窗口关联的菜单。我们使用其XID跟踪窗口,菜单是DBus上Dbusmenu服务器的路径。您将需要这两条信息进行注册。注册界面为pretty simple,因为您基本上将这两条信息都传递给了注册服务商。注册商在DBus上的知名名称为com.canonical.AppMenu.Registrar。
有关如何工作的示例,请查看indicator-appmenu中的mock-json-app sample code。这是一个小工具,它将获取dbusmenu-dumper(位于libdbusmenu-tools中)输出的JSON文件,并创建一个声称具有该菜单的窗口。它还处理诸如appmenu崩溃之类的事情,对于大多数应用程序可能并不是真正需要的(尽管在开发中确实很重要:-))。
要创建Dbusmenu Server,您基本上只需要分配对象并告诉它在DBus上显示的位置(因此您可以将位置提供给注册商)。对于appmenu-gtk这样的插件,我们使用生成的路径,这样就不会产生冲突,但是,如果您要控制应用程序,则可以使用固定的路径。然后,创建一个包含Dbusmenu Menuitem个对象的树结构。根目录未显示,但显示为passed to the Dbusmenu Server以启动菜单。根的第一级以下将在Ubuntu Menubar中显示为项目。
祝你好运,感谢所有骚扰我回答这个问题的人。我仍然认为您应该使用工具包支持(我上次说谎),但是祝您好运!