Отчасти чтобы не забыть, отчасти в надежде что кому-то это будет полезно оставлю информацию о написании аплета для gnome-panel`и. Я делал это на си.

Сначала о том, как сделать правильно, а потом о том, как сделать универсально.

Итак, чтобы сделать правильно, необходимо прочитать вот этот документ: Writing Gnome Applets in Gnome2, рассказывающий о том, как сделать Hello World с отображением запущенного приложения в панели. Там главным образом о том, куда положить какие файлы, чтобы апплет можно было выбрать в диалоговом окне "Add to Panel".

Я решил подойти к этому с другой стороны и написал просто приложение, которое добавляет иконку на панель с помощью некоторых вызовов GTK.

Итак, чтобы ваша иконка появилась на панели необходимо сделать следующее:

  1. Скачать библитечку (2 файла: 'eggtrayicon.h' и 'eggtrayicon.c' ) и посмотреть пример ее использования <a href="http://www.quietearth.us/articles/2007/01/23/Howto-Code-a-gnome-panel-applet">отсюда</a>
  2. Прочитать несколько первых страниц из руководства по GTK: <a href="http://linfoline.homedns.org/gtk/">http://linfoline.homedns.org/gtk/</a>

Чтобы добавить свою иконку на панель я использовал следующий код:

Код

<source lang="c"> static EggTrayIcon *docklet = NULL; GtkWidget *box; GtkWidget *window; GtkWidget *button; GtkWidget *image;

docklet = eggtrayiconnew("Rigidus"); box = gtkeventboxnew(); image = gtkimagenewfromfile ("main.png"); gtkcontaineradd(GTKCONTAINER(box), image); gtkcontaineradd(GTKCONTAINER(docklet), box);

if(!gtkcheckversion(2,4,0)) { gobjectset(GOBJECT(box), "visible-window", FALSE, NULL); } // Link to signal gsignalconnect(GOBJECT(box), "button-press-event", GCALLBACK(dockletbuttonpress), NULL); // Show applet gtkwidgetshowall(GTKWIDGET(docklet)); </source>

Тут все понятно без объяснений. Иногда нужно изменить внешний вид иконки в зависимости от произошедших в вашей программе событий. В этом случае поступаем так:

Перерисовка

<source lang="c"> // Replace icon gtkcontainerremove(GTKCONTAINER(box), image); image = gtkimagenewfromfile ("main.png"); gtkcontaineradd(GTKCONTAINER(box), image); gtkwidgetshow(GTKWIDGET(image)); </source>

И наконец, если вам нужно рисовать иконку на лету (например, если вы делаете аплет, который показывает вам количество непрочитанных писем в почте), то можно воспользоваться библиотекой cairo:

Cairo

<source lang="c"> // Cairo cairosurfacet *surface; cairot *cr;

surface = cairoimagesurfacecreate (CAIROFORMATARGB32, 24, 24); cr = cairocreate (surface);

cairoselectfontface (cr, "serif", CAIROFONTSLANTNORMAL, CAIROFONTWEIGHTBOLD); cairosetfontsize (cr, 14.0); cairosetsourcergb (cr, 1.0, 0.0, 0.0); cairomoveto (cr, 2.0, 17.0); cairoshowtext (cr, buffer); cairodestroy (cr); cairosurfacewritetopng (surface, "main.png"); cairosurfacedestroy (surface); </source>

Надеюсь приведенный код говорит сам за себя. В любом случае, отвечу на возникшие вопросы. Ах да, чуть не забыл - компилировать это можно вот так:

<source lang="bash"> #! /bin/sh gcc `pkg-config –cflags gtk+-2.0 pkg-config –libs gtk+-2.0 –libs gthread-2.0 ` -c main.c gcc `pkg-config –cflags gtk+-2.0` -c eggtrayicon.c gcc `pkg-config –cflags –libs gtk+-2.0 –libs gthread-2.0` main.o eggtrayicon.o -o main </source>

И последнее - заголовочные файлы, которые необходимо включить:

Заголовки

<source lang="c"> #include <stdio.h> #include <gtk/gtk.h> #include "eggtrayicon.h"

#include <sched.h> #include <pthread.h> #include <errno.h> #include <unistd.h> #include <fcntl.h>

#include <cairo.h>

#include <glib.h> </source>