Речь в статье пойдёт об панели 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:
- Счётчик 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.
- Горизонтальный разделитель.
Пример.
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 изнутри. Меню сообщений.
Немає коментарів:
Дописати коментар