Подписаться  на наше издание быстро и дешевле чем где-либо Вы можете прямо сейчас! Подписаться!

 

Как-то недавно, помимо других глупостей, я написал также, что в GNOME нет своего индикатора клавиатуры. Это я имел в виду, что нет своего метода переключения, сорри. А вот индикатор... он как бы есть, но это не совсем сам GNOME. Рассказываю, что удалось нарыть по сабжу…


Есть в GNOME такое отдельное приложение (глючное, кстати, весьма — у меня тулбары сами собой пропадают), GNOME Toolbar называется. С ним, в свою очередь, связан целый класс приложений — GNOME Toolbar Applets. По сути, это специфические GNOME-приложения, задача которых — маячить в тул-баре в виде пиктограмм, по возможности отображая что-то осмысленное, а по нажатию клавиш мыши выдавать контекстно-зависимые диалоги, типа "настройка звука". С точки зрения программирования аплеты можно рассматривать как плагины к Toolbar.


С GNOME поставляется большое количество таких аплетов. Тот же индикатор клавиатуры, например, а также такие небесполезные вещи, как "индикатор сети", "мгновенный скриншот", "погода" или "желтые стикеры". Есть и совершенно бесполезные вещи — вроде аплетов "плавающие рыбки" или "глаза следят за твоей мышкой". Оба алгоритма относятся к числу бродячих легенд, так что польза от них, как и от программы "Hello World!", может заключаться в демонстрации того, как вообще что-то работает. В данном случае — в тул-баре.


Переходя от теории к практике программирования (я надеюсь, меня читает хотя бы пара программистов, случайно заехавших в нашу местность), нужно отметить, что написать такой аплет не так уж и сложно — хотя, возможно, вы, как и я, ожидали, что для этого используется язык скриптов. На самом деле аплеты пишутся на C (как и весь GNOME), а для доступа к плагин-интерфейсу используется специальная библиотека libpanel-applet. Естественно, что для разработки приложений вам понадобится полная версия библиотеки — пакет, как водится в таких случаях, заканчивается на -devel. В новых (весьма примитивных) менеджерах установленных пакетов, вроде того что включен в Fedora Core 3, вы можете установить нужную библиотеку (или проверить ее наличие) в пункте GNOME Software Development.


GNOME 1


Будем считать, что с библиотекой вы разобрались. Переходим к кодированию. Как уже было сказано, аплет представляет собой GNOME-приложение особого типа. Фактически основные вызовы GNOME-API заменены на похожие — но дело, в отличие от GNOME-приложений, происходит в тул-баре. Вот краткий список соответствий функций, макросов и файлов:

 

 

Как видите, соответствие почти полное — за исключением того что действие происходит не в окне, а в строке тул-бара.


С учетом сказанного скелет аплета  для Gtk 1.X выглядит таким образом:

 

#include <applet-widget.h>
int main(int argc, char **argv) {
    applet_widget_init(PACKAGE,VERSION,argc,argv,NULL,0,NULL);
    GtkWidget* applet = applet_widget_new(PACKAGE);
    applet_widget_add(APPLET_WIDGET(applet), controls);
    gtk_widget_show(applet);
    applet_widget_gtk_main();
    return 0;
}

 

Ничего особенного — только не забывайте, что компилировать Gtk-проекты нужно (в простейшем случае, без automake и т.п.) через pkg-config с версией Gtk 1.X, который подставит правильные пути. Проверить наличие (а чаще всего — отсутствие) среды разработки Gtk 1.X на вашем компьютере поможет команда:

 

pkg-config --list-all | grep gtk

 

Поскольку, как вы, вероятно, уже убедились, у вас даже не установлена среда разработки Gtk 1.Х, мы не станем особо углубляться в создание аплетов для этой оболочки. Скажем только, что там участвует несколько несложных функциональных вызовов, вроде самого простого applet_widget_register_callback. По столь "кричащему" имени легко догадаться, что этот вызов регистрирует обработчика контекстно-зависимой команды, а заодно и создает пункт меню. Сами команды появляются по щелчку третьей (обычно — правой) кнопки мыши.


GNOME 2


Приведенный ранее вариант — традиционный, "канонический", в духе GNOME 1.X. Он использует GOAF — GNOME Object Activation Framework. Такие приложения будут работать и сейчас, но вы не должны больше их писать. Вместо этого в GNOME 2 используйте Bonobo UI Embedding.


Рассказать, что такое Bonobo (в миру — большой примат наподобие шимпанзе, достаточно близкий родственник человека) в двух словах — задача не самая простая. Утилитарно выражаясь, это то же самое, что и DCOM в MS Windows — но только на основе ORB’а. Фактически Bonobo — это и есть CORBA-демон. А точнее, менеджер таких демонов, ведущий учет зарегистрированных в системе CORBA-серверов (типа того, как COM ведет учет COM-серверов) — как запущенных, так и остановленных, и запускающий их по мере необходимости. Еще один "супердемон" вроде xinetd.


Приложения не вызывают (не должны, хотя и могут) CORBA-серверы напрямую, а обращаются к Bonobо — это и проще, и надежнее, и к тому же предоставляет сервисы более высокого уровня.


Раньше использовалась библиотека libgnorba, что приблизительно соответствовало COM без префикса D — вызовы между объектами происходили только локально, удаленный CORBA-сервер не мог быть запущен. В новой версии многие старые проблемы решены. В частности, сам протокол стал X-Windows-независимым, были решены проблемы с удаленными вызовами (запросами), разработан общий язык Bonobo Activation Query Language. Поищите последнее выражение в Сети, если вас интересуют детали,— а мы тем временем будем продвигаться к тул-бару.


Поскольку понять что-то в двух словах не удастся, возьмем для примера надоевший всем "Hello World!". Вот его текст в новом формате:

 

#include <string.h>
#include <panel-applet.h>
#include <gtk/gtklabel.h>
static gboolean hello_applet_fill (PanelApplet *applet,
                const gchar *iid,
                gpointer data) {
  GtkWidget *label;
  if (strcmp(iid, "OAFIID:My_HelloApplet")!=0)
      return FALSE;
  label = gtk_label_new ("Hello World!");
  gtk_container_add (GTK_CONTAINER (applet),label);
  gtk_widget_show_all (GTK_WIDGET (applet));
  return TRUE;
}
PANEL_APPLET_BONOBO_FACTORY ("OAFIID:My_HelloApplet_Factory",
               PANEL_TYPE_APPLET,
               "The Hello World Applet",
               "0",
               hello_applet_fill,
               NULL);

 

Первое, что хочется сказать при виде этого текста, это "Здравствуй, Windows!": нужно ж было так долго бороться, чтобы на это же и напоротьсяJ. Хотя, впрочем, у этого "windows" есть солидное преимущество — бесплатность и открытость кода и стандартов.


Второе, что бросается в глаза, это включаемый файл, называющийся теперь panel-applet.h. В моем дистро Fedora Core 3 (хотя это больше относится к libgnomeui) с указателями на файлы хедеров творится страшная чехарда. Не могу ничего вам посоветовать конкретного, у вас может быть (и будет) по-другому — но если вы получите, как я, огромный список ошибок, то посмотрите в самое начало — это просто не найдены некоторые хедеры, исправьте panel-applet.h, и все будет работать. Второй вариант: скопировать целые каталоги с хедерами туда, где компилятор их найдет. Я так и сделал в конце концов — намаялся, однако. А вообще-то, линуксоиды теперь халтурят не по-детски, такое количество багов винде и не снилось (спасибо хоть бесплатных багов).


Обратите внимание на проверку в строке, где strcmp: одна функция может "филить" сколь угодно классов, но в данном случае мы ограничились одним.


Таким же образом, как и в этом примере, создаются прочие элементы управления Bonobo. Мы регистрируем "фабрику" объектов заданного рантайм-типа (класса), в частности — подкласса #PanelApplet. Когда пользователь выберет "добавить", Bonobo найдет ваш зарегистрированный сервер, запустит его, создаст экземпляр и передаст управление в зарегистрированный "филлер". Внутри "филлера" вы должны создать какие-то элементы управления, которые потом попадут куда нужно — в строку панели. Как создавать элементы управления Gtk, я вам здесь, к сожалению, не успею рассказать. Разве что толстую книжку напишу когда-то.


Ресурсы


Как вы наверняка уже заметили, при нажатии на самой панели появляется меню, в котором есть пункт Add to Panel... При этом вы не выбираете из файлов-приложений — какой-то предопределенный набор аплетов виден сразу. И если этот список в меню есть, то, значит, он где-то… есть (да уж, такая вот непереводимая игра слов). То есть после создания аплета вы должны его куда-то прописать, чтобы он стал доступен в Add. В старой версии для этого нужно было править два файла с расширениями .gnorba и .desktop. В новой версии эти файлы уже не нужны, все "происходит" в файлах с расширением .server. Ко всему прочему, файлы эти еще и находятся в симпатичном (лично мне) формате XML — а раньше это был формат, напоминающий win.ini.


Недостаток XML-файлов в их многословности, поэтому, если вы не против, я просто перетащу весь пример этого файла прямо сюда:

 

<oaf_info>
<oaf_server iid="OAFIID:My_HelloApplet_Factory" type="exe"
       location="test-bonobo-applet">
  <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="Hello World Applet Factory"/>
  <oaf_attribute name="description" type="string" value="My first applet factory"/>
</oaf_server>

<oaf_server iid="OAFIID:My_HelloApplet" type="factory"
            location="OAFIID:My_HelloApplet_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="Hello World Applet"/>
  <oaf_attribute name="description" type="string" value="Applet for GNOME2"/>
  <oaf_attribute name="panel:icon" type="string" value="gnome-applets.png"/>
</oaf_server>
</oaf_info>

 

По своей сути файлик прост, и соответствует гайдлайну по аналогичным файлам для обычного элемента управления Bonobo. Что немного "не так", так это поле panel:icon — описание той самой иконки, которую вы видите слева, когда добавляете новые апплеты в панель.


Заключение


Применение CORBA в локальном контексте выглядит реализацией известного принципа "из пушки по воробьям". Действительно, до последнего времени работу GNOME можно было охарактеризовать как "интересный прототип". Новые процессоры и мощная ревизия ORBit сделали технологию приемлемой для практического применения — как помните, многие технологии NT, да и сам графический интерфейс, тоже не один год ждали своей очереди, хотя в теории, с тем же альфа-блендингом например, все было ясно.


К числу преимуществ (которых больше, чем недостатков) CORBA/Bonobo можно отнести открытость стандарта, его прозрачность и стабильность. Уже одного этого было бы достаточно, но ведь есть еще и независимость от платформы — как операционной, так и от X-Windows. Последняя напоминает прогнившую арматуру в бетонных перекрытиях: несущие функции уже не выполняются — но это не повод выковыривать ржавчину из бетона. Используя Bonobo, можно в один день "узнать", что новый GNOME уже не использует X-Windows — думаю, траур будет недолгим.


Еще одно позитивное свойство CORBA — его независимость от языка программирования. Это очень интересное свойство "выкупило наповал" Sun Microsystems — компания уже взяла GNOME в оборот, выпуская пока "Java-emabled" Linux Desktop на основе GNOME, но в следующем релизе Looking Glass Project в качестве Bonobo-элементов уже будут выступать Java3D-компоненты. Обещает быть "бомбой", если сроки релиза не сыграют злой шутки с этой идеей — а то получится очередной "Duke Nukem Forever". Впрочем, конкурентов заметного масштаба на горизонте нет — и не предвидится.


На самом деле последняя документация Panel Applet Liblary Reference изобилует страницами "FIXME: write" — то есть получить исчерпывающую информацию можно только из исходного кода. Который, однако, очень сложен — наподобие аналогичного кода для COM. Так что технологии GNOME/Bonobo приносят не только радости "бесплатной мощности", но и грустные воспоминания о простом, компактном и быстром Linux.

2005.08.30
19.03.2009
В IV квартале 2008 г. украинский рынок серверов по сравнению с аналогичным периодом прошлого года сократился в денежном выражении на 34% – до $30 млн (в ценах для конечных пользователей), а за весь календарный год – более чем на 5%, до 132 млн долл.


12.03.2009
4 марта в Киеве компания Telco провела конференцию "Инновационные телекоммуникации", посвященную новым эффективным телекоммуникационным технологиям для решения задач современного бизнеса.


05.03.2009
25 февраля в Киеве компания IBM, при информационной поддержке "1С" и Canonical, провела конференцию "Как сохранить деньги в условиях кризиса?"


26.02.2009
18-19 февраля в Киеве прошел юбилейный съезд ИТ-директоров Украины. Участниками данного мероприятия стали ИТ-директора, ИТ-менеджеры, поставщики ИТ-решений из Киева, Николаева, Днепропетровска, Чернигова и других городов Украины...


19.02.2009
10 февраля в Киеве состоялась пресс-конференция, посвященная итогам деятельности компании "DiaWest – Комп’ютерний світ" в 2008 году.


12.02.2009
С 5 февраля 2009 г. в Киеве начали работу учебные курсы по использованию услуг "электронного предприятия/ учреждения" на базе сети информационно-маркетинговых центров (ИМЦ).


04.02.2009
29 января 2009 года в редакции еженедельника "Computer World/Украина" состоялось награждение победителей акции "Оформи подписку – получи приз!".


29.01.2009
22 января в Киеве компания "МУК" и представительство компании Cisco в Украине провели семинар для партнеров "Обзор продуктов и решений Cisco Small Business"

 

 
 
Copyright © 1997-2008 ИД "Комиздат".