Речь в статье пойдёт об панели Unity, которая является одновременно доком, панелью задач и называется 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:
Статические 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.
В каждом пункте
Динамические пункты в меню приложения.
Пункты меню могут быть добавлены к значку программы позднее, во время работы программы. Для создания корневого узла quicklist'а, следует создать его как контейнер и потом добавить к нему дочерние узлы.
Конечный результат ваших динамических пунктов будет доставлен Unity по шине DBus.
Элементы быстрого меню могут быть:
Пример.
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 изнутри. Меню сообщений.