Создание апплета GNOME

       

Регистрация апплета в панели GNOME


Если выше был обычный Python-код, с некоторой PyGTK-спецификой, то сейчас будет сплошная магия ;) Это, кстати, одна из слабых сторон GNOME-Python - отсутствие систематической документации (для gnomeapplet вообще никакой документации нет, за исключением пары примеров и вышеупомянутой "методички"). К примеру, при регистрации апплета вызывается функция applet_bonobo_factory, однако нигде не упоминается, какие параметры в нее передаются. Чтобы узнать это, нужно лезть в исходные тексты. Я, конечно, понимаю, что "Use code, Luke!", но все же качество документации по PyGTK в целом хромает (например, сплошь и рядом в документации рекомендуются методы, которые уже пару версий назад как уже объявлены устаревшими).

Общая идеология регистрации апплета такова:

описываем мета-информацию в специальном .server файле

в апплете вызываем специальный интерфейс

Вначале закончу дело с кодом апплета:

def run_in_panel(): gnomeapplet.bonobo_factory("OAFIID:GNOME_AppletSkeleton_Factory", GnomeAppletSkeleton.__gtype__, "Applet skeleton", "0", applet_factory)

это и есть вызов "специального интерфейса". Параметры такие: IID (уникальный идентификатор сервиса в GNOME), тип (это остатки C-природы GTK, тип GObject), имя, версия, callback-функция.

Теперь, что касается "описания мета-информации". Пишем следующий XML (он для всех апплетов будет идентичным, специфичные для моего апплета данные я выделил полужирным):

<oaf_info>

<oaf_server iid="OAFIID:GNOME_AppletSkeleton_Factory" type="exe" location="/usr/local/lib/pygnomeapplet/applet_skeleton.py">

<oaf_attribute name="repo_ids" type="stringv"> <item value="IDL:Bonobo/GenericFactory:1.0" /> <item value="IDL:Bonobo/Unknown:1.0" />

</oaf_attribute> <oaf_attribute name="name" type="string" value="Applet skeleton factory" /> <oaf_attribute name="name-ru" type="string" value="Фабрика скелета апплета" />




<oaf_attribute name="description" type="string" value="Factory of simple applet skeleton" /> <oaf_attribute name="description-ru" type="string" value="Фабрика скелета простейшего апплета" />

</oaf_server> <oaf_server iid="OAFIID:GNOME_AppletSkeleton" type="factory" location="OAFIID:GNOME_AppletSkeleton_Factory"> <oaf_attribute name="repo_ids" type="stringv">

<item value="IDL:GNOME/Vertigo/PanelAppletShell:1.0" /> <item value="IDL:Bonobo/Control:1.0" /> <item value="IDL:Bonobo/Unknown:1.0" />

</oaf_attribute> <oaf_attribute name="name" type="string" value="Applet skeleton" /> <oaf_attribute name="name-ru" type="string" value="Скелет апплета" />

<oaf_attribute name="description" type="string" value="Simple applet skeleton, do nothing" /> <oaf_attribute name="description-ru" type="string" value=" Скелет простого апплета, ни делает ни чего" />

<oaf_attribute name="panel:category" type="string" value="Accessories" /> <oaf_attribute name="panel:icon" type="string" value="gnome-panel.png" />

</oaf_server> </oaf_info>

Так, что тут: два раздела, фабрика и сам апплет. Для каждого определены IID, у фабрики IID должен совпадать с тем, что указали в вызове bonobo_factory в апплете. Дополнительно отмечу, что тут же можно задавать переводы названия/описания апплета (в данном случае будет на русском, если у Вас русская локаль и на английском во всех остальных случаях). Называем этот файл GNOME_AppletSkeleton.server и "скармливаем" его Bonobo Activation Server. Существует несколько вариантов этого "действа":


    Поместить .server в каталог /usr/lib/bonobo/servers



    Изменить /etc/bonobo-activation/bonobo-activation-config.xml (там есть несколько примеров), добавить нужный путь (скажем, /usr/local/lib/bonobo/servers) и положить .server туда

    В переменную BONOBO_ACTIVATION_PATH добавить каталог, где лежит .server.

    Мне наиболее правильным показался второй вариант, я его и использовал.

    После этого скрещиваем пальцы и пытаемся добавить апплет на панель. Если .server правильно "скормили", то апплет-скелет появляется в списке кандидатов на добавление. Если и все остальное сделали верно, то добавление пройдет гладко. И Вы получите примерно такой результат:

    Рисунок. 



    Скелет апплета, в панельном режиме, вместе с всплывающей подсказкой



    Скелет апплета, в панельном режиме, вместе с контекстным меню

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

    На сегодня, я думаю, достаточно. Полный код примера Вы можете взять . В следующий раз скелет будет обрастать мясом ;)


    Содержание раздела