Poner un gtk.Widget arbitrario en un appindicator.Indicator

18

Poner cualquier gtk.Widget dentro de un gtk.Menu funciona, de alguna manera, colocando un gtk.MenuItem vacío primero. No parece ser confiable, pero básicamente funciona. Con un appindicator.Indicator, no funciona. La entrada solo permanece vacía. Incluso si configura el elemento secundario [border_size] en 32, por ejemplo.

El único widget que funciona es un gtk.Label (más el MenuItem, ImageMenuItem, etc., por supuesto).

Ahora el menú Me tiene un gtk. Ingrese, por lo que seguramente debe ser posible hacerlo correctamente. ¿Cómo lo hago?

Aquí hay un código de ejemplo para explicar de qué estoy hablando:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Label("hello world!"))
    self.menu.append(self.item)

El código anterior funciona, sin embargo, esto no:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Entry())
    self.menu.append(self.item)

Donde self.menu es un appindicator.Indicator, si se tratara de un gtk.Menu, al menos se mostrará la entrada.

Aquí hay un código de trabajo:

import gtk
import appindicator

class AppIndicator (object):

    def __init__(self):
        self.ind = appindicator.Indicator("hello world client",
            "distributor-logo", appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status (appindicator.STATUS_ACTIVE)
        self.menu = gtk.Menu()
        item = gtk.MenuItem()

        item.add(gtk.Label("hello world"))
        # item.add(gtk.Entry())

        self.menu.append(item)
        self.menu.show_all()
        self.ind.set_menu(self.menu)


indicator = AppIndicator()
gtk.main()
Stefano Palazzo
fuente
Como me recordó @MarcoCeppi, sí, no se supone que esto funcione. Solo estoy esperando y soñando, tal vez pueda. Dado que el menú Me hace algo aparentemente similar.
Stefano Palazzo
1
Estoy bastante seguro de que el menú Me utiliza libido (objetos de visualización de indicadores) para hacerlo. Ver: launchpad.net/ido En particular, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). Desafortunadamente, no creo que haya enlaces de python. Es posible que desee preguntar en la lista de correo electrónico de ayatana-dev.
andrewsomething
¿Descubriste cómo hacer esto? Estoy enfrentando el mismo problema. Gracias.
Benjamin

Respuestas:

7

El soporte del menú Indicador de aplicación se basa en los menús de D-Bus, que son limitados en lo que admiten: solo admiten la funcionalidad básica del menú, no cosas más exóticas como widgets arbitrarios.

Un obstáculo significativo para ellos que alguna vez apoyan tales cosas es el hecho de que el menú del indicador de la aplicación se representa mediante un proceso diferente, el proceso del indicador de la aplicación, por lo que su programa no tiene acceso para dibujar directamente nada en él. Superar esto requeriría admitir algo como X-Embed en los menús de D-Bus o permitir que todo GTK funcione sobre D-Bus.

Michael Ekstrand
fuente
2

El indicador de sonido en Ubuntu tiene controles deslizantes para el volumen y me preguntaba cómo es posible. Después de echar un vistazo al código, parece que hay GtkMenus que se puede llenar a través de dbus mientras tanto: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Pero no sé cómo usarlos. Quería escribir un indicador de sonido donde pueda controlar el volumen por aplicación al igual que pavucontrol puede hacerlo.

c_korn
fuente