如何在python non-gtk,non-qt app中添加对全局菜单的支持?


24

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

我已经在Dbusmenu此处看到了API参考,但这对于理解机制不是很有帮助。

有一个简短的示例,用于创建包含dbus菜单的启动器快速列表,但不适用于global菜单/ appmenu。

有一个Wiki页面,除了“希望在其他工具包上支持其他应用程序菜单的工作,而不是DX团队的优先工作,需要帮​​助”之外,没有任何其他相关信息。

该图中的指标应用程序源代码中有一些信息,但是还不够,不能在developer.ubuntu.com上找到,需要更多说明:

在此处输入图片说明

所以:

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

类似问题


也许您可以添加您正在使用的工具包。
Timo 2012年

当然:这是kivy工具包。
xubuntix 2012年

1
我认为这个问题需要规范的答案。
快球

最初,我希望dbusmenu-glib(例如Ted Gould)甚至libdbusmenu-qt(Aurelien Gateau)的作者可以花一些时间来编写代码文档。但是经过4个月的等待,一切都没有发生。因此,我尝试了第二好的选择,试图以我声誉良好的方式“贿赂”社区,以使其介入。似乎效果不佳……
xubuntix 2012年

@xubuntix建议您直接与Ted(gould.cx/ted/blog)和aurelien(agateau.com/about-me)联系
fossfreedom

Answers:


14

通常,我建议使用工具箱支持的方法将菜单放入全局菜单栏中...但是,我认为现在说服您为时已晚:-)另外,我会注意到,即使以为我们正在使用Dbusmenu并在12.04中进行注册,目标是移至GMenuModel并在菜单中标出带有14.04的菜单,因此该信息将成为过时的信息。当然,工具包插件将被更新;-)(我保证最后一次尝试)

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

对于如何能工作,你可以看看一个例子模拟JSON的应用示例代码是在指标的appmenu。这是一个小工具,它将接收dbusmenu-dumper(在libdbusmenu-tools中)输出的JSON文件,并创建一个声称具有该菜单的窗口。它还处理诸如appmenu崩溃之类的事情,对于大多数应用程序可能并不是真正需要的(尽管在开发中确实很重要:-))。

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

祝你好运,感谢所有骚扰我回答这个问题的人。我仍然认为您应该使用工具箱支持(我上次说谎),但是祝您好运!


1
非常感谢你!还要感谢所有骚扰您的人:-)关于工具箱的问题:我很想使用工具箱的支持,但是Kivy没有。而且我不会只为菜单切换工具箱...切换到GMenuModel会使其无法与其他工具箱一起使用吗?
xubuntix 2012年

由于直接在GLib中提供支持,因此GMenuModel将使许多工具包中的上游操作变得更加容易,因此没有附加的依赖关系,这使某些工具包维护者感到困扰。
特德·古尔德

@TedGould很好的答案,Ted!但是,有没有GTK的例子吗?与仅使用Xlib尽可能接近的东西,还有别的吗?如果使用Gtk,您给出的模拟json-app示例就很棒。如果直接使用X11(或其他工具包),则不会太多。我试图将仅使用Glib,libdbusmenu-glib和X11的东西放在一起,但看起来好像遇到了麻烦。我的目标?我有兴趣在SDL应用程序中添加支持,并且我一直在思考GNUstep应用程序不支持dbusmenu。
IvanVučica2012年

1
@TedGould我的尝试已经在这里:bitbucket.org/ivucica/minidbus-menu希望您(或其他人!)有几分钟的时间看一下代码,看看为什么菜单不出现,以及为什么菜单不出现。标题栏显示“ Hud”。:-)
IvanVučica2012年

看起来我的C代码可以在12.04以下工作。我不应该尝试将独立项添加到菜单中。将它们添加为另一个菜单项的子项后,现在可以使用了。
不错

0

不幸的是,您将找不到一个友好的文档。全局菜单是在考虑GTK和Qt的情况下开发的,并且由于该协议基于DBus,因此从理论上讲可以实现对其他Webkit的支持,但是在提供文档方面的工作很少。

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


1
在某些代表性案例中,它还能帮助dbus-monitor跟踪对话吗?我对dbusmenu或监视dbus的了解不多,但是我很乐意从其他人那里得到一些例子。
nealmcb 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.