Umieszczanie arbitralnego gtk.Widget w appindicator.Indicator

18

Umieszczanie dowolnego gtk.Widget wewnątrz gtk.Menu działa nieco przez umieszczenie najpierw pustego gtk.MenuItem. Nie wydaje się być wiarygodny - ale w zasadzie działa. Z appindicator.Indicator nie działa. Wpis pozostaje pusty. Nawet jeśli na przykład ustawisz wartość child [border_size] na 32.

Jedynym działającym widżetem jest gtk.Label (plus MenuItem, ImageMenuItem itd.).

Teraz menu Me ma gtk. Wpisz, więc na pewno trzeba to zrobić poprawnie. Jak mam to zrobić?

Oto przykładowy kod wyjaśniający, o czym mówię:

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

Powyższy kod działa, ale to nie działa:

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

Gdzie self.menu jest aplikatorem. Wskaźnik, gdyby był gtk.Menu, Wpis byłby przynajmniej wyświetlany.

Oto działający kod:

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
źródło
Jak przypomniał mi @MarcoCeppi, tak - to nie powinno działać. Mam tylko nadzieję i marzę, może tak. Ponieważ Me Menu robi coś na pozór podobnego.
Stefano Palazzo
1
Jestem prawie pewien, że Me Menu wykorzystuje do tego libido (Indicator Display Objects). Zobacz: launchpad.net/ido w szczególności idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/... ). Niestety nie sądzę, że istnieją powiązania w języku Python. Możesz zapytać na liście e-mail ayatana-dev.
andrewsomething
Czy wiesz, jak to zrobić? Mam ten sam problem. Dzięki.
Benjamin

Odpowiedzi:

7

Obsługa menu wskaźnika aplikacji opiera się na menu D-Bus, które są ograniczone w tym, co obsługują - obsługują tylko podstawowe funkcje menu, a nie bardziej egzotyczne rzeczy, takie jak arbitralne widżety.

Jedną ze znaczących przeszkód dla nich, które kiedykolwiek wspierają takie rzeczy, jest fakt, że menu wskaźnika aplikacji jest renderowane przez inny proces, proces wskaźnika aplikacji, więc twój program nie ma dostępu do bezpośredniego rysowania na nim niczego. Przezwyciężenie tego wymagałoby albo wsparcia czegoś takiego jak X-Embed w menu D-Bus lub umożliwienia wszystkim GTK pracy z D-Bus.

Michael Ekstrand
źródło
2

Wskaźnik dźwięku w Ubuntu ma suwaki głośności i zastanawiałem się, jak to możliwe. Po przejrzeniu kodu wydaje się, że istnieje GtkMenus, który tymczasem można wypełnić za pomocą dbus: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Ale nie wiem jak ich używać. Chciałem napisać wskaźnik dźwiękowy, w którym mogę kontrolować głośność aplikacji, tak jak pavucontrol może to zrobić.

c_korn
źródło