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

24

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

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

Existe um pequeno exemplo para criar uma lista rápida de lançadores 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 diferente de "Trabalhar no suporte a outro menu do aplicativo em outros kits de ferramentas seriam bem-vindos, mas não uma prioridade para a equipe de DX, ajuda desejada. "

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

Então:

  • Qual é o procedimento que obtém um conjunto de itens de menu (Dbusmenu.Menuitem) a serem exibidos?
  • Qual papel o cliente e o servidor desempenham? (Qual desses deve ser executado no meu aplicativo? Ou ambos?)

Questão semelhante

    
por xubuntix 26.01.2012 / 12:43

3 respostas

14

Em geral, eu recomendo usar as maneiras suportadas pelo kit de ferramentas para colocar menus na barra de menu global ... mas, estou assumindo que é tarde demais para convencê-lo neste ponto :-) Além disso, vou observar que Mesmo achando que estamos usando o Dbusmenu e o registro em 12.04, o objetivo é passar para o GMenuModel e marcar a janela com seus menus por 14.04, então essa informação será datada. É claro, os plug-ins do kit de ferramentas serão atualizados ;-) (da última vez eu 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 é bem simples em que você basicamente passa essas duas informações para o registrador. O nome conhecido do registrador no DBus é com.canonical.AppMenu.Registrar .

Para um exemplo de como isso pode funcionar, você pode olhar para o mock-json-app sample code que está em indicador-appmenu . Esta é uma pequena ferramenta que pegará a saída do arquivo JSON do dbusmenu-dumper (que está em libdbusmenu-tools ) e fazer uma janela que diz ter esse menu. Ele também lida com coisas como o appmenu falhando, o que pode não ser realmente necessário para a maioria das aplicações (embora seja realmente importante no desenvolvimento :-)).

Para criar um Servidor Dbusmenu basicamente você só precisa para alocar o objeto e dizer onde ele deve aparecer no DBus (para que você possa fornecer o local ao registrador). Para plugins como appmenu-gtk usamos um caminho gerado para que não haja conflito, mas se você estiver controlando o aplicativo, você pode provavelmente use um caminho fixo. Então você cria uma estrutura em árvore de objetos Dbusmenu Menuitem . A raiz não é mostrada, mas é passou para o 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 assediaram para responder a esta pergunta. Eu ainda acredito que você deveria usar o suporte do kit de ferramentas (eu menti sobre ser a última vez), mas boa sorte!

    
por Ted Gould 20.05.2012 / 19:50
0

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

Os melhores indicadores que posso dar são os códigos-fonte do indicador-appmenu e plasma-widget-menubar . Você pode lê-los para entender como o protocolo dbus funciona.

    
por Marcelo Hashimoto 27.01.2012 / 23:05
0

Você pode usar ligações python-dbus e usar a API documentada no link para DbusMenu, para integrar com a barra de menu global.

    
por dobey 18.05.2012 / 18:11