Reply to comment

Несколько одинаковых виджетов в hildon

На рабочем столе N900's можно разместить несколько одинаковых виджетов, но эта функция почти не документирована. По крайней мере найти такую документацию мне не удалось. Ну а так, как такое поведение необходимо для ussd-widget, который я пишу, пришлось сделать небольшое исследование. GoAwayStupidAI в своем сообщении упомянул, что можно изменить .desktop файл так, чтобы hildon позволял добавить на рабочий стол несколько одинаковых виджетов. Просто добавьте
X-Multiple=true
к нему. Например, для 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 она есть.

Reply

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>. The supported tag styles are: <foo>, [foo].

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.