Как написать индикатор системы Unity в Python?

56

История:

  • Это НЕ для индикаторов приложений , но системных индикаторов .

    Изображение из: Ссылка

  • Цель состоит в том, чтобы показать индикатор-sysmonitor в экранах Greeter / Lock / Ubiquity. В работе есть:

    Как сделать индикатор-sysmonitor в качестве индикатора по умолчанию на экране входа в систему

C Оригинальный код: (работает нормально)

  • Я уже получил работу на языке C, см. мой другой вопрос:

    Как разработать системный индикатор для единства?

    Однако, indicator-sysmonitor уже разработано на Python так же, как и многие другие индикаторы приложения. Мне не нравится идея, что разработчики обязаны переносить свои проекты на C или писать прокси-сервер Python-C, если они хотят показать индикатор в экранах greeter / lock / ubiquity. Вместо этого, создание индикатора-sysmonitor создает системный индикатор непосредственно из python, было бы лучшим решением (без обходных решений, и это будет общее решение для всех проектов python, которые в настоящее время используют appindicator).

Код Python: (Мое неудачное пробу для того, чтобы передать код c на python)

  • Я пытаюсь перенести его на Python. Вот мой текущий код, который не работает. Он создает объект DBus для обоих меню & amp; Действия. Он указан в плагине индикаторов XFCE. Но не показано на панели.

    /usr/lib/indicator-test/indicator-test-service

    #!/usr/bin/python2
    
    import os
    import sys
    
    import gi
    from gi.repository import Gio, GLib
    
    APPLICATION_ID = 'local.sneetsher.indicator.test'
    DBUS_MENU_PATH = '/local/sneetsher/indicator/test/desktop'
    DBUS_ACTION_PATH = '/local/sneetsher/indicator/test'
    
    def callback():
        print ok
    
    def quit_callback(notification, loop):
        global connection
        global exported_action_group_id
        global exported_menu_model_id
    
        connection.unexport_action_group (exported_action_group_id)
        connection.unexport_menu_model (exported_menu_model_id)
    
        loop.quit()
    
    def cancel (notification, action, data):
        if action == "cancel":
            print "Cancel"
        else:
            print "That should not have happened (cancel)!"
    
    def bus_acquired(bus, name):
        # menu
        submenu = Gio.Menu()
        submenu.append("Show", "show")
        item = Gio.MenuItem.new(None, "_header")
        item.set_attribute([("x-canonical-type","s","com.canonical.indicator.root")])
        item.set_submenu(submenu)
        menu = Gio.Menu()
        menu.append_item (item)
    
        actions = Gio.SimpleActionGroup.new()
        action1 = Gio.SimpleAction.new("_header", None)
        actions.insert(action1)
        action2 = Gio.SimpleAction.new('show', None)
        actions.insert(action2)
        action2.connect("activate",callback)
    
        global connection
        connection = bus
    
        global exported_action_group_id
        exported_action_group_id = connection.export_action_group(DBUS_ACTION_PATH, actions)
    
        global exported_menu_model_id
        exported_menu_model_id = connection.export_menu_model(DBUS_MENU_PATH, menu)
    
    def setup ():
        #bus connection
        Gio.bus_own_name(Gio.BusType.SESSION, APPLICATION_ID, 0, bus_acquired, None, None)
    
    if __name__ == '__main__':
    
        connection = None
        exported_menu_model_id = 0
        exported_action_group_id = 0
        password = ""
    
        loop = GLib.MainLoop()
        setup ()
    
        loop.run()
    

    local.sneetsher.indicator.test

    [Indicator Service]
    Name=indicator-test
    ObjectPath=/local/sneetsher/indicator/test
    
    [desktop]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    
    [desktop_greeter]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    
    [desktop_lockscreen]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    

    local.sneetsher.indicator.test.service

    [D-BUS Service]
    Name=local.sneetsher.indicator.test
    Exec=/usr/lib/indicator-test/indicator-test-service
    

    90_unity-greeter.gschema.override

    [com.canonical.unity-greeter]
    indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'local.sneetsher.indicator.test', 'application']
    

Вопрос:

Я ожидаю, почему я не создал структуру меню или его мета (псевдо-элементы, такие как _header ), как они есть в исходном коде C.

Может ли кто-нибудь создать рабочий порт этого кода системного индикатора в C на Python?

    
задан user.dz 14.06.2016 в 13:21
источник

0 ответов