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

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

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

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

Теперь в меню 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()

решение1

Поддержка меню индикатора приложения основана на меню 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.

Связанный контент