
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.