Помещение произвольного gtk.Widget в appindicator.Indicator

18

Помещение любого gtk.Widget в gtk.Menu работает, в некотором смысле, сначала помещая пустой gtk.MenuItem. Это не кажется надежным - но в основном это работает. С appindicator.Indicator это не работает. Запись просто остается пустой. Даже если вы установите для дочернего элемента [border_size] значение 32, например.

Единственный работающий виджет - это gtk.Label (плюс, конечно, MenuItem, ImageMenuItem и так далее).

Теперь в Me Me есть gtk.Entry, поэтому должно быть возможно сделать это правильно. Как это сделать?

Вот пример кода, чтобы объяснить, о чем я:

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

Приведенный выше код работает, однако это не так:

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

Где self.menu является appindicator.Indicator, если бы это было gtk.Menu, запись будет отображаться по крайней мере.

Вот некоторый рабочий код:

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()
Стефано Палаццо
источник
Как @MarcoCeppi напомнил мне, да - это не должно работать. Я просто надеюсь и мечтаю, может быть, это возможно. Поскольку Me Me делает что-то похожее.
Стефано Палаццо
1
Я почти уверен, что в Me Me для этого используется либидо (объекты отображения индикатора). См .: launchpad.net/ido В частности, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). К сожалению, я не думаю, что есть привязки Python. Вы можете спросить в списке рассылки аятана-dev.
Andrewsomething
Вы узнали, как это сделать? Я сталкиваюсь с той же проблемой. Благодарю.
Бенджамин

Ответы:

7

Поддержка меню Application Indicator основана на меню D-Bus, которые ограничены в том, что они поддерживают - они поддерживают только базовые функции меню, а не более экзотические вещи, такие как произвольные виджеты.

Одним из существенных препятствий для тех, кто когда-либо поддерживал такие вещи, является тот факт, что меню индикаторов приложения отображается другим процессом, процессом индикатора приложения, поэтому ваша программа не имеет доступа, чтобы напрямую что-либо рисовать на нем. Преодоление этого потребовало бы либо поддержки чего-то вроде X-Embed в меню D-Bus, либо разрешения всем GTK работать через D-Bus.

Майкл Экстранд
источник
2

У звукового индикатора в Ubuntu есть ползунки для регулировки громкости, и я подумал, как это возможно. После просмотра кода кажется, что GtkMenus можно заполнить через dbus: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Но я не знаю, как их использовать. Хотел написать звуковой индикатор, чтобы я мог контролировать громкость для каждого приложения, как это делает pavucontrol.

c_korn
источник