Wie füge ich Unterstützung für das globale Menü zu einer Python-App hinzu, die nicht gtk, nicht qt ist?

24

Ich suche eine gute Dokumentation (ein Beispiel, ein Tutorial oder eine Anleitung) zum Hinzufügen globaler Menüunterstützung zu einer Nicht-Gtk-, Nicht-Qt-Anwendung. (In gtk funktioniert es 'magisch' für das Hauptmenü ...). Das Toolkit, mit dem ich dies verwenden möchte, ist kivy , das den glib-mainloop unterstützt (z. B. für gstreamer), daher sollten im Prinzip alle dort funktionieren.

Ich habe die API-Referenz von Dbusmenu und hier gesehen , aber das ist nicht sehr hilfreich für das Verständnis der Mechanismen.

Es gibt ein kurzes Beispiel für die Erstellung einer Launcher-Quicklist, die ein dbus-Menü enthält, jedoch nicht für das globale Menü / App-Menü.

Es gibt eine Wiki-Seite , die keine anderen relevanten Informationen enthält als "Arbeiten an der Unterstützung des Anwendungsmenüs auf anderen Toolkits wäre willkommen, aber keine Priorität für das DX-Team, um Hilfe zu bitten."

Diese Grafik enthält einige Informationen aus dem Quellcode des Indikator-Appmenüs, die jedoch nicht ausreichen. Sie können nicht auf developer.ubuntu.com gefunden werden und erfordern weitere Erläuterungen:

Bildbeschreibung hier eingeben

So:

  • Wie wird vorgegangen, um eine Reihe von Menüelementen (Dbusmenu.Menuitem) anzuzeigen?
  • Welche Rolle spielen Client und Server? (Welche davon soll in meiner Anwendung ausgeführt werden? Oder beides?)

Ähnliche Frage

xubuntix
quelle
Vielleicht können Sie das von Ihnen verwendete Toolkit hinzufügen.
Timo
sicher: es ist das kivy toolkit.
Xubuntix
1
Ich denke, diese Frage muss von Canonical beantwortet werden.
Tachyonen
Anfangs hatte ich gehofft, dass die Autoren von dbusmenu-glib (z. B. Ted Gould) oder sogar libdbusmenu-qt (Aurelien Gateau) einen Teil ihrer Zeit damit verbringen könnten, die Dokumentation ihres Codes zu schreiben. Aber nach 4 Monaten Wartezeit passierte nichts. Also habe ich die zweitbeste Option ausprobiert und versucht, die Community mit einem guten Ruf zu "bestechen". Scheint, dass dies nicht so gut funktioniert ...
xubuntix
@xubuntix empfehlen Ihnen, Ted ( gould.cx/ted/blog ) und Aurelien ( agateau.com/about-me ) direkt zu
kontaktieren

Antworten:

14

Im Allgemeinen würde ich empfehlen, das Toolkit zu verwenden, um Menüs in die globale Menüleiste einzufügen ... aber ich gehe davon aus, dass es zu spät ist, Sie an dieser Stelle zu überzeugen :-) Außerdem stelle ich fest, dass wir das selbst gedacht haben Verwenden Sie Dbusmenu und registrieren Sie sich in 12.04. Das Ziel ist, zu GMenuModel zu wechseln und das Fenster mit seinen Menüs bis 14.04. zu markieren, damit diese Informationen datiert werden. Natürlich werden die Toolkit-Plugins aktualisiert ;-) (Ich verspreche es beim letzten Mal)

Das Grundprinzip ist, dass wir wissen müssen, welche Menüs mit welchem ​​Fenster verknüpft sind. Wir verfolgen das Fenster anhand seiner XID und die Menüs sind ein Pfad zum Dbusmenu-Server auf DBus. Sie benötigen beide Informationen, um sich zu registrieren. Die Registrierungsschnittstelle ist ziemlich einfach , da Sie im Grunde beide Informationen an den Registrar übergeben. Der bekannte Name des Registrars auf DBus ist com.canonical.AppMenu.Registrar .

Ein Beispiel dafür finden Sie im Beispielcode für mock-json-app , der sich im Menü indicator-app befindet . Dies ist ein kleines Tool, das die von dbusmenu-dumper (in libdbusmenu-tools ) ausgegebene JSON-Datei verwendet und ein Fenster erstellt, das behauptet, dieses Menü zu haben. Es behandelt auch Dinge wie das Abstürzen des App-Menüs, das für die meisten Anwendungen möglicherweise nicht wirklich erforderlich ist (obwohl dies für die Entwicklung wirklich wichtig ist :-)).

Um einen Dbusmenu-Server zu erstellen, müssen Sie das Objekt lediglich zuweisen und ihm mitteilen, wo es auf dem DBus erscheinen soll (damit Sie dem Registrar den Speicherort mitteilen können). Für Plugins wie appmenu-gtk verwenden wir einen generierten Pfad, damit es keinen Konflikt gibt. Wenn Sie die App steuern, können Sie wahrscheinlich einen festen Pfad verwenden. Anschließend erstellen Sie eine Baumstruktur von Dbusmenu Menuitem- Objekten. Das Root- Menü wird nicht angezeigt, sondern an den Dbus-Menü-Server übergeben , um die Menüs zu starten. Die erste Ebene unter dem Stammverzeichnis wird in der Ubuntu-Menüleiste als Elemente angezeigt .

Viel Glück, vielen Dank an alle, die mich belästigt haben, um diese Frage zu beantworten. Ich glaube immer noch, dass Sie die Toolkit-Unterstützung verwenden sollten (ich habe das letzte Mal gelogen), aber viel Glück!

Ted Gould
quelle
1
Vielen Dank! Und danke an alle, die dich belästigt haben :-) Zur Toolkit-Frage: Ich würde gerne die Toolkit-Unterstützung verwenden, aber für Kivy gibt es keine. Und ich werde die Toolkits nicht nur für das Menü wechseln ... Wird der Wechsel zu GMenuModel die Verwendung mit anderen Toolkits unmöglich machen?
xubuntix
GMenuModel erleichtert das Upstreaming in vielen Toolkits, da die Unterstützung direkt in GLib erfolgt, sodass es keine zusätzlichen Abhängigkeiten gibt, die einige Toolkit-Betreuer stören würden.
Ted Gould
@ TedGould Tolle Antwort, Ted! Gibt es jedoch ein Beispiel ohne GTK? Etwas, das so nahe wie möglich daran ist, nur Xlib zu verwenden, und sonst nichts? Das Beispiel für die Mock-Json-App, das Sie angegeben haben, ist großartig, wenn Sie Gtk verwenden. Nicht so sehr, wenn X11 direkt verwendet wird (oder ein anderes Toolkit). Ich versuche, etwas zusammenzustellen, das nur Glib, libdbusmenu-glib und X11 verwendet, aber es sieht so aus, als stünde ich in Schwierigkeiten. Meine Ziele? Ich möchte eine SDL-App unterstützen und denke ständig daran, dass GNUstep-Apps dbusmenu nicht unterstützen.
Ivan Vučica
1
@TedGould Mein Versuch ist hier vorbei: bitbucket.org/ivucica/minidbus-menu Hoffentlich haben Sie (oder jemand anderes!) Ein paar Minuten Zeit, um sich den Code anzusehen und herauszufinden, warum das Menü nicht angezeigt wird und warum das Titelleiste sagt "Hud". :-)
Ivan Vučica
Es sieht so aus, als hätte ich meinen C-Code unter 12.04 zum Laufen gebracht. Ich hätte nicht versuchen sollen, dem Menü eigenständige Elemente hinzuzufügen. Nachdem sie als Unterelemente eines anderen Menüpunkts hinzugefügt wurden, funktioniert es jetzt. Cool;)
Ivan Vučica
0

Leider finden Sie dafür kein freundliches Dokument. Das globale Menü wurde unter Berücksichtigung von GTK und Qt entwickelt, und obwohl es theoretisch möglich ist, Unterstützung für andere Webkits zu implementieren, da das Protokoll auf DBus basiert, war die Bereitstellung von Dokumentation nur sehr wenig aufwendig.

Die besten Hinweise, die ich Ihnen geben kann, sind die Quellcodes des Indikator-Appmenüs und der Plasma-Widget-Menüleiste . Sie können diese lesen, um zu verstehen, wie das dbus-Protokoll funktioniert.

Marcelo Hashimoto
quelle
1
Könnte es auch hilfreich sein, für einige repräsentative Fälle einen dbus-Monitor-Trace der Konversation zu erstellen? Ich weiß nicht genug über das dbus-Menü oder die Überwachung von dbus, aber ich würde gerne einige Beispiele von jemandem sehen, der dies tut.
Nealmcb
0

Sie können Python-Dbus-Bindungen verwenden und die API verwenden, die unter http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.html für DbusMenu dokumentiert ist, um sie in die globale Menüleiste zu integrieren.

dobey
quelle
4
Dies ist genau der Link, den ich in meiner Antwort angegeben habe und der besagt, dass ich nicht verstehe, wie ich es verwenden soll!
xubuntix