Comment ajouter la prise en charge du menu global à une application python non-gtk, non-qt?

24

Je recherche une bonne documentation (un exemple, un tutoriel ou un guide) sur la façon d'ajouter la prise en charge du menu global à une application non gtk, non qt. (Dans gtk cela fonctionne 'par magie' pour le menu principal ...). La boîte à outils avec laquelle je veux l'utiliser est kivy , qui prend en charge le glib-mainloop (par exemple pour gstreamer), donc en principe tout devrait y fonctionner.

J'ai vu la référence API de Dbusmenu et ici , mais ce n'est pas très utile pour comprendre les mécanismes.

Il y a un court exemple pour créer une liste de lancement rapide qui contient un menu dbus, mais pas pour le menu global / appmenu.

Il y a une page wiki qui ne contient aucune information pertinente autre que "Travailler sur la prise en charge des autres le menu de l'application sur d'autres boîtes à outils serait le bienvenu, mais pas une priorité pour l'équipe DX, aide souhaitée."

Il y a un peu d'informations dans ce graphique du code source de l'indicateur-appmenu, mais ce n'est pas suffisant, ne peut pas être trouvé sur developer.ubuntu.com et nécessite plus d'explications:

entrez la description de l'image ici

Alors:

  • Quelle est la procédure qui permet d'afficher un ensemble d'éléments de menu (Dbusmenu.Menuitem)?
  • Quel rôle jouent le client et le serveur? (Lequel est censé être exécuté dans mon application? Ou les deux?)

Question similaire

xubuntix
la source
Vous pouvez peut-être ajouter la boîte à outils que vous utilisez.
Timo
bien sûr: c'est la boîte à outils kivy.
xubuntix
1
Je pense que cette question nécessite une réponse canonique.
Tachyons
Au départ, j'avais espéré que les auteurs de dbusmenu-glib (par exemple Ted Gould), ou même de libdbusmenu-qt (Aurelien Gateau) pourraient passer une partie de leur temps à écrire la documentation de leur code. Mais après 4 mois d'attente, rien ne s'est passé. J'ai donc essayé la deuxième meilleure option, en essayant de `` soudoyer '' la communauté avec un peu de ma réputation pour intervenir. Il semble que cela ne fonctionne pas aussi bien ...
xubuntix
@xubuntix vous suggère de contacter Ted ( gould.cx/ted/blog ) et aurelien ( agateau.com/about-me ) directement
fossfreedom

Réponses:

14

En général, je recommanderais d'utiliser les méthodes prises en charge par la boîte à outils pour mettre les menus dans la barre de menu globale ... mais, je suppose qu'il est trop tard pour vous convaincre à ce stade :-) De plus, je noterai que même si nous pensions Nous utilisons Dbusmenu et l'inscription en 12.04, l'objectif est de passer à GMenuModel et de marquer la fenêtre avec ses menus d'ici le 14.04, de sorte que ces informations deviendront obsolètes. Bien sûr, les plug-ins de la boîte à outils seront mis à jour ;-) (la dernière fois que j'essaierai, je le promets)

Le principe de base impliqué est que nous devons savoir quels menus sont associés à quelle fenêtre. Nous suivons la fenêtre à l'aide de son XID et les menus sont un chemin vers le serveur Dbusmenu sur DBus. Vous aurez besoin de ces deux informations pour vous inscrire. L'interface d'enregistrement est assez simple en ce sens que vous transmettez essentiellement ces deux informations au registraire. Le nom bien connu du registraire sur DBus est com.canonical.AppMenu.Registrar .

Pour un exemple de la façon dont cela peut fonctionner, vous pouvez consulter l' exemple de code mock-json-app qui se trouve dans le menu indicateur-app . Il s'agit d'un petit outil qui prendra la sortie du fichier JSON par dbusmenu-dumper (qui est dans libdbusmenu-tools ) et fera une fenêtre qui prétend avoir ce menu. Il gère également des choses comme le crash du menu d'application, qui pourrait ne pas être vraiment nécessaire pour la plupart des applications (bien que ce soit vraiment important dans le développement :-)).

Pour créer un serveur Dbusmenu, il vous suffit simplement d'allouer l'objet et de lui indiquer où apparaître sur DBus (afin de pouvoir donner l'emplacement au registraire). Pour les plugins comme appmenu-gtk, nous utilisons un chemin généré afin qu'il n'y ait pas de conflit, mais si vous contrôlez l'application, vous pouvez probablement utiliser un chemin fixe. Vous créez ensuite une arborescence d' objets Dbusmenu Menuitem . Celui racine n'est pas affiché, mais est transmis au serveur Dbusmenu pour démarrer les menus. Le premier niveau en dessous de la racine sera affiché comme des éléments dans la barre de menus d'Ubuntu .

Bonne chance, merci à toutes les personnes qui m'ont harcelé pour répondre à cette question. Je crois toujours que vous devriez utiliser le support de la boîte à outils (j'ai menti à propos de la dernière fois), mais bonne chance!

Ted Gould
la source
1
Merci beaucoup! Et merci à toutes les personnes qui vous ont harcelé :-) Quant à la question de la boîte à outils: j'adorerais utiliser le support de la boîte à outils, mais il n'y en a pas pour Kivy. Et je ne changerai pas de boîte à outils uniquement pour le menu ... Le passage à GMenuModel rendra-t-il impossible son utilisation avec d'autres boîtes à outils?
xubuntix
GMenuModel facilitera l'amont dans de nombreuses boîtes à outils, car le support est directement dans GLib, il n'y a donc pas de dépendance supplémentaire, ce qui a dérangé certains responsables de la boîte à outils.
Ted Gould
@TedGould Excellente réponse, Ted! Cependant, existe-t-il un exemple sans GTK? Quelque chose qui est aussi proche que possible de l'utilisation de Xlib, et rien d'autre? L'exemple mock-json-app que vous avez donné est excellent, si l'on utilise Gtk; pas tellement si X11 est directement utilisé (ou une autre boîte à outils). J'essaie de créer quelque chose qui n'utilise que Glib, libdbusmenu-glib et X11, mais il semble que je rencontre des problèmes. Mes objectifs? Je suis intéressé à ajouter un support dans une application SDL, et je pense constamment aux applications GNUstep ne prenant pas en charge dbusmenu.
Ivan Vučica
1
@TedGould Ma tentative est ici: bitbucket.org/ivucica/minidbus-menu J'espère que vous (ou quelqu'un d'autre!) Aurez quelques minutes pour jeter un œil au code et voir pourquoi le menu n'apparaît pas, et pourquoi le la barre de titre indique "Hud". :-)
Ivan Vučica
Il semble que mon code C fonctionne sous 12.04. Je n'aurais pas dû essayer d'ajouter des éléments autonomes au menu; les ayant ajoutés en tant que sous-éléments d'un autre élément de menu, cela fonctionne maintenant. Cool ;)
Ivan Vučica
0

Malheureusement, vous ne trouverez pas de document convivial pour cela. Le menu global a été développé avec GTK et Qt à l'esprit et, bien qu'il soit théoriquement possible d'implémenter la prise en charge d'autres webkits puisque le protocole est basé sur DBus, il y a eu très peu d'efforts pour rendre la documentation disponible.

Les meilleurs pointeurs que je peux vous donner sont les codes source de indicateur-menu et du plasma-widget-menubar . Vous pouvez les lire pour comprendre comment fonctionne le protocole dbus.

Marcelo Hashimoto
la source
1
Cela pourrait-il également aider à obtenir une trace de la conversation sur un moniteur dbus pour certains cas représentatifs? Je ne connais pas suffisamment dbusmenu ou la surveillance de dbus pour le savoir, mais j'aimerais voir des exemples de quelqu'un qui le fait.
nealmcb