Colocando um gtk.Widget arbitrário em um appindicator.Indicator

Colocando um gtk.Widget arbitrário em um appindicator.Indicator

Colocar qualquer gtk.Widget dentro de um gtk.Menu funciona, de certa forma, colocando um gtk.MenuItem vazio primeiro. Não parece ser confiável - mas basicamente funciona. Com um appindicator.Indicator, não funciona. A entrada permanece vazia. Mesmo se você definir child[border_size] como 32, por exemplo.

O único widget que funciona é gtk.Label (mais MenuItem, ImageMenuItem e assim por diante, é claro).

Agora o menu Me tem um gtk.Entry, então certamente deve ser possível fazer isso corretamente. Como eu faço isso?

Aqui está um exemplo de código para explicar o que estou falando:

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

O código acima funciona, mas não:

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

Onde self.menu é um appindicator.Indicator, se fosse um gtk.Menu, a entrada seria pelo menos exibida.

Aqui está um código funcional:

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()

Responder1

O suporte do menu do Application Indicator é baseado em menus D-Bus, que são limitados no que suportam - eles suportam apenas funcionalidades básicas de menu, não coisas mais exóticas, como widgets arbitrários.

Um obstáculo significativo para eles oferecerem suporte a essas coisas é o fato de que o menu do indicador do aplicativo é renderizado por um processo diferente, o processo do indicador do aplicativo, de modo que seu programa não tem acesso para desenhar nada diretamente nele. Superar isso exigiria suporte a algo como X-Embed nos menus D-Bus ou permitir que todo o GTK funcionasse no D-Bus.

Responder2

O indicador de som no Ubuntu possui controles deslizantes de volume e me perguntei como isso é possível. Depois de dar uma olhada no código, parece que existem GtkMenus que podem ser preenchidos via dbus enquanto isso: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Mas não sei como usá-los. Queria escrever um indicador de som onde eu pudesse controlar o volume por aplicativo, assim como o pavucontrol pode fazer.

informação relacionada