четвер, 11 жовтня 2012 р.

Unity Ubuntu изнутри. Launcher

Речь в статье пойдёт об панели Unity, которая является одновременно доком, панелью задач и называется Unity Launcher.

Unity Launcher
Рекомендованный и поддерживаемый путь по управлению своей иконкой на Launcher состоит в использовании библиотеки libunity. Эта библиотека является обёрткой над низкоуровневым DBus протоколом.

Каждый значок управляется отдельным объектом LauncherEntry. Новый объект LauncherEntry может быть создан с помощью вызова unity_launcher_entry_get_for_desktop_id (char *id);. Id здесь имя файла .desktop. Например evolution управляется "evolution.desktop" или empathy через "empathy.desktop".

LauncherEntry управляет 4 компонентами значка на панели Launcher:

  • Счётчик Count. Счётчик можно установить в нужное значение, вызывая unity_launcher_entry_set_count (UnityLauncherEntry *self, gint64 count);. Отображать счётчик или прятать его можно вызовом unity_launcher_entry_set_count_visible (UnityLauncherEntry *self, gboolean visible).
  • Прогресс Progress. Полосу прогресса для вашей иконки приложения можно установить вызовом unity_launcher_entry_set_progress (UnityLauncherEntry *self, gdouble progress); и сделать видимым unity_launcher_entry_set_progress_visible (UnityLauncherEntry *self, gboolean visible);. Значение прогресса лежит между 0,0 и 1,0
  • Привлечение внимания Urgency. Если вы хотите привлечь внимание пользователя анимацией значка в Launcher, то можете установить булеву переменную urgent и вызвать unity_launcher_entry_set_urgent (UnityLauncherEntry *self, gboolean urgent);
  • Быстрое меню приложения Quicklist. Есть два вида быстрых меню: статические, которые всегда доступны при щелчке правой клавишей мыши на значке, и динамические, которые отображаются уже после запуска приложения.

    Статические Quicklists выводят пункты меню всегда, даже если приложение не запущено.

    Динамические Quicklists дополняют статические пункты полезной для пользователя информацией.

    К примеру, есть программа мгновенных сообщений типа ICQ и у неё будут статичные пункты меню типа "новый разговор" и "добавить новый контакт". Эти пункты важны и нужны постоянно и следовательно будут присутствовать всегда, однако программа может дополнять свой Quicklist новыми пунктами типа "изменить свой статус" и т.д.

    Статические пункты в меню приложения.

    Статичные пункты меню создаются в файле .desktop соответствующего приложения. Формат описан в Action Groups.

    Пример для gnome-screenshot.

    […]
    Actions=Screen;Window;
    [Desktop Action Screen]
    Name=Сделать снимок всего экрана
    Exec=gnome-screenshot
    OnlyShowIn=Unity;
    [Desktop Action Window]
    Name=Сделать снимок текущего окна
    Exec=gnome-screenshot -w
    OnlyShowIn=Unity;
    

    Actions ссылается на Desktop Action. Каждая секция Desktop Action описывает отдельный пункт в быстром меню приложения. В данном примере два пункта Screen и Window.

    В каждом пункте

    • Name= параметр, который будет отображаться и олицетворять пункт меню.
    • Exec= описывает команду, которая будет вызвана при щелчке на данном пункте.
    • OnlyShowIn=Unity рекомендует показывать пункт меню только в Unity.

    Динамические пункты в меню приложения.

    Пункты меню могут быть добавлены к значку программы позднее, во время работы программы. Для создания корневого узла quicklist'а, следует создать его как контейнер и потом добавить к нему дочерние узлы.

    Конечный результат ваших динамических пунктов будет доставлен Unity по шине DBus.

    Элементы быстрого меню могут быть:

    • Textual links.
    • Просто текст без вызова действия.
    • Галочки Select.
    • Альтернативный выбор Radio.
    • Горизонтальный разделитель.

    Быстрое меню приложений Unity Launcher

    Пример.

    from gi.repository import Unity, GObject, Dbusmenu
    loop = GObject.MainLoop()
    # выберем evolution в качестве жертвы
    launcher = Unity.LauncherEntry.get_for_desktop_id("evolution.desktop")
    # Покажем на значке число "сообщений" = 124
    launcher.set_property("count", 124)
    launcher.set_property("count_visible", False)
    # установим прогресс = 42%
    launcher.set_property("progress", 0.42)
    launcher.set_property("progress_visible", True)
    # добавим динамических пунктов меню
    ql = Dbusmenu.Menuitem.new()
    item1 = Dbusmenu.Menuitem.new()
    item1.property_set(Dbusmenu.MENUITEM_PROP_LABEL, "Item 1")
    item1.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
    item2 = Dbusmenu.Menuitem.new()
    item2.property_set(Dbusmenu.MENUITEM_PROP_LABEL, "Item 2")
    item2.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
    ql.child_append(item1)
    ql.child_append(item2)
    launcher.set_property("quicklist", ql)
    def update_urgency():
        if launcher.get_property("urgent"):
            print "removing urgent flag"
            launcher.set_property("urgent", False)
        else:
            print "setting urgent flag"
            launcher.set_property("urgent", True)
        return True
    GObject.timeout_add_seconds(5, update_urgency)
    loop.run()
    

Цикл статей об Unity:
Unity Ubuntu изнутри. Линзы и области.
Unity Ubuntu изнутри. Меню сообщений.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments