Typos in french documentation manual
[adesklets.git] / doc / adesklets_fr.texi
blobf8555fdc9f60f4b9f399fe709419310208909b8d
1 \input texinfo   @c -*-texinfo-*-
2 @comment %**start of header
3 @setfilename adesklets_fr.info
4 @documentlanguage fr
5 @include version_fr.texi
6 @settitle adesklets @value{VERSION}
7 @syncodeindex pg cp
8 @comment %**end of header
9 @copying
10 Ce manuel concerne adesklets (version @value{VERSION}, @value{UPDATED}).
12 Copyright @copyright{} 2004, 2005
13 S.Fourmanoit @email{syfou@@users.sourceforge.net}. 
15 Traduction française originale de Guillaume Boitel @email{g.boitel@@wanadoo.fr}, entièrement remise à jour et reprise par Martin Kirchgessner @email{martin.kirch@@gmail.com} depuis adesklets 0.4.10 
17 @quotation
18 Permission est accordée de copier, distribuer et/ou modifier ce document selon
19 les termes de la Licence Generale Publique GNU (GNU GPL) version 2, ou toute 
20 version ultérieure publiée par la Free Software Fundation. Une copie de la présente  
21 licence est incluse dans la section ``GNU General Public License''
22 @end quotation
23 @end copying
25 @c Define useful weblink macro
26 @macro weblink{link}
27 @html
28 <a href="
29 @end html
30 \link\
31 @html
32 ">\link\</a>
33 @end html
34 @end macro
36 @c Define weblink2 macro: a variation on the previous one
37 @macro weblink2{desk,link}
38 @html
39 <a href="\link\">
40 @end html
41 \desk\
42 @html
43 </a>
44 @end html
45 @end macro
47 @dircategory Graphics
48 @direntry
49 * adesklets in french: (adesklets_fr).      Another desklets container (in French).
50 @end direntry
52 @titlepage
53 @title adesklets
54 @subtitle pour la version @value{VERSION}, @value{UPDATED}
55 @author Guillaume Boitel (@email{g.boitel@@wanado.fr})
56 @author Martin Kirchgessner (@email{martin.kirch@@gmail.com})
57 @page
58 @vskip 0pt plus 1filll
59 @insertcopying
60 @end titlepage
62 @contents
64 @ifnottex
65 @node Top
66 @top adesklets
68 @ifnothtml
69 Suivez le lien pour la version originale
70 (@xref{Top,Version anglaise, Contents, adesklets,}.).
71 @end ifnothtml
72 @ifhtml
73 @weblink2{[Version anglaise],../en/index.html}
74 @end ifhtml
76 @insertcopying
77 @end ifnottex
79 @menu
80 * A propos d'adesklets::
81 * Nouveautés::
82 * Installer adesklets::
83 * Utiliser adesklets::
84 * Programmation d'adesklets::
85 * Extension d'adesklets::
86 * Recherche d'aide!::
87 * Foire Aux Questions::
88 @ifhtml
89 * Documentation du paquetage Python::
90 @end ifhtml
91 * Documentation d'Imlib2::
92 * GNU Makefile pour empaqueter les desklets::
93 * Soumettre un desklet::
94 * Copier ce Manuel::
95 * Clé publique Open PGP::
96 * Index::
97 @end menu
99 @noindent Une version à jour de ce document peut être trouvée en ligne:
100 @weblink{http://adesklets.sf.net/}.
102 @noindent Captures d'écrans, codes sources, etc. peuvent aussi être trouvés
103 sur la page du projet: @weblink{http://sf.net/projects/adesklets/}.
105 @node A propos d'adesklets
106 @chapter Qu'est-ce qu'adesklets ?
108 @section Réponse courte
110 `adesklets' est une console interactive
111 d'@weblink2{Imlib2,http://www.enlightenment.org/pages/imlib2.html} pour le
112 système X Window. Il permet à des langages de script d'écrire de manière
113 propre et simple des applets graphiques intégrés au bureau (i.e. "desklets")
114 de belle apparence et légèrement interactifs.
116 Il peut aussi être utilisé comme un éditeur graphique en ligne de commande,
117 un peu comme @weblink2{ImageMagick,http://www.imagemagick.org/}, mais avec
118 des fonctionnalités différentes.
120 @section Réponse longue
122 @command{adesklets} signifie "another desklets [container]". Il a été écrit
123 comme une alternative à d'autres programmes tels que:
125 @enumerate
126 @item
127 GNOME gDesklets (@weblink{http://gdesklets.gnomedesktop.org/})
128 @item
129 KDE SuperKaramba (@weblink{http://netdragon.sourceforge.net/}).
130 @item
131 GKrellM (@weblink{http://www.gkrellm.net/})
132 @end enumerate
134 Puisque ce projet s'appelle 'a'desklets, il est encore possible, pour
135 commencer des projets semblables, d'utiliser l'espace de 'b' à 'z' desklets,
136 à l'exception de 'g' desklets, qui est déjà pris.
138 Plus sérieusement, tous ces programmes sont bons. Néanmoins, les deux premiers
139 ont des pré-requis très lourds en termes de dépendances de bibliothèques; 
140 de base gDesklets requiert que le bureau GNOME soit entièrement
141 installé (plus quelques bibliothèques spécialisées telles que gnome-python),
142 tandis que SuperKaramba a besoin de toutes les bibliothèques de KDE ainsi
143 que de l'environnement de base. Ceci se répercute sur l'exécution des autres
144 taches@footnote{Bien sur, c'est uniquement l'opinion de l'auteur - et ces
145 deux applications ont fait de gros progrès sur la gestion des ressources
146 de version en version.}. D'autre part, alors que GkrellM est plus léger
147 (bien qu'il dépend toujours de GTK+), il ne fournit pas la même qualité en
148 terme de "présentation" (selon les goûts de l'auteur, naturellement) ou de
149 " scriptabilité " par rapport aux deux autres.
151 De ce constat est né @command{adesklets}. Il fournit:
153 @itemize
154 @item
155 un cadre minimal pour des desklets X Window totalement intégrés dans le bureau,
156 avec quelques facilités pour gérer leur lancement, leur placement et
157 leur arrêt.
158 @item
159 une API de dessin générique, riche et facile d'emploi semblable à celle
160 de gDesklets et de SuperKaramba concernant sa qualité visuelle, grâce à la
161 bibliothèque Imlib2.
162 @item
163 des dépendances de bibliothèques simples, se résumant surtout à l'utilisation de la très bonne (et
164 rapide) bibliothèque Imlib2 pour toutes les opérations graphiques. Aucune boite
165 à outils de fenêtres n'est utilisée: le programme repose directement sur xlib.
166 @item
167 un interpréteur petit, léger et robuste potentiellement utilisable avec
168 toutes sortes de langages de scripts, grâce à une syntaxe propre, limitée et
169 homogène. Dans cette version @value{VERSION}, le support de Python a été fourni
170 séparément. Le support de Perl et Ruby est prévu pour les prochaines versions, 
171 n'hésitez pas à contribuer afin que votre langage préféré soit supporté!
172 @item
173 un usage minimal de l'espace disque, de la mémoire vive et du
174 processeur. Typiquement, avec la glibc-2.3.4 et le noyau Linux 2.6 sur
175 une architecture x86, l'unique exécutable représente moins de 130 Ko sur
176 le disque et prend moins de 3Mo de mémoire virtuelle par desklet, juste après
177 son lancement. Lorsque le desklet est lancé il n'utilise quasiment aucun 
178 cycle processeur (même en prenant en compte le script Python interprété).
179 @end itemize
181 Il ne fournit PAS:
182 @itemize
183 @item
184 une API de fenêtre sophistiquée, ni même un accès aux widgets en dehors de
185 menus gris nus et laids: vous ne pouvez clairement pas écrire une application
186 GUI avec ces seuls desklets.
187 @item
188 de mécanismes compliqués (ni même de mécanismes clairs, en la matière)
189 pour la configuration des scripts. Les développeurs de scripts sont libres (ou
190 condamnés, selon la façon de voir les choses) de faire ce qu'il leur convient.
191 @item
192 un support pour tout ce qui n'est pas entièrement compatible avec un système
193 POSIX. Par exemple, il serait vraiment surprenant d'arriver à le compiler sur 
194 Cygwin.
195 @item
196 une gestion poussée des évènements utilisateurs. Le but d'@command{adesklets} est
197 d'être fiable et peu consommateur de ressources; seuls quelques événements - 
198 essentiellement relatifs au pointeur - sont utilisables via son l'API.
199 @end itemize
201 @node Nouveautés
202 @chapter Quoi de neuf?
204 @heading Quoi de neuf pour la version 0.4.10?
205 C'est un correctif. Involontairement, une modification étrange est apparue 
206 dans la version précedente: à cause d'elle 
207 le menu contextuel ne fonctionnait plus de la manière prévue (la touche 
208 Control devrait être enfoncée pour que le menu s'affiche). Cette version 
209 à annulé ce changement, et ajouté une option de configuration, 
210 --enable-control-on-context-menu, pour ceux qui préfèrent vraiment ce 
211 comportement.
213 @heading Quoi de neuf pour la version 0.4.9?
214 C'est un correctif. Elle change les définitions des macros globales pour 
215 qu'adekslets puisse être compilé sans problème sur FreeBSD 6.x, corrige 
216 une erreur lors de la suppression des options à passer au compilateur C 
217 relatives au débogage, et ajoute un nouveau programme de démonstration 
218 du threading.
220 @heading Quoi de neuf pour la version 0.4.8?
221 C'est un correctif. Elle change les définitions des macros globales pour 
222 qu'adekslets puisse être compilé sans problème sur FreeBSD 5.x, et 
223 implante la détection d'une fausse root window pour KDE, grace à yogi77, 
224 du forum.
226 @heading Quoi de neuf pour la version 0.4.7?
227 C'est un correctif. Elle retire les appels à quelques fonctions 
228 mathématiques de C99 qui ne sont pas disponibles dans les premiers BSD, 
229 rendant le code plus portable. Elle ajoute aussi deux nouvelles commandes 
230 à l'API pour mieux contrôler le système de cache des images.
232 @heading Quoi de neuf pour la version 0.4.6?
233 C'est un correctif et une mise à jour de la documentation. Elle corrige de 
234 nombreux bugs mineurs dans les scripts de soumission des desklets, rend la 
235 structure autoconf plus portable, ajoute un nouveau script de démonstration 
236 dans test (widget.py), corrige quelques bugs de placement à l'écran dus à la 
237 routine xwindow_move_window (merci à man1ed du forum pour avoir fourni le 
238 patch), et enfin ajoute une nouvelle annexe contenant une version en ligne 
239 de la documentation d'Imlib2.
241 @heading Quoi de neuf pour la version 0.4.5?
242 C'est un correctif et une mise à jour de la documentation. Elle améliore le 
243 procédé de soumission des desklets en publiant le script complet de mise en 
244 ligne utilisé par l'auteur. Elle corrige aussi un bug du rafraichissement des 
245 fenêtres, qui apparait quand on utilise des images d'arrière-plan 
246 et des menus spécifiés par l'utilisateur; merci à ZeroDivide de l'avoir 
247 signalé. Quelques mises à jour et corrections de la documentation ont également 
248 été faites.  
250 @heading Quoi de neuf pour la version 0.4.4?
251 C'est une mise à jour de la documentation, principalement faite pour les 
252 auteurs de desklets. Elle inclut surtout une nouvelle annexe expliquant comment 
253 soumettre un desklet (avec l'aide d'un script), ainsi qu'une nouvelle sous-partie 
254 sur la détection des polices sur l'ensemble du système. Quelques ajouts ont 
255 été effectués sur la FAQ pour couvrir ce sujet.
257 @heading Quoi de neuf pour la version 0.4.3?
258 C'est une mise à jour de la documentation. Ici la plupart du travail à été 
259 fait part Mike Pirnat @email{exilejedi@@users.sourceforge.net}, qui a eu la 
260 gentillesse de corriger l'anglais déficient de l'auteur en relisant ce manuel 
261 d'un bout à l'autre. Merci Mike! La FAQ a aussi été largement enrichie, et 
262 une nouvelle annexe pour les auteurs de desklets à été ajoutée.
264 @heading Quoi de neuf pour la version 0.4.2?
265 C'est un correctif. Elle corrige un bug du paquetage Python qui l'empêchait 
266 de se compiler avec toutes les versions de Python inférieures à 2.4.0. Merci 
267 à nucular, du forum d'adesklets, de l'avoir remarqué. Elle corrige aussi un 
268 problème mineur concernant mmap sur ce package.  
270 @heading Quoi de neuf pour la version 0.4.1?
271 C'est un correctif. Elle sécurise l'utilisation de la classe optionelle 
272 @code{adesklets.ConfigFile} en changeant complètement la manière dont les 
273 fichiers de configurations sont importés, ce qui retire une faille de sécurité 
274 potentielle.
276 @heading Quoi de neuf pour la version 0.4.0?
277 C'est la sortie d'une nouvelle version mineure. L'interpreteur supporte 
278 maintenant l'internationalisation. Il peut maintenant travailler 
279 dynamiquement avec differents jeux de caractères sur les plate-formes 
280 supportant iconv (selon le standard UNIX98), et les affiche correctement. 
281 Le paquetage Python a aussi été enrichi d'une classe generique (optionelle) 
282 de configuration, en esperant qu'elle sera utile aux auteurs de desklets.
284 @heading Quoi de neuf pour la version 0.3.2?
285 C'est une mise à jour de la documentation. Une partie pour les 
286 programmeurs Python à été ajoutée, et la FAQ à été largement enrichie.
288 @heading Quoi de neuf pour la version 0.3.1 ?
289 Cette version corrige un oubli en implantant la gestion de l'interruption
290 des barrières temporelles (time gate) par des évènements X. Cette correction
291 est essentielle à la bonne marche de plusieurs effets dynamiques.
293 @heading Quoi de neuf pour la version 0.3.0 ?
294 Ceci est une nouvelle version mineure. Nous nous sommes beaucoup souciés de
295 la portabilité depuis les toutes premières versions d'adesklets; avec cette
296 version, le paquetage compile et tourne sans accroc sur FreeBSD et NetBSD 
297 (@xref{Portabilité}.). La gestion des évènements a également été épurée en interne,
298 et le paquetage Python étendu pour supporter la modification dynamique des 
299 évènements interceptés (voir @file{test/test_events.py}).
301 L'interpréteur répond maintenant aux désidérata de l'auteur, et ne devrait
302 pas être significativement étendu dans le futur; tout est relativement en
303 place pour écrire tout type de desklet, y compris des animations.
305 @heading Quoi de neuf pour la version 0.2.1 ?
306 Il s'agit de la correction d'un bug mineur du à une incompatibilité avec la 
307 bibliothèque GNU history. Merci à Mike Pirnat @email{exilejedi@@users.sourceforge.net} 
308 de l'avoir signalé.
310 @heading Quoi de neuf pour la version 0.2.0 ?
311 Ceci est une nouvelle version mineure. L'interpréteur supporte dorénavant
312 les variables textuelles (la substitution dynamique de chaînes, pour être précis),
313 ainsi que l'exécution de séquences préenregistrées de commandes sous des contraintes
314 précises de temps (un mode indirect d'exécution); cela donne aux desklets un moyen
315 de générer des animations fluides. Lancez le script de démonstration
316 @file{test/fading.py} du paquetage de base pour voir ces nouvelles fonctions
317 à l'oeuvre.
319 Les développeurs, quant à eux, ont maintenant accès à une plateforme complètement
320 réécrite d'enregistrement de rapports d'exécution de toutes session 
321 de l'interpréteur (à des fins de débogage).
323 @heading Détails
324 Allez voir @file{ChangeLog} pour obtenir l'historique complet des changements 
325 apportés.
327 @ifplaintext
328 @c Sets up a marker for automated INSTALL_FR file generation
329 INSTALL_BEG
330 @node Installer adesklets
331 @unnumbered Installer adesklets
332 @end ifplaintext
333 @ifnotplaintext
334 @node Installer adesklets
335 @chapter Installer adesklets
336 @end ifnotplaintext
338 @section Pré-requis pour la compilation
340 Pour compiler adesklets à partir des sources, vous aurez besoin de :
342 @itemize
343 @item
344 Un compilateur supportant le C ANSI ainsi que les macros variadiques (à peu
345 près toutes les versions de @weblink2{gcc,http://gcc.gnu.org} supérieures à 
346 la 2.7.0 devraient fonctionner, ou n'importe quoi d'autre sorti ces dix
347 dernières années)
348 @item
349 Les entêtes@footnote{Excepté pour les compilations sans fichiers entêtes, utile
350 pour les environnements serveurs et équivalents - lire la suite pour de plus
351 amples informations.} et les bibliothèques @weblink2{X11,http://www.x.org/}.
352 @item
353 Imlib2 1.1.2 ou supérieure (la plus récente sera la meilleure: allez 
354 la télécharger sur @weblink{http://sourceforge.net/projects/enlightenment/}).
355 @item
356 @weblink2{GNU readline,http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html}
357 @item
358 un système raisonnablement compatible POSIX
359 @end itemize
361 @noindent Les composants suivants pourront aussi être utilisés, si ils sont 
362 présents sur le système:
364 @itemize
365 @item
366 @weblink2{fontconfig,http://www.fontconfig.org/}, pour la détection automatique 
367 des polices utilisables présentes dans le système
368 @item
369 @weblink2{GNU history,http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html}, 
370 le complément fidèle de GNU readline permettant l'enregistrement d'historiques 
371 de commandes
372 @item
373 @weblink2{Python,http://www.python.org} 2.3 ou supérieure, si vous désirez
374 le support pour Python (vous en aurez probablement besoin à ce niveau:
375 c'est le seul langage de script supporté pour l'instant)
377 @end itemize
378 @section Note sur la portabilité
379 @anchor{Portabilité}
380 Ce paquetage est construit en gardant la portabilité à l'esprit - toutes les
381 extensions spécifiques ont été évitées, et les spécifications (ANSI, SVID
382 3, BSD 4.3, POSIX) ont été suivies scrupuleusement. Néanmoins, tous les
383 développement ont été fait sur un unique système Linux: il est très probable
384 qu'adesklets ne compilera pas ou ne fonctionnera pas comme prévu dans
385 certains cas. Régler ces problèmes est important pour nous.
387 adesklets a été porté et testé avec succès par les développeurs sur plusieurs 
388 systèmes. Au moment de rendre publique la version @value{VERSION}, le paquetage 
389 a été compilé et utilisé avec succès sous:
390 @itemize
391 @item Linux 2.4 i386, glibc 2.1.3, gcc 2.95.2 (Debian woody)
392 @item Linux 2.6 i686, glibc 2.3.4, gcc 3.4.3 (Gentoo linux 2005.0)
393 @item Linux 2.6 amd64, glibc 2.3.3, gcc 3.4.2 (Fedora core release 3)
394 @item Linux 2.6 amp64, glibc 2.3.4, gcc 3.4.3 (Gentoo Linux 2005.0)
395 @item FreeBSD i386, gcc 2.95.4 (4.10-BETA)
396 @item NetBSD i386, gcc 2.95.3 (1.6.1)
397 @end itemize
399 @strong{Update}: il a été signalé que adesklets >=0.4.8 fonctionne sur 
400 FreeBSD 5.3, mais l'auteur n'a pas eu l'occasion de le vérifier. Maintenant 
401 qu'adesklets est dans Debian unstable, il semble qu'il compile au moins sur 
402 tous les noyaux et architectures disponibles: allez voir 
403 @weblink{http://packages.debian.org/unstable/x11/adesklets}.
405 Vous avez vous-même essayé de faire tourner adesklets sur une architecture 
406 non citée plus haut? Faites-le nous savoir, surtout si ça n'a pas marché.
408 @section Téléchargement du logiciel
410 La version à jour du logiciel (en archive source bzipée) est disponible
411  sur la page du projet sur sourceforge:
412 @weblink{http://sf.net/projects/adesklets/}
414 Vous pouvez l'extraire depuis la console avec @command{tar}. Avec la
415 version @value{VERSION}, la ligne de commande devrait être:
416 @example
417 tar xvjf adesklets-@value{VERSION}.tar.bz2
418 @end example
419 ou, si la version que vous avez installée de @command{tar} ne supporte pas
420 les filtres d'archives bzip2:
421 @example
422 bzcat adesklets-@value{VERSION}.tar.bz2 | tar xv
423 @end example
425 @section Vérification optionelle de l'intégrité du logiciel
427 Pour adesklets @value{VERSION},  vous pouvez également télécharger de
428 @weblink2{sourceforge,http://sf.net/projects/adesklets/} une signature 
429 détachée sous forme ascii nommée @command{adesklets-@value{VERSION}.tar.bz2.asc},
430 que vous pourrez utiliser avec la clé publique de l'auteur 
431 (@pxref{Clé publique Open PGP}, en annexe) pour vous assurer de 
432 l'intégrité du paquetage. Par exemple, avec @command{GnuPG}
433 (@weblink{http://www.gnupg.org/}), vous utiliseriez la commande:
435 @example
436 gpg --verify adesklets-@value{VERSION}.tar.bz2.asc adesklets-@value{VERSION}.tar.bz2
437 @end example
439 Vous pouvez également obtenir la clé publique pour
440 l'adresse @email{syfou@@users.sourceforge.net}
441 de plusieurs serveurs de clés publics tel @weblink{http://www.keyserver.net/} ou
442 encore @weblink{http://pgp.mit.edu/}. N'hésitez pas à contacter l'auteur directement
443 si vous désirez vous assurer plus avant de l'authenticité de cette clé.
445 @section Compilation et Installation:
447 adesklets fournit les scripts usuels autoconf/automake des paquetages GNU.
449 Donc, dans la plupart des cas, l'installation suit les trois étapes habituelles:
451 @enumerate
452 @item
453 Atteignez le répertoire contenant le code source du paquetage (avec `cd') et tapez
454 `./configure' pour configurer le paquetage pour votre système.  Si vous utilisez
455 `csh' sur une ancienne version de System V, vous devrez peut-être plutot taper
456 `sh ./configure' afin d'empêcher `csh' d'exécuter lui-même `configure'.
458 L'exécution de `configure' peut prendre du temps. Pendant qu'il s'exécute,
459 il écrit quelques messages qui vous informent des fonctionnalités qu'il est
460 en train de vérifier.
461 @item
462 Tapez `make' pour compiler le paquetage.
463 @item
464 Tapez `make install' pour installer les programmes, tous les fichiers de
465 données et la documentation.
466 @end enumerate
468 Vous pouvez enlever les programmes binaires et les fichiers objets du
469 répertoire qui contient le code source en tapant `make clean'. Pour enlever
470 également les fichiers que `configure' a créé (ainsi vous pourrez compiler
471 le paquetage pour une autre type d'ordinateur), tapez `make distclean'.
473 @section Compilateurs et Options:
475 Certains systèmes requièrent des options inhabituelles pour la compilation
476 ou l'édition des liens que le script `configure' ne connaît pas. Vous pouvez
477 donner à `configure' des valeurs initiales pour des variables en les déclarant
478 dans l'environnement. En utilisant un shell compatible Bourne, vous pouvez
479 faire cela en ligne de commande comme ceci:
481 @example
482 CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
483 @end example
485 @noindent Ou dans les systèmes dotés du programme `env', vous pouvez faire:
487 @example
488 env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
489 @end example
491 @section Fonctionnalités Optionnelles :
493 adesklets possède quelques fonctionnalités optionnelles que vous pouvez
494 installer ou non à partir du script de configuration. Tapez :
496 @example
497 ./configure --help
498 @end example
500 @noindent pour une description courte et complète. En voici quelques une
501 intéressantes :
503 @itemize
504 @item
505 Vous pouvez choisir de compiler adesklets sans aucun support pour X
506 (@command{--without-x}).
507 Vous aurez une version qui n'est manifestement pas faite pour le rendu de
508 desklets, mais bonne pour de la manipulation d'image en ligne de commande.
509 @item
510 Vous pouvez enlever le support pour d'autres paquetages ainsi :
511 @command{--without-history}, @command{--without-fontconfig}
512 @end itemize
515 @node Utiliser adesklets
517 @chapter Utiliser adesklets
519 @ifplaintext 
520 INSTALL_END
521 @end ifplaintext
523 @section ... Comme un conteneur de desklets
525 Par lui-même, adesklets fait peu: il ne fournit que le nécessaire pour
526 faire plus ! Vous avez besoin soit de lui dire quoi faire en
527 lui envoyant des commandes (voir la section suivante) soit d'utiliser d'autres scripts
528 (les desklets) qui le piloteront pour vous.
530 @noindent Pour l'instant, il n'y a qu'un petit nombre de desklets
531 disponibles: vous pouvez les trouver sur la page du projet sur sourceforge en
532 tant que téléchargements séparés:
533 @weblink{http://sf.net/projects/adesklets/}. Ils vous donneront un aperçu 
534 de ce dont @command{adesklets} est capable.
536 @subsection Ajouter un nouveau desklet à votre affichage X
537 Pour ajouter un nouveau script de desklet, il suffit simplement de:
539 @enumerate
540 @item
541 Télécharger sa tarball et la désarchiver quelque part dans votre répertoire
542 personnel
543 @item
544 Lire le fichier README; les pré-requis ou instructions spécifiques y seront
545 donnés. Habituellement, vous n'aurez besoin que d'une installation
546 d'adesklets et d'un serveur X lancé, puis de lancer le script exécutable à
547 partir de votre répertoire de base.
548 @end enumerate
550 @noindent Notez bien que :
552 @itemize
553 @item
554 Lancer le même script plusieurs fois va en créer plusieurs instances.
555 @item
556 Sur les ordinateurs disposant de plusieurs écrans, les script seront affichés
557 sur leur écran hérité par défaut (par exemple, si vous ne faites rien
558 de spécial, appeler un script à partir d'un xterm sur l'écran 1 lancera le
559 desklet sur l'écran 1).
560 @end itemize
562 @noindent La plupart du temps, les scripts de desklets sont faits
563 pour fonctionner tant que vous ne leur dites pas de
564 s'arrêter. L'utilisateur a un contrôle total sur le démarrage, l'arrêt,
565 le redémarrage (quand c'est possible) et le positionnement du desklet, 
566 qui n'a aucun contrôle sur ces opérations.
568 @noindent Les quelques réglages de l'utilisateur sont stockés dans le fichier
569 @file{$HOME/.adesklets} de votre répertoire personnel. Habituellement, vous
570 n'avez pas à éditer ce fichier vous-même. Si vous le faites, assurez-vous
571 qu'aucune instance d'@command{adesklets} ne s'exécute en même temps.
573 @unnumberedsubsubsec Note concernant les polices du système
575 @emph{Vous pouvez sans problème passer cette partie si vous ne comptez pas 
576 utiliser des polices non fournies avec adeklets.}
578 Toutes les polices TrueType présentes sur votre système peuvent être utilisées 
579 avec adesklets, pourvu que votre système supporte fontconfig 
580 (@weblink{http://www.fontconfig.org/}) et qu'adesklets ait été compilé sans l'option
581 @code{--without-fontconfig} (par défaut il est compilé avec le support de 
582 fontconfig; @xref{Installer adesklets}.). Lors de son initialisation, 
583 un adesklets compilé avec fontconfig va parcourir toutes les polices 
584 détectées sur votre système pour identifier toutes les polices TrueType. 
585 Lisez la documentation de fontconfig pour savoir comment configurer 
586 correctement l'accès aux polices de vos logiciels 
587 (@xref{Foire Aux Questions}, pour quelques conseils sur le 
588 débogage de fontconfig). Il est aussi bon de savoir que le paquetage d'adesklets 
589 contient une copie de la police Bitstream's Vera; tous les utilisateurs peuvent 
590 donc s'attendre à ce qu'@command{adesklets} dispose toujours de cette police, 
591 au minimum.
593 @unnumberedsubsubsec Notes concernant l'internationalisation
595 @emph{Vous pouvez sans problème passer cette partie si vous n'envisagez pas 
596 d'utiliser les caractères étendus dans vos desklets.}
598 Si votre système supporte @command{iconv} (@xref{Installer adesklets}.), 
599 vous devriez pouvoir utiliser n'importe quel caractère de n'importe quel
600 jeu de caractères que votre système connait pour afficher du texte, que ce 
601 soit dans un desklet ou dans ses menus, pourvu que vous ayez les polices 
602 TrueType appropriées (c'est à dire des polices TrueType incluant la 
603 représentation de ces caractères)@footnote{Par exemple, la police 
604 Bitstream's Vera fournie avec @command{adesklets} contient des symboles 
605 pour pratiquement tous les caractères du jeu Latin-1.}.
607 En tout cas, en utilisant des caractères étendus (en dehors des 7 bits 
608 @code{ASCII}), assurez-vous que les paramètres locaux de GNU readline 
609 n'interfèrent pas. Ces trois paramètres devraient être configurés comme 
610 indiqué ci-dessous dans le fichier @file{initrc} approprié
611 @footnote{Veillez vous réferer à la documentation de GNU readline}:
613 @example
614 set input-meta on
615 set convert-meta off
616 output-meta on
617 @end example
619 Si vous ne voulez pas adapter vos paramètres de GNU readline, vous pouvez 
620 aussi utiliser l'option @code{--enable-force-extended-characters-input} du 
621 script @code{configure} lors de la configuration du paquetage à partir des 
622 sources, ainsi l'interpreteur outrepassera en interne ces trois variables 
623 dès qu'il le faudra.
625 Bien sur, vous aurez besoin de desklets utilisant ces caractères étendus. 
626 Au moment d'écrire ces lignes, tous les desklets en Python ne provenant pas 
627 de contributions les utilisent; pour ceux-là l'utilisateur peut choisir 
628 quel jeu de caractères utiliser en le précisant dans le fichier de 
629 configuration, quand il existe@footnote{si'l n'existe pas, cela signifie 
630 que de toute façon le desklet n'a pas besoin d'internationalisation}; 
631 l'utilisateur doit simplement définir correctement la ligne 'coding'
632 @footnote{Pour plus de détails consultez @weblink{http://python.fyxm.net/peps/pep-0263.html}.}.
634 Par exemple, pour utiliser les caractères ISO Latin-1, on utilisera 
635 quelquechose comme:
637 @example
638 # -*- coding: ISO-8859-1 -*-
639 @end example
641 à la première ou deuxième ligne du fichier de configuration d'un desklet 
642 en Python@footnote{Evidemment, ce fichier de configuration devra être 
643 enregistré en utilisant l'encodage ISO Latin-1 ou n'importe lequel de 
644 ses dérivés, comme l'@code{ASCII}.}.
646 Enfin, veillez noter que si votre plate-forme ne supporte pas iconv, 
647 vous devrez toujours laisser @code{ASCII} comme paramètre d'encodage, 
648 autrement les desklets vous renverront des erreurs fatales comme 
649 @code{charset conversion not compiled in}. 
651 @subsection Restaurer les précédents desklets sur une nouvelles session X
652 Invoquer @command{adesklets} sans argument :
653 @example
654 adesklets
655 @end example
657 @noindent est suffisant pour redémarrer tous les desklets qui tournaient la
658 dernière fois que vous avez tué le serveur X (dans ce mode, @command{adesklets}
659 terminera rapidement par lui-même : il n'y a pas besoin de les lancer en
660 arrière-plan. adesklets n'utilise pas de démon : chaque applet créé un
661 interpréteur @command{adesklets} indépendant comme processus fils). 
662 Invoquer @command{adesklets} quand des desklets sont déjà 
663 lancés forcera leur arrêt avant leur redémarrage
664 @footnote{Les instances d'@command{adesklets} et leurs parents immédiats 
665 recevront alors un signal SIGKILL.}.
667 @noindent Si vous pensez utiliser des desklets régulièrement, vous
668 devriez mettre la précédente commande @code{adesklets} quelque part dans
669 l'initialisation de votre session X. Je ne peux pas dire où avec précision,
670 puisque cela varie énormément d'un système à l'autre. Cherchez sur :
671 @weblink{http://www.google.com/search?q=''x window''+startup} pour une
672 aide générale.
674 @section ... Comme un éditeur graphique en ligne de commande
676 Vous pouvez aussi utiliser adesklets comme un éditeur graphique en ligne de
677 commande. Si vous tapez, dans une console:
679 @example
680 adesklets :
681 @end example
683 @noindent Vous obtiendrez quelque chose ressemblant à ceci :
685 @anchor{prompt}
686 @example
687 adesklets 0.1.0 (Fri Jan 28 19:09:13 EST 2005), on Linux 2.6.10
688 [gcc 3.4.3 20041125 (Gentoo Linux 3.4.3-r1, ssp-3.4.3-0, pie-8.7.7)]
689 Press TAB for hints.
690 0 >>> _
691 @end example
693 @noindent La dernière ligne est une invite. Elle vous dit que vous êtes prêt
694 à entrer la commande numéro 0. Dans adesklets @value{VERSION}, vous avez
695 environ 150 commandes à portée de main. Grâce à GNU readline, de nombreuses 
696 routines d'auto-complétion sont présentes, ce qui vous permet d'explorer 
697 facilement. Appuyez sur TAB pendant que vous entrez le nom d'une commande 
698 ou le premier argument d'une commande, et des informations utiles seront 
699 affichées. @xref{premiers pas,,une introduction à adesklets}, pour plus d'informations.
701 @node Programmation d'adesklets
702 @chapter Programmation d'adesklets
703 @section Une introduction à adesklets
704 @anchor{premiers pas}
706 Comme expliqué ci-dessus (@xref{A propos d'adesklets}.), adesklets est
707 principalement une console interactive d'Imlib2, avec une ou deux fonctions
708 supplémentaires:
710 @itemize
711 @item
712 Quand un affichage X est présent, la gestion automatique d'une 
713 fenêtre simple.
714 @item
715 Support automatique de la pseudo-transparence
716 @item
717 Gestion d'applets persistants entre sessions
718 @end itemize
720 @noindent Commençons une session interactive typique pour voir ce qui se
721 passe. Sous X, ouvrez un terminal et tapez:
723 @example
724 adesklets :
725 @end example
727 @noindent Comme dans la section précédente (@xref{prompt,, 'Utilisation
728 d'adesklets comme un éditeur graphique en ligne de commande' }.), vous obtenez
729 une invite. Maintenant entrez la commande '@code{images_info}'. Vous devriez
730 obtenir sur la sortie standard :
732 @example
733 2 images
734 id 0 width 1 height 1 alpha 1 filename (null)
735 id 1 width 1 height 1 alpha 1 filename (null)
736 command 0 ok: images_info
737 @end example
739 @noindent Cela signifie que vous avez deux images : l'image 0 et l'image 1,
740 et qu'elles ont une taille de 1x1 pixel. Ce sont les seules images que
741 vous ne pouvez jamais détruire ni modifier comme vous le souhaitez (les
742 redimensionner indépendamment, les retourner diagonalement, etc.) 
743 Qu'est-ce que c'est que cela?
745 @itemize
746 @item
747 Image 0 est l'image d'avant-plan. Par défaut, c'est la seule image qui
748 est affichée dans une fenêtre simple gérée par @command{adesklets}.
749 @item
750 Image 1 est l'image d'arrière-plan. Par défaut, elle contient toujours le
751 contenu de la fenêtre racine (le bureau) qui est sous cette fenêtre. Sans
752 modification de notre part, elle est toujours mise à jour lorsque l'utilisateur
753 la déplace, la redimensionne, lorsque le fond d'écran change, etc.
754 @end itemize
756 @noindent Mais ou est cette fenêtre? Eh bien, pour l'instant, ce sont seulement des
757 images de 1x1 pixel, et elles ne sont pas affichées@footnote{"Mappé" dans le 
758 jargon d'X Window} à l'écran. Ainsi, redimensionnons les à 100x100 pixels:
759 tapez '@code{window_resize 100 100}'. Maintenant, si vous retapez la commande
760 '@code{images_info}', vous obtiendrez:
761 @example
762 2 images
763 id 0 width 100 height 100 alpha 1 filename (null)
764 id 1 width 100 height 100 alpha 1 filename (null)
765 command 2 ok: images_info
766 @end example
768 @noindent Vous voyez? Les images d'avant-plan et d'arrière-plan ont été
769 redimensionées à 100x100 pixels: de plus l'arrière-plan a été mis à jour
770 pour contenir la nouvelle image de fond. Maintenant, rendons cette fenêtre
771 visible. Tapez les deux commandes: '@code{window_reset managed}' et enfin
772 '@code{window_show}'.
774 @noindent La première commande demande à adesklets de laisser votre
775 gestionnaire de fenêtres "gérer" votre fenêtre (ce qui n'est pas fait par défaut): 
776 cela signifie que la fenêtre va être décorée, et que  vous pourrez changer sa
777 visibilité@footnote{Une fenêtre "non-gérée" est très utile pour les desklets: 
778 c'est comme si c'était une partie de la fenêtre racine puisqu'elle peut
779 être faite pour ne jamais être en avant-plan et pour rester affichée (mapped) 
780 lorsque l'on change d'espace de travail.} de façon interactive. La seconde
781 montre votre fenêtre de 100x100. Rien d'impressionnant: un carré noir de
782 100x100 avec une barre de titre et des bordures fixes.
784 @noindent Comme dit plus haut, seule l'image 0 (l'avant-plan) est affichée par
785 défaut. Maintenant, tapons : '@code{window_set_transparency 1}'. Wouah! Nous
786 voyons la fenêtre racine du dessous! Avec "window transparency"
787 activé, l'image 1 (arrière-plan) est d'abord copiée dans la fenêtre, puis
788 l'image 0 (avant-plan) qui est entièrement noire et transparente, est mise
789 par-dessus@footnote{Enfin... Pas tout à fait : il y a un buffer qui intervient 
790 pour la performance, mais l'opération est logiquement équivalente à
791 cette description.}.
793 @noindent Il est temps de parler des couleurs: souvenez-vous, adesklets
794 est une console d'Imlib2. Par conséquent, comme Imlib2@footnote{Gardez
795 votre documentation d'Imlib2 à proximité: c'est très utile!
796 @xref{Documentation d'Imlib2}.}, les couleurs sont toujours de
797 véritables couleurs 32 bits codées en RVBA - huit bits par canal (de 0 à
798 255), incluant un canal alpha pour la transparence. La conversion de palette se
799 fera  automatiquement si la définition de votre écran est inférieure, vous
800 n'avez pas à vous en occuper. Si vous tapez: '@code{context_get_color}',
801 vous obtiendrez:
803 @example
804 command 0 ok: context color 255 255 255 255
805 @end example
807 @noindent Imlib2 est une sorte de machine par états; en tant que tel, il utilise un 
808 "contexte" qui garde en mémoire une série d'attributs qui seront utilisés dans
809 ses opérations futures. Par exemple, nous savons maintenant que la couleur
810 qui sera utilisée, aussi longtemps que nous ne la modifions pas, sera un
811 blanc opaque (rouge=255, bleue=255, vert=255, alpha=255). Si nous tapons:
812 '@code{context_get_image}', il retourne:
813 @example
814 command 0 ok: context image 0
815 @end example
817 @noindent Cela signifie que toute opération que nous effectuons sur une fenêtre
818 sera faite directement sur l'image d'avant-plan. Dessinons un rectangle plein
819 semi-transparent de couleur magenta sur l'avant-plan. Les commandes seront:
820 '@code{context_set_color 255 0 0 200}' et '@code{image_fill_rectangle 25 25
821 50 50}'. Élégant, n'est-ce pas?
823 @noindent Si vous avez l'habitude de programmer avec Imlib2, vous avez 
824 du remarquer que ces dernières commandes ont l'air familières. C'est
825 assez normal; la plupart des fonctions C d'Imlib2 sont présentées de
826 la même façon dans les 'commandes' d'adesklets. Ainsi, la commande
827 d'adesklets  '@code{image_fill_rectangle}' suit la même sémantique que
828 la fonction '@code{imlib_image_fill_rectangle()}' d'Imlib2, la commande
829 '@code{context_set_color}' suit celle de la fonction '@code{imlib_context_set_color()}',
830 etc. Les deux seules différences significatives (et systématiques) sont premièrement que
831 partout où vous utiliserez un objet '@code{Imlib_Quelquechose}' en C, vous
832 utiliserez un ID entier avec adesklets, et deuxièmement dans la sémantique des fonctions
833 '@code{imlib_free_Quelquechose()}' où on doit préciser l'ID de l'objet 
834 auquel s'applique la fonction au 
835 lieu de libérer l'objet de ce type sélectionné dans le contexte.
837 @noindent Tout ceci est facile à illustrer. Chargeons la police "Vera" 
838 incluse dans adesklets à la taille 20pt, mettons la en police par défaut 
839 et écrivons 'Hello' en blanc opaque en diagonale sur l'image d'avant-plan 
840 en partant du coin en haut à gauche, avant de décharger la police. 
841 Cela devrait ressembler à:
843 @example
844 6 >>> load_font Vera/20
845 command 6 ok: new font 0
846 7 >>> context_set_font 0
847 command 7 ok: context_set_font 0
848 8 >>> context_set_direction text_to_angle
849 command 8 ok: context_set_direction text_to_angle
850 9 >>> context_set_angle 45
851 command 9 ok: context_set_angle 45
852 10 >>> context_set_color 255 255 255 255
853 command 10 ok: context_set_color 255 255 255 255
854 11 >>> text_draw 0 0 Hello
855 command 11 ok: text_draw 0 0 Hello
856 12 >>> free_font 0
857 command 12 ok: free_font 0
858 @end example
860 @noindent Si vous regardez votre documentation d'Imlib2, vous remarquerez
861 immédiatement les deux différences que l'on vient d'évoquer: toutes les
862 références à la police Vera/20 sont faites par un ID entier (0 ici), et
863 la commande '@code{free_font}', contrairement à la fonction correspondante
864 '@code{imlib_free_font()}', est appelée avec l'ID de la police comme argument
865 plutôt qu'avec la police du contexte.
867 @noindent A partir de là, imaginons que vous voulez sauvegarder l'image résultante; 
868 aucun problème! Tapez: '@code{save_image out.png}', et
869 l'avant-plan sera sauvé dans un fichier "out.png" dans le répertoire 
870 courant@footnote{Pour que ça marche, il faut que votre installation d'Imlib2 
871 soit correctement configurée pour utiliser libpng, sinon vous
872 risquez de recevoir l'erreur "no loader for file format".}. Maintenant,
873 juste pour le plaisir, quittons adesklets, et lançons une autre session
874 interactive pour voir si nous pouvons recharger cette image. Tapez juste
875 la commande "@code{quit}" ou pressez ^D (Control D: fin de fichier), votre
876 nouvelle session devrait ressembler à ceci :
878 @example
879 0 >>> window_resize 100 100
880 command 0 ok: window_resize 100 100
881 1 >>> window_reset managed
882 command 1 ok: window_reset managed
883 2 >>> window_set_transparency 1
884 command 2 ok: window_set_transparency 1
885 3 >>> load_image out.png
886 command 3 ok: new image 2
887 4 >>> blend_image_onto_image 2 0 0 0 100 100 0 0 100 100
888 command 4 ok: blend_image_onto_image 2 0 0 0 100 100 0 0 100 100
889 5 >>> window_show
890 command 5 ok: window_show
891 6 >>> free_image 2
892 command 6 ok: free_image 2
893 @end example
895 @noindent Bien sur, nous voulions visualiser le résultat - c'est
896 pourquoi nous avons utilisé les commandes '@code{window_reset}',
897 '@code{window_set_transparency}' et '@code{window_show}': elles n'ont
898 pas d'autre utilité. La commande '@code{blend_image_onto_image}' vient elle 
899 aussi tout droit d'Imlib2; elle prend la nouvelle image 2 que l'on vient de
900 créer avec la troisième commande, et la met dans l'image du contexte 
901 (image 0 - avant-plan par défaut), à partir de ses coordonnées (0,0) et 
902 d'une taille de 100x100 pixels, et la met dans un rectangle partant de (0,0)
903 et de taille 100x100 pixels dans l'image 0. Il est finalement bon de noter
904 que, avec adesklets, il y a toujours une image dans le contexte d'Imlib2:
905 dès que vous essayez de libérer l'image courante, le contexte d'image est
906 réinitialisé à l'image d'avant-plan.
908 @noindent Voila, c'est presque la fin de cette introduction... A partir de
909 là vous devriez jouer un peu avec adesklets. Si vous êtes déjà familier avec 
910 Imlib2 vous vous y ferez très rapidement. Sinon vous devriez garder la 
911 documentation d'Imlib2 sous la main. :-)
913 @noindent Quelques dernières astuces:
915 @itemize
916 @item
917 Si vous êtes fatigué de taper encore et encore, n'oubliez pas 
918 l'auto-complétion: 'TAB your problems away!'
919 @item
920 Si vous avez besoin d'aide sur quoi que ce soit, il existe
921 la commande '@code{help}'.
922 @item
923 Si vous exécutez une série de commandes, que ça ne marche pas et que tout
924 cet usage interactif vous fatigue:
925 @enumerate
926 @item
927 Utilisez la commande '@code{history}' pour enregistrer votre session courante
928 dans un fichier@footnote{Pour que ça marche, GNU
929 history doit être installé lors de la compilation d'adesklets.}.
930 @item
931 Utilisez l'option '-f' avec adesklets pour passer les commandes à partir
932 d'un fichier plutôt que de la console tty.
933 @item
934 Si vous essayez de visualiser quelque chose, insérez une commande
935 '@code{pause}' à la fin du script pour geler l'interpréteur.
936 @item
937 Tous les caractères après un dièse '#' jusqu'à la fin de la
938 ligne seront ignorés, ce qui vous permet d'écrire des commentaires.
939 @end enumerate
940 @end itemize
942 @noindent Voici un exemple:
944 @example
945 #!/usr/bin/env adesklets -f
947 # Rendre la fenêtre 'gérée'
949 window_reset managed
951 # Redimmensioner la fenêtre à 100x100 pixels
953 window_resize 100 100
955 # Montrer la fenêtre, puis la geler pendant 10 secondes avant de sortir
957 window_show
958 pause 10
959 @end example
961 @noindent Vous aurez juste besoin de rendre ce script exécutable et de le
962 lancer. Comme d'habitude, les résultats seront affichées sur la sortie standard.
964 @section Véritable programmation avec adesklets: écriture d'un script de desklet
966 Lorsque vous serez prêt pour un vrai travail@footnote{:-)}, vous voudrez 
967 surement utiliser un véritable langage de script plutôt que l'interpréteur 
968 rudimentaire d'@command{adesklets} que nous avons utilisé dans l'introduction;
969 ne serait-ce que pour pouvoir utiliser des variables.
971 Au moment où j'écris ces lignes (@value{UPDATED}), le support pour
972 Python est déjà inclus@footnote{adesklets a été écrit pour être facilement 
973 utilisé depuis toutes sortes de langages interprétés; des interfaces  
974 pour Perl et Ruby sont en projet - n'hésitez pas à proposer votre aide si vous
975 voulez accélérer les choses!}, et la mise en place de Perl 5 est en route.
977 @subsection Quelques astuces pour les programmeurs
979 Une fonction très utile de l'interpréteur d'@command{adesklets} est sa 
980 capacité à produire un trace complète d'une de ses sessions (commandes, 
981 évènements et messages spéciaux), que ce soit sur @code{stderr} ou dans 
982 un fichier journal, et ce indépendemment de ce qui le contrôle. Pour se 
983 servir de cette fonctionalité, il faut:
985 @enumerate
986 @item Configurer le paquetage au niveau des sources en activant la trappe 
987 @code{--enable-debug} de @code{configure}.
988 @item Exporter la variable @code{ADESKLETS_LOG} dans l'environnement si la 
989 sortie de la session doit être enregistrée dans un fichier plutôt qu'affichée 
990 sur @code{stderr}@footnote{L'afficher sur @code{stderr} risque fortement de 
991 perturber les liens avec les langages externes, il est donc préferable de ne le faire que lors d'une invocation de 
992 l'interpréteur directement sur la console.}. Ce doit être un chemin absolu 
993 qui servira de préfixe à l'interpréteur qui, l'ayant hérité de l'environnement, 
994 s'en servira pour créer les noms complets des fichiers dans lesquels il 
995 écrira.
996 @end enumerate
997 A partir de là, il est possible de lire des journaux de session complets et 
998 chronologiques; utilisés correctement, ça peut être utile pour débugger. Vous 
999 pouvez vous en servir conjointement avec la commande @code{echo} pour placer 
1000 des marqueurs faciles à trouver.
1002 @subsection adesklets et Python
1003 @unnumberedsubsubsec Un exemple d'utilisation de Python
1004 Avec Python, les choses ne sont pas très différentes de l'interpréteur. 
1005 Les commandes ont été encapsulées dans des fonctions Python, et une classe 
1006 publique @code{Events_handler} a été construite pour manipuler les retours 
1007 asynchrones de l'interpréteur. Jetons un coup d'oeil sur le script 
1008 @file{test/test.py} de l'archive source de la version @value{VERSION}:
1010 @verbatiminclude ../test/test_fr.py
1012 Voilà! 26 lignes de code Python, et nous avons un desklet parfaitement
1013 fonctionnel. Je pense qu'il s'explique de lui-même; jetez un coup d'oeil à
1014 l'aide intégrée de python à propos de @code{adesklets}, @code{adesklets.functions}
1015 et @code{adesklets.Events_handler} pour de bonnes et complètes explications
1016 @ifhtml
1017 (@xref{Documentation du paquetage Python}.)
1018 @end ifhtml
1019 . Tout ce que nous avons fait ici c'est:
1021 @enumerate
1022 @item
1023 Importer le paquetage @code{adesklets}: cela instancie automatiquement un
1024 processus fils @command{adesklets} et configure toutes les communications. 
1025 Si l'initialisation du paquetage termine sans provoquer d'exception, cela signifie
1026 que l'interpréteur tourne et qu'il attend des commandes.
1027 @item
1028 Faire une sous-classe d'@code{adesklets.Events_handler} et redéfinir les
1029 méthodes invoquées pour les événements qui nous intéressent (tous les autres
1030 événements ne sont pas simplement ignorés, ils ne sont pas générés).
1031 @item
1032 Instancier un objet de cette classe, et le mettre en boucle infinie
1033 @footnote{Cette dernière étape n'est pas obligatoire; le script peut
1034 très bien continuer, mais devra alors avoir été écrit pour supporter les 
1035 interruptions des signaux. Lisez `@code{help(adesklets.Events_handler)}' pour de
1036 plus amples informations.}.
1037 @end enumerate
1039 @unnumberedsubsubsec Attention, piège: quelques détails sur les ID d'objets
1041 Tous les objets d'adesklets (polices, images, palettes de couleurs, polygones, etc), 
1042 sont stockés dans des piles (une pile par type d'objet). Les ID de Python ne sont 
1043 rien d'autre que la position initale d'objets donnés dans la pile correspondante, 
1044 et deviendront donc invalides si un objet du même type situé en-dessous est 
1045 libéré.
1047 Par exemple, partant d'un état vierge, il n'y a d'autre dans la pile des images 
1048 que l'avant-plan (ID O) et l'arrière-plan (ID 1) de la fenêtre. Lorsque 
1049 quelqu'un créé deux autres images depuis Python comme ceci:
1050 @example
1051 im_1 = adesklets.create_image(10,10)
1052 im_2 = adesklets.create_image(10,10)
1053 @end example
1054 @noindent on a @code{im_1==1}, et @code{im_2==2}. Dès qu'on fera:
1055 @example
1056 adesklets.free_image(im_1)
1057 @end example
1058 @noindent La pile commence à s'écraser, et ce qui était l'image 3 (@code{im_1}) 
1059 est maintenant l'image 2, et @code{im_2} est une réference invalide. Cela 
1060 signifie clairement qu'invoquer:
1061 @example
1062 adesklets.free_image(im2)
1063 @end example
1064 @noindent génerera le message d'erreur @code{image out of range}.
1066 @unnumberedsubsubsec Un sujet spécial: les animations
1068 @command{adesklets} inclut maintenant aussi bien un mode d'exécution indirect 
1069 que les variables textuelles (pour être précis, le remplacement textuel 
1070 non-récursif). Cela signifie que les auteurs de desklets ont ce qu'il faut 
1071 pour créer des animations précisément temporisées. Vous trouverez un exemple 
1072 simple à suivre dans @file{test/fading.py}. Une utilisation 
1073 plus poussée de ces fonctionalités est faite dans le desklet @code{yab}. Pour 
1074 réaliser un animation en Python, il faut:
1076 @enumerate
1077 @item @strong{Enregistrer} une séquence de commandes (que nous appelerons une 
1078 commande macro, ou macro). Avec Python, il faut passer en mode 
1079 indirect avec la fonction @code{adesklets.start_recording()}, émettre un 
1080 nombre indéterminé de commandes @command{adesklets}, puis repasser en mode 
1081 normal (execution directe) avec @code{adesklets.stop_recording()}. Bien sur, 
1082 aucune commande n'est évaluée quand l'interpréteur est en mode indirect; les 
1083 commandes sont seulement conservées dans l'historique pour être rejouées plus 
1084 tard. 
1085 @item @strong{Choisir} si la séquence de commandes à rejouer peut être 
1086 interrompue par des évènements ou pas, en utilisant la fonction 
1087 @code{adesklets.play_set_abort_on_events()}. La méthode de haut niveau 
1088 @code{adesklets.Events_handler::set_events()} peut aussi être utilisée pour 
1089 choisir dynamiquement quels évènements seront rattrapés. Pour un exemple, 
1090 voyez @file{test/test_events.py}.
1091 @item @strong{Initialiser} les variables utilisées dans la macro 
1092 enregistrée avec la fonction @code{adesklets.set()}, qui est très similaire 
1093 à son homonyme du shell Bourne.
1094 @item @strong{Lire} la macro avec la fonction @code{adesklets.play()}.
1095 @end enumerate
1097 Quelques remarques supplémentaires:
1098 @itemize
1099 @item Une temporisation précise de la séquence peut être faite par la 
1100 commande @code{time_gate}. Elle fonctionne très simplement: à chaque 
1101 fois qu'une macro est exécutée, adesklets enregistre à quel moment 
1102 elle à commencé. Dès qu'une commande @code{time_gate} apparait lors 
1103 de l'exécution, le programme attend que le nombre de secondes données 
1104 en argument à @code{time_gate} soient écoulées. Par exemple, écrire 
1105 @code{time_gate 0.1} dans une macro empêchera l'execution de toutes les 
1106 commandes suivantes de la macro tant que celle-ci n'aura pas fonctionné 
1107 pendant au moins un dixième de seconde.
1108 @item La substitution des variables à toujours lieu juste avant l'exécution 
1109 des commandes, indépendemment du mode d'execution (direct ou indirect). 
1110 Toute séquence de caractères ne contenant pas d'espace précedée directement 
1111 par un seul '$' sera remplacée par le contenu de la variable correspondante 
1112 (configuré précedemment avec @code{set}). Si aucune variable ne correspond, 
1113 la séquence est simplement ignorée.
1114 @item Toutes les macros exécutées par la commande @code{play} sont, du point de 
1115 vue du desklet qui les contrôle, élémentaires, comme toutes les autres commandes. 
1116 En un mot, cela signifie qu'aucun évènement ne sera jamais géneré pendant 
1117 qu'une macro est exécutée; ils apparaitront tous juste après que la commande 
1118 @code{play} ait terminé. 
1119 @item Comme d'habitude, l'interpréteur d'adesklets fonctionne par états pour 
1120 les variables et les états liés au mode indirect. Vous n'avez pas à fixer le 
1121 drapeau @code{set_abort_on_events} ou les variables à chaque fois que vous 
1122 appelez une macro, sauf si quelquechose doit être changé depuis l'appel 
1123 précedent.
1124 @item La fonction de haut niveau @code{adesklets.Events_handler::set_events()} 
1125 sert principalement à arrêter la prise en charge de certains évenements pendant 
1126 l'exécution de la macro, ainsi la macro ne peut être interrompue que dans des 
1127 circonstances bien précises. Bien sur, tous les évènements génerés avant l'appel 
1128 à cette méthode ne seront pas perdus mais placés en file d'attente, et les 
1129 méthodes d'évènements appropriées seront appelées plus tard, pourvu que les 
1130 trappes soient en place lorsque l'exécution de la macro est terminée.
1131 @item Avons-nous rappelé que faire tout cela depuis un endroit non protégé est 
1132 une mauvaise idée? Eh bien, ça l'est. N'oubliez pas d'utiliser 
1133 @code{adesklets.Events_handler::block()} et @code{adesklets.Events_handler::unblock()} 
1134 autour de tout code relatif à une animation si vous avez instancié un objet 
1135 d'une classe fille de @code{adesklets.Events_handler}.
1136 @end itemize
1138 @unnumberedsubsubsec Configuration et internationalisation
1140 Mentionnons jute ici que depuis @command{adesklets} 0.4.0, le module 
1141 @code{adesklets.utils} inclut maintenant une classe optionelle 
1142 @code{ConfigFile} qui peut être facilement réutilisée par les auteurs de 
1143 desklets pour ajouter un système de configuration facilement extensible à 
1144 leur code@footnote{Pour en voir un exemple voyez n'importe quel desklet 
1145 non issu de contributions.}
1146 @ifhtml
1147 (@xref{Documentation du paquetage Python}.)
1148 @end ifhtml
1149 . Par défaut, la classe prend aussi en charge l'internationalisation 
1150 automatiquement, en sélectionnant les jeux de caractères selon les 
1151 besoins de l'utilisateur. L'utilisation des jeux peut bien sûr être 
1152 déterminée ou changée à tout moment en utilisant les fonctions 
1153 @code{adesklets.get_charset()} et @code{adesklets.set_charset()}. La 
1154 classe @code{adesklets.utils.ConfigFile} a aussi un attribut @code{charset} 
1155 qu'on peut examiner pour connaitre les préferences de l'utilisateur. En 
1156 utilisant cette classe on notera que le jeu de caractères 'ASCII' est 
1157 considéré comme choix par défaut, et qu'il ne désactivera pas une éventuelle conversion.
1158 Ansi, les utilisateurs de plate-formes ne supportant pas iconv pourront 
1159 toujours utiliser @command{adesklets} sans le support de l'internationalisation. 
1161 @unnumberedsubsubsec Derniers mots
1163 @noindent Enfin, signalons que vous pourriez avoir envie de jeter un oeil au 
1164 code source du desklet @file{weather} disponible sur 
1165 @weblink2{le site web du projet SourceForge,http://sourceforge.net/projects/adesklets/} 
1166 pour voir un plus gros morceau de code Python utilisant adesklets. Il y a aussi 
1167 quelques autres desklets de test sous le répertoire @file{test/} qui pourraient 
1168 vous donner des idées.
1169 @ifhtml
1170 Vous pourriez aussi jeter un oeil au paquetage d'aide autogéneré d'@command{adesklets} 
1171 par pydoc, inclus dans ce document (@xref{Documentation du paquetage Python}.). Dès 
1172 que vous êtes suffisement content de votre desklet, n'hésitez pas à le partager avec 
1173 le reste d'entre nous (ce qui serait très apprécié). Faites-en un paquetage 
1174 (@xref{GNU Makefile pour empaqueter les desklets}.), puis soumettez-le 
1175 (@xref{Soumettre un desklet}.).
1176 @end ifhtml
1178 @node Extension d'adesklets
1179 @chapter Utiliser adesklets à partir d'autres languages
1181 adeskets a été fait pour être facilement utilisable depuis toutes sortes 
1182 d'environnements de langages@footnote{On parle d'environnement de langage 
1183 parceque le problème n'est pas la syntaxe ou le paradigme utilisé 
1184 (qu'il soit impératif, fonctionnel ou n'importe quoi d'autre), mais la 
1185 manière dont vous pouvez gérer des opérations de base de POSIX sur les 
1186 fichiers, les signaux, etc. (@xref{Fonctionalités requises}.). Ainsi 
1187 un programmeur Perl 5 devrait utiliser adesklets facilement, alors qu'un 
1188 programmeur Linux JDK devrait probablement recontrer plus de difficultés 
1189 (sans vouloir critiquer).}. Ce chapitre explique aux développeurs comment 
1190 l'interpréteur d'adesklets s'intègre dans le système d'une manière 
1191 indépendante du langage.
1193 @noindent Si vous n'êtes pas un minimum habitués aux systèmes POSIX ou que 
1194 vous n'avez pas les notions de base sur la programmation de systèmes 
1195 d'exploitations, ce chapitre n'est surement pas d'un grand interêt pour 
1196 vous.
1198 @noindent Veillez noter que le paquetage Python du répertoire 
1199 @file{scripting/pyhton/adesklets} est un bon complément de ce que vous 
1200 allez lire.
1202 @section Fonctionalités requises
1203 @anchor{Fonctionalités requises}
1204 Si vous voulez utiliser l'interpréteur d'adesklets depuis votre langage 
1205 favori mais qu'il n'est pas supporté à la base@footnote{Pour adesklets 
1206 @value{VERSION}, seul Python est supporté à la base.}, vous pouvez 
1207 toujours ajouter ce support, pourvu que votre langage comporte une 
1208 de ces fonctionalités:
1210 @itemize
1211 @item Lire et écrire dans des tuyaux (pipes); ou
1212 @item Lire et écrire depuis ou dans des fichiers sans mémoire tampon ('unbuffered files')
1213 @end itemize
1215 @noindent Il doit aussi pouvoir@footnote{Ceci dit, 
1216 disposer du sopport d'IPC et de poll/select rendra les choses à la fois plus 
1217 simples et plus claires. Il est aussi très utile de pouvoir bloquer des signaux.}:
1219 @itemize
1220 @item Rattraper des signaux IPC; ou
1221 @item Lire des fichiers en mode non-bloquant; ou
1222 @item Utiliser poll/select sur des fichiers
1223 @end itemize
1225 @noindent Enfin, il doit aussi être capable de lancer un processus fils.
1227 @noindent Ces pré-requis sont bien minces du point de vue d'un système 
1228 POSIX, mais précisons par souci d'exhaustivité que si votre 
1229 environnement de langage ne remplit pas ces critères, vous pouvez quand 
1230 même vous en servir pourvu que vous arriviez à faire en sorte que votre 
1231 application communique de manière fiable avec un autre programme
1232 @footnote{Qui serait en fait une interface.} qui, lui, les remplirait. 
1233 Bien sur, ce n'est pas la situation idéale et cela doit être évité 
1234 autant que possible.
1236 @section Mécanisme d'initialisation
1238 Comme vous le savez probablement (@xref{Utiliser adesklets}.), 
1239 @command{adesklets} possède deux modes de fonctionnement, si l'on 
1240 peut les appeler ainsi:
1242 @enumerate
1243 @item en tant que lanceur de desklets, si vous appelez @command{adesklets} 
1244 sans arguments.
1245 @item en tant qu'interpréteur, dans tous les autres cas (utilisation en 
1246 ligne de commande intéractive ou en processus fils d'un desklet).
1247 @end enumerate
1249 @subsection adeskelts appelé comme un lanceur de desklets - redémmarer tous les desklets
1250 @noindent Dans une nouvelle session X, la séquence de démmarage classique est 
1251 à peu près la suivante:
1253 @enumerate
1254 @item @command{adesklets} est appelé sans arguments à partir d'un script 
1255 d'initialisation de la session X.
1256 @item A partir de là, la nouvelle instance d'adesklets se comporte comme 
1257 un lanceur de desklets. Elle parcoure le fichier @file{$HOME/.adesklets}, 
1258 puis se copie (fork) autant de fois qu'il y a de desklets à démarrer. Ensuite 
1259 le processus lanceur termine puisqu'il n'y a pas besoin de démon ici.
1260 @item Tous les processus copiés initialisent la variable d'environnement 
1261 @code{ADESKLETS_ID} contenant leur propre ID entier en tant que chaine de 
1262 caractères, puis exécutent@footnote{Avec un appel de la famille execve*; 
1263 voir @code{man 2 execve}.} le script associé.
1264 @item Chaque desklet se lance une instance d'@command{adesklets} en tant 
1265 que processus fils, donnant en passant la variable @code{ADESKLETS_ID} 
1266 sans l'alterer. Il est du devoir du desklet de s'assurer que:
1267 @itemize
1268 @item Les flux standards de l'interpréteur d'adesklets, @code{stdin}, 
1269 @code{stdout} et @code{stderr}, soient redirigés séparément, de sorte que 
1270 le processus parent puisse facilement écrire dans le @code{stdin} 
1271 d'adesklets, et lire @code{stdout} et @code{stderr}. L'utilisation de 
1272 tuyaux, FIFOs ou éventuellement de fichiers réguliers sont possibles.
1273 @item les écritures vers @code{stdin} et les lectures depuis les deux 
1274 autres flux se font toutes sans tampon.
1275 @item le premier argument de la commande @command{adesklets} est le nom 
1276 absolu du script du desklet.
1277 @end itemize
1278 @item Chaque interpréteur @command{adesklets} nouvellement créé s'initialise 
1279 en utilisant la variable d'environnement @code{ADESKLETS_ID} et le nom 
1280 absolu donné en premier argument de ligne de commande pour déterminer 
1281 ses caracteristiques non-scriptables@footnote{Qui sont, nominativement, 
1282 son écran et ses coordonnées.} à partir de @file{$HOME/.adesklets}. 
1283 Une fois cette opération terminée, l'évènement @code{ready!} est 
1284 géneré (@xref{Evènements}.), l'interpréteur est alors prêt à 
1285 traiter des commandes.
1286 @end enumerate
1288 @subsection adesklets appelé en tant qu'interpréteur - enregistrement d'un nouveau desklet
1290 Quand un nouveau desklet est appelé directement, la séquence de démarrage 
1291 décrite dans la section précedente est la même, sauf que les trois 
1292 premières étapes n'ont tout simplement pas lieu. Cela signifie que 
1293 l'environnement @code{ADESKLETS_ID} n'est pas défini; cela permet 
1294 au nouvel interpréteur d'@command{adesklets} de détecter qu'il 
1295 s'agit d'un nouveau desklet, il va parcourir le fichier de configuration 
1296 @file{$HOME/.adesklets} et allouer au desklet le premier ID disponible. 
1298 @noindent Il faut noter que si le nom de fichier du desklet donné comme 
1299 premier argument à l'instance fille d'@command{adesklets} est relatif ou 
1300 si'l n'est pas lisible et exécutable par l'utilisateur courant, le 
1301 desklet ne sera pas enregistré dans @file{$HOME/.adesklets}, et par 
1302 conséquent ne sera pas automatiquement redémmaré par le lanceur 
1303 dans les futures nouvelles sessions X. Dans le cas où @code{stdin} 
1304 est un terminal@footnote{Ce qui signifie que la session est 
1305 interactive}, l'enregistrement ne se fera pas non plus.
1307 @subsection Conséquences
1308 Ainsi, du point de vue du script de desklet, les deux cas sont identiques, 
1309 ce qui ne nécessite aucun traitement conditionel. Tout le travail 
1310 d'initialisation du desklet se fait dans la quatrième étape de la 
1311 sous-partie ci-dessus.
1313 @noindent Si besoin, le desklet pourra utiliser la commande @code{get_id} 
1314 pour déterminer son ID.
1316 @section Utilisation des flux
1318 Comme expliqué précedemment, un desklet communique avec son propre 
1319 interpréteur adesklets via des flux sans tampons redirigés. Voyons 
1320 ici quelles informations ils transportent.
1322 @subsection stdin: les commandes
1324 Sur le @code{stdin} de l'interpréteur, le desklet envoie les commande 
1325 qu'il veut exécuter dans l'ordre dans lequel il veut les exécuter, une 
1326 commande par ligne@footnote{Le caractère '\n' doit être placé après 
1327 chaque commande.}. Etant donné que la lecture de ce flux est suspendue 
1328 quand une commande est évaluée, un desklet devra géneralement attendre 
1329 qu'une commande soit exécutée avant d'en envoyer une autre
1330 @footnote{Ceci permet d'éviter de bloquer le processus en surchargeant 
1331 le flux avec des commandes arbitrairement longues; bien sur, envoyer 
1332 trois commandes de quelques centaines d'octets d'un coup n'est pas un 
1333 problème!} (voir la section suivante).
1335 @noindent Le format des commandes est assez simple: on a le nom d'une 
1336 commande suivi d'arguments séparés par des espaces, tous représentés par 
1337 du texte pur, y compris les nombres. adesklets ne se soucie pas du nombre 
1338 d'espaces entre les arguments, pourvu qu'il y en ait au moins un. Dans le 
1339 cas particulier des commandes où le dernier argument est une chaine de 
1340 caractères (@code{text_draw}, par exemple), adesklets considèrera les 
1341 premiers caractères n'étant pas des espaces comme le début de la chaine; 
1342 le reste de la ligne, espaces inclus, sera considéré comme faisant 
1343 partie de la chaine.
1345 @noindent Deux fichiers, automatiquement tenus à jour avec la source 
1346 (@file{scripting/prototypes} et @file{scripting/enums}) à partir de 
1347 la distribution d'origine, fournissent au format texte brut (avec une 
1348 tabulation comme séparateur) une description de toutes les commandes et 
1349 constantes mises à disposition des desklets@footnote{Pour plus de détails 
1350 sur le format de ces deux fichiers, cf @file{scripting/protoize.sh.in} et 
1351 @file{scripting/enums.sh}.}. Un bon portage pour un langage particulier 
1352 devrait être fourni avec quelques routines permettant de génerer automatiquement 
1353 les parties pertinentes de sa propre bibliothèque à partir de ces fichiers; 
1354 par exemple, le portage de Python comporte une fonction @code{protoize} 
1355 dans le script @file{setup.py} de @code{distutils} pour le faire. 
1356 Idéalement, cette routine devrait être écrite avec ce langage et un 
1357 ensemble raisonnable de librairies@footnote{L'idée étant que la plupart 
1358 des utilisateurs de votre portage doivent être plus ou moins capables 
1359 de s'en servir avec l'installation de base du langage.}; si'l n'est pas 
1360 bien adapté à cette tâche, vous devrez vous limitez à:
1362 @itemize
1363 @item Des scripts portables pour le shell Bourne, conforme aux standards 
1364 POSIX 1003.2 et 1003.2a
1365 @item Un sed (Streaming Editor) récent, compatible avec GNU sed
1366 @footnote{De nos jours éxecuter GNU sed n'est pas un problème sur pratiquement 
1367 n'importe quel système POSIX.}
1368 @item Une utilisation portable de n'importe quel bc pour l'arithmetique
1369 @end itemize
1371 @noindent si vous voulez que votre travail soit intégré au paquetage officiel.
1373 @subsection stdout: les résultats des commandes
1375 L'interpréteur d'@command{adesklets} cherche fréquemment si de nouveaux 
1376 caractères sont arrivés sur son flux @code{stdin}, et le lit si besoin. 
1377 Dès qu'il reçoit le caractère de fin de ligne ('\n'), il arrête de lire 
1378 et essaye d'exécuter la commande. Une fois la commande terminée (elle 
1379 aura peut-être envoyé quelques lignes sur @code{stdout}), il envoie 
1380 en tant que dernière entrée un message d'état de la forme suivante: 
1382 @example
1383 command RANG ok: MESSAGE
1384 @end example
1386 @noindent si la commande s'est terminée avec succès, ou:
1388 @example
1389 command RANG error: MESSAGE_DERREUR
1390 @end example
1392 @noindent @code{RANG} est l'indentifiant numérique de la commande (un entier 
1393 non signé) qui part de zéro lorsque l'interpréteur est créé, et qui est 
1394 automatiquement incrémenté à chaque ligne qu'il reçoit ensuite. Il est 
1395 garanti que toutes les commandes seront exécutées dans l'ordre dans lequel 
1396 elles ont étées données. 
1397 @code{MESSAGE_DERREUR} est un message compréhensible, sans format particulier, 
1398 expliquant d'où vient l'erreur. @code{MESSAGE} est également compréhensible, 
1399 mais sera formaté de sorte qu'il peut être utilisé pour récupérer les valeurs 
1400 de retour utiles algorithmiquement de n'importe quelles commandes. Ces valeurs 
1401 de retour peuvent être:
1403 @enumerate
1404 @item un entier--l'ID de la valeur de retour (@code{create_image} et autres)
1405 @item un couple d'entiers--le résultat numérique de la commande 
1406 (pour @code{context_get_color} et consorts)
1407 @item une liste de chaines--la liste ordonnée des chaines de caractères retournées 
1408 par les commandes retournant plusieurs lignes sur @code{stdout} (@code{images_info} 
1409 et ses semblables), la dernière ligne étant un message d'état
1410 @item une chaine de description--une réponse textuelle en une ligne de la commande 
1411 @item rien du tout
1412 @end enumerate
1414 @noindent Algorithmiquement, votre 'routine de récupération des valeurs de retour' 
1415 devrait d'abord essayer de récupérer les entiers de @code{MESSAGE}@footnote{Tous 
1416 les paramètres de @code{MESSAGE} sont séparés par un esapce.}. Si elle trouve un 
1417 entier ou plus, elle devra vérifier que le message n'est pas une simple copie 
1418 d'une commande donnée; alors la valeur de retour correspond au cinquième 
1419 cas (cf ci-dessus). Autrement, si elle ne trouve qu'un entier, on est dans le 
1420 premier cas; et si'l y en a plus d'un, dans le deuxième. Si aucun entier n'est 
1421 trouvé et si'l y avait une liste de lignes envoyées à @code{stdout} avant le 
1422 message d'état de la commande, on est dans le troisième cas. Pour le reste:  
1423 si le message d'état diffère d'une commande donnée, cela correspond au 
1424 quatrième cas. Sinon il faut considérer que la sortie correspond au cinquième cas. 
1425 Cet algorithme de récupération fonctionne avec toutes les commandes listées 
1426 dans @file{scripting/prototypes}.
1428 @subsection stderr: les évènements
1429 @anchor{Evènements}
1431 Tous les autres rapports asynchrones d'évènements sont envoyés au flux 
1432 @code{stderr} de l'interpréteur. Ils sont asynchrones par rapport au traitement 
1433 des commandes; ils ne se produiront jamais pendant le traitement d'une 
1434 commande (dans l'intervalle de temps entre la soumission de la commande 
1435 complète sur @code{stdin} et la sortie de son message d'état sur 
1436 @code{stdout}), ils peuvent être envoyés à n'importe quel autre moment
1437 @footnote{De toute façon aucun évènement n'est jamais perdu; son apparition 
1438 est simplement retardée.}.
1440 @noindent Les rapports d'évènements tiennent sur une ligne, de la forme
1441 @footnote{Toutes les autres informations sur @code{stderr} peuvent être 
1442 ignorées sans risque.}:
1444 @example
1445 event: MESSAGE_DEVENEMENT
1446 @end example
1448 @noindent Sous la forme de Backus 
1449 Naur@footnote{@weblink{http://fr.wikipedia.org/wiki/Forme_de_Backus_Naur}}, 
1450 la grammaire employée pour MESSAGE_DEVENEMENT serait:
1452 @verbatim
1453 MESSAGE_DEVENEMENT :: ready! |
1454                       backgroundgrab |
1455                       menufire MENU_ID MENU_STR |
1456                       motionnotify X Y |
1457                       enternotify X Y |
1458                       leavenotify X Y |
1459                       buttonpress X Y BUTTON_ID |
1460                       buttonrelease X Y BUTTON_ID
1462 @end verbatim
1464 @noindent où @code{MENU_ID}, @code{X}, @code{Y}, et @code{BUTTON_ID} sont tous 
1465 des entiers supérieurs ou égaux à zéro, et @code{MENU_STR} est une chaine de 
1466 caractères, pouvant contenir des espaces. Détaillons un peu plus tout cela:
1468 @itemize
1469 @item Evènement @strong{Ready}: envoyé une fois seulement, dès que l'interpréteur 
1470 d'@command{adesklets} est prêt à traiter des commandes.
1471 @item Evènement @strong{BackgroundGrab}: envoyé à chaque fois que l'image 
1472 d'arrière-plan (image 1) est regénerée.
1473 @item Evènement @strong{MenuFire}: envoyé à chaque fois qu'un utilisateur sélectionne 
1474 un élément d'un menu qui n'est pas géré en interne par adesklets.
1475 @item Evènement @strong{MotionNotify}: envoyé dès que le pointeur bouge dans la 
1476 fenêtre d'un desklet.
1477 @item @strong{EnterNotify, LeaveNotify}: envoyé dès que le curseur passe sur une 
1478 bordure visible de la fenêtre de l'interpréteur, qu'il aille dedans ou dehors.
1479 @item @strong{ButtonPress, ButtonRelease}: envoyé quand un bouton de la souris est 
1480 cliqué dans la fenêtre de l'interpréteur.
1481 @end itemize
1483 @noindent Tous les évènements sauf 'Ready!' (nominativement: MotionNotify, 
1484 EnterNotify, LeaveNotify, ButtonPress, ButtonRelease, BackgroundGrab et MenuFile) 
1485 peuvent êtres masqués par le desklet. En fait, @command{adesklets} fournit au desklet 
1486 des commandes permettant de gérer spécifiquement la création et la production des 
1487 évènements, qui sont:
1488 @code{event_catch}, @code{events_get_send_sigusr1}, @code{events_reset_all},
1489 @code{event_uncatch}, @code{events_info}, @code{events_set_echo}, 
1490 @code{events_get_echo}, @code{events_purge} et @code{events_set_send_sigusr1}.
1491 Il faut noter que ces fonctions ne sont pas listées dans 
1492 @file{scripting/prototypes} puisque vous ne voulez probablement pas que vos 
1493 utilisateurs y aient accès. Vous devrez probablement démarrer une session 
1494 interactive et jouer avec pour être sur que vous les avez bien comprises. Il est 
1495 aussi temps de mentionner le script @file{src/adesklets_debug.sh}, qui se 
1496 rend utile pour les expériences intéractives avec les évènements.
1498 @noindent Il faut encore mentionner deux choses à propos des évènements:
1500 @enumerate
1501 @item Par défaut, les évènements ne sont pas affichés, mais stockés en interne, 
1502 en attendant d'être purgés avec @code{event_purge}. Vous pouvez modifier cela 
1503 avec @code{events_set_echo}.
1504 @item Vous pouvez paramètrer un interpréteur adesklets pour qu'il envoie le 
1505 signal SIGUSR1 à chaque fois qu'un évènement est envoyé à son processus père 
1506 (le desklet). Cette communication entre processus est très utile puisque le signal peut être ratrappé, 
1507 ce qui permet à la routine de gestion des évènements de ne fonctionner que 
1508 lorsque c'est nécessaire. C'est ce qui est utilisé dans le paquetage Pyhton 
1509 dans la classe @code{Events_handler}.
1510 @end enumerate
1512 @section Récuperation du signal SIGCHLD
1514 Pourvu que votre langage le permette, vous devriez installer une sorte de 
1515 récuperateur de SIGCHILD, ainsi vous pourrez au moins être averti si jamais 
1516 l'interpréteur d'adesklets se termine sans raison (sans parler du cas des 
1517 processus fils à l'état zombie)@footnote{@code{man 2 signal} est une très bonne 
1518 réference sur les signaux.}.
1520 @section Variables textuelles
1522 @command{adesklets} supporte aussi l'exécution differée (mode indirect) 
1523 et le remplacement textuel des variables. Voici comment fonctionnent les 
1524 variables en mode indirect:
1526 @enumerate
1527 @item Une fois qu'une commande est entrée, elle est stockée telle quelle 
1528 dans la liste de l'historique des commandes si on est bien dans le mode 
1529 non-interactif de l'interpréteur et si la commande réside entre les appels 
1530 à @code{start_recording} et @code{stop_recording})
1531 @item Quand une macro est éxecutée (avec la commande @code{play}, 
1532 @xref{Programmation d'adesklets}.), les variables sont substituées en une 
1533 seule passe, et aucune réference indirecte n'est possible. La substitution 
1534 est assez directe. On recherche dans la ligne de commande stockée toute séquence 
1535 non-vide de caractères distincts de l'espace commançant par un seul '$'. Chaque 
1536 séquence trouvée est remplacée par la valeur @code{$variable} correspondante, 
1537 ou supprimée si aucune variable n'est trouvée.
1538 @item La commande completée est exécutée.
1539 @end enumerate
1542 Le même mécanisme de substitution s'applique en mode d'exécution direct. Tout ceci 
1543 implique que, avec le paquetage Python par exemple, ces deux morceaux de code sont 
1544 équivalents:
1546 @example
1547 adesklets.window_resize(100,100)
1548 @end example
1552 @example
1553 adesklets.set('dim',100)
1554 adesklets.window_resize('$dim','$dim')
1555 @end example
1557 Python étant un langage typé dynamiquement, aucune modification de notre code 
1558 n'est nécessaire, mais d'autres langages pourraient demander plus de réflexion. 
1560 @section Derniers mots
1562 Maintenant vous devriez savoir quasiment tout ce qu'il faut pour intégrer adesklets 
1563 à votre environnement de langage. Cette tache peut avoir l'air intimidante, mais un 
1564 traducteur très propre peut être fait par un seul développeur en seulement quelques 
1565 jours. Encore une fois, jetez un oeil à @file{src/adesklets_debug.sh}; c'est un 
1566 traducteur (simplet) du Bourne Shell pour adesklets qui tient dans seulement 
1567 cinquante lignes, commentaires compris.
1569 Si jamais vous avez besoin d'aide, vous êtes encouragés à écrire (en anglais) à la 
1570 @weblink2{mailing list 
1571 adesklets-devel,https://lists.sourceforge.net/lists/listingo/adesklets-devel}...
1573 Bonne programmation!
1575 @noindent
1576 @node Recherche d'aide!
1577 @chapter Contribuer à adesklets
1579 Nous avons besoin de votre aide! Vous pouvez contribuer efficacement à 
1580 adesklets de différentes manières:
1581 @itemize
1582 @item
1583 @strong{Mettre en ligne vos captures d'écran}. Vous êtes un utilisateur 
1584 d'adesklets et pensez avoir un bureau particulièrement réussi? Partagez-le 
1585 avec le monde, et faites-le nous savoir! Vous aiderez ainsi à faire 
1586 connaitre le projet.
1587 @item
1588 @strong{Contribuer à la documentation}. Vous écrivez correctement en Allemand, 
1589 Espagnol, Portugais, Arabe ou Swahili? Les traducteurs seront toujours les 
1590 bienvenus, ainsi que les relecteurs, quels que soient les langues.
1591 @item
1592 @strong{Écrire de nouveau desklets}. adesklets est encore dans sa petite
1593 enfance: nous sommes en quête de talentueux auteurs de desklets, et nous serions
1594 plus qu'enchantés de mettre en ligne ou de faire des liens vers votre travail.
1595 Ne vous inquiétez pas trop des changements d'interface; l'auteur à fait des efforts 
1596 considérables pour lui assurer une certaine stabilité, même dans les premières 
1597 versions. Elle n'est pas non plus fixée pour toujours, mais ne devrait en tout cas 
1598 pas gêner vos desklets sans prévenir. Actuellement, l'API subit surtout des 
1599 corrections internes de bugs et des améliorations de sa portabilité.
1600 @item @strong{Ajouter des interfaces pour de nouveaux langages}. Contactez 
1601 les développeurs avant de commencer quoi que ce soit pour que vous ne perdiez pas 
1602 votre temps sur quelquechose de déjà fait; ils seront heureux de partager leur code. 
1603 Inscrivez-vous à la @weblink2{mailing-list 
1604 adesklets-devel,https://lists.sourceforge.net/lists/listinfo/adesklets-devel} sur 
1605 sourceforge pour un contact direct avec eux.
1606 @end itemize
1608 @noindent Contactez-moi par email à @email{syfou@@users.sourceforge.net} (NdT: 
1609 vous pouvez lui écrire en anglais comme en français).
1611 @node Foire Aux Questions
1612 @appendix Foire Aux Questions
1614 Dernière mise à jour: @value{UPDATED}
1616 @section Démmarer des desklets
1618 @subsection Quand j'essaie de lancer un nouveau desklet, j'obtiens l'erreur @code{ImportError: no module named adesklets} de l'interpréteur Python. Qu'est-ce qui se passe?
1620 C'est écrit dessus: @command{python} n'arrive pas à trouver le 
1621 paqetage @code{adesklets}; peut-être qu'il n'a pas été installé, 
1622 ou qu'il a été installé au mauvais endroit.
1624 @itemize
1625 @item Reprenez depuis le début la procédure d'installation 
1626 (@xref{Installer adesklets}.). Assurez vous que vous 
1627 @strong{n'activez pas} l'option de configuration 
1628 @code{--without-python-support}.
1629 @item Re-essayez de lancer le desklet. Si cela ne marche toujours pas, 
1630 vérifiez que le répertoire d'installation, que vous pouvez voir 
1631 avec: @example
1632 sed -n '/PYTHON_SITE_PKG/p' Makefile
1633 @end example
1634 @noindent est inclus dans: @example
1635 echo 'import sys; print sys.path' | python
1636 @end example
1638 @noindent si'l ne l'est pas, vous pouvez toujours essayer de déplacer 
1639 manuellement le répertoire d'adesklets de @code{PYTHON_SITE_PKG} vers 
1640 un des chemins donnés par la commande précedente.
1641 @end itemize
1643 @subsection Quand j'essaie de démmarer un nouveau desklet, j'obtiens l'erreur @code{ADESKLETSError: adesklets process exited} de l'interpréteur Python. Qu'est-ce que c'est?
1645 Sur certains systèmes rares (@weblink2{archlinux,http://www.archlinux.org/} par exemple), 
1646 la variable @code{PATH} de l'interpréteur Python diffère de celle 
1647 héritée de l'environnement standard, ce qui fait que le paquetage Python 
1648 n'arrive pas à lancer adesklets en tant que processus fils. Sur ce 
1649 genre de systèmes, assurez-vous que vous installez @command{adesklets} 
1650 avec l'option appropriée @code{--prefix} lors de la configuration. 
1651 Par exemple, sur la plupart des plate-formes Linux récentes, vous 
1652 devriez utiliser:
1654 @example
1655 ./configure --prefix=/usr
1656 @end example
1658 @subsection Tout a bien fonctionné mais ensuite j'ai essayé de mettre à jour un desklet, et je n'ai jamais pu voir le nouveau. Où est l'erreur?
1660 Il y a un mécanisme interne de blocage dans l'interpréteur qui empêche un 
1661 utilisateur de lancer simultanément plus d'un desklet avec le même @code{ID} 
1662 et le même nom, quelle que soit la version. Lorsque vous mettez à jour un 
1663 desklet donné, vous devriez d'abord quitter proprement le desklet (en 
1664 utilisant la commande @code{Quit} du menu contextuel), puis installer le 
1665 desklet mis à jour en suivant les instructions fournies par le fichier 
1666 @file{README}.
1668 @subsection Argh! Le desklet X marche, mais ne se souvient pas de ses paramètres, ou bien il démmare toujours dans le coin en haut à gauche de l'écran 0 dans une nouvelle session X. Qu'est-ce que c'est? C'est lourd!
1670 C'est très probablement lié à la manière dont vous avez démmaré le 
1671 desklet (cf @pxref{Utiliser adesklets}.). Vous devez invoquer le script 
1672 du desklet @strong{une seule fois}. Pour toute utilisation future vous 
1673 n'aurez qu'a éxectuer la commande:
1675 @example
1676 @command{adesklets}
1677 @end example
1679 qui se souviendra où vous aviez placé les desklets et quels desklets étaient 
1680 lancés. 
1682 @subsection C'est exactement ce que j'ai fait, mais ce truc ne veut toujours pas redémmarer.
1684 N'auriez-vous pas placé les desklets dans un répertoire du type 
1685 @file{$HOME/.adesklets}? Veillez ne pas le faire. @command{adesklets} 
1686 utilise le fichier @file{$HOME/.adesklets} pour enregistrer toutes sortes 
1687 de paramètres des desklets lancés; créer un répertoire portant ce nom 
1688 l'empêchera de faire son travail correctement, vous n'avez donc qu'a 
1689 déplacer votre répertoire ailleurs (@file{$HOME/.desklets}, par exemple).
1691 @section Afficher les desklets
1693 @subsection Où sont mes desklets? L'interpréter d'@command{adesklets} semble être lancé correctement, mais je ne vois tout simplement rien sur mon bureau!
1695 Essayez la commande:
1697 @example
1698 python test/test.py
1699 @end example
1701 @noindent depuis le répertoire de base des sources. Si une fenêtre de 100 sur 
1702 100 pixels apparaît, ce signifie très probablement que vous utilisez un 
1703 gestionnaire de fenêtres qui dessine une grosse fenêtre par dessus la fenêtre 
1704 racine; vous desklets sont juste dessinés sous celle-ci. Parmi ces gestionnaires 
1705 de fenêtres on trouve Nautilus, KDE, Xfce4, CDE ou  E17. Actuellement, Nautilus, 
1706 KDE, et Xfce4 sont pris en charge automatiquement, mais les autres ne le sont pas.
1708 Toute l'infrastructure nécessaire est déjà en place. Dans la plupart des cas, 
1709 seule la fonction @code{xwindow_get_root_window()} de @file{src/xwindow.c} doit 
1710 être complétée pour détecter de nouveaux gestionnaires de fenêtres. Vous pouvez 
1711 soit soumettre un patch, ou le demander sur la 
1712 @weblink2{mailing-list de développement d'adesklets,http://lists.sourceforge.net/lists/listinfo/adesklets-devel}.
1714 @subsection Je ne peut pas voir les petits desklets comme xmms_bar ou asimpleclock, alors que les autres fonctionnent. Pourquoi?
1716 Les nouveaux desklets sont toujours lancés dans le coin le plus en haut à gauche de 
1717 l'écran, tout en bas de la pile de fenêtres. Vérifiez qu'il n'y a rien 
1718 (barre de gnome, engage, etc) qui puisse masquer cette zone de l'écran. 
1719 Attention! Certaines applications sont pseudo-transparentes, et peuvent 
1720 masquer la fenêtre racine sans en avoir l'air.
1722 @subsection J'utilise Fvwm comme gestionnaire de fenêtres. Pourquoi est-ce que je n'arrive pas à maintenir les desklets sous toutes les autres fenêtres? Ils n'arrêtent pas de se mettre au premier plan!
1724 Allez voir la faq de Fvwm: @weblink{http://www.fvwm.org/documentation/faq/#5.11}. 
1725 D'après de nombreux utilisateurs de Fvwm, cette option, 
1726 @code{BugOpts RaiseOverUnmanaged on} fonctionne bien.
1728 @section Utiliser les desklets
1730 @subsection Le bouton 'Configure' dans le menu contextuel des desklets ne marche pas!
1731 Pour que cela marche--tout du moins pour tous les desklets de démonstration--il faut 
1732 que @command{xterm} soit installé, et que la variable @code{EDITOR} soit correctement 
1733 définie dans votre environnement, comme le veut l'usage sous UNIX. Veillez remarquer 
1734 que cela ne fait que lancer un éditeur de texte dans un terminal. Editer le fichier 
1735 de configuration du desklet (habituellement @file{config.txt} dans le répertoire de 
1736 base du desklet) aura le même effet.
1738 @subsection Avez-vous prévu d'inclure le support d'SVG? J'aimerais utiliser une image SVG dans un de mes desklets.
1739 Désolé, ce n'est pas prévu. Ce n'est pas 
1740 qu'@weblink2{SVG,http://www.w3.org/Graphics/SVG/} est un mauvais format; il est même 
1741 assez bon. Mais c'est également un format orienté vers le dessin vectoriel (et assez 
1742 complexe), alors qu'Imlib2, sur laquelle @command{adesklets} se base entièrement, 
1743 est complètement orientée dessin de trame. Or c'est l'utilisation d'Imlib2 qui rend 
1744 @command{adesklets} simple, relativement rapide et peu consommateur de ressources.
1746 Ceci dit, il n'y a aucune raison que vous n'utilisiez pas d'image SVG dans vos 
1747 desklets, puisqu'il est assez simple de convertir des images SVG en PNG de haute 
1748 qualité en utilisant des programmes comme @weblink2{sodipodi,http://www.sodipodi.com/}, 
1749 @weblink2{inkscape,http://www.inkscape.org/} ou @weblink2{xsvg,http://xsvg.org/}. 
1750 Dans un répertoire plein de SVG, sur un système GNU vous pouvez aussi utiliser 
1751 une commande comme::
1752 @example
1753 ls *.svg | sed 's/\(.*\).svg/-z --file=& --export-png=\1.png --export-width=128 --export-height=128/' | xargs --max-lines=1 sodipodi
1754 @end example
1755 pour toutes les convertir en PNG semi-transparents de 128x128 pixels.
1757 @subsection J'aimerais utiliser certaines polices de mon système avec adesklets, mais mes desklets n'arrivent pas à les trouver. Que dois-je faire?
1759 D'abord, votre adesklets doit supporter fontconfig. Vérifiez-le en lisant le fichier 
1760 config.log issu de la phase de configuration. Si vous n'avez pas gardé le log, vous 
1761 pouvez aussi voir quelles bibliothèques dynamiques sont liées à l'interpréteur. 
1762 Sur un système disposant des binutils GNU, vous pouvez faire quelquechose comme:
1763 @example
1764 ldd `which adesklets` | grep fontconfig
1765 @end example
1766 Si vous obtenez une réponse du genre:
1767 @example
1768  libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x45c750000)
1769 @end example
1770 cela signifie que tout va bien. Autrement, vous devrez recompiler @command{adeskelts} 
1771 à partir des sources. Ensuite, vous pouvez utiliser la commande: 
1772 @example
1773 echo 'list_font_path' | adesklets :
1774 @end example
1775 pour voir dans quels répertoires adesklets recherche les polices TrueType. Consultez 
1776 la documentation de fontconfig si vous désirez les modifier (sur les systèmes à 
1777 jour, @code{man 5 fonts-conf} est un bon point de départ).
1778 De même:
1779 @example
1780 echo 'list_fonts' | adesklets :
1781 @end example
1782 Vous listera les polices actuellement disponibles... Gardez à l'esprit lorsque 
1783 vous les testerez que le nom des polices est sensible à la casse.
1785 Enventuellement, si vous n'arrivez pas à faire fonctionner fontconfig, une manière 
1786 de contourner le problème est de créer des liens symboliques vers les polices que 
1787 vous voulez utiliser dans n'importe quel répertoire listé par la commande 
1788 @code{echo 'list_font_path' ...} ci-dessus.
1790 @ifhtml
1791 @node Documentation du paquetage Python
1792 @appendix Documentation du paquetage Python
1794 Voici quelques liens intéressants vers la documentation du paquetage 
1795 Pyhton@footnote{NdT: elle est en anglais, certes... Mais je ne connais pas encore 
1796 de développeur anglophobe ;-)}:
1798 @itemize
1799 @item @weblink2{adesklets,../pydoc/adesklets.html}
1800 @item @weblink2{adesklets.events_handler,../pydoc/adesklets.events_handler.html}
1801 @item @weblink2{adesklets.commands,../pydoc/adesklets.commands.html}
1802 @item @weblink2{adesklets.utils,../pydoc/adesklets.utils.html}
1803 @item @weblink2{adesklets.configfile,../pydoc/adesklets.configfile.html}
1804 @end itemize
1806 @end ifhtml
1808 @node Documentation d'Imlib2
1809 @appendix Documentation d'Imlib2
1811 Carsten Haitzler (@email{raster@@rasterman.com}) a pris le temps d'écrire une 
1812 documentation très réferencée d'Imlib2, mais pour certaines raisons (très 
1813 probablement des problèmes de taille), elle n'est pas incluse dans le 
1814 paquetage tar des sources d'Imlib2.@footnote{Bien qu'elle puisse être assez 
1815 facilement refaite avec doxygen.}.
1816 Vous pouvez 
1817 @ifhtml
1818 la récuperer @weblink2{ici,../imlib2}.
1819 @end ifhtml
1820 @ifnothtml
1821 la lire en ligne sur @weblink{http://adesklets.sf.net/doc/imlib2/}.
1822 @end ifnothtml
1825 La plupart des fonctions de l'API d'Imlib2 ont des homonymes leurs 
1826 correspondant dans @command{adesklets}. @xref{Programmation d'adesklets}, 
1827 pour plus détails sur la transition du développement avec Imlib2 à adesklets.
1829 @node GNU Makefile pour empaqueter les desklets
1830 @appendix GNU Makefile pour empaqueter les desklets 
1832 Voici un Makefile qui vous permettera d'automatiser la création de  
1833 paquetages contenant des desklets existants ou nouveaux sur un système GNU. 
1834 Copiez simplement le Makefile ci-dessous dans @file{GNUmakefile} dans le 
1835 répertoire de base de votre desklet pour vous en servir. Il n'y a rien du 
1836 tout à éditer, pourvu que le nom du répertoire de base soit de la forme 
1837 'NOM-MAJEURE.MINEURE.REVISION', par exemple @code{beast-0.666.0}.
1839 @verbatiminclude ../utils/GNUmakefile.desklet
1841 @node Soumettre un desklet
1842 @appendix Soumettre un desklet
1844 @section Minima requis dans un paquetage de desklet
1845 Les règles sur le contenu du paquetage d'un desklet sont maigres; les auteurs 
1846 sont libres de faire ce qu'ils veulent. Ils ne doivent absolument respecter que 
1847 deux choses:
1848 @enumerate
1849 @item Le répertoire de base de l'archive du desklet doit contenir un fichier 
1850 @file{README} très clair@footnote{NdT: et en anglais, pour plus de 'portabilité'.} et 
1851 tenu à jour. Il doit au moins contenir:
1852 @itemize
1853 @item le nom et l'adresse email de l'auteur@footnote{Ce serait surement une 
1854 mauvaise idée que de publier votre adresse email privée ici; pour éviter 
1855 le spam, vous devriez plutôt ouvrir un compte sur 
1856 @weblink2{SourceForge,http://sourceforge.net/}, ou un autre fournisseur similaire 
1857 disposant d'un bon système anti-spam.} 
1858 @item Une courte description du desklet
1859 @item Ses dépendances
1860 @item Comment s'en servir
1861 @end itemize
1862 @item Le paquetage doit être une archive tar bzippée ne contenant qu'un seul répertoire 
1863 source du type @code{NOM-MAJEURE.MINEURE.REVISION}, où @code{NAME} est le 
1864 nom de base du desklet, et @code{MAJOR.MINOR.REVISION} sa version. Veillez noter 
1865 qu'un makefile (@xref{GNU Makefile pour empaqueter les desklets}.) est aussi 
1866 fourni pour automatiser la création de ce genre d'archive sur les systèmes GNU.
1867 @end enumerate
1869 @section Le script @command{adesklets_submit}
1871 Depuis @command{adesklets} 0.4.4, les auteurs de desklets disposent d'un 
1872 script Pyhton automatisant la soumission de leurs desklets: 
1873 @file{utils/adesklets_submit} dans le paquetage des sources. Utilisez 
1874 l'option de configuration @code{--with-python-install-submission-scripts} 
1875 pour le placer dans votre répertoire @code{bindir} lors de l'installation.
1877 @file{adesklets_submit} peut être utilisé pour:
1878 @itemize
1879 @item Soumettre une nouvelle description, ou une mise à jour, à inclure dans 
1880 le @weblink2{site Internet d'adesklets,http://adesklets.sf.net/desklets.html}; 
1881 @item Soumettre une archive bzippée du desklet pour l'ajouter aux paquetages 
1882 de desklets de SourceForge (c'est optionel--vous pouvez choisir de l'héberger 
1883 vous-même).
1884 @end itemize
1886 @section Invoquer @command{adesklets_submit}
1887 La soumission du desklet commence par l'envoi d'un email formaté 
1888 spécifiquement à @email{adesklets@@mailworks.org}@footnote{Il est inutile 
1889 d'envoyer autre chose à cette adresse; tous les messages qui ne peuvent être 
1890 interprétés par le script de réception automatique seront simplement 
1891 supprimés. Ecrivez plutôt à @email{syfou@@users.sourceforge.net} si vous 
1892 désirez contacter le créateur du projet (qui parle très bien français, NdT).}.
1893 Le script @command{adesklets_submit} vous assiste dans la construction de cet 
1894 email en utilisant le fichier de configuration @file{$HOME/.adesklets_submit} 
1895 et des options de ligne de commande. Voici un exemple de configuration 
1896 valide du fichier @file{$HOME/.adesklets_submit}:
1898 @verbatiminclude ../utils/adesklets_submit.example
1900 Il s'explique assez bien de lui-même, mais voici quelques points moins clairs:
1902 @itemize
1903 @item
1904 Essayez autant que possible d'éviter les pseudonymes et les surnoms pour 
1905 @code{author_name}, sauf si, évidemment, vous avez déjà une indentité 
1906 virtuelle bien établie sous ce nom.
1907 @item
1908 @code{send_confirmation} précise si un email doit être envoyé en retour à 
1909 l'adresse @code{author_email} dès que votre desklet est publié correctement. 
1910 De toute façon si'l est rejeté vous serez toujours averti par email, avec 
1911 quelques explications. Géneralement, le gérant n'essaiera pas 
1912 de changer les données problématiques, il va seulement expliquer à l'auteur 
1913 ce qui n'était pas bon.
1914 @item
1915 @emph{Verifiez deux fois} l'adresse @code{author_email}, puisque c'est la 
1916 seule que le webmestre essaiera d'utiliser pour vous contacter, ce que les 
1917 en-têtes disent sera ignoré. Si vous ne fournissez pas une adresse valide 
1918 tous les messages ne pourront vous être envoyés, et toutes les nouvelles 
1919 entrées du desklet seront rejetées.
1920 @item
1921 Vous pouvez sans problème utiliser adesklets_submit sans aucun contact 
1922 préalable avec le webmestre d'adesklets (que ce soit par email, dans le 
1923 forum avec l'adresse donnée pour l'enregistrement, ou via la mailing-list), 
1924 mais un minimum de communication sera nécessaire avant la publication 
1925 simplement pour vérifier votre identité et sa relation effective avec 
1926 l'adresse email fournie.
1927 @item
1928 @code{desklets} est un dictionnaire de dictionnaires (un dictionnaire par 
1929 desklet, le nom des desklets étant les clefs); toutes les données se 
1930 réferant à des fichiers (miniatures, captures d'écran ou fichiers à 
1931 télecharger) peuvent être soit une adresse sur un site accessible publiquement 
1932 (de préference), soit un chemin absolu ou relatif à votre répertoire $HOME 
1933 vers des fichiers locaux. Dans ce cas, les fichiers requis seront attachés 
1934 en pièce jointe à l'email géneré. 
1935 @item
1936 Toutes les images seront rapatriées puis intégrées au site Internet 
1937 adesklets.sf.net, vous pourrez ensuite sans problème les retirer de votre 
1938 emplacement en ligne si vous avez fourni des URL.
1939 @item
1940 Si vous mettez à jour un desklet déjà en ligne, il n'y a pas besoin de 
1941 soumettre les images @code{thumbnail} ou @code{screenshot} si elles n'ont 
1942 pas changé; vous pouvez aussi facilement faire réference aux images 
1943 déjà installées sur SourceForge:
1944 @itemize
1945 @item @code{thumbnail} est toujours stockée sous @code{http://adesklets.sf.net/images/NAME_thumb.[jpg|png]}
1946 @item @code{screenshot} est toujours stockée sous @code{http://adesklets.sf.net/images/NAME_screen.[jpg|png]}
1947 où @code{NAME} est le nom de votre desklet.
1948 @end itemize
1949 @item
1950 En utilisant la valeur @code{host_on_sourceforge}, vous pouvez choisir 
1951 si le paquetage de votre desklet sera hébergé sur SourceForge ou sur votre 
1952 propre site si vous avez fourni une URL. Bien sur dans ce dernier cas 
1953 vous devrez le maintenir à l'emplacement donné.
1954 @item
1955 L'image @code{thumbnail} doit être au format JPG (de préference) ou 
1956 PNG (si vous avez @emph{vraiment} besoin de définitions plus élevées) 
1957 et d'une dimension comprise entre 190x35 pixels et 230x110 pixels.
1958 @item
1959 L'image @code{screenshot} doit être un JPG (de préference) ou un 
1960 PNG de 640x480 pixels. Elle doit mettre votre desklet en évidence, 
1961 et donc ne pas en contenir d'autres.
1962 @item
1963 Vous pouvez choisir de ne pas fournir de miniature ni/ou de capture 
1964 d'écran. Dans ce cas, par défaut, des images géneriques seront utilisées 
1965 à la place.
1966 @item
1967 @code{Category} est actuellement inutilisée, et sera juste ignorée.
1968 @item
1969 Tous les emails pesant plus de 300KB seront rejetés par le serveur email 
1970 du webmestre, adesklets_submit refusera donc d'en génerer. Au lieu de 
1971 soumettre d'aussi grosses entrées, utilisez la possibilité de donner des 
1972 URLs comme décrit ci-dessus pour alléger l'email. 
1973 @item @command{adeskets_submit} ne vérifie pas que vous respectez toutes 
1974 ces règles; il ne vérifie que ce qui est strictement nécessaire pour 
1975 construire un email de soumission adapté: l'existence des entrées de 
1976 dictionnaire, la disponibilité des fichiers, la validité des types de 
1977 fichiers locaux... Il est de votre devoir de s'assurer que les données 
1978 sont correctes si vous voulez éviter le rejet.
1979 @end itemize
1981 Par exemple, Belial Leviathan devrait d'abord vérifier les données de 
1982 son desklet @code{beast} en faisant quelquechose comme:
1983 @example
1984 adesklet_submit beast
1985 @end example
1987 Si tout fonctionne bien, l'email de soumission résultant sera affiché sur 
1988 @code{stdout}. A partir de là, Belial peut: 
1989 @itemize
1990 @item Le passer par un tuyau (pipe) à son MTA (agent de transfet d'email) 
1991 favori pour l'envoyer à @email{adesklets@@mailworks.org}.
1992 @item Demander à @command{adesklets_submit} de l'envoyer lui-même par 
1993 SMTP, en utilisant les paramètres @code{smtp_host} et @code{smtp_port} 
1994 dans son @file{$HOME/.adesklets_submit}. Pour cela, Belial devrait utiliser:
1995 @end itemize
1996 @example
1997 adesklets_submit --send beast
1998 @end example
2000 Une dernière chose: essayez d'éviter d'envoyer des corrections mineures à 
2001 plusieurs reprises, en particulier si vous utilisez des fichiers locaux. 
2002 Cela va charger à la fois le server email du webmestre et son travail de gestion. 
2003 Veillez essayer de créer une entrée valide @emph{puis} de l'envoyer, au 
2004 lieu de patauger autrement. 
2006 @subsection Validation approfondie d'une entrée avec @command{adesklets_checkin}
2007 Depuis @command{adesklets} 0.4.5, vous avez aussi à votre disposition 
2008 le script @command{adesklets_checkin}. C'est le script Python que le 
2009 webmestre utilise pour vérifier toutes les soumissions. @emph{N'oubliez pas 
2010 que ce script n'est fournit aux auteurs de desklets que par confort, 
2011 pour minimiser le nombre de rejets de soumissions--les développeurs ne 
2012 sont en aucun cas forcés de l'utiliser, et peuvent même être incapables 
2013 de le faire, puisque ce script n'a pas été écrit avec le souci de la 
2014 portabilité, contrairement à adesklets_submit. Lisez l'en-tête du 
2015 script pour une liste complète des pré-requis à son exécution.}
2017 @command{adesklets_checkin} a deux modes de fonctionnement: interactif et 
2018 non-interactif. Seul le mode non-interactif interessera les auteurs de 
2019 desklets. Dans ce mode, l'utilisation est franchement simple. Belial, 
2020 par exemple, ferait:
2021 @example
2022 adesklets_submit beast | adesklets_checkin
2023 @end example
2025 Si tout fonctionne bien, le résultat serait similaire à:
2026 @example
2027 Validation started. Please wait.
2028 Everything seems fine, but keep in mind a few things cannot be
2029 verified without human intervention. See documentation for details.
2030 @end example
2032 Sinon, vous aurez la trace de l'exception avec quelques explications 
2033 assez claires (esperons-le).
2035 @subsection Limitations d'@command{adesklets_checkin} en mode non-interactif
2037 Voici quelques problèmes restants qu'@command{adesklets_checkin} ne 
2038 peut pas détecter et qui doivent donc être absolument résolus 
2039 manuellement (le webmestre en détectera la plupart, et vous aurez à 
2040 renvoyer l'email de toute façon):
2041 @itemize
2042 @item
2043 Un fichier README incomplet dans le répertoire de base (Est-ce qu'il 
2044 contient tous les détails énumerés ci-dessus?).
2045 @item
2046 Le fichier README n'est plus à jour (Est-ce que son contenu reflète 
2047 l'état actuel du desklet?).
2048 @item
2049 Le desklet ne peut pas fonctionner à la sortie de la boite (c'est-à-dire 
2050 sans ou avec un minimum de configuration) alors que les pré-requis du 
2051 fichier README et les instructions particulières sont respectés.
2052 @end itemize    
2054 @node Copier ce Manuel
2055 @appendix Copier ce Manuel
2057 @menu
2058 * GNU General Public License::  la licence permettant de copier ce manuel.
2059 @end menu
2060 NdT: La licence est laissée en version originale car seule cette version à une 
2061 valeur juridique. Néanmoins, pour en faciliter la compréhension, 
2062 il existe des traductions disponibles sur Internet, par exemple sur 
2063 @weblink{http://www.linux-france.org/article/these/gpl.html}.
2065 @include gpl.texi
2067 @node Clé publique Open PGP
2068 @appendix Clé publique Open PGP
2070 @verbatiminclude syfou.asc
2072 @noindent Vous pouvez également obtenir ce certificat d'un bon nombre de serveurs
2073 publics de clés sur Internet, tels @weblink{http://www.keyserver.net/}, ou
2074 @weblink{http://pgp.mit.edu/}. Contactez son auteur légitime, 
2075 Sylvain Fourmanoit, par courier électronique à l'adresse
2076 @email{syfou@@users.sourceforge.net} pour organiser une validation plus correcte
2077 de la clé si vous en avez besoin.
2079 @node Index
2080 @unnumbered Index
2082 @printindex cp
2084 @bye