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:
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?)
fonte
Respostas:
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!
fonte
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.
fonte
Você pode usar ligações python-dbus e a API documentada em http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.html para DbusMenu, para integrar-se à barra de menus global.
fonte