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

18

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

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

Agora, o Menu Me possui um gtk.Entry, portanto 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 isso não funciona:

    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 de trabalho:

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
fonte
Como o @MarcoCeppi me lembrou, sim - isso não deveria funcionar. Só estou esperando e sonhando, talvez possa. Como o menu Me faz algo aparentemente semelhante.
Stefano Palazzo
11
Tenho certeza de que o Menu Me faz uso da libido (Objetos de exibição do indicador) para fazer isso. Consulte: launchpad.net/ido Em particular, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). Infelizmente, não acho que haja ligações python. Você pode perguntar na lista de e-mails ayatana-dev.
precisa saber é o seguinte
Você descobriu como fazer isso? Estou enfrentando o mesmo problema. Obrigado.
22413 Benjamin Benjamin

Respostas:

7

O suporte ao menu Indicador de Aplicação é baseado nos menus D-Bus, que são limitados no que suportam - eles suportam apenas a funcionalidade básica do menu, não coisas mais exóticas, como widgets arbitrários.

Um obstáculo significativo para que eles sempre apóiam essas coisas é o fato de o menu do indicador de aplicativo ser processado por um processo diferente, o processo do indicador de aplicativo, para que seu programa não tenha acesso para desenhar diretamente algo nele. Para superar isso, seria necessário oferecer suporte a algo como X-Embed nos menus do D-Bus ou permitir que todo o GTK trabalhasse no D-Bus.

Michael Ekstrand
fonte
2

O indicador de som no Ubuntu tem controles deslizantes para o volume e me perguntei como isso é possível. Depois de 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 eu não sei como usá-los. Queria escrever um indicador de som em que eu possa controlar o volume por aplicativo, assim como o pavucontrol.

c_korn
fonte