{"id":7,"date":"2004-04-13T13:34:17","date_gmt":"2004-04-13T13:34:17","guid":{"rendered":"http:\/\/liberty.fdn.fr\/?p=7"},"modified":"2025-08-17T20:13:58","modified_gmt":"2025-08-17T20:13:58","slug":"ecrire-un-applet-gnome2-programmation","status":"publish","type":"post","link":"http:\/\/renaudguezennec.eu\/index.php\/2004\/04\/13\/ecrire-un-applet-gnome2-programmation\/","title":{"rendered":"\u00c9crire un applet Gnome2"},"content":{"rendered":"<div id=\"reader-header\" class=\"header\">\n<h1 id=\"reader-title\">\u00c9crire un applet Gnome2 &#8211; Programmation<\/h1>\n<div id=\"reader-credits\" class=\"credits\"><\/div>\n<\/div>\n<div class=\"content\">\n<div id=\"moz-reader-content\">\n<div id=\"readability-page-1\" class=\"page\">\n<div class=\"article\" lang=\"fr\">\n<h3><span class=\"nom\">par Andrew Burton traduit par Renaud Guezennec<\/span><\/h3>\n<p><code class=\"email\">&lt;<a href=\"mailto:adb@iinet.net.au\">adb@iinet.net.au<\/a>&gt;<\/code><\/p>\n<table border=\"1\" summary=\"Revision history\" width=\"100%\">\n<tbody>\n<tr>\n<th colspan=\"3\" align=\"left\" valign=\"top\"><span class=\"gras\">Historique<\/span><\/th>\n<\/tr>\n<tr>\n<td align=\"left\">R\u00e9vision 1.1<\/td>\n<td align=\"left\">6 septembre 2007<\/td>\n<td align=\"left\">RG<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" align=\"left\">Ajout d&#8217;une copie de makefile et traduction fran\u00e7aise V0.5.<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">R\u00e9vision 1.0<\/td>\n<td align=\"left\">20 Decembre 2005<\/td>\n<td align=\"left\">ADB<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" align=\"left\">Ajout du lien pour t\u00e9l\u00e9charger l&#8217;applet.<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Revision 0.02<\/td>\n<td align=\"left\">15 Avril 2004<\/td>\n<td align=\"left\">ADB<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" align=\"left\">Version bas\u00e9 sur les retours de la liste de diffution: gnome-doc-list mailing. Utilisation de Docbook 4.2, am\u00e9lioration de la section sur la compilation, Utilisation apropri\u00e9e des marqueurs pour la FAQ,\u00a0Modification du code.<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">Revision 0.01<\/td>\n<td align=\"left\">13 Avril 2004<\/td>\n<td align=\"left\">ADB<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" align=\"left\">Version initiale.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>Mise en bouche<\/h4>\n<p lang=\"fr-FR\">Les applets Gnome sont de petites applications qui s&#8217;int\u00e8grent \u00e0 Gnome. Elles fournissent des fonctionnalit\u00e9s simples et utiles pour l&#8217;utilisateur. Il y a quelques diff\u00e9rences avec l&#8217;\u00e9criture d&#8217;une application Gnome normale. Le but de ce tutorial est d&#8217;expliquer; comment cr\u00e9er un petit applet.<\/p>\n<hr \/>\n<p class=\"gras\">Table des mati\u00e8res<\/p>\n<dl>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2449846\">Qu&#8217;est-ce qu&#8217;un Applet?<\/a> <\/span><\/dt>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2449878\">Construire l&#8217;infrastructure<\/a> <\/span><\/dt>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2450236\">Le rendre int\u00e9ressant<\/a> <\/span><\/dt>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2450359\">Cr\u00e9ation d&#8217;un menu contextuel<\/a> <\/span><\/dt>\n<dt><a href=\"http:\/\/renaudguezennec.eu\/#id\">Foire aux Questions<\/a><\/dt>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2450744\">Conclusion<\/a> <\/span><\/dt>\n<dt><span class=\"sect1\"><a href=\"http:\/\/renaudguezennec.eu\/#id2450767\">plus informations<\/a> <\/span><\/dt>\n<\/dl>\n<h2 class=\"title\"><a name=\"id2449846\"><\/a>Qu&#8217;est-ce qu&#8217;un Applet?<\/h2>\n<p lang=\"fr-FR\">Dans Gnome, un applet est une petite application destin\u00e9e \u00e0 s&#8217;int\u00e9grer au tableau de bord de Gnome, donnant un acc\u00e8s rapide et facile sur un contr\u00f4le, comme un contr\u00f4leur de volume, un indicateur d&#8217;activit\u00e9 r\u00e9seau, ou encore une information m\u00e9t\u00e9orologique.<\/p>\n<p lang=\"fr-FR\">Les applets n\u00e9cessitent la biblioth\u00e8que &#8220;libpanel-applet&#8221; pour s&#8217;ex\u00e9cuter et si vous souhaitez en d\u00e9velopper un, vous aurez besoin d&#8217;installer le paquet de d\u00e9veloppement (souvent distinguer par -dev ou -devel en fin, cela d\u00e9pend de votre distribution). En raison de leur symbiose avec Gnome, ils sont souvent moins complexes et plus facile \u00e0 ma\u00eetriser pour un programmeur d\u00e9butant dans l&#8217;environnement Gnome.<\/p>\n<p lang=\"fr-FR\">Apr\u00e8s une installation de Gnome, sur un ordinateur de bureau, vous aurez la date et un applet de contr\u00f4le du volume dans le coin sup\u00e9rieur droit. Sur un ordinateur portable, vous trouverez aussi une barre d&#8217;\u00e9tat de votre batterie.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/renaudguezennec.eu\/prog\/tutorial\/8\/applets_in_panel.png\" alt=\"screenshot\" \/><\/p>\n<h2 class=\"title\"><a name=\"id2449878\"><\/a>Construire l&#8217;infrastructure<\/h2>\n<p lang=\"fr-FR\">Sur un plan technique, Les applets sont des contr\u00f4les &#8220;Bonobo&#8221; int\u00e9gr\u00e9s au tableau de bord de Gnome. Cela signifie qu&#8217;il y a plusieurs diff\u00e9rences avec un programme Gnome classique. La premi\u00e8re diff\u00e9rence est que chaque applet n\u00e9cessite un fichier avec l&#8217;extension &#8216;.server&#8217;, qui contient la description pour le rendre compr\u00e9hensible par &#8220;Bonobo&#8221;. Si vous ne comprenez pas tr\u00e8s bien ceci ne vous inqui\u00e9tez pas. La seule chose que le d\u00e9veloppeur a \u00e0 faire est d&#8217;\u00e9diter le fichier, et remplacer certains champs par les sp\u00e9cificit\u00e9s de son applet.<\/p>\n<p>Voici un exemple d&#8217;un fichier &#8220;.server&#8221; appell\u00e9 &#8220;sample.server&#8221;.<\/p>\n<p><a name=\"id2449895\"><\/a><\/p>\n<h4>Example 1. Un exemple de fichier .server<\/h4>\n<pre class=\"code\">&lt;oaf_info&gt;\r\n&lt;oaf_server iid=\"OAFIID:ExampleApplet_Factory\" type=\"exe\"\r\nlocation=\"\/usr\/lib\/gnome-panel\/myexample\"&gt;\r\n&lt;oaf_attribute name=\"repo_ids\" type=\"stringv\"&gt;\r\n&lt;item value=\"IDL:Bonobo\/GenericFactory:1.0\"\/&gt;\r\n&lt;item value=\"IDL:Bonobo\/Unknown:1.0\"\/&gt;\r\n&lt;\/oaf_attribute&gt;\r\n&lt;oaf_attribute name=\"name\" type=\"string\" value=\"Example Applet Factory\"\/&gt;\r\n&lt;oaf_attribute name=\"description\" type=\"string\" \r\nvalue=\"Factory to create the example applet\"\/&gt;\r\n&lt;\/oaf_server&gt;\r\n&lt;oaf_server iid=\"OAFIID:ExampleApplet\" type=\"factory\"\r\nlocation=\"OAFIID:ExampleApplet_Factory\"&gt;\r\n&lt;oaf_attribute name=\"repo_ids\" type=\"stringv\"&gt;\r\n&lt;item value=\"IDL:GNOME\/Vertigo\/PanelAppletShell:1.0\"\/&gt;\r\n&lt;item value=\"IDL:Bonobo\/Control:1.0\"\/&gt;\r\n&lt;item value=\"IDL:Bonobo\/Unknown:1.0\"\/&gt;\r\n&lt;\/oaf_attribute&gt;\r\n&lt;oaf_attribute name=\"name\" type=\"string\" value=\"Example Applet\"\/&gt;\r\n&lt;oaf_attribute name=\"description\" type=\"string\" value=\"An example applet\"\/&gt;\r\n&lt;oaf_attribute name=\"panel:category\" type=\"string\" value=\"Amusements\"\/&gt;\r\n&lt;oaf_attribute name=\"panel:icon\" type=\"string\" value=\"myicon.png\"\/&gt;\r\n&lt;\/oaf_server&gt;\r\n&lt;\/oaf_info&gt;<\/pre>\n<p><span lang=\"fr-FR\">Il y a quelques trucs \u00e0 noter. Premi\u00e8rement, il faut d\u00e9finir l&#8217;emplacement de l&#8217;ex\u00e9cutable, d\u00e9finie dans l&#8217;attribut &#8220;location&#8221; de oaf_server, N&#8217;oublier pas d&#8217;indiquer le type en\u00a0&#8220;exe&#8221;. Dans cet exemple, notre fichier ex\u00e9cutable s&#8217;appelle myexample et est plac\u00e9 dans<\/span>\u00a0<code class=\"filename\">\/usr\/lib\/gnome-panel\/<\/code> <span lang=\"fr-FR\">. (Emplacement traditionnel de tous les applets) Secondement, nous d\u00e9finissons le nom de notre &#8216;applet Factory&#8217; , ExampleApplet_Factory. Nommer votre .serveur et placer le dans<\/span> <code class=\"filename\">\/usr\/lib\/bonobo\/servers\/<\/code>.<\/p>\n<p>Apr\u00e8s avoir ajouter le .server dans le dossier, nous pouvons commencer \u00e0 \u00e9crire le code source du notre applet. Voici, un exemple simple: un applet &#8220;Hello World&#8221;.<\/p>\n<p><a name=\"id2449961\"><\/a><\/p>\n<h4>Exemple 2. Hello World!<\/h4>\n<pre class=\"code\">#include &lt;string.h&gt;\r\n#include &lt;panel-applet.h&gt;\r\n#include &lt;gtk\/gtklabel.h&gt;\r\nstatic gboolean\r\nmyexample_applet_fill (PanelApplet *applet,\r\nconst gchar *iid,\r\ngpointer data)\r\n{\r\nGtkWidget *label;\r\nif (strcmp (iid, \"OAFIID:ExampleApplet\") != 0)\r\nreturn FALSE;\r\nlabel = gtk_label_new (\"Hello World\");\r\ngtk_container_add (GTK_CONTAINER (applet), label);\r\ngtk_widget_show_all (GTK_WIDGET (applet));\r\nreturn TRUE;\r\n}<\/pre>\n<pre class=\"code\">PANEL_APPLET_BONOBO_FACTORY (\"OAFIID:ExampleApplet_Factory\",\r\nPANEL_TYPE_APPLET,\r\n\"The Hello World Applet\",\r\n\"0\",\r\nmyexample_applet_fill,\r\nNULL);<\/pre>\n<p>La compilation ce fait avec cette commande:<\/p>\n<p><code class=\"code\">bash~$ gcc $(pkg-config --cflags --libs libpanelapplet-2.0) -o myexample my_applet.c<\/code>Pour un Makefile, voici mon exemple:<\/p>\n<p class=\"code\">PKGCONFIG = \/usr\/bin\/pkg-config<br \/>\nCFLAGS = $(shell $(PKGCONFIG) &#8211;cflags libpanelapplet-2.0)<br \/>\nLDFLAGS = $(shell $(PKGCONFIG) &#8211;libs libpanelapplet-2.0)<br \/>\nOPTION = -g -Wall<\/p>\n<p>all:myexample<br \/>\nmyexample: my_applet.c<br \/>\ngcc $(OPTION) $(CFLAGS) $(LDFLAGS) -o myexample my_applet.cinstall:myexample sample.server<br \/>\ncp myexample \/usr\/lib\/gnome-applets\/<br \/>\ncp sample.server \/usr\/lib\/bonobo\/servers\/<br \/>\nclean:<br \/>\nrm \/usr\/lib\/gnome-applets\/myexampleNoter que la variable d&#8217;environnement PKG_CONFIG_PATH doit contenir le chemin vers <code class=\"filename\">libpanelapplet-2.0.pc<\/code>. Si vous obtenez l&#8217;erreur suivante:<\/p>\n<pre class=\"screen\">Package libpanelapplet-2.0 was not found in the pkg-config search path.\r\nPerhaps you should add the directory containing `libpanelapplet-2.0.pc'\r\nto the PKG_CONFIG_PATH environment variable\r\nNo package 'libpanelapplet-2.0' found<\/pre>\n<p>Vous avez besoin d&#8217;ex\u00e9cuter les commandes suivantes:<\/p>\n<p class=\"code\">bash$ PKG_CONFIG_PATH=\/usr\/lib\/pkgconfig<br \/>\nbash$ export $PKG_CONFIG_PATH<\/p>\n<p>Placer l&#8217;ex\u00e9cutable dans le r\u00e9pertoire <code class=\"filename\">\/usr\/lib\/gnome-panel\/<\/code> (souvenez-vous que le fichier .server doit \u00eatre d\u00e9fini). Notre applet sera repr\u00e9sent\u00e9 (dans la fen\u00eatre d&#8217;ajout d&#8217;applet) par l&#8217;icone <code class=\"filename\">myicon.png<\/code>, qui doit \u00eatre plac\u00e9 dans <code class=\"filename\">\/usr\/share\/pixmaps\/<\/code>.<\/p>\n<p>Nous ajoutons notre applet au tableau de bord Gnome par un clique droit sur la barre de Gnome, et choisissez &#8220;ajouter au tableau de bord&#8230;&#8221; dans la rubrique &#8220;Amusements&#8221;: Example Applet.<\/p>\n<p>Comment Gnome fait pour lier le code C et le fichier .server? Le lien se fait gr\u00e2ce a l&#8217;appel de la fonction PANEL_APPLET_BONOBO_FACTORY. Cet appel utilise un nombre important de param\u00e8tres, et le prototype de la fonction est:<\/p>\n<pre class=\"code\">PANEL_APPLET_BONOBO_FACTORY (iid, type, name, version, callback, data)<\/pre>\n<p>Le premier param\u00e8tre sp\u00e9cifie le OAFIID, c&#8217;est l&#8217;identifiant pour Bonobo, et il devrait \u00eatre le nom que vous avez d\u00e9fini dans le fichier .server, &#8220;ExampleApplet_Factory&#8221;. Le deuxi\u00e8me param\u00e8tre d\u00e9finit le type; pour un applet donc PANEL_TYPE_APPLET. Le troisi\u00e8me param\u00e8tre est le nom qui s&#8217;affichera lorsque vous ex\u00e9cuterez l&#8217;interface Bonobo. Le quatri\u00e8me est le version. Nous devons aussi donner la fonction \u00e0 ex\u00e9cuter,La fonction d&#8217;entr\u00e9e dans notre code source est <code class=\"function\">myexample_applet_fill()<\/code>. Pour le dernier param\u00e8tre, nous sp\u00e9cifions l&#8217;envoi \u00e0 la m\u00e9thode d&#8217;entr\u00e9e n&#8217;importe quel type de donn\u00e9es. Dans notre exemple,nous ne passons rien ainsi nous mettons &#8220;NULL&#8221; comme valeur de param\u00e8tre.<\/p>\n<p>Dans notre code, la d\u00e9finition de la m\u00e9thode pour myexample_applet_fill () est:<\/p>\n<pre class=\"code\">myexample_applet_fill (applet, iid, data)<\/pre>\n<p>Noter que le nom de cette m\u00e9thode doit \u00eatre pr\u00e9sent dans la d\u00e9finition de la &#8220;factory&#8221;.<\/p>\n<p>Premi\u00e8rement, nous testons que l&#8217;iid corresponde avec l&#8217;iid pass\u00e9 en param\u00e8tre. Si ce n&#8217;est pas le cas, nous annulons la cr\u00e9ation de l&#8217;applet, dans les autres cas, nous continuons avec le reste de la m\u00e9thode.<\/p>\n<pre class=\"code\">if (strcmp (iid, \"OAFIID:ExampleApplet\") != 0)\r\nreturn FALSE;<\/pre>\n<p>Il est pr\u00e9f\u00e9rable pour la fonction &#8220;main&#8221; qu&#8217;elle n&#8217;aie pas beaucoup de fonctionnalit\u00e9s. Assurez-vous que le OAFIID corresponde avec l&#8217;identifiant de Bonobo. Dessiner un &#8216;label&#8217; dans l&#8217;applet, et afficher le. Facile mais pas vraiment utile. Apr\u00e8s avoir fait tout cela, notre applet existe. Si vous faites un clique droit dessus, vous avez trois possibilit\u00e9s : Enlever l&#8217;applet, le d\u00e9placer et le fixer.<\/p>\n<h2 class=\"title\"><a name=\"id2450236\"><\/a>Le rendre int\u00e9ressant<\/h2>\n<p>Nous allons changer le &#8216;widget&#8217; avec le texte &#8220;Hello World&#8221; par un petit image. D&#8217;abord ajoutons une &#8220;GtkImage&#8221; dans l&#8217;applet:<\/p>\n<pre class=\"code\">image = gtk_image_new_from_file (\"\/usr\/share\/pixmaps\/mypicture.png\");<\/pre>\n<p>Alors, les widget GtkImage ne peuvent recevoir d&#8217;\u00e9v\u00e8nement (c&#8217;est vrai) et ainsi ils ne peuvent pas r\u00e9agir vis \u00e0 vis d&#8217;un clique de souris, Nous avons besoin de mettre le GtkImage dans GtkEventBox:<\/p>\n<pre class=\"code\">event_box = gtk_event_box_new ();\r\ngtk_container_add (GTK_CONTAINER (event_box), image);\r\ng_signal_connect (G_OBJECT (event_box), \"button_press_event\",\r\nG_CALLBACK (on_button_press),\r\nimage);<\/pre>\n<p>N&#8217;oublier pas de supprimer le code pour la cr\u00e9ation du label avec &#8220;Hello World&#8221;.<\/p>\n<p>Maintenant, nous avons faire que l&#8217;applet r\u00e9agisse quand nous cliquons sur l&#8217;ic\u00f4ne du &#8220;tableau de bord&#8221;. Bien s\u00fbr, nous avons besoin d&#8217;une fonction qui intercepte le clique de souris:<\/p>\n<p><a name=\"id2450280\"><\/a> <span class=\"gras\">Example 3. Traiter un clique de souris dans votre applet.<\/span><\/p>\n<pre class=\"code\">static gboolean\r\non_button_press (GtkWidget *event_box, GdkEventButton *event,\r\ngpointer data)\r\n{\r\nstatic int window_shown;\r\nstatic GtkWidget *window, *box, *image, *label;\r\n\/* Don't react to anything other than the left mouse button;\r\nreturn FALSE so the event is passed to the default handler *\/\r\nif (event-&gt;button != 1)\r\nreturn FALSE;\r\nif (!window_shown) {\r\nwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r\nbox = GTK_BOX (gtk_vbox_new (TRUE, 12));\r\ngtk_container_add (GTK_CONTAINER (window), box);\r\nimage = GTK_IMAGE (gtk_image_new_from_file (\"\/usr\/share\/pixmaps\/mypicture.png\"));\r\ngtk_box_pack_start (GTK_BOX (box), image, TRUE, TRUE, 12);\r\nlabel = gtk_label_new (\"Hello World\");\r\ngtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 12);\r\ngtk_widget_show_all (window);\r\n}\r\nelse\r\ngtk_widget_hide (GTK_WIDGET (window));\r\nwindow_shown = !window_shown;\r\nreturn TRUE;\r\n}<\/pre>\n<p>Dans la fonction on_button_press() ci-dessus, nous cr\u00e9ons une nouvelle fen\u00eatre avec un peu de texte. Quand nous cliquons sur le bouton la fen\u00eatre s&#8217;affiche si vous recliquez, elle dispara\u00eet.<\/p>\n<p>I\u00e7i la capture d&#8217;\u00e9cran de la fen\u00eatre affich\u00e9e quand on clique sur l&#8217;applet avec le bouton gauche de la souris:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/renaudguezennec.eu\/prog\/tutorial\/8\/applet_window.png\" alt=\"screenshort\" \/><\/p>\n<h2 class=\"title\"><a name=\"id2450359\"><\/a>Cr\u00e9ation d&#8217;un menu contextuel<\/h2>\n<p>Quand on clique avec le bouton droit sur l&#8217;ic\u00f4ne d&#8217;un applet sur le tableau de bord, un menu par d\u00e9faut s&#8217;affiche avec la possibilit\u00e9 de: supprimer l&#8217;applet, le d\u00e9placer ou le figer. Il est possible d&#8217;ajouter quelques options &#8211; un bouton d&#8217;aide, une fen\u00eatre &#8220;\u00e0 propos&#8221; et une fen\u00eatre de pr\u00e9f\u00e9rences.<\/p>\n<p>Pour cr\u00e9er un menu &#8220;pop-up&#8221;, nous d\u00e9finissons en premier lieu le menu lui m\u00eame. Vous pouvez le faire avec le code suivant:<\/p>\n<pre class=\"code\">static const char Context_menu_xml [] =\r\n\"&lt;popup name=\\\"button3\\\"&gt;\\n\"\r\n\" &lt;menuitem name=\\\"Properties Item\\\" \"\r\n\" verb=\\\"ExampleProperties\\\" \"\r\n\" _label=\\\"_Preferences...\\\"\\n\"\r\n\" pixtype=\\\"stock\\\" \"\r\n\" pixname=\\\"gtk-properties\\\"\/&gt;\\n\"\r\n\" &lt;menuitem name=\\\"About Item\\\" \"\r\n\" verb=\\\"ExampleAbout\\\" \"\r\n\" _label=\\\"_About...\\\"\\n\"\r\n\" pixtype=\\\"stock\\\" \"\r\n\" pixname=\\\"gnome-stock-about\\\"\/&gt;\\n\"\r\n\"&lt;\/popup&gt;\\n\";<\/pre>\n<p>ou dans un fichier, charger pendant l&#8217;ex\u00e9cution avec la fonction <code class=\"function\">panel_applet_setup_menu_from_file ()<\/code>. Les valeurs utilis\u00e9es ici devrait \u00eatre simple \u00e0 comprendre. Nous ajoutons 2 \u00e9l\u00e9ments au menu, le nom appara\u00eetra dans le menu apr\u00e8s un clique droit avec une ic\u00f4ne &#8216;stock\u00e9e&#8217;, d\u00e9fini dans GtkStockItem (les Stock sont des \u00e9l\u00e9ments pr\u00e9sent dans gnomes permettant une internationnalisation facile des applications).<\/p>\n<p>En suite, nous d\u00e9finissons les actions graphiques Bonobo:<\/p>\n<pre class=\"code\">static const BonoboUIVerb myexample_menu_verbs [] = {\r\nBONOBO_UI_VERB (\"ExampleProperties\", display_properties_dialog),\r\nBONOBO_UI_VERB (\"ExampleAbout\", display_about_dialog),\r\nBONOBO_UI_VERB_END\r\n};<\/pre>\n<p>Ceci lie les actions avec leurs fonctions sp\u00e9cifi\u00e9es ci-dessus, et ex\u00e9cute les fonctions. Autrement dit, quand l&#8217;utilisateur choisit &#8220;Pr\u00e9f\u00e9rences&#8230;&#8221; depuis le menu contextuel, votre applet entre dans la fonction display_properties_dialog ().<\/p>\n<p>En fin, nous avons besoin de construire le menu, rassemblons ensemble ces deux \u00e9tapes:<\/p>\n<pre class=\"code\">panel_applet_setup_menu (PANEL_APPLET (myexample-&gt;applet),\r\nContext_menu_xml,\r\nmyexample_menu_verbs,\r\nmyexample);<\/pre>\n<p>Notons que le dernier param\u00e8tre est un pointeur, qui peut \u00eatre utilis\u00e9 dans la fonction de gestion d&#8217;un \u00e9v\u00e8nement.<\/p>\n<p>Vos gestionnaires d&#8217;\u00e9v\u00e8nements ont le prototype suivant:<\/p>\n<pre class=\"code\">static void\r\nmyexample_applet_properties_dialog (BonoboUIComponent *uic,\r\nstruct MultiRes *applet) {\r\n\/* Construire la fen\u00eatre des propri\u00e9tes et l'afficher ici *\/\r\n...\r\n}<\/pre>\n<h2 class=\"title\">Foire aux questions<\/h2>\n<dl>\n<dt class=\"question\">1.\u00a0<a href=\"http:\/\/renaudguezennec.eu\/#id2450464\">Comment d\u00e9bogguer mon applet ? J&#8217;utilise souvent des appels \u00e0 printf () pour voir ce que fait mon code, mais je ne peux pas le faire avec un applet!<\/a><\/dt>\n<dt class=\"question\">2.\u00a0<a href=\"http:\/\/renaudguezennec.eu\/#id2450464\">Comment d\u00e9bogguer mon applet ? J&#8217;utilise souvent gdb, comment l&#8217;utiliser?<\/a><\/dt>\n<dt class=\"question\">3.<a href=\"http:\/\/renaudguezennec.eu\/#id2450700\">Je n&#8217;ai pas d&#8217;ic\u00f4ne pour mon applet, je ne peux dont pas l&#8217;inclure dans le .server. Je ne peux pas trouver mon applet dans la liste des applets disponibles quand j&#8217;essaie de l&#8217;ajouter \u00e0 mon tableau de bord.<\/a><\/dt>\n<dt class=\"question\">4.<a href=\"http:\/\/renaudguezennec.eu\/#id2450713\">Mon applet n&#8217;est pas visible dans le menu d&#8217;ajout au tableau de bord.<\/a><\/dt>\n<\/dl>\n<table border=\"0\" summary=\"Q and A Set\">\n<colgroup>\n<col width=\"1%\" align=\"left\" \/> <\/colgroup>\n<tbody>\n<tr class=\"question\">\n<td><a name=\"id2450464\"><\/a><a name=\"id2450466\"><\/a><span class=\"gras\">1.<\/span><\/td>\n<td>Comment d\u00e9bogguer mon applet ? J&#8217;utilise souvent des appels \u00e0 <span class=\"command\">printf()<\/span> pour voir ce que fait mon code, mais je ne peux pas le faire avec un applet!<\/td>\n<\/tr>\n<tr class=\"answer\">\n<td><\/td>\n<td>Ex\u00e9cuter votre applet par la ligne de commande <span class=\"command\"> \/usr\/lib\/gnome-applet\/my_example<\/span>, Ensuite ajouter le \u00e0 votre &#8220;tableau de bord&#8221;, ainsi tous les appels vers les sorties standards seront visibles dans la console (une astuce de Glynn Foster).<\/td>\n<\/tr>\n<tr class=\"question\">\n<td>2.<\/td>\n<td>Comment d\u00e9bogguer mon applet ? J&#8217;utilise souvent gdb, comment l&#8217;utiliser!<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Ex\u00e9cuter votre applet par la ligne de commande <span class=\"command\"> gdb \/usr\/lib\/gnome-applet\/my_example<\/span>, puis faites &#8216;run&#8217; dans gdb. Ensuite, ajouter \u00e0 votre &#8220;tableau de bord&#8221;, ainsi vous pouvez maintenant utiliser gdb comme vous en avait l&#8217;habitude.<\/td>\n<\/tr>\n<tr class=\"question\">\n<td><a name=\"id2450700\"><\/a><a name=\"id2450701\"><\/a>3.<\/td>\n<td>Je n&#8217;ai pas d&#8217;ic\u00f4ne pour mon applet, je ne peux donc pas l&#8217;inclure dans le .server. Je ne peux pas trouver mon applet dans la liste des applets disponibles quand j&#8217;essaie de l&#8217;ajouter \u00e0 mon tableau de bord.<\/td>\n<\/tr>\n<tr class=\"answer\">\n<td><\/td>\n<td>Les Applets n\u00e9cessitent une ic\u00f4ne pour \u00eatre afficher dans la listes d&#8217;ajout.<\/td>\n<\/tr>\n<tr class=\"question\">\n<td><a name=\"id2450713\"><\/a><a name=\"id2450715\"><\/a><span class=\"gras\">4.<\/span><\/td>\n<td>Mon applet n&#8217;est pas visible dans le menu d&#8217;ajout au tableau de bord.<\/td>\n<\/tr>\n<tr class=\"answer\">\n<td><\/td>\n<td>L&#8217;applet est install\u00e9 dans <code class=\"filename\">\/usr\/local\/<\/code> par d\u00e9faut. Gnome le cherche dans \/usr. Vous pouvais ex\u00e9cuter <strong class=\"command\">.\/configure &#8211;prefix=\/usr<\/strong> pour installer votre applet dans un autre r\u00e9pertoire. Vous aurez besoin de vous fermer la session Gnome et de la rouvrir pour que les changement soit pris en compte.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 class=\"title\"><a name=\"id2450744\"><\/a>Conclusion<\/h2>\n<p>Cr\u00e9er un applet n&#8217;est pas difficile. Cependant, il peut \u00eatre aussi complexe que vous le souhaitez. Il est parfois plus raisonnable de cr\u00e9er une application. Exemple: vous d\u00e9sirez ajouter plus de widgets, Utiliser Glade combin\u00e9 avec libxml sera plus facile pour construire votre IHM(Interface Homme Machine).<\/p>\n<p>Un avertissement important en ce qui concerne l&#8217;exemple employ\u00e9 dans ce tutorial. J&#8217;ai compil\u00e9 l&#8217;applet par la ligne de commande par simplicit\u00e9 ; pour un vrai applet, employer un fichier makefile. Cela tient compte des particularit\u00e9s mat\u00e9rielles (comme l&#8217;emplacement de l&#8217;ic\u00f4ne), la maintenance n&#8217;en sera que plus facile.<\/p>\n<h2 class=\"title\"><a name=\"id2450767\"><\/a>Plus d&#8217;Information<\/h2>\n<ul class=\"disc\">\n<li><a href=\"http:\/\/renaudguezennec.eu\/prog\/tutorial\/8\/my_applet-0.1.tar.gz\">T\u00e9l\u00e9charger l&#8217;applet d&#8217;exemple<\/a> Voici l&#8217;applet cr\u00e9\u00e9 dans ce tutorial. L&#8217;archive (.tar) inclut aussi les &#8216;makefiles&#8217; appropri\u00e9s pour configurer et installer votre applet.<\/li>\n<li>Les applets Gnome sont disponible au t\u00e9l\u00e9chargement dans le CVS de gnome sous le r\u00e9pertoire gnome-applets.<\/li>\n<li>Installer la documentation de la biblioth\u00e8que libpanel-applet2 donne une bonne aide (bien qu&#8217;incompl\u00e8te) pour \u00e9crire des applets.<\/li>\n<li>Voici un vieux tutorial pour r\u00e9aliser des applets avec GTK1.0<br \/>\n<a href=\"http:\/\/developer.gnome.org\/arch\/gnome\/corecomponents\/panel\/applets.html\">Le site des d\u00e9velopper Gnome<\/a>.<\/li>\n<li>Version originale de ce tutorial: <a href=\"http:\/\/members.iinet.com.au\/%7Eadburton\/docs\/gnomepanelapplets.html\">cliquez-ici<\/a>.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00c9crire un applet Gnome2 &#8211; Programmation par Andrew Burton traduit par Renaud Guezennec &lt;adb@iinet.net.au&gt; Historique R\u00e9vision 1.1 6 septembre 2007 RG Ajout d&#8217;une copie de makefile et traduction fran\u00e7aise V0.5. R\u00e9vision 1.0 20 Decembre 2005 ADB Ajout du lien pour t\u00e9l\u00e9charger l&#8217;applet. Revision 0.02 15 Avril 2004 ADB Version bas\u00e9 sur les retours de la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[80,23],"tags":[],"class_list":["post-7","post","type-post","status-publish","format-standard","hentry","category-fr","category-tutorial"],"_links":{"self":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/7","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/comments?post=7"}],"version-history":[{"count":4,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/7\/revisions"}],"predecessor-version":[{"id":5083,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/7\/revisions\/5083"}],"wp:attachment":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/media?parent=7"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/categories?post=7"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/tags?post=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}