Come aggiungere il supporto per il menu globale a un'app non-gtk e non qt di Python?


24

Sto cercando una buona documentazione (un esempio, tutorial o guida) su come aggiungere il supporto del menu globale a un'applicazione non GTK, non QT. (In GTK funziona 'magicamente' per il menu principale ...). Il toolkit con cui voglio usarlo è kivy , che supporta glib-mainloop (ad es. Per gstreamer), quindi in linea di principio dovrebbe funzionare tutto lì.

Ho visto il riferimento API di Dbusmenu e qui , ma non è molto utile per comprendere i meccanismi.

C'è un breve esempio per la creazione di un lanciatore-QuickList che contiene un dbus-menu, ma non per il global menu / appmenu.

C'è una pagina wiki che non contiene alcuna informazione pertinente se non "Lavorare per supportare il menu dell'applicazione su altri toolkit sarebbe il benvenuto, ma non una priorità per il team DX, aiuto desiderato".

Ci sono alcune informazioni in questo grafico dal codice sorgente indicatore-appmenu, ma non è abbastanza, non può essere trovato su developer.ubuntu.com e richiede ulteriori spiegazioni:

inserisci qui la descrizione dell'immagine

Così:

  • Qual è la procedura che consente di visualizzare una serie di voci di menu (Dbusmenu.Menuitem)?
  • Quale ruolo svolgono il client e il server? (Quale di questi dovrebbe essere eseguito nella mia applicazione? O entrambi?)

Domanda simile


Forse puoi aggiungere il toolkit che stai utilizzando.
Timo,

certo: è il kivy toolkit.
xubuntix,

1
Penso che questa domanda abbia bisogno di una risposta canonica.
Tachyons,

Inizialmente avevo sperato che gli autori di dbusmenu-glib (ad es. Ted Gould) o persino libdbusmenu-qt (Aurelien Gateau) potessero passare un po 'del loro tempo a scrivere documentazione del loro codice. Ma dopo 4 mesi di attesa, non è successo nulla. Così ho provato la seconda opzione migliore, cercando di "corrompere" la comunità con un campione della mia reputazione per intervenire. Sembra che non funzioni altrettanto bene ...
xubuntix,

@xubuntix ti suggerisce di contattare direttamente Ted ( gould.cx/ted/blog ) e aurelien ( agateau.com/about-me )
fossfreedom

Risposte:


14

In generale, consiglierei di usare i modi supportati dal toolkit per inserire i menu nella barra dei menu globale ... ma, presumo che sia troppo tardi per convincerti a questo punto :-) Inoltre, noterò che anche se pensavamo che noi Usando Dbusmenu e la registrazione in 12.04 l'obiettivo è quello di passare a GMenuModel e contrassegnare la finestra con i suoi menu entro il 14.04, quindi queste informazioni diventeranno datate. Naturalmente, i plug-in del toolkit verranno aggiornati ;-) (l'ultima volta che ci proverò, lo prometto)

Il principio di base coinvolto è che dobbiamo sapere quali menu sono associati a quale finestra. Tracciamo la finestra usando il suo XID ed i menu sono un percorso al Server Dbusmenu su DBus. Avrai bisogno di entrambe queste informazioni per registrarti. L'interfaccia di registrazione è piuttosto semplice in quanto sostanzialmente si passano entrambe le informazioni al registrar. Il nome noto del registrar su DBus è com.canonical.AppMenu.Registrar .

Per un esempio di come funziona, puoi guardare il codice di esempio mock-json-app che si trova nel menu indicatore-app . Questo è un piccolo strumento che prenderà l'output del file JSON da dbusmenu-dumper (che si trova in libdbusmenu-tools ) e creerà una finestra che afferma di avere quel menu. Gestisce anche cose come il crash del menu, che potrebbe non essere realmente richiesto per la maggior parte delle applicazioni (anche se è davvero importante nello sviluppo :-)).

Per creare un server Dbusmenu basterà semplicemente allocare l'oggetto e dirgli dove apparire su DBus (in modo da poter dare la posizione al registrar). Per plugin come appmenu-gtk usiamo un percorso generato in modo che non ci siano conflitti, ma se controlli l'app puoi probabilmente usare un percorso fisso. Quindi si crea una struttura ad albero di oggetti Dbusmenu Menuitem . Quello principale non viene visualizzato, ma viene passato al server Dbusmenu per avviare i menu. Il primo livello sotto il root verrà mostrato come elementi nella barra dei menu di Ubuntu .

Buona fortuna, grazie a tutte le persone che mi hanno molestato per rispondere a questa domanda. Credo ancora che dovresti usare il supporto del toolkit (ho mentito sull'ultima volta), ma buona fortuna!


1
Grazie mille! E grazie a tutte le persone che ti hanno molestato :-) Per quanto riguarda la domanda del toolkit: Mi piacerebbe usare il supporto del toolkit, ma non ce n'è per Kivy. E non cambierò toolkit solo per il menu ... Il passaggio a GMenuModel renderà impossibile usarlo con altri toolkit?
xubuntix,

GMenuModel renderà più semplice l'upstream in molti toolkit in quanto il supporto è direttamente in GLib, quindi non vi è alcuna dipendenza aggiuntiva, che ha disturbato alcuni manutentori del toolkit.
Ted Gould,

@TedGould Ottima risposta, Ted! Tuttavia, esiste un esempio senza GTK? Qualcosa che è il più vicino possibile usare solo Xlib e nient'altro? L'esempio di mock-json-app che hai dato è fantastico, se si usa Gtk; non tanto se X11 viene utilizzato direttamente (o un altro toolkit). Sto cercando di mettere insieme qualcosa che usa solo Glib, libdbusmenu-glib e X11, ma sembra che io stia correndo dei guai. I miei obiettivi? Sono interessato ad aggiungere supporto in un'app SDL e penso costantemente alle app GNUstep che non hanno il supporto per dbusmenu.
Ivan Vučica,

1
@TedGould Il mio tentativo è finito qui: bitbucket.org/ivucica/minidbus-menu Spero che tu (o qualcun altro!) Avrai qualche minuto per dare un'occhiata al codice e vedere perché il menu non appare e perché il la barra del titolo dice "Hud". :-)
Ivan Vučica,

Sembra che il mio codice C funzioni sotto 12.04. Non avrei dovuto provare ad aggiungere voci autonome al menu; dopo averli aggiunti come elementi secondari di un'altra voce di menu, ora funziona. Cool;)
Ivan Vučica,

0

Sfortunatamente, non troverai un documento amichevole per questo. Il menu globale è stato sviluppato pensando a GTK e Qt e, sebbene teoricamente sia possibile implementare il supporto per altri webkit poiché il protocollo è basato su DBus, ci sono stati pochi sforzi per rendere disponibile la documentazione.

I migliori consigli che posso darti sono i codici sorgente di indicatore-appmenu e plasma-widget-menubar . Puoi leggerli per capire come funziona il protocollo dbus.


1
Potrebbe anche aiutare a ottenere una traccia dbus-monitor della conversazione per alcuni casi rappresentativi? Non so abbastanza su dbusmenu o sul monitoraggio di dbus da sapere, ma mi piacerebbe vedere alcuni esempi da qualcuno che lo fa.
nealmcb,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.