¿Cómo agregar soporte para el menú global a una aplicación python no-gtk, no-qt?

24

Estoy buscando una buena documentación (un ejemplo, tutorial o guía) sobre cómo agregar soporte de menú global a una aplicación no gtk, no qt. (En gtk funciona 'mágicamente' para el menú principal ...). El kit de herramientas con el que quiero usar esto es kivy , que admite glib-mainloop (por ejemplo, para gstreamer), por lo que, en principio, todo debería funcionar allí.

He visto la referencia API de Dbusmenu y aquí , pero eso no es muy útil para comprender los mecanismos.

Hay un breve ejemplo para crear una lista rápida de lanzador que contiene un menú dbus, pero no para el menú global / appmenu.

Hay una página wiki que no contiene ninguna información relevante aparte de "Sería bienvenido trabajar en el soporte del menú de la aplicación en otros kits de herramientas, pero no es una prioridad para el equipo de DX, se necesita ayuda".

Hay un poco de información en este gráfico del código fuente del indicador-appmenu, pero no es suficiente, no se puede encontrar en developer.ubuntu.com y requiere más explicación:

ingrese la descripción de la imagen aquí

Asi que:

  • ¿Cuál es el procedimiento que muestra un conjunto de elementos de menú (Dbusmenu.Menuitem)?
  • ¿Qué papel juegan el cliente y el servidor? (¿Cuál de esos se supone que debe ejecutarse en mi aplicación? ¿O ambos?)

Pregunta similar

xubuntix
fuente
Tal vez pueda agregar el kit de herramientas que está utilizando.
Timo
seguro: es el kit de herramientas kivy.
xubuntix
1
Creo que esta pregunta necesita una respuesta de canónico.
Tachyons
Inicialmente esperaba que los autores de dbusmenu-glib (por ejemplo, Ted Gould), o incluso libdbusmenu-qt (Aurelien Gateau) pudieran pasar parte de su tiempo escribiendo documentación de su código. Pero después de 4 meses de espera, no pasó nada. Así que probé la segunda mejor opción, tratando de 'sobornar' a la comunidad con algo de mi reputación para intervenir. Parece que esto no funciona tan bien ...
xubuntix
@xubuntix le sugiere contactar a Ted ( gould.cx/ted/blog ) y aurelien ( agateau.com/about-me ) directamente
fossfreedom

Respuestas:

14

En general, recomendaría usar el kit de herramientas para admitir formas de poner menús en la barra de menú global ... pero, supongo que es demasiado tarde para convencerlo en este punto :-) Además, notaré que incluso pensamos que Está utilizando Dbusmenu y el registro en 12.04 el objetivo es pasar a GMenuModel y marcar la ventana con sus menús antes del 14.04, por lo que esta información será fechada. Por supuesto, los complementos del kit de herramientas se actualizarán ;-) (la última vez que lo intentaré, lo prometo)

El principio básico implicado es que necesitamos saber qué menús están asociados con qué ventana. Rastreamos la ventana usando su XID y los menús son una ruta al servidor Dbusmenu en DBus. Necesitará ambas piezas de información para registrarse. La interfaz de registro es bastante simple, ya que básicamente pasa ambas piezas de información al registrador. El nombre bien conocido del registrador en DBus es com.canonical.AppMenu.Registrar .

Para ver un ejemplo de cómo puede funcionar esto, puede consultar el código de muestra de mock-json-app que se encuentra en el menú indicador-aplicación . Esta es una pequeña herramienta que tomará la salida del archivo JSON por dbusmenu-dumper (que está en libdbusmenu-tools ) y creará una ventana que dice tener ese menú. También maneja cosas como el bloqueo del menú de aplicaciones, que podría no ser realmente necesario para la mayoría de las aplicaciones (aunque es realmente importante en el desarrollo :-)).

Para crear un servidor Dbusmenu , básicamente solo necesita asignar el objeto y decirle dónde aparecer en DBus (para que pueda darle la ubicación al registrador). Para complementos como appmenu-gtk , usamos una ruta generada para que no haya conflicto, pero si está controlando la aplicación, probablemente pueda usar una ruta fija. Luego crea una estructura de árbol de objetos Dbusmenu Menuitem . La raíz no se muestra, pero se pasa al servidor Dbusmenu para iniciar los menús. El primer nivel debajo de la raíz se mostrará como elementos en la barra de menús de Ubuntu .

Buena suerte, gracias a todas las personas que me acosaron para responder esta pregunta. Todavía creo que deberías usar el soporte del kit de herramientas (mentí acerca de que era la última vez), ¡pero buena suerte!

Ted Gould
fuente
1
¡Muchas gracias! Y gracias a todas las personas que lo acosaron :-) En cuanto a la pregunta del kit de herramientas: Me encantaría usar el soporte del kit de herramientas, pero no hay ninguno para Kivy. Y no cambiaré los kits de herramientas solo por el menú ... ¿El cambio a GMenuModel hará que sea imposible usarlo con otros kits de herramientas?
xubuntix
GMenuModel facilitará la transmisión en muchos kits de herramientas ya que el soporte está en GLib directamente, por lo que no hay una dependencia adicional, lo que molestó a algunos mantenedores de kits de herramientas.
Ted Gould
@TedGould ¡Gran respuesta, Ted! Sin embargo, ¿hay un ejemplo sin GTK? ¿Algo que esté tan cerca de usar solo Xlib como sea posible, y nada más? El ejemplo de mock-json-app que diste es genial, si uno usa Gtk; no tanto si X11 se usa directamente (u otro kit de herramientas). Estoy tratando de armar algo que use solo Glib, libdbusmenu-glib y X11, pero parece que estoy teniendo problemas. ¿Mis metas? Estoy interesado en agregar soporte en una aplicación SDL, y estoy constantemente pensando en que las aplicaciones GNUstep no tengan soporte para dbusmenu.
Ivan Vučica
1
@TedGould Mi intento está aquí: bitbucket.org/ivucica/minidbus-menu Espero que usted (¡o alguien más!) Tenga unos minutos para echar un vistazo al código y ver por qué el menú no aparece y por qué La barra de título dice "Hud". :-)
Ivan Vučica
Parece que obtuve mi código C para trabajar bajo 12.04. No debería haber intentado agregar elementos independientes al menú; habiéndolos agregado como subpuntos de otro elemento del menú, ahora funciona. Cool;)
Ivan Vučica
0

Desafortunadamente, no encontrará un documento amigable para eso. El menú global se desarrolló con GTK y Qt en mente y, si bien es teóricamente posible implementar soporte para otros kits web ya que el protocolo está basado en DBus, hubo muy poco esfuerzo para hacer que la documentación esté disponible.

Los mejores indicadores que puedo darle son los códigos fuente de indicador-appmenu y plasma-widget-menubar . Puede leerlos para comprender cómo funciona el protocolo dbus.

Marcelo Hashimoto
fuente
1
¿Podría ayudar también obtener un seguimiento de la conversación en el monitor dbus para algunos casos representativos? No sé lo suficiente sobre dbusmenu o la supervisión de dbus para saberlo, pero me encantaría ver algunos ejemplos de alguien que sí lo sabe.
nealmcb