Jak dodać obsługę globalnego menu do aplikacji w języku Python non-gtk, non-qt?

24

Szukam dobrej dokumentacji (przykład, samouczek lub przewodnik) na temat dodawania obsługi menu globalnego do aplikacji innej niż gtk i innej niż qt. (W gtk działa „magicznie” dla menu głównego ...). Zestaw narzędzi, z którym chcę tego używać, to kivy , który obsługuje glib-mainloop (np. Dla gstreamer), więc w zasadzie wszystko powinno tam działać.

Widziałem odniesienie API Dbusmenu i tutaj , ale to nie jest bardzo pomocne dla zrozumienia mechanizmów.

Istnieje krótki przykład tworzenia szybkiej listy programu uruchamiającego, która zawiera menu dbus, ale nie dla menu globalnego / menu aplikacji.

Istnieje strona wiki , która nie zawiera żadnych istotnych informacji innych niż „Praca nad obsługą innych menu aplikacji na innych zestawach narzędzi byłaby mile widziana, ale nie jest priorytetem dla zespołu DX, potrzebna pomoc”.

Na tej grafice znajduje się trochę informacji z kodu źródłowego wskaźnika-menu aplikacji, ale to za mało, nie można znaleźć na developer.ubuntu.com i wymaga dodatkowych wyjaśnień:

wprowadź opis zdjęcia tutaj

Więc:

  • Jaka jest procedura wyświetlania zestawu pozycji menu (Dbusmenu.Menuitem)?
  • Jaką rolę odgrywa klient i serwer? (Który z nich powinien być uruchamiany w mojej aplikacji? Lub obu?)

Podobne pytanie

xubuntix
źródło
Może możesz dodać zestaw narzędzi, którego używasz.
Timo
pewnie: to zestaw narzędzi Kivy.
xubuntix
1
Myślę, że to pytanie wymaga odpowiedzi kanonicznej.
Tachyons,
Początkowo miałem nadzieję, że autorzy dbusmenu-glib (np. Ted Gould), a nawet libdbusmenu-qt (Aurelien Gateau) mogą poświęcić trochę czasu na pisanie dokumentacji swojego kodu. Ale po 4 miesiącach oczekiwania nic się nie stało. Wypróbowałem więc drugą najlepszą opcję, próbując „przekupić” społeczność z faktem mojej reputacji, aby wkroczyła. Wydaje się, że to również nie działa ...
xubuntix
@xubuntix sugeruje bezpośredni kontakt z Tedem ( gould.cx/ted/blog ) i aurelien ( agateau.com/about-me )
fossfreedom

Odpowiedzi:

14

Ogólnie polecam korzystanie z obsługiwanych przez zestaw narzędzi sposobów umieszczania menu w globalnym pasku menu ... ale zakładam, że jest już za późno, aby cię przekonać :-) Ponadto zauważę, że nawet myślałem, że 'używam Dbusmenu i rejestracji w 12.04 celem jest przejście do GMenuModel i oznaczenie okna z menu do 14.04, więc ta informacja zostanie opatrzona datą. Oczywiście wtyczki zestawu narzędzi zostaną zaktualizowane ;-) (ostatni raz spróbuję, obiecuję)

Podstawową zasadą jest to, że musimy wiedzieć, jakie menu są powiązane z którym oknem. Śledzimy okno za pomocą jego XID, a menu są ścieżką do serwera Dbusmenu na DBus. Będziesz potrzebował obu tych informacji, aby się zarejestrować. Interfejs rejestracji jest dość prosty, ponieważ zasadniczo przekazujesz oba te informacje do rejestratora. Znaną nazwą rejestratora w DBus jest com.canonical.AppMenu.Registrar .

Na przykład, jak to może działać, możesz spojrzeć na przykładowy kod mock-json-app, który znajduje się w menu wskaźnikowym . Jest to małe narzędzie, które pobierze dane wyjściowe pliku JSON przez dbusmenu-dumper (który znajduje się w libdbusmenu-tools ) i utworzy okno, które twierdzi, że ma to menu. Obsługuje także takie awarie menu aplikacji, które mogą nie być tak naprawdę wymagane w większości aplikacji (choć jest to bardzo ważne w rozwoju :-)).

Aby utworzyć serwer Dbusmenu , wystarczy po prostu przydzielić obiekt i powiedzieć mu, gdzie ma się pojawić na DBusie (abyś mógł podać lokalizację rejestratorowi). W przypadku wtyczek takich jak appmenu-gtk używamy wygenerowanej ścieżki, aby nie było konfliktu, ale jeśli kontrolujesz aplikację, prawdopodobnie możesz użyć stałej ścieżki. Następnie tworzysz strukturę drzewa obiektów Dbusmenu Menuitem . Główny nie jest pokazany, ale jest przekazywany do serwera Dbusmenu w celu uruchomienia menu. Pierwszy poziom poniżej katalogu głównego będzie wyświetlany jako elementy w menu Ubuntu Menubar .

Powodzenia dzięki wszystkim osobom, które mnie nękały, aby odpowiedzieć na to pytanie. Nadal uważam, że powinieneś skorzystać ze wsparcia zestawu narzędzi (kłamałem, że to ostatni raz), ale powodzenia!

Ted Gould
źródło
1
Dziękuję Ci bardzo! I dzięki wszystkim osobom, które cię nękały :-) Co do pytania o zestaw narzędzi: Chciałbym skorzystać z obsługi zestawu narzędzi, ale Kivy nie ma takiego. I nie zamienię zestawów narzędzi tylko dla menu ... Czy przejście na GMenuModel uniemożliwi korzystanie z innych zestawów narzędzi?
xubuntix
GMenuModel ułatwi upstream w wielu zestawach narzędzi, ponieważ obsługa jest bezpośrednio w GLib, więc nie ma dodatkowej zależności, która przeszkadzałaby niektórym opiekunom zestawu narzędzi.
Ted Gould,
@TedGould Świetna odpowiedź, Ted! Czy jest jednak przykład bez GTK? Coś, co jest tak blisko korzystania z Xlib, jak to możliwe, i nic więcej? Podany przykład makiety-json-app jest świetny, jeśli używa się Gtk; nie tyle, jeśli X11 jest bezpośrednio używany (lub inny zestaw narzędzi). Próbuję stworzyć coś, co używa tylko Glib, libdbusmenu-glib i X11, ale wygląda na to, że mam kłopoty. Moje cele? Jestem zainteresowany dodaniem obsługi w aplikacji SDL i ciągle myślę o tym, że aplikacje GNUstep nie mają obsługi dbusmenu.
Ivan Vučica,
1
@TedGould Moja próba jest tutaj: bitbucket.org/ivucica/minidbus-menu Mam nadzieję, że ty (lub ktoś inny!) Będziesz miał kilka minut, aby spojrzeć na kod i zobaczyć, dlaczego menu się nie pojawia i dlaczego pasek tytułu mówi „Hud”. :-)
Ivan Vučica,
Wygląda na to, że mój kod C działa poniżej 12.04. Nie powinienem był próbować dodawać samodzielnych pozycji do menu; po dodaniu ich jako podelementów innego elementu menu, teraz działa. Fajnie;)
Ivan Vučica
0

Niestety nie znajdziesz na to przyjaznego dokumentu. Menu globalne zostało opracowane z myślą o GTK i Qt i chociaż teoretycznie możliwe jest wdrożenie obsługi innych zestawów internetowych, ponieważ protokół jest oparty na DBus, udostępnienie dokumentacji było bardzo niewielkie.

Najlepsze wskaźniki, jakie mogę ci podać, to kody źródłowe wskaźnika-menu i paska narzędzi widgetu plazmy . Możesz je przeczytać, aby zrozumieć, jak działa protokół dbus.

Marcelo Hashimoto
źródło
1
Czy może to również pomóc w uzyskaniu śledzenia rozmowy dbus-monitor dla niektórych reprezentatywnych przypadków? Nie wiem wystarczająco dużo o dbusmenu lub monitorowaniu dbus, ale chciałbym zobaczyć kilka przykładów od kogoś, kto to wie.
nealmcb