Mettre un gtk.Widget arbitraire dans un appindicator.Indicator

18

Mettre n'importe quel gtk.Widget à l'intérieur d'un gtk.Menu fonctionne, en quelque sorte, en mettant un gtk.MenuItem vide en premier. Cela ne semble pas fiable - mais cela fonctionne essentiellement. Avec un indicateur, l'indicateur ne fonctionne pas. L'entrée reste simplement vide. Même si vous définissez l'enfant [border_size] sur 32, par exemple.

Le seul widget qui fonctionne est un gtk.Label (plus le MenuItem, ImageMenuItem et ainsi de suite bien sûr).

Maintenant, le menu Me a un gtk.Entry dedans, donc il doit sûrement être possible de le faire correctement. Comment fait-on ça?

Voici un exemple de code pour expliquer de quoi je parle:

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

Le code ci-dessus fonctionne, mais cela ne fonctionne pas:

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

Où self.menu est un appindicator.Indicator, s'il s'agissait d'un gtk.Menu, l'entrée serait au moins affichée.

Voici un code de travail:

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
la source
Comme @MarcoCeppi me l'a rappelé, oui - cela n'est pas censé fonctionner. J'espère et je rêve, peut-être. Puisque le menu Me fait quelque chose d'apparemment similaire.
Stefano Palazzo
1
Je suis à peu près sûr que le menu Moi utilise la libido (objets d'affichage d'indicateur) pour ce faire. Voir: launchpad.net/ido En particulier, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). Malheureusement, je ne pense pas qu'il existe de liaisons python. Vous voudrez peut-être demander sur la liste de diffusion ayatana-dev.
andrewsomething
Avez-vous trouvé comment procéder? Je fais face au même problème. Merci.
Benjamin

Réponses:

7

La prise en charge du menu Indicateur d'application est basée sur les menus D-Bus, qui sont limités dans ce qu'ils prennent en charge - ils ne prennent en charge que les fonctionnalités de menu de base, pas des choses plus exotiques telles que des widgets arbitraires.

Un obstacle important à leur prise en charge de telles choses est le fait que le menu d'indicateur d'application est rendu par un processus différent, le processus d'indicateur d'application, de sorte que votre programme n'a pas accès pour dessiner directement quoi que ce soit dessus. Pour surmonter cela, il faudrait soit prendre en charge quelque chose comme X-Embed dans les menus D-Bus, soit permettre à GTK de fonctionner sur D-Bus.

Michael Ekstrand
la source
2

L'indicateur de son dans Ubuntu a des curseurs pour le volume et je me demandais comment c'était possible. Après un coup d'œil dans le code, il semble qu'il existe des menus Gtk qui peuvent être remplis via dbus en attendant: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Mais je ne sais pas comment les utiliser. Je voulais écrire un indicateur sonore où je peux contrôler le volume par application, tout comme pavucontrol peut le faire.

c_korn
la source