На рабочем столе N900's можно разместить несколько одинаковых виджетов, но эта функция почти не документирована. По крайней мере найти такую документацию мне не удалось. Ну а так, как такое поведение необходимо для
ussd-widget, который я пишу, пришлось сделать небольшое исследование.
GoAwayStupidAI в
своем сообщении упомянул, что можно изменить .desktop файл так, чтобы hildon позволял добавить на рабочий стол несколько одинаковых виджетов. Просто добавьте
к нему. Например, для ussd-widget этот файл будет выглядеть так:
/usr/share/applications/hildon-home/ussd-widget.desktop
[Desktop Entry]
Name=Ussd widget
Comment=Shows result of USSD query
Type=python
X-Path=ussd-widget.py
X-Multiple=true
Хорошо, теперь пользователь может добавлять несколько виджетов, но толку от этого мало, так как они будут совершенно одинаковыми (если конечно не делают чего-либо случайным образом). Так что нам нужен способ различать экземпляры виджетов. Поиски в google привели меня вот к этой фукции в исходниках hildon:
hd_home_plugin_item_get_applet_id(). В python она реализована как get_applet_id() меотд виджета.
[OFFTOP] Между прочим, в коде есть замечательный doxygen комментарии,
почему по ним никто не сгенерировал документацию? Мне очень нравится документация на QT, все в собрано воедино и можно находить ответы на вопросы очень быстро.
Если все, что нужно сделать, это натравить doxygen на исходники hildon и выложить это куда-то, зачем использовать wiki? Wiki
никогда не будет поспевать за изменениямив исходниках.
Хорошо, документация нашлась. По какой-то мистической причине google предпочитает находить чейнджлоги git и кучу всякого мусора вместо нее.[/OFFTOP]
Но когда я попытался воспользоваться этим методом, программа вывалилась с ошибкой сегментирования. Оказывается, во время работы конструктора виджета (а именно там обычно делается вся инициализация) идентификатор еще не инициализирован. Это означает, что
в конструкторе можно делать только инициализацию, свойственную для всех экземпляров виджета. В качестве обходного маневра пришлось искать метод, который бы выполнялся после инициализации идентификатора, но до того, как пользователь сможет воспользоваться виджетом. Я выбрал do_show, так как если виджет спрятан, то и пользоваться им нельзя.
def __init__(self):
self.ready = False
def do_show(self):
if not self.ready:
# Получаем идентификатор
id = self.get_applet_id()
# Используем его для инициализации, специфичной для каждого экземпляра
#...
# не забудте вызвать родительские do_show
hildondesktop.HomePluginItem.do_show(self)
Если есть лучшие идеи, пишите.
Ну а когда извесен идентификатор, задача становится тривиальной. Используйте его в именах конфигурационных файлов или в именах секций внутри них. Имея различные настройки для разных экземпляров позволит им иметь различное поведение.
Идентификаторы представляют из себя строки вида <имя виджета>.desktop-<номер экземпляра>. В моем случае, певый экземпляр получит ussd-widget.desktop-0, следующий ussd-widget.desktop-1. Если пользователь удалит виджеты с экрана, нумерация снова начинается с 0. Так что, по хорошему, нужно еще корректно обрабатывать событие удаления виджета, чтобы пользователь мог удалить произвольный, а не только последний, но сейчас я не хочу с этим связываться.
P.S. Кстати, виджеты могут менять размеры, благодаря GTK. Но виджет должен реализовать поддержку этого самостоятельно. В
ussd-widget она есть.