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:
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?)
fuente
Respuestas:
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!
fuente
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.
fuente
Puede usar enlaces de python-dbus y usar la API documentada en http://developer.ubuntu.com/api/ubuntu-12.04/python/Dbusmenu-0.4.html para DbusMenu, para integrarse con la barra de menú global.
fuente