Como adicionar suporte ao menu global a um aplicativo python não-gtk e não-qt?

24

Estou procurando uma boa documentação (um exemplo, tutorial ou guia) sobre como adicionar suporte de menu global a um aplicativo não-gtk e não-qt. (No gtk, funciona 'magicamente' para o menu principal ...). O kit de ferramentas com o qual quero usar isso é o kivy , que suporta o glib-mainloop (por exemplo, para o gstreamer), portanto, em princípio, todos devem funcionar lá.

Eu vi a referência de API do Dbusmenu e aqui , mas isso não é muito útil para entender os mecanismos.

Há um pequeno exemplo para criar uma lista rápida do iniciador que contém um menu dbus, mas não para o menu global / appmenu.

Existe uma página wiki que não contém nenhuma informação relevante além de "O trabalho de dar suporte ao outro menu de aplicativos em outros kits de ferramentas seria bem-vindo, mas não uma prioridade para a equipe do DX, ajuda".

Há pouca informação neste gráfico do código-fonte do indicador-appmenu, mas não é suficiente, não pode ser encontrada no developer.ubuntu.com e requer mais explicações:

insira a descrição da imagem aqui

Tão:

  • Qual é o procedimento que permite exibir um conjunto de itens de menu (Dbusmenu.Menuitem)?
  • Qual a função do cliente e do servidor? (Qual deles deve ser executado no meu aplicativo? Ou ambos?)

Pergunta semelhante

xubuntix
fonte
Talvez você possa adicionar o kit de ferramentas que está usando.
Timo
certo: é o kit de ferramentas kivy.
Xubuntix
1
Eu acho que essa pergunta precisa de uma resposta canônica.
Tachyons
Inicialmente, eu esperava que os autores do dbusmenu-glib (por exemplo, Ted Gould) ou mesmo do libdbusmenu-qt (Aurelien Gateau) passassem algum tempo escrevendo a documentação de seu código. Mas após 4 meses de espera, nada aconteceu. Então eu tentei a segunda melhor opção, tentando 'suborno' a comunidade com um fiths de minha reputação ao passo parece que isso não funciona tão bem ....
xubuntix
@xubuntix sugere que você entre em contato diretamente com Ted ( gould.cx/ted/blog ) e aurelien ( agateau.com/about-me )
fossfreedom

Respostas:

14

Em geral, eu recomendo usar as maneiras suportadas do kit de ferramentas para colocar menus na barra de menus global ... mas, presumo que seja tarde demais para convencê-lo neste momento :-) Além disso, observarei que até pensamos em usando o Dbusmenu e o registro no 12.04, o objetivo é mudar para o GMenuModel e marcar a janela com seus menus até o 14.04, para que essas informações sejam datadas. Obviamente, os plug-ins do kit de ferramentas serão atualizados ;-) (da última vez que tentarei, prometo)

O princípio básico envolvido é que precisamos saber quais menus estão associados a qual janela. Nós rastreamos a janela usando seu XID e os menus são um caminho para o servidor Dbusmenu no DBus. Você precisará dessas duas informações para se registrar. A interface de registro é bastante simples , pois você basicamente passa essas duas informações ao registrador. O nome conhecido do registrador no DBus é com.canonical.AppMenu.Registrar .

Para um exemplo de como isso pode funcionar, você pode ver o código de amostra mock-json-app que está no menu do indicador-app . Esta é uma pequena ferramenta que pega a saída do arquivo JSON pelo dbusmenu-dumper (que está no libdbusmenu-tools ) e cria uma janela que afirma ter esse menu. Ele também lida com coisas como a falha do menu de aplicativos, que pode não ser realmente necessária para a maioria dos aplicativos (embora seja realmente importante no desenvolvimento :-)).

Para criar um servidor Dbusmenu, você basicamente precisa alocar o objeto e informar onde ele deve aparecer no DBus (para que você possa dar a localização ao registrador). Para plugins como appmenu-gtk , usamos um caminho gerado para que não haja conflito, mas se você estiver controlando o aplicativo, provavelmente poderá usar um caminho fixo. Em seguida, você cria uma estrutura em árvore dos objetos Dbusmenu Menuitem . A raiz não é mostrada, mas é passada ao servidor Dbusmenu para iniciar os menus. O primeiro nível abaixo da raiz será mostrado como itens na barra de menus do Ubuntu .

Boa sorte, obrigado a todas as pessoas que me perseguiram para responder a essa pergunta. Ainda acredito que você deve usar o suporte do kit de ferramentas (menti sobre a última vez), mas boa sorte!

Ted Gould
fonte
1
Muito obrigado! E obrigado a todas as pessoas que o perseguiram :-) Quanto à pergunta do kit de ferramentas: Eu adoraria usar o suporte ao kit de ferramentas, mas o Kivy não existe. E não trocarei kits de ferramentas apenas pelo menu ... A troca para o GMenuModel tornará impossível usá-los com outros kits de ferramentas?
Xubuntix
O GMenuModel facilitará a atualização em muitos kits de ferramentas, já que o suporte está no GLib diretamente, para que não haja uma dependência adicional, o que incomodou alguns mantenedores de kits de ferramentas.
Ted Gould
@TedGould Ótima resposta, Ted! No entanto, existe um exemplo sem GTK? Algo que está tão perto de usar apenas o Xlib quanto possível, e nada mais? O exemplo do mock-json-app que você deu é ótimo, se alguém usa o Gtk; nem tanto se o X11 for usado diretamente (ou outro kit de ferramentas). Estou tentando montar algo que usa apenas Glib, libdbusmenu-glib e X11, mas parece que estou tendo problemas. Os meus objetivos? Estou interessado em adicionar suporte a um aplicativo SDL e estou constantemente pensando em que os aplicativos GNUstep não tenham suporte para o dbusmenu.
Ivan Vučica
1
@TedGould Minha tentativa terminou aqui: bitbucket.org/ivucica/minidbus-menu Espero que você (ou outra pessoa!) Tenha alguns minutos para dar uma olhada no código e ver por que o menu não aparece e por que o titlebar diz "Hud". :-)
Ivan Vučica
Parece que eu tenho meu código C para trabalhar sob 12.04. Eu não deveria ter tentado adicionar itens independentes ao menu; depois de adicioná-los como subitens de outro item de menu, ele agora funciona. Arrefecer;)
Ivan Vučica
0

Infelizmente, você não encontrará um documento amigável para isso. O menu global foi desenvolvido com o GTK e Qt em mente e, embora seja teoricamente possível implementar suporte para outros webkits, já que o protocolo é baseado no DBus, houve muito pouco esforço para disponibilizar a documentação.

Os melhores indicadores que posso fornecer são os códigos-fonte do menu de aplicativos indicadores e a barra de menus de widgets de plasma . Você pode ler aqueles para entender como o protocolo dbus funciona.

Marcelo Hashimoto
fonte
1
Também pode ajudar a rastrear a conversa no monitor dbus para alguns casos representativos? Não sei o suficiente sobre o dbusmenu ou o monitoramento do dbus para saber, mas adoraria ver alguns exemplos de alguém que o faça.
Nealmcb 26/03/12