Rework pseudo-transparency by changing the background grabbing mechanism
[adesklets.git] / doc / adesklets_fr.texi
blob3b28ccf0fc1c04808efad0cdbbdc2f69c3156c50
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 @c @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, 2006
13 S.Fourmanoit @email{syfou@@users.sourceforge.net}. 
15 Traduction française originale de Guillaume Boitel @email{g.boitel@@wanadoo.fr}, 
16 entièrement remise à jour et reprise par Martin 
17 Kirchgessner @email{martin.kirch@@gmail.com} depuis adesklets 0.4.10 
19 @quotation
20 Permission est accordée de copier, distribuer et/ou modifier ce document selon
21 les termes de la Licence Generale Publique GNU (GNU GPL) version 2, ou toute 
22 version ultérieure publiée par la Free Software Fundation. Une copie de la présente  
23 licence est incluse dans la section ``GNU General Public License''
24 @end quotation
26 [Cette version est une traduction complète de la documentation d'adesklets; malgré 
27 tout les nouveautés peuvent mettre quelques jours à être traduites, pour être sur(e)  
28 de ne pas les rater lisez la version originale.]
29 @end copying
31 @c Define useful weblink macro
32 @macro weblink{link}
33 @html
34 <a href="
35 @end html
36 \link\
37 @html
38 ">\link\</a>
39 @end html
40 @end macro
42 @c Define weblink2 macro: a variation on the previous one
43 @macro weblink2{desk,link}
44 @html
45 <a href="\link\">
46 @end html
47 \desk\
48 @html
49 </a>
50 @end html
51 @end macro
53 @dircategory Graphics
54 @direntry
55 * adesklets in french: (adesklets_fr).      Another desklets container (in French).
56 @end direntry
58 @titlepage
59 @title adesklets
60 @subtitle pour la version @value{VERSION}, @value{UPDATED}
61 @author Guillaume Boitel (@email{g.boitel@@wanado.fr})
62 @author Martin Kirchgessner (@email{martin.kirch@@gmail.com})
63 @page
64 @vskip 0pt plus 1filll
65 @insertcopying
66 @end titlepage
68 @contents
70 @ifnottex
71 @node Top
72 @top adesklets
74 @ifnothtml
75 Suivez le lien pour la version originale
76 (@xref{Top,Version anglaise, Contents, adesklets,}.).
77 @end ifnothtml
78 @ifhtml
79 @weblink2{[Version anglaise],../en/index.html}
80 @end ifhtml
82 @insertcopying
83 @end ifnottex
85 @menu
86 * A propos d'adesklets::
87 * Nouveautés::
88 * Installer adesklets::
89 * Utiliser adesklets::
90 * Programmation d'adesklets::
91 * Extension d'adesklets::
92 * Recherche d'aide!::
93 * Foire Aux Questions::
94 @ifhtml
95 * Documentation du paquetage Python::
96 * Documentation du paquetage Perl::
97 @end ifhtml
98 * Documentation d'Imlib2::
99 * GNU Makefile pour empaqueter les desklets::
100 * Soumettre un desklet::
101 * Copier ce Manuel::
102 * Clé publique Open PGP::
103 @end menu
105 @noindent Une version à jour de ce document peut être trouvée en ligne:
106 @weblink{http://adesklets.sf.net/doc/fr/}.
108 @noindent Vous trouverez aussi sur le site du projet des captures d'écran, les 
109 paquetages des sources, les archives téléchargeables de la documentation,
110 et bien d'autres choses encore: @weblink{http://sf.net/projects/adesklets/}.
112 @node A propos d'adesklets
113 @chapter Qu'est-ce qu'adesklets ?
115 @section Réponse courte
117 `adesklets' est une console interactive
118 d'@weblink2{Imlib2,http://www.enlightenment.org/} pour le
119 X Window System. Il permet à des langages de script d'écrire de manière
120 propre et simple des applets graphiques intégrés au bureau (i.e. "desklets")
121 de belle apparence et légèrement interactifs.
123 Il peut aussi être utilisé comme un éditeur graphique en ligne de commande,
124 un peu comme @weblink2{ImageMagick,http://www.imagemagick.org/}, mais avec
125 des fonctionnalités différentes.
127 @section Réponse longue
129 @command{adesklets} signifie "another desklets [container]" (littéralement: un 
130 autre [conteneur] de desklets). Il a été écrit
131 comme une alternative à d'autres programmes tels que:
133 @enumerate
134 @item
135 GNOME gDesklets (@weblink{http://gdesklets.org/})
136 @item
137 KDE SuperKaramba (@weblink{http://netdragon.sourceforge.net/}).
138 @item
139 GKrellM (@weblink{http://www.gkrellm.net/})
140 @end enumerate
142 Puisque ce projet s'appelle 'a'desklets, il est encore possible, pour
143 commencer des projets semblables, d'utiliser l'espace de 'b' à 'z' desklets,
144 à l'exception de 'g' desklets, qui est déjà pris.
146 Plus sérieusement, tous ces programmes sont bons. Néanmoins, les deux premiers
147 ont des pré-requis très lourds en termes de dépendances de bibliothèques; 
148 de base gDesklets requiert que le bureau GNOME soit entièrement
149 installé (plus quelques bibliothèques spécialisées telles que gnome-python),
150 tandis que SuperKaramba a besoin de toutes les bibliothèques de KDE ainsi
151 que de l'environnement de base. Ceci se répercute sur l'exécution des autres
152 taches@footnote{Bien sûr, c'est uniquement l'opinion de l'auteur - et ces
153 deux applications ont fait de gros progrès sur la gestion des ressources
154 de version en version.}. D'autre part, alors que GkrellM est plus léger
155 (bien qu'il dépende toujours de GTK+), il ne fournit pas la même qualité en
156 terme de "présentation" (selon les goûts de l'auteur, naturellement) ou de
157 " scriptabilité " par rapport aux deux autres.
159 De ce constat est né @command{adesklets}. Il fournit:
161 @itemize
162 @item
163 un cadre minimal, fiable pour des desklets X Window totalement intégrés dans le bureau,
164 avec quelques facilités pour gérer leur lancement, leur placement et
165 leur arrêt.
166 @item
167 une API de dessin générique, riche et facile d'emploi semblable à celle
168 de gDesklets et de SuperKaramba concernant sa qualité visuelle, grâce à la
169 bibliothèque Imlib2.
170 @item
171 des dépendances de bibliothèques simples, se résumant surtout à l'utilisation de la très bonne (et
172 rapide) bibliothèque Imlib2 pour toutes les opérations graphiques. Aucune boite
173 à outils de fenêtres n'est utilisée: le programme repose directement sur xlib.
174 @item
175 un interpréteur petit, léger, robuste et portable potentiellement utilisable avec
176 toutes sortes de langages de scripts, grâce à une syntaxe propre, limitée et
177 homogène. Dans cette version @value{VERSION},  Python et Perl sont directement supportés. Le support de Ruby serait également possible, 
178 n'hésitez pas à contribuer afin que votre langage préféré soit 
179 supporté (@xref{Extension d'adesklets}.)!
180 @item
181 un usage minimal de l'espace disque, de la mémoire vive et du
182 processeur. Typiquement, avec la glibc-2.3.4 et le noyau Linux 2.6 sur
183 une architecture x86, l'unique exécutable représente moins de 130 Ko sur
184 le disque et prend moins de 3Mo de mémoire virtuelle par desklet, juste après
185 son lancement. Lorsque le desklet est lancé, au repos il n'utilise quasiment 
186 aucun cycle processeur (même en prenant en compte le script Python); 
187 dans la plupart des cas c'est même legèrement moins avec un script Perl.
188 @end itemize
190 Il ne fournit PAS:
191 @itemize
192 @item
193 une API de fenêtre sophistiquée, ni même un accès aux widgets en dehors de
194 menus gris nus et laids: vous ne pouvez clairement pas écrire une interface 
195 graphique (GUI), seulement des desklets.
196 @item
197 de mécanismes compliqués 
198 pour la configuration des scripts. Les développeurs de scripts sont libres (ou
199 condamnés, selon la façon de voir les choses) de faire ce qui leur convient, 
200 bien que pour Python des routines par défaut soient disponibles pour les aider.
201 @item
202 un support pour tout ce qui n'est pas entièrement compatible avec un système
203 POSIX. Par exemple, il serait vraiment surprenant d'arriver à le compiler sur 
204 Cygwin.
205 @item
206 une gestion poussée des évènements utilisateurs. Le but
207 d'@command{adesklets} est d'être fiable et frugal; seuls quelques
208 événements - essentiellement relatifs au pointeur - sont utilisables
209 via son API. Ne réclamez pas le support des évènements claviers ou
210 l'intégration de boites à outils -- cela va à l'encontre des objectifs
211 du projet.
212 @end itemize
214 @node Nouveautés
215 @chapter Nouveautés
217 @heading Quoi de neuf pour la version 0.6.1?
218 C'est un correctif. adesklets compile maintenant sans avertissements sur 
219 toutes les versions 4.x de gcc, tout en conservant la compatibilité avec 
220 toutes les versions précedentes du compilateur C GNU. Un nouveau modèle, 
221 test/timing.py, a aussi été ajouté pour aider au diagnostic d'éventuels 
222 problèmes de temporisation.
224 @heading Quoi de neuf pour la version 0.6.0?
225 C'est une nouvelle version mineure. adesklets supporte maintenant les desklets
226 écrits en Perl: mille mercis à Lucas Brutschy
227 @email{lbrutschy@@users.sourceforge.net} pour son travail!
229 @heading Quoi de neuf pour la version 0.5.1?
230 C'est un correctif. Maintenant adesklets compile et fonctionne sous OpenBSD 3.8,
231 l'interface nettoie automatiquement les tubes FIFO en cas de fin de session
232 anormale et supporte la dernière version d'e16.  Le changement automatique
233 d'interface utilisateur du script d'installation d'adesklets à également été
234 réparé.
236 @heading Quoi de neuf pour la version 0.5.0?
237 C'est une nouvelle version mineure et un correctif. Elle agrandit la
238 documentation et la FAQ sur de nombreux points, inclut de nombreuses corrections
239 aux scripts autotools (remerciements tous particuliers à Steve Langasek
240 @email{vorlon@@debian.org}), régularise quelques exceptions dans l'interpréteur,
241 ajoute le support des menu contextuels spécifiques à un gestionnaire de
242 fenêtres, des scripts correspondant à quelques cas d'utilisation dans
243 @command{test/}, ainsi qu'un tout nouvel installeur de desklets
244 (@command{adesklets_installer}) permettant le télechargement et la décompression
245 automatique des desklets.
247 @heading Quoi de neuf pour la version 0.4.12?
248 C'est un correctif. Elle corrige une erreur dans le nouveau makefile distribué
249 pour la documentation qui empêchait les fichiers info et les pages de manuel
250 d'être installés dans des répertoires arbitraires vides (merci à Bart Kreska
251 pour le patch). Elle ajoute aussi le support de nautilus et de KDE version 3.4.1
252 et supérieures, ainsi qu'un support préliminaire pour xffm-desktop et
253 ROX-Filer. Elle devrait rectifier un vieux problème avec certains desklets qui
254 n'arrivaient pas à terminer leur affichage initial. Enfin la FAQ a aussi été
255 sensiblement enrichie.
257 @heading Quoi de neuf pour la version 0.4.11?
258 C'est un correctif. Concernant la documentation, la version française à été
259 remise au niveau de l'anglaise (merci à Martin Kirchgessner
260 @email{martin.kirch@@gmail.com} pour tout son travail). De plus toutes les
261 sources de la documentation et les fichiers html ont étés séparés du paquetage
262 principal (grâce à cela, adesklets à maintenant perdu 300Ko).  Concernant le
263 code, cette version contient beaucoup de petites corrections pour diverses
264 plate-formes -- FreeBSD7 devrait normalement être supporté sans patch, le manuel
265 du script de soumission des desklets à été ajouté pour satisfaire Debian. Mais
266 le plus gros changement est probablement l'inclusion d'une interface optionelle
267 basée sur le shell pour l'interpréteur, qui facilite l'administration
268 d'adesklets et l'adaptation du code à de nouveaux gestionnaires de fenêtres.
270 @heading Quoi de neuf pour la version 0.4.10?
271 C'est un correctif. Involontairement, une modification étrange est apparue dans
272 la version précedente: à cause d'elle le menu contextuel ne fonctionnait plus de
273 la manière prévue (la touche Control devrait être enfoncée pour que le menu
274 s'affiche). Cette version à annulé ce changement, et ajouté une option de
275 configuration, --enable-control-on-context-menu, pour ceux qui préfèrent
276 vraiment ce comportement.
278 @heading Quoi de neuf pour la version 0.4.9?
279 C'est un correctif. Elle change les définitions des macros globales pour
280 qu'adekslets puisse être compilé sans problème sur FreeBSD 6.x, corrige une
281 erreur lors de la suppression des options à passer au compilateur C relatives au
282 débogage, et ajoute un nouveau programme de démonstration du threading.
284 @heading Quoi de neuf pour la version 0.4.8?
285 C'est un correctif. Elle change les définitions des macros globales pour
286 qu'adekslets puisse être compilé sans problème sur FreeBSD 5.x, et implante la
287 détection d'une fausse root window pour KDE, grâce à yogi77, du forum.
289 @heading Quoi de neuf pour la version 0.4.7?
290 C'est un correctif. Elle retire les appels à quelques fonctions mathématiques de
291 C99 qui ne sont pas disponibles dans les premiers BSD, rendant le code plus
292 portable. Elle ajoute aussi deux nouvelles commandes à l'API pour mieux
293 contrôler le système de cache des images.
295 @heading Quoi de neuf pour la version 0.4.6?
296 C'est un correctif et une mise à jour de la documentation. Elle corrige de 
297 nombreux bugs mineurs dans les scripts de soumission des desklets, rend la 
298 structure autoconf plus portable, ajoute un nouveau script de démonstration 
299 dans test (widget.py), corrige quelques bugs de placement à l'écran dus à la 
300 routine xwindow_move_window (merci à man1ed du forum pour avoir fourni le 
301 patch), et enfin ajoute une nouvelle annexe contenant une version en ligne 
302 de la documentation d'Imlib2.
304 @heading Quoi de neuf pour la version 0.4.5?
305 C'est un correctif et une mise à jour de la documentation. Elle améliore le 
306 procédé de soumission des desklets en publiant le script complet de mise en 
307 ligne utilisé par l'auteur. Elle corrige aussi un bug du rafraichissement des 
308 fenêtres, qui apparait quand on utilise des images d'arrière-plan 
309 et des menus spécifiés par l'utilisateur; merci à ZeroDivide de l'avoir 
310 signalé. Quelques mises à jour et corrections de la documentation ont également 
311 été faites.  
313 @heading Quoi de neuf pour la version 0.4.4?
314 C'est une mise à jour de la documentation, principalement faite pour les 
315 auteurs de desklets. Elle inclut surtout une nouvelle annexe expliquant comment 
316 soumettre un desklet (avec l'aide d'un script), ainsi qu'une nouvelle sous-partie 
317 sur la détection des polices sur l'ensemble du système. Quelques ajouts ont 
318 été effectués sur la FAQ pour couvrir ce sujet.
320 @heading Quoi de neuf pour la version 0.4.3?
321 C'est une mise à jour de la documentation. Ici la plupart du travail à été 
322 fait part Mike Pirnat @email{exilejedi@@users.sourceforge.net}, qui a eu la 
323 gentillesse de corriger l'anglais déficient de l'auteur en relisant ce manuel 
324 d'un bout à l'autre. Merci Mike! La FAQ a aussi été largement enrichie, et 
325 une nouvelle annexe pour les auteurs de desklets à été ajoutée.
327 @heading Quoi de neuf pour la version 0.4.2?
328 C'est un correctif. Elle corrige un bug du paquetage Python qui l'empêchait 
329 de se compiler avec toutes les versions de Python inférieures à 2.4.0. Merci 
330 à nucular, du forum d'adesklets, de l'avoir remarqué. Elle corrige aussi un 
331 problème mineur concernant mmap sur ce package.  
333 @heading Quoi de neuf pour la version 0.4.1?
334 C'est un correctif. Elle sécurise l'utilisation de la classe optionelle
335 @code{adesklets.ConfigFile} en changeant complètement la manière dont les
336 fichiers de configurations sont importés, ce qui retire une faille de sécurité
337 potentielle.
339 @heading Quoi de neuf pour la version 0.4.0?
340 C'est la sortie d'une nouvelle version mineure. L'interpreteur supporte
341 maintenant l'internationalisation. Il peut maintenant travailler dynamiquement
342 avec differents jeux de caractères sur les plate-formes supportant iconv (selon
343 le standard UNIX98), et les affiche correctement.  Le paquetage Python a aussi
344 été enrichi d'une classe generique (optionelle) de configuration, en esperant
345 qu'elle sera utile aux auteurs de desklets.
347 @heading Quoi de neuf pour la version 0.3.2?
348 C'est une mise à jour de la documentation. Une partie pour les programmeurs
349 Python à été ajoutée, et la FAQ à été largement enrichie.
351 @heading Quoi de neuf pour la version 0.3.1 ?
352 Cette version corrige un oubli en implantant la gestion de l'interruption des
353 barrières temporelles (time gate) par des évènements X. Cette correction est
354 essentielle à la bonne marche de plusieurs effets dynamiques.
356 @heading Quoi de neuf pour la version 0.3.0 ?
357 Ceci est une nouvelle version mineure. Nous nous sommes beaucoup souciés de la
358 portabilité depuis les toutes premières versions d'adesklets; avec cette
359 version, le paquetage compile et tourne sans accroc sur FreeBSD et NetBSD
360 (@xref{Portabilité}.). La gestion des évènements a également été épurée en
361 interne, et le paquetage Python étendu pour supporter la modification dynamique
362 des évènements interceptés (voir @file{test/test_events.py}).
364 L'interpréteur répond maintenant aux désidérata de l'auteur, et ne devrait
365 pas être significativement étendu dans le futur; tout est relativement en
366 place pour écrire tout type de desklet, y compris des animations.
368 @heading Quoi de neuf pour la version 0.2.1 ?
369 Il s'agit de la correction d'un bug mineur du à une incompatibilité avec la
370 bibliothèque GNU history. Merci à Mike Pirnat
371 @email{exilejedi@@users.sourceforge.net} de l'avoir signalé.
373 @heading Quoi de neuf pour la version 0.2.0 ?
374 Ceci est une nouvelle version mineure. L'interpréteur supporte dorénavant les
375 variables textuelles (la substitution dynamique de chaînes, pour être précis),
376 ainsi que l'exécution de séquences préenregistrées de commandes sous des
377 contraintes précises de temps (un mode indirect d'exécution); cela donne aux
378 desklets un moyen de générer des animations fluides. Lancez le script de
379 démonstration @file{test/fading.py} du paquetage de base pour voir ces nouvelles
380 fonctions à l'oeuvre.
382 Les développeurs, quant à eux, ont maintenant accès à une plateforme
383 complètement réécrite d'enregistrement de rapports d'exécution de toutes session
384 de l'interpréteur (à des fins de débogage).
386 @heading Détails
387 Lisez le fichier @file{ChangeLog} pour connaitre le détail des changements 
388 apportés.
390 @ifplaintext
391 @c Sets up a marker for automated INSTALL_FR file generation
392 INSTALL_BEG
393 @node Installer adesklets
394 @unnumbered Installer adesklets
395 @end ifplaintext
396 @ifnotplaintext
397 @node Installer adesklets
398 @chapter Installer adesklets
399 @end ifnotplaintext
401 @section Pré-requis pour la compilation
403 Pour compiler adesklets à partir des sources, vous aurez besoin de :
405 @itemize
406 @item
407 Un compilateur supportant le C ANSI ainsi que les macros variadiques (à peu
408 près toutes les versions de @weblink2{gcc,http://gcc.gnu.org} supérieures à 
409 la 2.7.0 devraient fonctionner, tout comme n'importe quoi d'autre sorti ces dix
410 dernières années)
411 @item
412 Les en-têtes@footnote{Excepté pour les compilations sans fichiers en-têtes, utiles 
413 pour les environnements serveurs et équivalents - lire la suite pour de plus
414 amples informations.} et les bibliothèques @weblink2{X11,http://www.x.org/}.
415 @item
416 Imlib2 1.1.2 ou supérieure (la plus récente sera la meilleure: allez
417 la télécharger sur
418 @weblink{http://sourceforge.net/projects/enlightenment/}). Le support
419 PNG est nécéssaire à la bonne marche de la majorité des desklets.
420 @item
421 @weblink2{GNU readline,http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html}
422 @item
423 un système raisonnablement compatible POSIX
424 @end itemize
426 @noindent Les composants suivants pourront aussi être utilisés, si'ls sont 
427 présents sur le système:
429 @itemize
430 @item
431 @weblink2{fontconfig,http://www.fontconfig.org/}, pour la détection automatique 
432 des polices utilisables présentes dans le système
433 @item
434 @weblink2{GNU history,http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html}, 
435 le complément fidèle de GNU readline permettant l'enregistrement d'historiques 
436 de commandes
437 @item
438 @weblink2{Python,http://www.python.org} 2.3 ou supérieure, si vous désirez
439 le support de Python (vous en aurez sûrement besoin: la plupart des desklets 
440 sont écrits avec ce langage pour l'instant)
441 @item
442 @weblink2{Perl,http://www.perl.org} 5.8.2 ou supérieure@footnote{Certaines versions 
443 plus anciennes comportent une version de makemaker supportant mal DESTDIR.}, si 
444 vous désirez le support de Python (quelques desklets seront écrits en Perl)
445 @end itemize
447 De nombreux systèmes placent les versions de ``développement'' des librairies 
448 et de leurs outils dans des paquetages séparés (@command{imlib2-devel}, 
449 @command{readline-devel}, @command{fontconfig-devel}, @command{python-devel}, 
450 etc); si c'est le cas du système de destination, ces versions devront être 
451 utilisées plutôt que les versions ``normales''; par contre vous n'aurez besoin 
452 que de l'exécutable pour Perl, puisque le paquetage fourni est en pur Perl.
454 @section Pré-requis pour l'exécution
456 En plus des dépendances de compilation, l'interface optionelle d'adesklets 
457 basée sur le shell, installée par défaut, requiert elle-même quelques 
458 utilitaires, tous censés satisfaire un minimum les spécifications POSIX 
459 1003.2 et 1003.2a:
461 @itemize
462 @item un shell compatible @command{/bin/sh}
463 @item un éditeur de flux (Streaming EDitor, sed)
464 @item test, mkdir, rmdir, sleep, kill et ls
465 @end itemize
467 les programmes @command{xwininfo} et @command{xprop} peuvent aussi être 
468 utilisés, si une routine de détection de fausse fenêtre racine (fake root 
469 window) donnée est explicitement invoquée. Les implémentations de ces 
470 utilitaires de XFree86 et de X.org (R6 et R7) ont toutes les deux été testées. 
471 D'autres programmes seront utilisés par certaines routines de détection: 
472 voyez les sources de l'interface pour plus de détails.
474 @section Note sur la portabilité
475 @anchor{Portabilité}
476 Ce paquetage est construit en gardant la portabilité à l'esprit - toutes les
477 extensions spécifiques ont été évitées, et les spécifications (ANSI, SVID
478 3, BSD 4.3, POSIX) ont été suivies scrupuleusement. Néanmoins, tous les
479 développement ont été fait sur un unique système Linux: il est très probable
480 qu'adesklets ne compilera pas ou ne fonctionnera pas comme prévu dans
481 certains cas. Régler ces problèmes est important pour nous.
483 adesklets a été porté et testé avec succès par les développeurs sur plusieurs 
484 systèmes. Au moment de rendre publique la version @value{VERSION}, le paquetage 
485 a été compilé et utilisé avec succès sous toutes sortes de:
486 @itemize
487 @item @strong{Noyaux/systèmes}: Linux (séries 2.2, 2.4 et 2.6), FreeBSD 
488       (4.10, 5, 6 et 7), NetBSD (1.6), OpenBSD (3.8)
489 @item @strong{Bibliothèques C}: glibc (2.1.3 et plus), uclibc (0.8.28), si 
490 disponibles sur votre plate-forme
491 @item @strong{Compilateurs}: gcc (2.95.2, toutes versions 3, 4.0.2, 4.1.0)
492 @end itemize
494 De plus adesklets est lui-même complètement indépendant de l'architecture matérielle, 
495 bien qu'Imlib2 soit plutôt optimisée pour x86 et amd64. Il est couramment utilisé 
496 par l'auteur sur des machines x86, amd64 et ppc.
498 Au moment où ces lignes sont écrites, adesklets est déjà intégré dans les portages 
499 de nombreux BSD et dans les catalogues de nombreuses distributions de Linux. 
500 Mentionnons notemment:
502 @itemize
503 @item Le paquetage Debian: @weblink{http://packages.debian.org/unstable/x11/adesklets}, 
504 maintenu par Bartosz Fenski @email{fenio@@debian.org} (également présents dans les branches testing et stable), 
505 @item Le portage FreeBSD: @weblink{http://www.freshports.org/deskutils/adesklets/}, 
506 maintenu par Roman Bogorodskiy @email{novel@@freebsd.org},
507 @end itemize
509 Vous avez vous-même essayé de faire tourner adesklets sur une architecture 
510 non citée plus haut? Faites-le nous savoir, surtout si ça n'a pas marché.
512 @section Téléchargement du logiciel
514 La version à jour du logiciel (en archive source bzipée) est disponible
515  sur la page du projet sur sourceforge:
516 @weblink{http://sf.net/projects/adesklets/}
518 Vous pouvez l'extraire depuis la console avec @command{tar}. Avec la
519 version @value{VERSION}, la ligne de commande devrait être:
520 @example
521 tar xvjf adesklets-@value{VERSION}.tar.bz2
522 @end example
523 ou, si la version que vous avez installée de @command{tar} ne supporte pas
524 les filtres d'archives bzip2:
525 @example
526 bzcat adesklets-@value{VERSION}.tar.bz2 | tar xv
527 @end example
529 @section Vérification optionelle de l'intégrité du logiciel
531 Pour adesklets @value{VERSION},  vous pouvez également télécharger depuis 
532 @weblink2{sourceforge,http://sf.net/projects/adesklets/} une signature 
533 détachée sous forme ascii nommée @command{adesklets-@value{VERSION}.tar.bz2.asc},
534 que vous pourrez utiliser avec la clé publique de l'auteur 
535 (@pxref{Clé publique Open PGP}, en annexe) pour vous assurer de 
536 l'intégrité du paquetage. Par exemple, avec @command{GnuPG}
537 (@weblink{http://www.gnupg.org/}), vous utiliseriez la commande:
539 @example
540 gpg --verify adesklets-@value{VERSION}.tar.bz2.asc adesklets-@value{VERSION}.tar.bz2
541 @end example
543 Vous pouvez également obtenir la clé publique pour
544 l'adresse @email{syfou@@users.sourceforge.net}
545 de plusieurs serveurs de clés publiques tel @weblink{http://www.keyserver.net/} ou
546 encore @weblink{http://pgp.mit.edu/}. N'hésitez pas à contacter l'auteur directement
547 si vous désirez vous assurer plus avant de l'authenticité de cette clé.
549 @section Compilation et Installation:
551 adesklets fournit les scripts usuels autoconf/automake des paquetages GNU.
553 Donc, dans la plupart des cas, l'installation suit les trois étapes habituelles:
555 @enumerate
556 @item
557 Atteignez le répertoire contenant le code source du paquetage (avec `cd') et tapez
558 `./configure' pour configurer le paquetage pour votre système.  Si vous utilisez
559 `csh' sur une ancienne version de System V, vous devrez peut-être plutot taper
560 `sh ./configure' afin d'empêcher `csh' d'exécuter lui-même `configure'.
562 L'exécution de `configure' peut prendre du temps. Pendant qu'il s'exécute,
563 il écrit quelques messages qui vous informent des fonctionnalités qu'il est
564 en train de vérifier.
565 @item
566 Tapez `make' pour compiler le paquetage.
567 @item
568 Tapez `make install' pour installer les programmes, tous les fichiers de
569 données et la documentation.
570 @end enumerate
572 Vous pouvez enlever les programmes binaires et les fichiers objets du
573 répertoire qui contient le code source en tapant `make clean'. Pour enlever
574 également les fichiers que `configure' a créé (ainsi vous pourrez compiler
575 le paquetage pour une autre type d'ordinateur), tapez `make distclean'.
577 @section Compilateurs et Options:
579 Certains systèmes requièrent des options inhabituelles pour la compilation
580 ou l'édition des liens que le script `configure' ne connaît pas. Vous pouvez
581 donner à `configure' des valeurs initiales pour des variables en les déclarant
582 dans l'environnement. En utilisant un shell compatible Bourne, vous pouvez
583 faire cela en ligne de commande comme ceci:
585 @example
586 CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
587 @end example
589 @noindent Ou dans les systèmes dotés du programme `env', vous pouvez faire:
591 @example
592 env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
593 @end example
595 @section Fonctionnalités Optionnelles :
597 adesklets possède quelques fonctionnalités optionnelles que vous pouvez
598 installer ou non à partir du script de configuration. Tapez :
600 @example
601 ./configure --help
602 @end example
604 @noindent pour une description courte et complète. En voici quelques une
605 intéressantes :
607 @itemize
608 @item
609 Vous pouvez choisir de compiler adesklets sans aucun support pour X
610 (@command{--without-x}).
611 Vous aurez une version qui n'est manifestement pas faite pour le rendu de
612 desklets, mais bonne pour de la manipulation d'images en ligne de commande.
613 @item
614 Vous pouvez enlever le support pour d'autres paquetages ainsi :
615 @command{--without-history}, @command{--without-fontconfig}
616 @item
617 L'interface du shell peut elle aussi être retirée en utilisant 
618 l'option: @command{--disable-frontend-shell-driver}
619 @end itemize
622 @node Utiliser adesklets
624 @chapter Utiliser adesklets
626 @ifplaintext 
627 INSTALL_END
628 @end ifplaintext
630 @section ... Comme un conteneur de desklets
632 Par lui-même, adesklets fait peu: il ne fournit que le nécessaire pour
633 faire plus ! Vous aurez besoin soit de lui dire quoi faire en
634 lui envoyant des commandes (voir la section suivante) soit d'utiliser d'autres scripts
635 (les desklets) qui le piloteront pour vous.
637 @noindent Aujourd'hui, de nombreux desklets existent: vous pouvez les 
638 trouver sur le site Internet d'adesklets en tant que téléchargements 
639 séparés: @weblink{http://adesklets.sf.net/desklets.html}.
641 @subsection Ajouter un nouveau desklet à votre affichage X
642 Pour ajouter un nouveau script de desklet, il suffit simplement de:
644 @enumerate
645 @item
646 Télécharger sa tarball et la désarchiver quelque part dans votre répertoire
647 personnel.
648 @item
649 Lire le fichier README; les pré-requis ou instructions spécifiques y seront
650 donnés. Habituellement, vous n'aurez besoin que d'une installation
651 d'adesklets et d'un serveur X lancé, puis de lancer le script exécutable à
652 partir de votre répertoire de base.
653 @end enumerate
655 Depuis adesklets 0.4.11, les desklets en Python vous demanderont explicitement 
656 si vous voulez les enregistrer ou les tester. Ils supporteront également 
657 l'option @command{--help}, que vous pouvez utiliser pour savoir quelles sont 
658 les options que vous pouvez passer à l'interpréteur d'adesklets pendant des tests 
659 (détection de fausse fenêtre racine, etc.). Ceci vaut aussi pour les desklets 
660 en Perl.
662 @noindent Notez bien que :
664 @itemize
665 @item
666 Lancer le même script plusieurs fois va en créer plusieurs instances.
667 @item
668 Sur les ordinateurs disposant de plusieurs écrans, les scripts seront affichés
669 sur leur écran hérité par défaut (par exemple, si vous ne faites rien
670 de spécial, appeler un script à partir d'un xterm sur l'écran 1 lancera le
671 desklet sur l'écran 1).
672 @end itemize
674 @noindent La plupart du temps, les scripts de desklets sont faits
675 pour fonctionner tant que vous ne leur dites pas de
676 s'arrêter. L'utilisateur a un contrôle total sur le démarrage, l'arrêt,
677 le redémarrage (quand c'est possible) et le positionnement du desklet, 
678 qui n'a aucun contrôle sur ces opérations.
680 @noindent Les quelques réglages de l'utilisateur sont stockés dans le fichier
681 @file{$HOME/.adesklets} de votre répertoire personnel. Habituellement, vous
682 n'avez pas à éditer ce fichier vous-même. Si vous le faites, assurez-vous
683 qu'aucune instance d'@command{adesklets} ne s'exécute en même temps.
685 @unnumberedsubsubsec Alternative au télechargement manuel des desklets
687 Depuis adesklets 0.5.0, un nouveau script @command{adesklets_installer} est 
688 disponible si vous avez installé le paquetage avec le support de Python: il 
689 permet une gestion automatisée de vos desklets sous @file{$HOME/.desklets} à 
690 travers une interface interactive simple. Depuis un vrai ou pseudo-terminal, 
691 invoquez:
693 @example
694 adesklets_installer
695 @end example
697 Ou, si vous disposez de l'interface pour shell d'adesklets:
699 @example
700 adesklets -i
701 @end example
703 Il est capable de détecter quels desklets vous avez et d'en télecharger, 
704 vérifier l'integrité et décompresser de nouveaux à partir des informations 
705 contenues dans le flux officiel des 
706 desklets (@weblink{http://adesklets.sf.net/desklets.atom}). Bien sur, il est 
707 toujours de votre devoir de les configurer et les lancer manuellement à 
708 partir de là.
710 Le script @command{adesklets_installer} est fournit avec trois interfaces 
711 utilisateur: une interface Tk (c'est celle par défaut, basée sur le module 
712 Tkinter), une interface curses ainsi qu'une simple interface 
713 purement textuelle, qui suppose simplement qu'un terminal trivial est présent 
714 (les flux de caractères @file{stdin} et @file{stdout}). Par défaut le 
715 script essaiera de présenter à l'utilisateur la première possible dans l'ordre 
716 donné, puis se rabattera sur la suivante si elle ne fonctionne 
717 pas @footnote{L'interface purement textuelle devrait toujours fonctionner à la 
718 fin de la journée.}, mais vous pouvez très bien en choisir une depuis la ligne 
719 de commande. Lisez:
721 @example
722 adesklets_installer --help
723 @end example
725 pour plus de détails sur l'invocation.
727 @unnumberedsubsubsec Note concernant les polices du système
729 @emph{Vous pouvez sans problème passer cette partie si vous ne comptez pas 
730 utiliser des polices non fournies avec adeklets.}
732 Toutes les polices TrueType présentes sur votre système peuvent être utilisées 
733 avec adesklets, pourvu que votre système supporte fontconfig 
734 (@weblink{http://www.fontconfig.org/}) et qu'adesklets ait été compilé sans l'option
735 @code{--without-fontconfig} (par défaut il est compilé avec le support de 
736 fontconfig; @xref{Installer adesklets}.). Lors de son initialisation, 
737 un adesklets compilé avec fontconfig va parcourir toutes les polices 
738 détectées sur votre système pour identifier toutes les polices TrueType. 
739 Lisez la documentation de fontconfig pour savoir comment configurer 
740 correctement l'accès aux polices de vos logiciels 
741 (@xref{Foire Aux Questions}, pour quelques conseils sur le 
742 débogage de fontconfig). Il est aussi bon de savoir que le paquetage d'adesklets 
743 contient une copie de la police Bitstream's Vera; tous les utilisateurs peuvent 
744 donc s'attendre à ce qu'@command{adesklets} dispose toujours de cette police, 
745 au minimum.
747 @unnumberedsubsubsec Notes concernant l'internationalisation
749 @emph{Vous pouvez sans problème passer cette partie si vous n'envisagez pas 
750 d'utiliser des caractères étendus dans vos desklets.}
752 Si votre système supporte @command{iconv} (@xref{Installer adesklets}.), 
753 vous devriez pouvoir utiliser n'importe quel caractère de n'importe quel
754 jeu de caractères que votre système connait pour afficher du texte, que ce 
755 soit dans un desklet ou dans ses menus, pourvu que vous ayez les polices 
756 TrueType appropriées (c'est à dire des polices TrueType incluant la 
757 représentation de ces caractères)@footnote{Par exemple, la police 
758 Bitstream's Vera fournie avec @command{adesklets} contient des symboles 
759 pour pratiquement tous les caractères du jeu Latin-1.}.
761 En tout cas, en utilisant des caractères étendus (en dehors des 7 bits 
762 @code{ASCII}), assurez-vous que les paramètres locaux de GNU readline 
763 n'interfèrent pas. Ces trois paramètres devraient être configurés comme 
764 indiqué ci-dessous dans le fichier @file{initrc} approprié
765 @footnote{Veillez vous réferer à la documentation de GNU readline}:
767 @example
768 set input-meta on
769 set convert-meta off
770 output-meta on
771 @end example
773 Si vous ne voulez pas adapter vos paramètres de GNU readline, vous pouvez 
774 aussi utiliser l'option @code{--enable-force-extended-characters-input} du 
775 script @code{configure} lors de la configuration du paquetage à partir des 
776 sources, ainsi l'interpreteur outrepassera en interne ces trois variables 
777 dès qu'il le faudra.
779 Bien sur, vous aurez besoin de desklets utilisant ces caractères étendus. 
780 Au moment d'écrire ces lignes, tous les desklets en Python ne provenant pas 
781 de contributions les utilisent; pour ceux-là l'utilisateur peut choisir 
782 quel jeu de caractères utiliser en le précisant dans le fichier de 
783 configuration, quand il existe@footnote{si'l n'existe pas, cela signifie 
784 que de toute façon le desklet n'a pas besoin d'internationalisation}; 
785 l'utilisateur doit simplement définir correctement la ligne 'coding'
786 @footnote{Pour plus de détails consultez @weblink{http://python.fyxm.net/peps/pep-0263.html}.}.
788 Par exemple, pour utiliser les caractères ISO Latin-1, on utilisera 
789 quelquechose comme:
791 @example
792 # -*- coding: ISO-8859-1 -*-
793 @end example
795 à la première ou deuxième ligne du fichier de configuration d'un desklet 
796 en Python@footnote{Evidemment, ce fichier de configuration devra être 
797 enregistré en utilisant l'encodage ISO Latin-1 ou n'importe lequel de 
798 ses dérivés, comme l'@code{ASCII}.}.
800 Enfin, veillez noter que si votre plate-forme ne supporte pas iconv, 
801 vous devrez toujours laisser @code{ASCII} comme paramètre d'encodage, 
802 autrement les desklets vous renverront des erreurs fatales comme 
803 @code{charset conversion not compiled in}. 
805 @subsection Restaurer les desklets précédents sur une nouvelle session X
806 Invoquer @command{adesklets} sans arguments@footnote{Attention: par défaut 
807 depuis adesklets 0.4.11 vous @emph{devez} ajouter certaines options si 
808 votre gestionnaire de fenêtres utilise une fausse fenêtre racine. 
809 @xref{Foire Aux Questions}.}:
810 @example
811 adesklets
812 @end example
814 @noindent est suffisant pour redémarrer tous les desklets qui tournaient la
815 dernière fois que vous avez tué le serveur X (dans ce mode, @command{adesklets}
816 terminera rapidement par lui-même : il n'y a pas besoin de le lancer en
817 arrière-plan. adesklets n'utilise pas de démon : chaque applet créé un
818 interpréteur @command{adesklets} indépendant comme processus fils). 
819 Invoquer @command{adesklets} quand des desklets sont déjà 
820 lancés forcera leur arrêt avant leur redémarrage
821 @footnote{Les instances d'@command{adesklets} et leurs parents immédiats 
822 recevront alors un signal SIGKILL.}.
824 @noindent Si vous pensez utiliser des desklets régulièrement, vous
825 devriez mettre la commande @code{adesklets} quelque part dans
826 l'initialisation de votre session X. Je ne peux pas dire où avec précision,
827 puisque cela varie énormément d'un système à l'autre. Cherchez sur :
828 @weblink{http://www.google.com/search?q=''x window''+startup} pour une
829 aide générale.
831 Depuis adesklets 0.4.11, une interface plus complète basée sur le shell 
832 est à votre disposition si vous l'avez installée (ce qui se fait par 
833 défaut). Elle fournit un ensemble plus fonctionel d'options. Lancez 
835 @example
836 adesklets --help
837 @end example
839 Pour voir ce que vous avez au bout des doigts. Notez bien que depuis 
840 adesklets 0.4.11, si vous avez besoin de la détection de fausse fenêtre racine 
841 vous @strong{devez} normalement activer les options correctes en ligne 
842 de commande (@xref{Foire Aux Questions}.).
844 @section ... Comme un éditeur graphique en ligne de commande
846 Vous pouvez aussi utiliser adesklets comme un éditeur graphique en ligne de
847 commande. Si vous tapez dans une console:
849 @example
850 adesklets :
851 @end example
853 @noindent Vous obtiendrez quelque chose ressemblant à ceci :
855 @anchor{prompt}
856 @example
857 adesklets 0.1.0 (Fri Jan 28 19:09:13 EST 2005), on Linux 2.6.10
858 [gcc 3.4.3 20041125 (Gentoo Linux 3.4.3-r1, ssp-3.4.3-0, pie-8.7.7)]
859 Press TAB for hints.
860 0 >>> _
861 @end example
863 @noindent La dernière ligne est une invite. Elle vous dit que vous êtes prêt
864 à entrer la commande numéro 0. Dans adesklets @value{VERSION}, vous avez
865 environ 150 commandes à portée de main. Grâce à GNU readline, de nombreuses 
866 routines d'auto-complétion sont présentes, ce qui vous permet d'explorer 
867 facilement. Appuyez sur TAB pendant que vous entrez le nom d'une commande 
868 ou le premier argument d'une commande, et des informations utiles seront 
869 affichées. @xref{premiers pas,,une introduction à adesklets}, pour plus d'informations.
871 @node Programmation d'adesklets
872 @chapter Programmation d'adesklets
873 @section Une introduction à adesklets
874 @anchor{premiers pas}
876 Comme expliqué ci-dessus (@xref{A propos d'adesklets}.), adesklets est
877 principalement une console interactive d'Imlib2, avec une ou deux fonctions
878 supplémentaires:
880 @itemize
881 @item
882 Quand un affichage X est présent, la gestion automatique d'une 
883 fenêtre simple.
884 @item
885 Support automatique de la pseudo-transparence
886 @item
887 Gestion d'applets persistants entre sessions
888 @end itemize
890 @noindent Commençons une session interactive typique pour voir ce qui se
891 passe. Sous X, ouvrez un terminal et tapez:
893 @example
894 adesklets :
895 @end example
897 @noindent Comme dans la section précédente (@xref{prompt,, 'Utilisation
898 d'adesklets comme un éditeur graphique en ligne de commande' }.), vous obtenez
899 une invite. Maintenant entrez la commande '@code{images_info}'. Vous devriez
900 obtenir sur la sortie standard :
902 @example
903 2 images
904 id 0 width 1 height 1 alpha 1 filename (null)
905 id 1 width 1 height 1 alpha 1 filename (null)
906 command 0 ok: images_info
907 @end example
909 @noindent Cela signifie que vous avez deux images : l'image 0 et l'image 1,
910 et qu'elles ont une taille de 1x1 pixel. Ce sont les seules images que
911 vous ne pourrez jamais détruire ou modifier (redimensionner indépendamment, 
912 retourner diagonalement, etc.) comme vous le souhaitez. Qu'est-ce que c'est 
913 que cela?
915 @itemize
916 @item
917 Image 0 est l'image d'avant-plan. Par défaut, c'est la seule image qui
918 est affichée dans une fenêtre simple gérée par @command{adesklets}.
919 @item
920 Image 1 est l'image d'arrière-plan. Par défaut, elle contient toujours le
921 contenu de la fenêtre racine (le bureau) qui est sous cette fenêtre. Sans
922 modification de notre part, elle est toujours mise à jour lorsque l'utilisateur
923 la déplace, la redimensionne, lorsque le fond d'écran change, etc.
924 @end itemize
926 @noindent Mais où est cette fenêtre? Eh bien, pour l'instant, ce sont seulement des
927 images de 1x1 pixel, et elles ne sont pas affichées@footnote{"Mappé" dans le 
928 jargon d'X Window} à l'écran. Ainsi, redimensionnons les à 100x100 pixels:
929 tapez '@code{window_resize 100 100}'. Maintenant, si vous retapez la commande
930 '@code{images_info}', vous obtiendrez:
931 @example
932 2 images
933 id 0 width 100 height 100 alpha 1 filename (null)
934 id 1 width 100 height 100 alpha 1 filename (null)
935 command 2 ok: images_info
936 @end example
938 @noindent Vous voyez? Les images d'avant-plan et d'arrière-plan ont été
939 redimensionées à 100x100 pixels: de plus l'arrière-plan a été mis à jour
940 pour contenir la nouvelle image de fond. Maintenant, rendons cette fenêtre
941 visible. Tapez les deux commandes: '@code{window_reset managed}' et enfin
942 '@code{window_show}'.
944 @noindent La première commande demande à adesklets de laisser votre
945 gestionnaire de fenêtres "gérer" votre fenêtre (ce qui n'est pas fait par défaut): 
946 cela signifie que la fenêtre va être décorée, et que  vous pourrez changer sa
947 visibilité@footnote{Une fenêtre "non-gérée" est très utile pour les desklets: 
948 c'est comme si c'était une partie de la fenêtre racine puisqu'elle peut
949 être faite pour ne jamais être en avant-plan et pour rester affichée (mapped) 
950 lorsque l'on change d'espace de travail.} de façon interactive. La seconde
951 montre votre fenêtre de 100x100. Rien d'impressionnant: un carré noir de
952 100x100 avec une barre de titre et des bordures fixes.
954 @noindent Comme dit plus haut, seule l'image 0 (l'avant-plan) est affichée par
955 défaut. Maintenant, tapons : '@code{window_set_transparency 1}'. Wouah! Nous
956 voyons la fenêtre racine du dessous! Avec "window transparency"
957 activé, l'image 1 (arrière-plan) est d'abord copiée dans la fenêtre, puis
958 l'image 0 (avant-plan) qui est entièrement noire et transparente, est mise
959 par-dessus@footnote{Enfin... Pas tout à fait : il y a un buffer qui intervient 
960 pour la performance, mais l'opération est logiquement équivalente à
961 cette description.}.
963 @noindent Il est temps de parler des couleurs: souvenez-vous, adesklets
964 est une console d'Imlib2. Par conséquent, comme Imlib2@footnote{Gardez
965 votre documentation d'Imlib2 à proximité: c'est très utile!
966 @xref{Documentation d'Imlib2}.}, les couleurs sont toujours de
967 véritables couleurs 32 bits codées en RVBA - huit bits par canal (de 0 à
968 255), incluant un canal alpha pour la transparence. La conversion de palette se
969 fera  automatiquement si la définition de votre écran est inférieure, vous
970 n'avez pas à vous en occuper. Si vous tapez: '@code{context_get_color}',
971 vous obtiendrez:
973 @example
974 command 0 ok: context color 255 255 255 255
975 @end example
977 @noindent Imlib2 est une sorte de machine par états; en tant que tel, il utilise un 
978 "contexte" qui garde en mémoire une série d'attributs qui seront utilisés dans
979 ses opérations futures. Par exemple, nous savons maintenant que la couleur
980 qui sera utilisée, aussi longtemps que nous ne la modifions pas, sera un
981 blanc opaque (rouge=255, bleu=255, vert=255, alpha=255). Si nous tapons:
982 '@code{context_get_image}', il retourne:
983 @example
984 command 0 ok: context image 0
985 @end example
987 @noindent Cela signifie que toute opération que nous effectuons sur une fenêtre
988 sera faite directement sur l'image d'avant-plan. Dessinons un rectangle plein
989 semi-transparent de couleur magenta sur l'avant-plan. Les commandes seront:
990 '@code{context_set_color 255 0 0 200}' et '@code{image_fill_rectangle 25 25
991 50 50}'. Élégant, n'est-ce pas?
993 @noindent Si vous avez l'habitude de programmer avec Imlib2, vous avez 
994 du remarquer que ces dernières commandes ont l'air familières. C'est
995 assez normal; la plupart des fonctions C d'Imlib2 sont présentées de
996 la même façon dans les 'commandes' d'adesklets. Ainsi, la commande
997 d'adesklets  '@code{image_fill_rectangle}' suit la même sémantique que
998 la fonction '@code{imlib_image_fill_rectangle()}' d'Imlib2, la commande
999 '@code{context_set_color}' suit celle de la fonction '@code{imlib_context_set_color()}',
1000 etc. Les deux seules différences significatives (et systématiques) sont premièrement que
1001 partout où vous utiliserez un objet '@code{Imlib_Quelquechose}' en C, vous
1002 utiliserez un ID entier avec adesklets, et deuxièmement dans la sémantique des fonctions
1003 '@code{imlib_free_Quelquechose()}' où on doit préciser l'ID de l'objet 
1004 auquel s'applique la fonction au 
1005 lieu de libérer l'objet de ce type sélectionné dans le contexte.
1007 @noindent Tout ceci est facile à illustrer. Chargeons la police "Vera" 
1008 incluse dans adesklets à la taille 20pt, mettons la en police par défaut 
1009 et écrivons 'Hello' en blanc opaque en diagonale sur l'image d'avant-plan 
1010 en partant du coin en haut à gauche, avant de décharger la police. 
1011 Cela devrait ressembler à:
1013 @example
1014 6 >>> load_font Vera/20
1015 command 6 ok: new font 0
1016 7 >>> context_set_font 0
1017 command 7 ok: context_set_font 0
1018 8 >>> context_set_direction text_to_angle
1019 command 8 ok: context_set_direction text_to_angle
1020 9 >>> context_set_angle 45
1021 command 9 ok: context_set_angle 45
1022 10 >>> context_set_color 255 255 255 255
1023 command 10 ok: context_set_color 255 255 255 255
1024 11 >>> text_draw 0 0 Hello
1025 command 11 ok: text_draw 0 0 Hello
1026 12 >>> free_font 0
1027 command 12 ok: free_font 0
1028 @end example
1030 @noindent Si vous regardez votre documentation d'Imlib2, vous remarquerez
1031 immédiatement les deux différences que l'on vient d'évoquer: toutes les
1032 références à la police Vera/20 sont faites par un ID entier (0 ici), et
1033 la commande '@code{free_font}', contrairement à la fonction correspondante
1034 '@code{imlib_free_font()}', est appliquée à la police dont l'ID est donné en 
1035 argument plutôt qu'à la police du contexte.
1037 @noindent A partir de là, imaginons que vous voulez sauvegarder l'image résultante; 
1038 aucun problème! Tapez: '@code{save_image out.png}', et
1039 l'avant-plan sera sauvé dans un fichier "out.png" dans le répertoire 
1040 courant@footnote{Pour que ça marche, il faut que votre installation d'Imlib2 
1041 soit correctement configurée pour utiliser libpng, sinon vous
1042 risquez de recevoir l'erreur "no loader for file format".}. Maintenant,
1043 juste pour le plaisir, quittons adesklets, et lançons une autre session
1044 interactive pour voir si nous pouvons recharger cette image. Tapez juste
1045 la commande "@code{quit}" ou pressez ^D (Control D: fin de fichier), votre
1046 nouvelle session devrait ressembler à ceci :
1048 @example
1049 0 >>> window_resize 100 100
1050 command 0 ok: window_resize 100 100
1051 1 >>> window_reset managed
1052 command 1 ok: window_reset managed
1053 2 >>> window_set_transparency 1
1054 command 2 ok: window_set_transparency 1
1055 3 >>> load_image out.png
1056 command 3 ok: new image 2
1057 4 >>> blend_image_onto_image 2 1 0 0 100 100 0 0 100 100
1058 command 4 ok: blend_image_onto_image 2 1 0 0 100 100 0 0 100 100
1059 5 >>> window_show
1060 command 5 ok: window_show
1061 6 >>> free_image 2
1062 command 6 ok: free_image 2
1063 @end example
1065 @noindent Bien sur, nous voulions visualiser le résultat - c'est
1066 pourquoi nous avons utilisé les commandes '@code{window_reset}',
1067 '@code{window_set_transparency}' et '@code{window_show}': elles n'ont
1068 pas d'autre utilité. La commande '@code{blend_image_onto_image}' vient elle 
1069 aussi tout droit d'Imlib2; elle prend la nouvelle image 2 que l'on vient de
1070 créer avec la troisième commande, et la met dans l'image du contexte 
1071 (image 0 - avant-plan par défaut), à partir de ses coordonnées (0,0) et 
1072 d'une taille de 100x100 pixels, et la met dans un rectangle partant de (0,0)
1073 et de taille 100x100 pixels dans l'image 0. Il est finalement bon de noter
1074 que, avec adesklets, il y a toujours une image dans le contexte d'Imlib2:
1075 dès que vous essayez de libérer l'image courante, le contexte d'image est
1076 réinitialisé à l'image d'avant-plan.
1078 @noindent Voila, c'est presque la fin de cette introduction... A partir de
1079 là vous devriez pouvoir jouer un peu avec adesklets. Si vous êtes déjà 
1080 familier avec Imlib2 vous vous y ferez très rapidement. Sinon vous devriez 
1081 garder la documentation d'Imlib2 sous la main. :-)
1083 @noindent Quelques dernières astuces:
1085 @itemize
1086 @item
1087 Si vous êtes fatigué de taper encore et encore, n'oubliez pas 
1088 l'auto-complétion: 'TAB your problems away!'
1089 @item
1090 Si vous avez besoin d'aide sur quoi que ce soit, il existe
1091 la commande '@code{help}'.
1092 @item
1093 Si vous exécutez une série de commandes, que ça ne marche pas et que tout
1094 cet usage interactif vous fatigue:
1095 @enumerate
1096 @item
1097 Utilisez la commande '@code{history}' pour enregistrer votre session courante
1098 dans un fichier@footnote{Pour que ça marche, GNU
1099 history doit être installé lors de la compilation d'adesklets.}.
1100 @item
1101 Utilisez l'option '-f' avec adesklets pour passer les commandes à partir
1102 d'un fichier plutôt que de la console tty.
1103 @item
1104 Si vous essayez de visualiser quelque chose, insérez une commande
1105 '@code{pause}' à la fin du script pour geler l'interpréteur.
1106 @item
1107 Tous les caractères après un dièse '#' jusqu'à la fin de la
1108 ligne seront ignorés, ce qui vous permet d'écrire des commentaires.
1109 @end enumerate
1110 @end itemize
1112 @noindent Voici un exemple:
1114 @example
1115 #!/usr/bin/env adesklets -f
1117 # Rendre la fenêtre 'gérée'
1119 window_reset managed
1121 # Redimmensioner la fenêtre à 100x100 pixels
1123 window_resize 100 100
1125 # Montrer la fenêtre, puis la geler pendant 10 secondes avant de sortir
1127 window_show
1128 pause 10
1129 @end example
1131 @noindent Vous aurez juste besoin de rendre ce script exécutable et de le
1132 lancer. Comme d'habitude, les résultats seront affichées sur la sortie standard.
1134 @section Véritable programmation avec adesklets: écriture d'un script de desklet
1136 Lorsque vous serez prêt pour un vrai travail@footnote{:-)}, vous voudrez 
1137 surement utiliser un véritable langage de script plutôt que l'interpréteur 
1138 rudimentaire d'@command{adesklets} que nous avons utilisé dans l'introduction;
1139 ne serait-ce que pour pouvoir utiliser des variables.
1141 Au moment où j'écris ces lignes (@value{UPDATED}), le support pour
1142 Python et Perl 5 est inclus dans le paquetage d'adesklets@footnote{adesklets a 
1143 été écrit pour être facilement utilisé depuis toutes sortes de langages 
1144 interprétés; n'hésitez pas à proposer votre aide si vous voulez que votre 
1145 langage favori soit supporté!}.
1147 @subsection Quelques astuces pour les programmeurs
1148 @anchor{generaltips}
1150 Une fonction très utile de l'interpréteur d'@command{adesklets} est sa 
1151 capacité à produire un trace complète d'une de ses sessions (commandes, 
1152 évènements et messages spéciaux), que ce soit sur @code{stderr} ou dans 
1153 un fichier journal, et ce indépendemment de ce qui le contrôle. Pour se 
1154 servir de cette fonctionalité, il faut:
1156 @enumerate
1157 @item Configurer le paquetage au niveau des sources en activant la trappe 
1158 @code{--enable-debug} de @code{configure}.
1159 @item Exporter la variable @code{ADESKLETS_LOG} dans l'environnement si la 
1160 sortie de la session doit être enregistrée dans un fichier plutôt qu'affichée 
1161 sur @code{stderr}@footnote{L'afficher sur @code{stderr} risque fortement de 
1162 perturber les liens avec les langages externes, il est donc préferable de ne 
1163 le faire que lors d'une invocation de l'interpréteur directement sur la 
1164 console.}. Ce doit être un chemin absolu qui servira de préfixe à 
1165 l'interpréteur qui, l'ayant hérité de l'environnement, s'en servira pour créer 
1166 les noms complets des fichiers dans lesquels il écrira.
1167 @end enumerate
1168 A partir de là, il est possible de lire des journaux de session complets et 
1169 chronologiques; utilisés correctement, ils peuvent être utiles pour débugger. 
1170 Vous pouvez vous en servir conjointement avec la commande @code{echo} pour 
1171 placer des marqueurs faciles à trouver@footnote{Certains systèmes de gestion 
1172 des paquetages, comme les ebuilds de Portage avec le drapeau USE @code{debug}, 
1173 utilisent cette fonctionalité automatiquement.}.
1175 @subsection adesklets et Python
1176 @unnumberedsubsubsec Un exemple d'utilisation de Python
1177 Avec Python, les choses ne sont pas très différentes de l'interpréteur. 
1178 Les commandes ont été encapsulées dans des fonctions Python, et une classe 
1179 publique @code{Events_handler} a été construite pour manipuler les retours 
1180 asynchrones de l'interpréteur. Jetons un coup d'oeil sur le script 
1181 @file{test/test.py} de l'archive source de la version @value{VERSION}:
1183 @verbatiminclude ../test/test_fr.py
1185 Voilà! 26 lignes de code Python, et nous avons un desklet parfaitement
1186 fonctionnel. Je pense qu'il s'explique de lui-même; jetez un coup d'oeil à
1187 l'aide intégrée de python à propos de @code{adesklets}, @code{adesklets.functions}
1188 et @code{adesklets.Events_handler} pour de bonnes et complètes explications
1189 @ifhtml
1190 (@xref{Documentation du paquetage Python}.)
1191 @end ifhtml
1192 . Tout ce que nous avons fait ici c'est:
1194 @enumerate
1195 @item
1196 Importer le paquetage @code{adesklets}: cela instancie automatiquement un
1197 processus fils @command{adesklets} et configure toutes les communications. 
1198 Si l'initialisation du paquetage termine sans provoquer d'exception, cela signifie
1199 que l'interpréteur tourne et qu'il attend des commandes.
1200 @item
1201 Faire une sous-classe d'@code{adesklets.Events_handler} et redéfinir les
1202 méthodes invoquées pour les événements qui nous intéressent (tous les autres
1203 événements ne sont pas simplement ignorés, ils ne sont pas générés).
1204 @item
1205 Instancier un objet de cette classe, et le mettre en boucle infinie
1206 @footnote{Cette dernière étape n'est pas obligatoire; le script peut
1207 très bien continuer, mais devra alors avoir été écrit pour supporter les 
1208 interruptions des signaux. Lisez `@code{help(adesklets.Events_handler)}' pour de
1209 plus amples informations.}.
1210 @end enumerate
1212 @unnumberedsubsubsec Attention, piège: quelques détails sur les ID d'objets
1213 @anchor{objectids}
1214 Tous les objets d'adesklets (polices, images, palettes de couleurs, polygones, etc), 
1215 sont stockés dans des piles (une pile par type d'objet). Les ID de Python ne sont 
1216 rien d'autre que la position initale d'objets donnés dans la pile correspondante, 
1217 et deviendront donc invalides si un objet du même type situé en-dessous est 
1218 libéré.
1220 Par exemple, partant d'un état vierge, il n'y a d'autre dans la pile des images 
1221 que l'avant-plan (ID O) et l'arrière-plan (ID 1) de la fenêtre. Lorsque 
1222 quelqu'un créé deux autres images depuis Python comme ceci:
1223 @example
1224 im_1 = adesklets.create_image(10,10)
1225 im_2 = adesklets.create_image(10,10)
1226 @end example
1227 @noindent on a @code{im_1==2}, et @code{im_2==3}. Dès qu'on fera:
1228 @example
1229 adesklets.free_image(im_1)
1230 @end example
1231 @noindent La pile commence à s'écraser, et ce qui était l'image 3 (@code{im_2}) 
1232 est maintenant l'image 2, et @code{im_2} est une réference invalide. Cela 
1233 signifie clairement qu'invoquer:
1234 @example
1235 adesklets.free_image(im2)
1236 @end example
1237 @noindent génerera le message d'erreur @code{image out of range}.
1239 @unnumberedsubsubsec Un sujet spécial: les animations
1240 @anchor{animations}
1241 @command{adesklets} inclut maintenant aussi bien un mode d'exécution indirect 
1242 que les variables textuelles (pour être précis, le remplacement textuel 
1243 non-récursif). Cela signifie que les auteurs de desklets ont ce qu'il faut 
1244 pour créer des animations précisément temporisées. Vous trouverez un exemple 
1245 simple à suivre dans @file{test/fading.py}. Une utilisation 
1246 plus poussée de ces fonctionalités est faite dans le desklet @code{yab}. Pour 
1247 réaliser un animation en Python, il faut:
1249 @enumerate
1250 @item @strong{Enregistrer} une séquence de commandes (que nous appelerons une 
1251 commande macro, ou macro). Avec Python, il faut passer en mode 
1252 indirect avec la fonction @code{adesklets.start_recording()}, émettre un 
1253 nombre indéterminé de commandes @command{adesklets}, puis repasser en mode 
1254 normal (execution directe) avec @code{adesklets.stop_recording()}. Bien sur, 
1255 aucune commande n'est évaluée quand l'interpréteur est en mode indirect; les 
1256 commandes sont seulement conservées dans l'historique pour être rejouées plus 
1257 tard. 
1258 @item @strong{Choisir} si la séquence de commandes à rejouer peut être 
1259 interrompue par des évènements ou pas, en utilisant la fonction 
1260 @code{adesklets.play_set_abort_on_events()}. La méthode de haut niveau 
1261 @code{adesklets.Events_handler::set_events()} peut aussi être utilisée pour 
1262 choisir dynamiquement quels évènements seront rattrapés. Pour un exemple, 
1263 voyez @file{test/test_events.py}.
1264 @item @strong{Initialiser} les variables utilisées dans la macro 
1265 enregistrée avec la fonction @code{adesklets.set()}, qui est très similaire 
1266 à son homonyme du shell Bourne.
1267 @item @strong{Lire} la macro avec la fonction @code{adesklets.play()}.
1268 @end enumerate
1270 Quelques remarques supplémentaires:
1271 @itemize
1272 @item Une temporisation précise de la séquence peut être faite par la 
1273 commande @code{time_gate}. Elle fonctionne très simplement: à chaque 
1274 fois qu'une macro est exécutée, adesklets enregistre à quel moment 
1275 elle à commencé. Dès qu'une commande @code{time_gate} apparait lors 
1276 de l'exécution, le programme attend que le nombre de secondes données 
1277 en argument à @code{time_gate} soient écoulées. Par exemple, écrire 
1278 @code{time_gate 0.1} dans une macro empêchera l'execution de toutes les 
1279 commandes suivantes de la macro tant que celle-ci n'aura pas fonctionné 
1280 pendant au moins un dixième de seconde.
1281 @item La substitution des variables à toujours lieu juste avant l'exécution 
1282 des commandes, indépendemment du mode d'execution (direct ou indirect). 
1283 Toute séquence de caractères ne contenant pas d'espace précedée directement 
1284 par un seul '$' sera remplacée par le contenu de la variable correspondante 
1285 (configuré précedemment avec @code{set}). Si aucune variable ne correspond, 
1286 la séquence est simplement ignorée.
1287 @item Toutes les macros exécutées par la commande @code{play} sont, du point de 
1288 vue du desklet qui les contrôle, élémentaires, comme toutes les autres commandes. 
1289 En un mot, cela signifie qu'aucun évènement ne sera jamais géneré pendant 
1290 qu'une macro est exécutée; ils apparaitront tous juste après que la commande 
1291 @code{play} ait terminé. 
1292 @item Comme d'habitude, l'interpréteur d'adesklets fonctionne par états pour 
1293 les variables et les états liés au mode indirect. Vous n'avez pas à fixer le 
1294 drapeau @code{set_abort_on_events} ou les variables à chaque fois que vous 
1295 appelez une macro, sauf si quelquechose doit être changé depuis l'appel 
1296 précedent.
1297 @item La fonction de haut niveau @code{adesklets.Events_handler::set_events()} 
1298 sert principalement à arrêter la prise en charge de certains évenements pendant 
1299 l'exécution de la macro, ainsi la macro ne peut être interrompue que dans des 
1300 circonstances bien précises. Bien sur, tous les évènements génerés avant l'appel 
1301 à cette méthode ne seront pas perdus mais placés en file d'attente, et les 
1302 méthodes d'évènements appropriées seront appelées plus tard, pourvu que les 
1303 trappes soient en place lorsque l'exécution de la macro est terminée.
1304 @item Avons-nous rappelé que faire tout cela depuis un endroit non protégé est 
1305 une mauvaise idée? Eh bien, ça l'est. N'oubliez pas d'utiliser 
1306 @code{adesklets.Events_handler::block()} et @code{adesklets.Events_handler::unblock()} 
1307 autour de tout code relatif à une animation si vous avez instancié un objet 
1308 d'une classe fille de @code{adesklets.Events_handler}.
1309 @end itemize
1311 @unnumberedsubsubsec Configuration et internationalisation
1313 Mentionnons jute ici que depuis @command{adesklets} 0.4.0, le module 
1314 @code{adesklets.utils} inclut maintenant une classe optionelle 
1315 @code{ConfigFile} qui peut être facilement réutilisée par les auteurs de 
1316 desklets pour ajouter un système de configuration facilement extensible à 
1317 leur code@footnote{Pour en voir un exemple voyez n'importe quel desklet 
1318 non issu de contributions.}
1319 @ifhtml
1320 (@xref{Documentation du paquetage Python}.)
1321 @end ifhtml
1322 . Par défaut, la classe prend aussi en charge l'internationalisation 
1323 automatiquement, en sélectionnant les jeux de caractères selon les 
1324 besoins de l'utilisateur. L'utilisation des jeux peut bien sûr être 
1325 déterminée ou changée à tout moment en utilisant les fonctions 
1326 @code{adesklets.get_charset()} et @code{adesklets.set_charset()}. La 
1327 classe @code{adesklets.utils.ConfigFile} a aussi un attribut @code{charset} 
1328 qu'on peut examiner pour connaitre les préferences de l'utilisateur. En 
1329 utilisant cette classe on notera que le jeu de caractères 'ASCII' est 
1330 considéré comme choix par défaut, et qu'il ne désactivera pas une éventuelle conversion.
1331 Ainsi, les utilisateurs de plate-formes ne supportant pas iconv pourront 
1332 toujours utiliser @command{adesklets} sans le support de l'internationalisation. 
1334 @unnumberedsubsubsec Derniers mots
1336 @noindent Enfin, signalons que vous pourriez avoir envie de jeter un oeil au 
1337 code source du desklet @file{weather} disponible sur 
1338 @weblink2{le site web du projet SourceForge,http://sourceforge.net/projects/adesklets/} pour 
1339 voir un plus gros morceau de code Python utilisant adesklets. Il y a aussi 
1340 quelques autres desklets de test sous le répertoire @file{test/} qui pourraient 
1341 vous donner des idées.
1342 @ifhtml
1343 Vous pourriez aussi jeter un oeil au paquetage d'aide autogéneré d'@command{adesklets} 
1344 par pydoc, inclus dans ce document (@xref{Documentation du paquetage Python}.). Dès 
1345 que vous êtes suffisement content de votre desklet, n'hésitez pas à le partager avec 
1346 le reste d'entre nous (ce qui serait très apprécié). Faites-en un paquetage 
1347 (@xref{GNU Makefile pour empaqueter les desklets}.), puis soumettez-le 
1348 (@xref{Soumettre un desklet}.).
1349 @end ifhtml
1351 @subsection adesklets et Perl
1352 Depuis adesklets 0.6.0, adesklets peut par défaut être commandé par Perl, 
1353 grâce au travail de @weblink2{Lucas
1354 Brutschy,mailto:lbrutschy@@users.sourceforge.net}. Bien sur, les liens 
1355 avec Perl sont complètement perpendiculaires à Python, et n'ont besoin 
1356 que de l'environnement Perl 5 en plus de l'interpréteur de base d'adesklets, 
1357 écrit en C.
1359 @unnumberedsubsubsec Exemple d'utilisation de Perl
1361 Comme avec le paquetage Python, les commandes sont encapsulées dans des 
1362 routines Perl. Une boucle de gestion des évènements peut alors être lancée, 
1363 enregistrant et appelant automatiquement les routines données 
1364 (@code{BackgroundGrab}, @code{ButtonRelease}, @code{LeaveNotify}, 
1365 @code{MotionNotify}, @code{ButtonPress}, @code{EnterNotify}, 
1366 @code{MenuFire}) selon le cas approprié. @code{adesklets::event_loop} 
1367 ne termine que lors de la fin de l'interpréteur adesklets commandé. Voici 
1368 le script @file{test/test.pl} du paquetage source de la version 
1369 @value{VERSION}:
1371 @verbatiminclude ../test/test.pl
1373 Simplement vingt lignes de code, et comme précedemment, nous avons 
1374 déjà un desklet fonctionnel. Il doit être assez simple à comprendre, 
1375 mais voici quelques indications génerales sur ce qu'il fait: 
1377 @enumerate
1378 @item D'abord, il importe de module adesklets de Perl 
1379 (@code{use adesklets}), et instancie l'interpréteur d'adesklets en 
1380 appelant @code{adesklets::open_stream()}. Lorsque la sous-routine 
1381 termine, la ligne de commande est déjà traitée et l'interpréteur 
1382 est prêt à accepter des commandes. 
1383 @item A partir de là, nous avons simplement initialisé une fenêtre 
1384 non-gerée de 100 pixels sur 100, que nous avons remplie avec un fond 
1385 transluicide blanc, et l'avons affichée. 
1386 @item Enfin, nous allumons une boucle des évènements, enregistrant 
1387 une sous-routine de retour qui agit quand l'utilisateur clique dessus 
1388 (ici, l'action consiste à dessiner un carré rouge de 3 pixels de coté 
1389 sous le pointeur). Cette boucle des évènements tourne tant que 
1390 l'interpréteur d'adesklets n'est pas tué (que ce soit manuellement 
1391 ou à cause de la fin d'une session X11). Quand elle termine, la 
1392 sous-routine de nettoyage @code{adesklets::close_streams()} est 
1393 appelée.
1394 @end enumerate
1396 @unnumberedsubsubsec Rattraper les erreurs
1398 Lorsqu'une commande adesklets retourne une erreur, le script Perl 
1399 meurt. Vous pouvez récuperer le message d'erreur d'origine comme 
1400 ceci: 
1402 @example
1403 eval @{ my $image = adesklets::load_image("aaarrhg"); @};
1404 if($@@) @{ print $@@; @}
1405 @end example
1407 @xref{generaltips,Quelques astuces pour les programmeurs}, pour une alternative.
1409 @unnumberedsubsubsec Configuration
1411 Vous pouvez très bien conserver de multiples instances du même desklet 
1412 en Perl configurées differemment; il s'agit simplement d'utiliser la 
1413 valeur de retour de @code{adesklets::get_id()} pour identifier de 
1414 manière unique l'instance en cours d'exécution; la manière dont vous 
1415 utilisez cet unique identifiant entier pour sélectionner les 
1416 paramètres de configuration dépends entièrement de vous. 
1418 @unnumberedsubsubsec Derniers mots
1420 Vous désirez certainement jeter un oeil aux sections précedentes 
1421 concernant les ID d'objets (@xref{objectids, Attention, piège: quelques détails sur les ID d'objets}.) 
1422 et les animations (@xref{animations,Un sujet spécial: les animations}.), qui 
1423 sont toujours valables pour Perl.
1425 @ifhtml
1426 Vous pouvez aussi voir la vieille documentation (plain old documentation 
1427 -- POD) du paquetage Perl, incluse dans ce document 
1428 (@xref{Documentation du paquetage Perl}.). Comme signalé precedemment, dès 
1429 que vous êtes suffisemment satisfait de votre desklet, n'hésitez pas à 
1430 le partage avec le reste d'entre nous (ce qui serait très apprecié) -- 
1431 faites-en un paquetage (@xref{GNU Makefile pour empaqueter les desklets}.), 
1432 puis soumettez-le (@xref{Soumettre un desklet}.).
1433 @end ifhtml
1435 @node Extension d'adesklets
1436 @chapter Utiliser adesklets à partir d'autres languages
1438 adeskets a été fait pour être facilement utilisable depuis toutes sortes 
1439 d'environnements de langages@footnote{On parle d'environnement de langage 
1440 parceque le problème n'est pas la syntaxe ou le paradigme utilisé 
1441 (qu'il soit impératif, fonctionnel ou n'importe quoi d'autre), mais la 
1442 manière dont vous pouvez gérer des opérations de base de POSIX sur les 
1443 fichiers, les signaux, etc. (@xref{Fonctionalités requises}.). Ainsi 
1444 un programmeur BASH devrait utiliser adesklets facilement, alors qu'un 
1445 programmeur Linux JDK devrait probablement recontrer plus de difficultés 
1446 (sans vouloir critiquer).}. Ce chapitre explique aux développeurs comment 
1447 l'interpréteur d'adesklets s'intègre dans le système d'une manière 
1448 indépendante du langage.
1450 @noindent Si vous n'êtes pas un minimum habitués aux systèmes POSIX ou que 
1451 vous n'avez pas les notions de base sur la programmation de systèmes 
1452 d'exploitations, ce chapitre n'est surement pas d'un grand interêt pour 
1453 vous.
1455 @noindent Veillez noter que le paquetage Python du répertoire 
1456 @file{scripting/pyhton/adesklets} est un bon complément de ce que vous 
1457 allez lire.
1459 @section Fonctionalités requises
1460 @anchor{Fonctionalités requises}
1461 Si vous voulez utiliser l'interpréteur d'adesklets depuis votre langage 
1462 favori mais qu'il n'est pas supporté à la base@footnote{Pour adesklets 
1463 @value{VERSION}, Python et Perl sont tous deux supportés à la base.}, 
1464 vous pouvez toujours ajouter ce support, pourvu que votre langage 
1465 comporte une de ces fonctionalités:
1467 @itemize
1468 @item Lire et écrire dans des tuyaux (pipes); ou
1469 @item Lire et écrire depuis ou dans des fichiers sans mémoire tampon ('unbuffered files')
1470 @end itemize
1472 @noindent Il doit aussi pouvoir@footnote{Ceci dit, 
1473 disposer du support d'IPC et de poll/select rendra les choses à la fois plus 
1474 simples et plus claires. Il est aussi très utile de pouvoir bloquer des signaux.}:
1476 @itemize
1477 @item Rattraper des signaux IPC; ou
1478 @item Lire des fichiers en mode non-bloquant; ou
1479 @item Utiliser poll/select sur des fichiers
1480 @end itemize
1482 @noindent Enfin, il doit aussi être capable de lancer un processus fils.
1484 @noindent Ces pré-requis sont bien minces du point de vue d'un système 
1485 POSIX, mais précisons par souci d'exhaustivité que si votre 
1486 environnement de langage ne remplit pas ces critères, vous pouvez quand 
1487 même vous en servir pourvu que vous arriviez à faire en sorte que votre 
1488 application communique de manière fiable avec un autre programme
1489 @footnote{Qui serait en fait une interface.} qui, lui, les remplirait. 
1490 Bien sur, ce n'est pas la situation idéale et cela doit être évité 
1491 autant que possible.
1493 @section Mécanisme d'initialisation
1495 Comme vous le savez probablement (@xref{Utiliser adesklets}.), 
1496 @command{adesklets} possède deux modes de fonctionnement, si l'on 
1497 peut les appeler ainsi:
1499 @enumerate
1500 @item en tant que lanceur de desklets, si vous appelez @command{adesklets} 
1501 sans arguments.
1502 @item en tant qu'interpréteur, dans tous les autres cas (utilisation en 
1503 ligne de commande intéractive ou en processus fils d'un desklet).
1504 @end enumerate
1506 @subsection adeskelts appelé comme un lanceur de desklets - redémarrer tous les desklets
1507 @noindent Dans une nouvelle session X, la séquence de démarrage classique est 
1508 à peu près la suivante:
1510 @enumerate
1511 @item @command{adesklets} est appelé sans arguments à partir d'un script 
1512 d'initialisation de la session X.
1513 @item A partir de là, la nouvelle instance d'adesklets se comporte comme 
1514 un lanceur de desklets. Elle parcoure le fichier @file{$HOME/.adesklets}, 
1515 puis se copie (fork) autant de fois qu'il y a de desklets à démarrer. Ensuite 
1516 le processus lanceur termine puisqu'il n'y a pas besoin de démon ici.
1517 @item Tous les processus copiés initialisent la variable d'environnement 
1518 @code{ADESKLETS_ID} contenant leur propre ID entier en tant que chaine de 
1519 caractères, puis exécutent@footnote{Avec un appel de la famille execve*; 
1520 voir @code{man 2 execve}.} le script associé.
1521 @item Chaque desklet se lance une instance d'@command{adesklets} en tant 
1522 que processus fils, donnant en passant la variable @code{ADESKLETS_ID} 
1523 sans l'alterer. Il est du devoir du desklet de s'assurer que:
1524 @itemize
1525 @item Les flux standards de l'interpréteur d'adesklets, @code{stdin}, 
1526 @code{stdout} et @code{stderr}, soient redirigés séparément, de sorte que 
1527 le processus parent puisse facilement écrire dans le @code{stdin} 
1528 d'adesklets, et lire @code{stdout} et @code{stderr}. L'utilisation de 
1529 tuyaux, FIFOs ou éventuellement de fichiers réguliers sont possibles.
1530 @item les écritures vers @code{stdin} et les lectures depuis les deux 
1531 autres flux se font toutes sans tampon.
1532 @item le premier argument de la commande @command{adesklets} est le nom 
1533 absolu du script du desklet.
1534 @end itemize
1535 @item Chaque interpréteur @command{adesklets} nouvellement créé s'initialise 
1536 en utilisant la variable d'environnement @code{ADESKLETS_ID} et le nom 
1537 absolu donné en premier argument de ligne de commande pour déterminer 
1538 ses caracteristiques non-scriptables@footnote{Qui sont, nominativement, 
1539 son écran et ses coordonnées.} à partir de @file{$HOME/.adesklets}. 
1540 Une fois cette opération terminée, l'évènement @code{ready!} est 
1541 géneré (@xref{Evènements}.), l'interpréteur est alors prêt à 
1542 traiter des commandes.
1543 @end enumerate
1545 @subsection adesklets appelé en tant qu'interpréteur - enregistrement d'un nouveau desklet
1547 Quand un nouveau desklet est appelé directement, la séquence de démarrage 
1548 décrite dans la section précedente est la même, sauf que les trois 
1549 premières étapes n'ont tout simplement pas lieu. Cela signifie que 
1550 l'environnement @code{ADESKLETS_ID} n'est pas défini; cela permet 
1551 au nouvel interpréteur d'@command{adesklets} de détecter qu'il 
1552 s'agit d'un nouveau desklet, il va parcourir le fichier de configuration 
1553 @file{$HOME/.adesklets} et allouer au desklet le premier ID disponible. 
1555 @noindent Il faut noter que si le nom de fichier du desklet donné comme 
1556 premier argument à l'instance fille d'@command{adesklets} est relatif ou 
1557 si'l n'est pas lisible et exécutable par l'utilisateur courant, le 
1558 desklet ne sera pas enregistré dans @file{$HOME/.adesklets}, et par 
1559 conséquent ne sera pas automatiquement redémarré par le lanceur 
1560 dans les futures nouvelles sessions X. Dans le cas où @code{stdin} 
1561 est un terminal@footnote{Ce qui signifie que la session est 
1562 interactive}, l'enregistrement ne se fera pas non plus.
1564 @subsection Conséquences
1565 Ainsi, du point de vue du script de desklet, les deux cas sont identiques, 
1566 ce qui ne nécessite aucun traitement conditionel. Tout le travail 
1567 d'initialisation du desklet se fait dans la quatrième étape de la 
1568 sous-partie ci-dessus.
1570 @noindent Si besoin, le desklet pourra utiliser la commande @code{get_id} 
1571 pour déterminer son ID.
1573 @section Utilisation des flux
1575 Comme expliqué précedemment, un desklet communique avec son propre 
1576 interpréteur adesklets via des flux sans tampons redirigés. Voyons 
1577 ici quelles informations ils transportent.
1579 @subsection stdin: les commandes
1581 Sur le @code{stdin} de l'interpréteur, le desklet envoie les commande 
1582 qu'il veut exécuter dans l'ordre dans lequel il veut les exécuter, une 
1583 commande par ligne@footnote{Le caractère '\n' doit être placé après 
1584 chaque commande.}. Etant donné que la lecture de ce flux est suspendue 
1585 quand une commande est évaluée, un desklet devra géneralement attendre 
1586 qu'une commande soit exécutée avant d'en envoyer une autre
1587 @footnote{Ceci permet d'éviter de bloquer le processus en surchargeant 
1588 le flux avec des commandes arbitrairement longues; bien sur, envoyer 
1589 trois commandes de quelques centaines d'octets d'un coup n'est pas un 
1590 problème!} (voir la section suivante).
1592 @noindent Le format des commandes est assez simple: on a le nom d'une 
1593 commande suivi d'arguments séparés par des espaces, tous représentés par 
1594 du texte pur, y compris les nombres. adesklets ne se soucie pas du nombre 
1595 d'espaces entre les arguments, pourvu qu'il y en ait au moins un. Dans le 
1596 cas particulier des commandes où le dernier argument est une chaine de 
1597 caractères (@code{text_draw}, par exemple), adesklets considèrera les 
1598 premiers caractères n'étant pas des espaces comme le début de la chaine; 
1599 le reste de la ligne, espaces inclus, sera considéré comme faisant 
1600 partie de la chaine.
1602 @noindent Deux fichiers, automatiquement tenus à jour avec la source 
1603 (@file{scripting/prototypes} et @file{scripting/enums}) à partir de 
1604 la distribution d'origine, fournissent au format texte brut (avec une 
1605 tabulation comme séparateur) une description de toutes les commandes et 
1606 constantes mises à disposition des desklets@footnote{Pour plus de détails 
1607 sur le format de ces deux fichiers, cf @file{scripting/protoize.sh.in} et 
1608 @file{scripting/enums.sh}.}. Un bon portage pour un langage particulier 
1609 devrait être fourni avec quelques routines permettant de génerer automatiquement 
1610 les parties pertinentes de sa propre bibliothèque à partir de ces fichiers; 
1611 par exemple, le portage de Python comporte une fonction @code{protoize} 
1612 dans le script @file{setup.py} de @code{distutils} pour le faire. 
1613 Idéalement, cette routine devrait être écrite avec ce langage et un 
1614 ensemble raisonnable de librairies@footnote{L'idée étant que la plupart 
1615 des utilisateurs de votre portage doivent être plus ou moins capables 
1616 de s'en servir avec l'installation de base du langage.}; si'l n'est pas 
1617 bien adapté à cette tâche, vous devrez vous limitez à:
1619 @itemize
1620 @item Des scripts portables pour le shell Bourne, conforme aux standards 
1621 POSIX 1003.2 et 1003.2a
1622 @item Un sed (Streaming Editor) récent, compatible avec GNU sed
1623 @footnote{De nos jours éxecuter GNU sed n'est pas un problème sur pratiquement 
1624 n'importe quel système POSIX.}
1625 @item Une utilisation portable de n'importe quel bc pour l'arithmetique
1626 @end itemize
1628 @noindent si vous voulez que votre travail soit intégré au paquetage officiel.
1630 @subsection stdout: les résultats des commandes
1632 L'interpréteur d'@command{adesklets} cherche fréquemment si de nouveaux 
1633 caractères sont arrivés sur son flux @code{stdin}, et le lit si besoin. 
1634 Dès qu'il reçoit le caractère de fin de ligne ('\n'), il arrête de lire 
1635 et essaye d'exécuter la commande. Une fois la commande terminée (elle 
1636 aura peut-être envoyé quelques lignes sur @code{stdout}), il envoie 
1637 en tant que dernière entrée un message d'état de la forme suivante: 
1639 @example
1640 command RANG ok: MESSAGE
1641 @end example
1643 @noindent si la commande s'est terminée avec succès, ou:
1645 @example
1646 command RANG error: MESSAGE_DERREUR
1647 @end example
1649 @noindent @code{RANG} est l'indentifiant numérique de la commande (un entier 
1650 non signé) qui part de zéro lorsque l'interpréteur est créé, et qui est 
1651 automatiquement incrémenté à chaque ligne qu'il reçoit ensuite. Il est 
1652 garanti que toutes les commandes seront exécutées dans l'ordre dans lequel 
1653 elles ont étées données. 
1654 @code{MESSAGE_DERREUR} est un message compréhensible, sans format particulier, 
1655 expliquant d'où vient l'erreur. @code{MESSAGE} est également compréhensible, 
1656 mais sera formaté de sorte qu'il peut être utilisé pour récupérer les valeurs 
1657 de retour utiles algorithmiquement de n'importe quelles commandes. Ces valeurs 
1658 de retour peuvent être:
1660 @enumerate
1661 @item un entier--l'ID de la valeur de retour (@code{create_image} et autres)
1662 @item un couple d'entiers--le résultat numérique de la commande 
1663 (pour @code{context_get_color} et consorts)
1664 @item une liste de chaines--la liste ordonnée des chaines de caractères retournées 
1665 par les commandes retournant plusieurs lignes sur @code{stdout} (@code{images_info} 
1666 et ses semblables), la dernière ligne étant un message d'état
1667 @item une chaine de description--une réponse textuelle en une ligne de la commande 
1668 @item rien du tout
1669 @end enumerate
1671 @noindent Algorithmiquement, votre 'routine de récupération des valeurs de retour' 
1672 devrait d'abord essayer de récupérer les entiers de @code{MESSAGE}@footnote{Tous 
1673 les paramètres de @code{MESSAGE} sont séparés par un esapce.}. Si elle trouve un 
1674 entier ou plus, elle devra vérifier que le message n'est pas une simple copie 
1675 d'une commande donnée; alors la valeur de retour correspond au cinquième 
1676 cas (cf ci-dessus). Autrement, si elle ne trouve qu'un entier, on est dans le 
1677 premier cas; et si'l y en a plus d'un, dans le deuxième. Si aucun entier n'est 
1678 trouvé et si'l y avait une liste de lignes envoyées à @code{stdout} avant le 
1679 message d'état de la commande, on est dans le troisième cas. Pour le reste:  
1680 si le message d'état diffère d'une commande donnée, cela correspond au 
1681 quatrième cas. Sinon il faut considérer que la sortie correspond au cinquième cas. 
1682 Cet algorithme de récupération fonctionne avec toutes les commandes listées 
1683 dans @file{scripting/prototypes}.
1685 @subsection stderr: les évènements
1686 @anchor{Evènements}
1688 Tous les autres rapports asynchrones d'évènements sont envoyés au flux 
1689 @code{stderr} de l'interpréteur. Ils sont asynchrones par rapport au traitement 
1690 des commandes; ils ne se produiront jamais pendant le traitement d'une 
1691 commande (dans l'intervalle de temps entre la soumission de la commande 
1692 complète sur @code{stdin} et la sortie de son message d'état sur 
1693 @code{stdout}), ils peuvent être envoyés à n'importe quel autre moment
1694 @footnote{De toute façon aucun évènement n'est jamais perdu; son apparition 
1695 est simplement retardée.}.
1697 @noindent Les rapports d'évènements tiennent sur une ligne, de la forme
1698 @footnote{Toutes les autres informations sur @code{stderr} peuvent être 
1699 ignorées sans risque.}:
1701 @example
1702 event: MESSAGE_DEVENEMENT
1703 @end example
1705 @noindent Sous la forme de Backus 
1706 Naur@footnote{@weblink{http://fr.wikipedia.org/wiki/Forme_de_Backus_Naur}}, 
1707 la grammaire employée pour MESSAGE_DEVENEMENT serait:
1709 @verbatim
1710 MESSAGE_DEVENEMENT :: ready! |
1711                       backgroundgrab |
1712                       menufire MENU_ID MENU_STR |
1713                       motionnotify X Y |
1714                       enternotify X Y |
1715                       leavenotify X Y |
1716                       buttonpress X Y BUTTON_ID |
1717                       buttonrelease X Y BUTTON_ID
1719 @end verbatim
1721 @noindent où @code{MENU_ID}, @code{X}, @code{Y}, et @code{BUTTON_ID} sont tous 
1722 des entiers supérieurs ou égaux à zéro, et @code{MENU_STR} est une chaine de 
1723 caractères, pouvant contenir des espaces. Détaillons un peu plus tout cela:
1725 @itemize
1726 @item Evènement @strong{Ready}: envoyé une fois seulement, dès que l'interpréteur 
1727 d'@command{adesklets} est prêt à traiter des commandes.
1728 @item Evènement @strong{BackgroundGrab}: envoyé à chaque fois que l'image 
1729 d'arrière-plan (image 1) est regénerée.
1730 @item Evènement @strong{MenuFire}: envoyé à chaque fois qu'un utilisateur sélectionne 
1731 un élément d'un menu qui n'est pas géré en interne par adesklets.
1732 @item Evènement @strong{MotionNotify}: envoyé dès que le pointeur bouge dans la 
1733 fenêtre d'un desklet.
1734 @item @strong{EnterNotify, LeaveNotify}: envoyé dès que le curseur passe sur une 
1735 bordure visible de la fenêtre de l'interpréteur, qu'il aille dedans ou dehors.
1736 @item @strong{ButtonPress, ButtonRelease}: envoyé quand un bouton de la souris est 
1737 cliqué dans la fenêtre de l'interpréteur.
1738 @end itemize
1740 @noindent Tous les évènements sauf 'Ready!' (nominativement: MotionNotify, 
1741 EnterNotify, LeaveNotify, ButtonPress, ButtonRelease, BackgroundGrab et MenuFile) 
1742 peuvent êtres masqués par le desklet. En fait, @command{adesklets} fournit au desklet 
1743 des commandes permettant de gérer spécifiquement la création et la production des 
1744 évènements, qui sont:
1745 @code{event_catch}, @code{events_get_send_sigusr1}, @code{events_reset_all},
1746 @code{event_uncatch}, @code{events_info}, @code{events_set_echo}, 
1747 @code{events_get_echo}, @code{events_purge} et @code{events_set_send_sigusr1}.
1748 Il faut noter que ces fonctions ne sont pas listées dans 
1749 @file{scripting/prototypes} puisque vous ne voulez probablement pas que vos 
1750 utilisateurs y aient accès. Vous devrez probablement démarrer une session 
1751 interactive et jouer avec pour être sur que vous les avez bien comprises. Il est 
1752 aussi temps de mentionner le script @file{src/adesklets_debug.sh}, qui se 
1753 rend utile pour les expériences intéractives avec les évènements.
1755 @noindent Il faut encore mentionner deux choses à propos des évènements:
1757 @enumerate
1758 @item Par défaut, les évènements ne sont pas affichés, mais stockés en interne, 
1759 en attendant d'être purgés avec @code{event_purge}. Vous pouvez modifier cela 
1760 avec @code{events_set_echo}.
1761 @item Vous pouvez paramètrer un interpréteur adesklets pour qu'il envoie le 
1762 signal SIGUSR1 à chaque fois qu'un évènement est envoyé à son processus père 
1763 (le desklet). Cette communication entre processus est très utile puisque le signal peut être ratrappé, 
1764 ce qui permet à la routine de gestion des évènements de ne fonctionner que 
1765 lorsque c'est nécessaire. C'est ce qui est utilisé dans le paquetage Pyhton 
1766 dans la classe @code{Events_handler}.
1767 @end enumerate
1769 @section Récuperation du signal SIGCHLD
1771 Pourvu que votre langage le permette, vous devriez installer une sorte de 
1772 récuperateur de SIGCHILD, ainsi vous pourrez au moins être averti si jamais 
1773 l'interpréteur d'adesklets se termine sans raison (sans parler du cas des 
1774 processus fils à l'état zombie)@footnote{@code{man 2 signal} est une très bonne 
1775 réference sur les signaux.}.
1777 @section Variables textuelles
1779 @command{adesklets} supporte aussi l'exécution differée (mode indirect) 
1780 et le remplacement textuel des variables. Voici comment fonctionnent les 
1781 variables en mode indirect:
1783 @enumerate
1784 @item Une fois qu'une commande est entrée, elle est stockée telle quelle 
1785 dans la liste de l'historique des commandes si on est bien dans le mode 
1786 non-interactif de l'interpréteur et si la commande réside entre les appels 
1787 à @code{start_recording} et @code{stop_recording})
1788 @item Quand une macro est éxecutée (avec la commande @code{play}, 
1789 @xref{Programmation d'adesklets}.), les variables sont substituées en une 
1790 seule passe, et aucune réference indirecte n'est possible. La substitution 
1791 est assez directe. On recherche dans la ligne de commande stockée toute séquence 
1792 non-vide de caractères distincts de l'espace commançant par un seul '$'. Chaque 
1793 séquence trouvée est remplacée par la valeur @code{$variable} correspondante, 
1794 ou supprimée si aucune variable n'est trouvée.
1795 @item La commande completée est exécutée.
1796 @end enumerate
1799 Le même mécanisme de substitution s'applique en mode d'exécution direct. Tout ceci 
1800 implique que, avec le paquetage Python par exemple, ces deux morceaux de code sont 
1801 équivalents:
1803 @example
1804 adesklets.window_resize(100,100)
1805 @end example
1809 @example
1810 adesklets.set('dim',100)
1811 adesklets.window_resize('$dim','$dim')
1812 @end example
1814 Python étant un langage typé dynamiquement, aucune modification de notre code 
1815 n'est nécessaire, mais d'autres langages pourraient demander plus de réflexion. 
1817 @section Derniers mots
1819 Maintenant vous devriez savoir quasiment tout ce qu'il faut pour intégrer adesklets 
1820 à votre environnement de langage. Cette tache peut avoir l'air intimidante, mais un 
1821 traducteur très propre peut être fait par un seul développeur en seulement quelques 
1822 jours. Encore une fois, jetez un oeil à @file{src/adesklets_debug.sh}; c'est un 
1823 traducteur (simplet) du Bourne Shell pour adesklets qui tient dans seulement 
1824 cinquante lignes, commentaires compris.
1826 Si jamais vous avez besoin d'aide, vous êtes encouragés à écrire (en anglais) à la 
1827 @weblink2{mailing list 
1828 adesklets-devel,https://lists.sourceforge.net/lists/listingo/adesklets-devel}...
1830 Bonne programmation!
1832 @noindent
1833 @node Recherche d'aide!
1834 @chapter Contribuer à adesklets
1836 Nous avons besoin de votre aide! Vous pouvez contribuer efficacement à 
1837 adesklets de différentes manières:
1838 @itemize
1839 @item
1840 @strong{Mettre en ligne vos captures d'écran}. Vous êtes un utilisateur 
1841 d'adesklets et pensez avoir un bureau particulièrement réussi? Partagez-le 
1842 avec le monde, et faites-le nous savoir! Vous aiderez ainsi à faire 
1843 connaitre le projet.
1844 @item
1845 @strong{Contribuer à la documentation}. Vous écrivez correctement en Allemand, 
1846 Espagnol, Portugais, Arabe ou Swahili? Les traducteurs seront toujours les 
1847 bienvenus, ainsi que les relecteurs, quels que soient les langues.
1848 @item
1849 @strong{Écrire de nouveau desklets}. adesklets est encore jeune: nous sommes 
1850 en quête de talentueux auteurs de desklets, et nous serions
1851 plus qu'enchantés de mettre en ligne ou de faire des liens vers votre travail.
1852 Ne vous inquiétez pas trop des changements d'interface; l'auteur à fait des efforts 
1853 considérables pour lui assurer une certaine stabilité, même dans les premières 
1854 versions. Elle n'est pas non plus fixée pour toujours, mais ne devrait en tout cas 
1855 pas gêner vos desklets sans prévenir. Actuellement, l'API subit surtout des 
1856 corrections internes de bugs et des améliorations de sa portabilité.
1857 @item @strong{Ajouter des interfaces pour votre langage préféré}. Contactez 
1858 les développeurs avant de commencer quoi que ce soit pour que vous ne perdiez pas 
1859 votre temps sur quelquechose de déjà fait; ils seront heureux de partager leur code. 
1860 Inscrivez-vous à la @weblink2{mailing-list 
1861 adesklets-devel,https://lists.sourceforge.net/lists/listinfo/adesklets-devel} sur 
1862 sourceforge pour un contact direct avec eux.
1863 @end itemize
1865 @noindent Contactez-moi par email à @email{syfou@@users.sourceforge.net} (NdT: 
1866 vous pouvez lui écrire en anglais comme en français).
1868 @node Foire Aux Questions
1869 @appendix Foire Aux Questions
1871 Dernière mise à jour: @value{UPDATED}
1873 @appendixsection Compiler adesklets
1875 @subheading Le script de configuration d'adesklets dit que mon installation de Python est trop ancienne, pourtant elle ne l'est pas. Quel est le problème?
1877 Certaines plate-formes (NetBSD, Ubuntu Linux, et probablement d'autres encore) 
1878 altèrent parfois la version de Python, en y ajoutant des lettres, des numéros de 
1879 version mineures, etc., ce qui empêche le script de configuration de la détecter 
1880 correctement. Si vous êtes @strong{sûr} que la version installée est supérieure 
1881 à la 2.3.0, vous pouvez utiliser l'option @code{--with-python-force-detection} de 
1882 @code{configure}, ainsi le script de configuration passera la détection de version. 
1884 @appendixsection Installer des desklets
1886 @subheading Je trouve que la méthode d'installation par défaut des desklets est pénible: n'y a-t-il pas un moyen plus simple de les installer?
1888 Depuis adesklets 0.5.0, vous disposez d'un nouveau 
1889 script @command{adesklets_installer} (@xref{Utiliser adesklets}.). Il peut vous 
1890 aider à télecharger ou décompresser de nouveaux desklets, ou des mises à jour.
1892 @subheading Eh bien, c'est un peu mieux, mais ce n'est toujours pas complètement automatisé (je déteste lire et comprendre de nouveaux trucs, vous savez...)
1894 C'est vrai. @command{adesklets_installer} ne fait que vous mettre au courant 
1895 des mises à jour, il télecharge, vérifie et décompresse les desklets, mais il 
1896 est toujours de votre devoir de lire leur README, de satisfaire leurs 
1897 dépendances, de les démarrer, les arrêter et les configurer. 
1899 Mais franchement est-ce @emph{si} difficile? La plupart des gens ne changent pas 
1900 la configuration de leurs desklets de toute façon. Ceci était un choix 
1901 délibéré de notre part: le but d'adesklets à toujours été de limiter la 
1902 compléxité globale du code, ce qui mène à un paquetage plus fin, léger et plus 
1903 consistant. Pourquoi résoudre dans un logiciel long, pénible, difficile à 
1904 écrire et à maintenir tous les problèmes pointus qu'un utilisateur avisé peut 
1905 résoudre en quelques minutes avec une documentation correcte?
1907 Si l'automatisation complète était ce pour quoi vous nous suppliez, jetez un 
1908 oeil aux alternatives à adesklets (@xref{A propos d'adesklets}.).
1910 @appendixsection Démarrer et arrêter des desklets
1912 @subheading 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?
1914 C'est écrit dessus: @command{python} n'arrive pas à trouver le 
1915 paqetage @code{adesklets}; peut-être qu'il n'a pas été installé, 
1916 ou qu'il a été installé au mauvais endroit.
1918 @itemize
1919 @item Reprenez depuis le début la procédure d'installation 
1920 (@xref{Installer adesklets}.). Assurez vous que vous 
1921 @strong{n'activez pas} l'option de configuration 
1922 @code{--without-python-support}.
1923 @item Re-essayez de lancer le desklet. Si cela ne marche toujours pas, 
1924 vérifiez que le répertoire d'installation, que vous pouvez voir 
1925 avec: @example
1926 sed -n '/PYTHON_SITE_PKG/p' Makefile
1927 @end example
1928 @noindent est inclus dans: @example
1929 echo 'import sys; print sys.path' | python
1930 @end example
1932 @noindent si'l ne l'est pas, vous pouvez toujours essayer de déplacer 
1933 manuellement le répertoire d'adesklets de @code{PYTHON_SITE_PKG} vers 
1934 un des chemins donnés par la commande précedente.
1935 @end itemize
1937 @subheading Quand j'essaie de démarrer un nouveau desklet, j'obtiens l'erreur @code{ADESKLETSError: adesklets process exited} de l'interpréteur Python. Qu'est-ce que c'est?
1939 C'est une erreur génerique vous informant qu'il manque quelquechose à 
1940 l'interpréteur de bas niveau qui est suffisamment critique pour provoquer 
1941 une sortie. Si vous êtes chanceux vous trouverez à la fin de la ligne 
1942 un tiret suivi d'un message décrivant ce qui ne fonctionne pas. Dans 
1943 ce cas, et si vous avez du mal à le comprendre, allez chercher de l'aide 
1944 en ligne. Si aucune information ne vous est donnée concernant 
1945 l'origine de l'erreur, essayez ceci depuis un pseudo-terminal sous X:
1946 @example
1947 echo x_status | adesklets :
1948 @end example
1949 Vous devriez normalement obtenir quelquechose ressemblant à:
1950 @example
1951 event: ready!
1952 command 0 ok: x_status 1 (connected to ':0.0')
1953 @end example
1955 Si c'est la cas, c'est probablement que vous utilisez un système 
1956 (@weblink2{archlinux,http://www.archlinux.org/} par exemple) 
1957 sur lequel la variable @code{PATH} de l'interpréteur Python diffère de celle 
1958 héritée de l'environnement standard, ce qui fait que le paquetage Python 
1959 n'arrive pas à lancer adesklets en tant que processus fils. Sur ce 
1960 genre de systèmes, assurez-vous que vous installez @command{adesklets} 
1961 avec l'option @code{--prefix} appropriée lors de la configuration. 
1962 Par exemple, sur la plupart des plate-formes Linux récentes, vous 
1963 devriez utiliser:
1965 @example
1966 ./configure --prefix=/usr
1967 @end example
1969 @subheading Quand j'essaie de démarrer un nouveau desklet, j'obtiens l'erreur @code{desklets command error - could not load image 'une_image' - no loader for file format} de l'interpréteur Python. Pourquoi?
1971 Parce que la version de Imlib2 installée dans votre système ne
1972 supporte pas le format de @code{une_image} (la plupart du temps, le
1973 format non-supporté sera PNG). La solution à ce problème consiste à
1974 remplacer (par la réinstallation ou la recompilation) Imlib2 avec une
1975 version qui supporte le format d'image de @code{une_image}.
1977 @subheading Je ne peux lancer aucun desklet écrit en Python: j'obtiens des erreurs du récupérateur automatique de mémoire (garbage collector)!
1978 Si vous obtenez des erreurs du type:
1980 @example
1981 python: Modules/gcmodule.c:275: visit_decref: Assertion `gc->gc.gc_refs != 0' failed.
1982 Aborted
1983 @end example
1985 Cela signifie que le récuperateur automatique de mémoire de votre 
1986 installation de Python est corrompu; c'est souvent du à une 
1987 compilation utilisant des options d'optimisation incorrectes ou 
1988 agressives. D'habitude recompiler un environnement Python solide 
1989 provenant de @weblink{http://python.org/} résoud ce problème.
1991 @subheading Les desklets se lancent bien en tant que root ou autre utilisateur local, mais gèlent ou se terminent avec un compte monté via NFS
1993 Pour pouvoir fonctionner correctement, adesklets à besoin de pouvoir 
1994 vérouiller quelques fichiers dans le répertoire @code{$HOME}: la plupart 
1995 des problèmes avec les systèmes de fichiers en réseau sont dus à 
1996 des installations fonctionnant à moitié qui n'arrivent pas à fournir 
1997 ce genre de verouillage. Dans l'archive tar des sources d'adesklets vous 
1998 trouverez un court script, @code{test/flock.py}, qui effectue un 
1999 simple test des verrous fcntl; normalement il récupère un verrou dans 
2000 le répertoire de travail courant, attend que l'utilisateur presse une 
2001 touche, alors il relache le verrou et sort. Vous pouvez lancer plusieurs 
2002 instances du script depuis le même répertoire pour vérifier que le 
2003 verouillage fonctionne effectivement. Si ce n'est pas le cas, alors le 
2004 faire fonctionner reviendra surement à faire fonctionner adesklets.
2006 @subheading Tout fonctionnait bien mais j'ai essayé de mettre à jour un desklet, et je n'arrive pas à voir le nouveau. Où est l'erreur?
2008 Il y a un mécanisme interne de blocage dans l'interpréteur qui empêche un 
2009 utilisateur de lancer simultanément plus d'un desklet avec le même @code{ID} 
2010 et le même nom, quelle que soit la version. Lorsque vous mettez à jour un 
2011 desklet donné, vous devriez d'abord quitter proprement le desklet (en 
2012 utilisant la commande @code{Quit} du menu contextuel), puis installer le 
2013 desklet mis à jour en suivant les instructions fournies par le fichier 
2014 @file{README}.
2016 @subheading Argh! Le desklet X marche, mais ne se souvient pas de ses paramètres, ou bien il démarre 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!
2018 C'est très probablement lié à la manière dont vous avez démarré le 
2019 desklet (cf @pxref{Utiliser adesklets}.). Vous devez invoquer le script 
2020 du desklet @strong{une seule fois}. Pour toute utilisation future vous 
2021 n'aurez qu'a éxectuer la commande:
2023 @example
2024 @command{adesklets}
2025 @end example
2027 qui se souviendra où vous aviez placé les desklets et quels desklets étaient 
2028 lancés. N'oubliez pas d'activer les options correctes lors de l'appel à 
2029 @command{adesklets}.
2031 @subheading C'est exactement ce que j'ai fait, mais ce truc ne veut toujours pas redémarrer.
2033 N'auriez-vous pas placé les desklets dans un répertoire du type 
2034 @file{$HOME/.adesklets}? Veillez ne pas le faire. @command{adesklets} 
2035 utilise le fichier @file{$HOME/.adesklets} pour enregistrer toutes sortes 
2036 de paramètres des desklets lancés; créer un répertoire portant ce nom 
2037 l'empêchera de faire son travail correctement, vous n'avez donc qu'a 
2038 déplacer votre répertoire ailleurs (@file{$HOME/.desklets}, par exemple).
2040 @subheading Les desklets se lancent correctement, mais ils continuent de marcher quand je termine la session X.
2042 Normalement, les desklets sont censés s'arrêter automatiquement à la fin de la 
2043 session. Si vous disposez de l'interface basée sur le shell (ce qui est le cas par 
2044 défaut), vous pouvez aussi les fermer manuellement en invoquant la commande
2046 @example
2047 adesklets --killall
2048 @end example
2050 lors de la sortie de session.
2052 @appendixsec Afficher les desklets
2054 @subheading Où sont mes desklets? L'interpréteur d'@command{adesklets} semble être lancé correctement, mais je ne vois tout simplement rien sur mon bureau (le soi-disant problème de clignotement)!
2056 Essayez la commande:
2058 @example
2059 python test/test.py
2060 @end example
2062 @noindent depuis le répertoire de base des sources. Si une fenêtre de 
2063 100x100 pixels apparaît, cela signifie très probablement que vous utilisez 
2064 un gestionnaire de fenêtres qui dessine une grosse fenêtre (dite fausse 
2065 fenêtre racine, ``fake root window'') par dessus la fenêtre racine; 
2066 vos desklets sont dessinés en-dessous. Parmi ces gestionnaires de 
2067 fenêtres on trouve Nautilus, KDE, Xfce4, CDE, e16 version 0.16.8 et plus, 
2068 ou e17. Pour adesklets @value{VERSION}, les gestionnaires de fenêtres 
2069 supportés dans cette catégorie sont:
2071 @itemize
2072 @item @strong{e16}: seules les version stables >= 0.16.8 et les 
2073 pre-releases de la même époque en ont besoin.
2074 @item @strong{KDE}: pour les versions 3.4.1 et supérieures (les versions 
2075 antérieures n'ont pas été testées).
2076 Vous devez soit activer l'option ``Centre de Configuration de KDE -> 
2077 Bureau -> Comportement -> Afficher les icônes sur le bureau -> Autoriser 
2078 les programmes à utiliser la fenêtre du bureau'', soit 
2079 désactiver l'option ``Afficher les icônes sur le bureau''@footnote{Merci 
2080 à Stefan Jungcurt pour l'astuce.}.
2081 @item @strong{Nautilus}
2082 @item @strong{ROX-Filer}: pour l'instant il ne s'agit que d'un support 
2083 préliminaire
2084 @item @strong{Xfce4}
2085 @item @strong{xffm-desktop}: pour l'instant il ne s'agit que d'un support 
2086 préliminaire
2087 @end itemize
2089 Depuis adesklets 0.4.11, la méthode de détection des fausses fenêtres racine 
2090 a changé: par défaut cela ne fait plus partie du code C@footnote{Bien que 
2091 vous pouvez revenir à l'ancienne méthode si vous le désirez en 
2092 utilisant @command{--enable-legacy-fake-root-window-detection} lors de 
2093 la configuration. @xref{Installer adesklets}.}. L'interpréteur s'attend 
2094 maintenant à ce que la variable d'environnement ADESKLETS_ROOT contienne 
2095 le bon ID hexadécimal de la fausse fenêtre racine, si'l y en a. Vous 
2096 pouvez bien sur la définir manuellement, mais l'interface basée sur le shell 
2097 prendra en charge pour vous les gestionnaires de fenêtres les plus courants 
2098 (voir la liste précedente), pourvu que vous lui demandiez de le faire. 
2099 Essayez d'invoquer:
2101 @example
2102 adesklets --help
2103 @end example
2105 Si l'interface est installée, vous devriez voir de nombreuses options, 
2106 notemment celles permettant d'activer une routine de détection de fausse 
2107 fenêtre racine adaptée à un gestionnaire de fenêtres donné. Vous disposez 
2108 aussi d'une détection ``génerique'' via l'option @command{--user}: elle 
2109 peut fonctionner (ou pas) chez vous, selon la structure de votre 
2110 gestionnaire de fenêtres. Enfin, veillez noter que l'interface est un 
2111 simple script compatible sh, installé par défaut dans 
2112 @command{$prefix/share/adesklets} -- il devrait être 
2113 très facile de le modifier pour tout personne désirant implémenter d'autres 
2114 méthodes de détection.
2116 Gardez aussi à l'esprit que la détection de fausse fenêtre racine requiert 
2117 évidemment que celle-ci existe, il est donc important que vous invoquiez 
2118 @command{adesklets} @emph{après} l'initialisation du gestionnaire de 
2119 fenêtre. Pour vous aider à le faire, vous avez à votre disposition l'option 
2120 @command{-w nomduprogramme} dans l'interface du shell.
2122 @subheading Et pour enlightenment?
2124 adesklets fonctionnera comme prévu avec e16 tant que vous n'activez pas les 
2125 fonctions induisant l'uilisation de fausses fenêtres racine (voir les 
2126 questions précedentes -- vous devrez utiliser l'option --e16 pour e16 version 
2127 0.16.8 et supérieure), ce qui cache dans certains cas les desklets derrière 
2128 la structure du gestionnaire de fenêtres. D'après l'experience de l'auteur, 
2129 avec les versions 0.16.7.2 et 0.16.8 il n'est possible de voir les desklets 
2130 que dans le premier bureau virtuel. Ceci dit, dans le jargon d'enlightenment, 
2131 les bureaux virtuels peuvent s'étaler sur plusieurs "écrans" (quatre, alignés 
2132 horizontalement par défaut), ce qui permet parfaitement l'usage de plusieurs 
2133 espaces de travail en laissant les desklets d'adesklets visibles.
2135 e17 n'est pas supporté. Si vous y tenez vous pouvez trouver plus d'astuces à 
2136 ce sujet sur la @weblink2{FAQ d'enlightenment, http://www.get-e.org/Main/FAQs/#48}. 
2137 Ceci dit, e17 est fourni avec ce qu'on appelle les ``modules e17'' (engage, 
2138 etc.), qui fonctionnnent parfaitement avec ce WM et qui remplissent les mêmes 
2139 fonctions.
2141 @subheading Maintenant je vois les desklets, mais la transparence foire!
2143 Une pseudo-transparence correcte se base sur la possibilité de récupérer 
2144 l'image de fond d'écran et d'être averti quand elle change. Il n'y a aucune 
2145 méthode complètement fiable ni même bien établie pour le faire sur autre 
2146 chose que la vraie fenêtre racine du protocole X11 (veuillez lire cette partie 
2147 de la FAQ, ``Afficher les desklets'', depuis le début pour bien comprendre 
2148 ce qui suit).
2150 Ainsi, même en présence d'une fausse fenêtre racine, adesklets récupère 
2151 toujours l'arrière-plan de la vraie fenêtre racine: certains gestionnaires de 
2152 fenêtres se soucient de la synchronisation permanente entre la vraie et la 
2153 fausse fenêtre racine, mais pas assez. adesklets fait de son mieux, quand 
2154 c'est possible de manière portable, pour synchroniser @emph{lors de son 
2155 initialisation} les arrières-plans mais dans certains cas supportés 
2156 (ROX-Filer, xffm-desktop), ce n'est même pas possible. Par conséquent, si 
2157 vous obtenez des arrières plans corrompus (pas d'arrière-plan, un arrière-plan 
2158 incorrect ou ne reflétant pas le dernier changement effectué, alors que vous 
2159 voyez effectivement le nouveau papier peint dans une fausse fenêtre racine), 
2160 vous n'avez qu'à dupliquer le papier peint utilisé sur la vraie fenêtre racine, 
2161 de préference en utilisant un afficheur de papier peint supportant la mécanisme 
2162 ad-hoc, largement supporté, d'@weblink2{enlightenment,http://gershwin.ens.fr/vdaniel/Doc-Locale/Outils-Gnu-Linux/Eterm-0.9/#trans} pour la 
2163 notification de changement de papier peint -- n'importe lequel des programmes 
2164 suivants devrait fonctionner correctment: @command{Esetroot}, @command{wmsetbg}, 
2165 @command{feh}, @command{hsetroot}, @command{chbg} ou @command{xsri}. 
2166 En fait vous pouvez utiliser n'importe quel afficheur de papier peint pour 
2167 changer la vraie racine, mais ensuite vous aurez peut-être à rappeler 
2168 le lanceur d'adesklets pour profiter d'une récupération initiale du papier 
2169 peint correcte si aucune notification n'a été envoyée.
2171 @subheading Qu'avez-vous fait? La transparence fonctionnait avant, alors que maintenant elle foire!
2173 La méthode employée pour capturer le contenu de la fenêtre racine a
2174 changé après adesklets 0.6.1 pour correspondre à la pratique la plus
2175 courante du moment dans ce type d'application, soit d'utiliser le
2176 contenu du plan de bits _XROOTMAP_ID. Le bon côté de cette méthode est
2177 que la pseudo-transparence de adesklets marchera dorénavant avec la
2178 majorité des gestionnaires de fenêtres, incluant ceux utilisant la
2179 composition (@emph{compositing}). Malheureusement, cela signifie
2180 également qu'il existe une chance que certains des gestionnaires de
2181 fenêtres sans composition plus anciens ne soient plus correctement
2182 supportés. Vous pouvez rétablir le comportement antérieur en
2183 spécifiant @command{--enable-legacy-pseudo-transparency} au moment de
2184 la configuration.
2186 @subheading Je ne peut pas voir les petits desklets comme xmms_bar ou asimpleclock, alors que les autres fonctionnent. Pourquoi?
2188 Les nouveaux desklets sont toujours lancés dans le coin le plus en haut à gauche de 
2189 l'écran, tout en bas de la pile de fenêtres. Vérifiez qu'il n'y a rien 
2190 (barre de gnome, engage, etc) qui puisse masquer cette zone de l'écran. 
2191 Attention! Certaines applications sont pseudo-transparentes, et peuvent 
2192 masquer la fenêtre racine sans en avoir l'air.
2194 @subheading 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!
2196 Allez voir la faq de Fvwm: @weblink{http://www.fvwm.org/documentation/faq/#5.11}. 
2197 D'après de nombreux utilisateurs de Fvwm, cette option, 
2198 @code{BugOpts RaiseOverUnmanaged on} fonctionne bien.
2200 @subheading J'en ai tellement marre d'avoir le menu contextuel des desklets quand tout ce que je veux c'est celui du gestionnaire de fenêtres! Puis-je faire quelque chose contre cela?
2202 Utilisez l'option @command{--enable-control-on-context-menu} lors de la 
2203 configuration. Ainsi, un clic normal du bouton gauche sur un desklet devrait 
2204 faire apparaitre le menu de votre gestionnaire de fenêtres dans la plupart 
2205 des cas (testé sur Xfce4 et tous les *box). Dans tous les cas, vous devrez 
2206 appuyer sur la touche control en même temps pour obtenir le menu 
2207 contextuel du desklet.
2209 @appendixsec Utiliser les desklets
2211 @subheading Le bouton 'Configure' dans le menu contextuel des desklets ne marche pas!
2212 Pour que cela marche--tout du moins pour tous les desklets de démonstration--il faut 
2213 que @command{xterm} soit installé, et que la variable @code{EDITOR} soit correctement 
2214 définie dans votre environnement, comme le veut l'usage sous UNIX. Veillez remarquer 
2215 que cela ne fait que lancer un éditeur de texte dans un terminal. Editer le fichier 
2216 de configuration du desklet (habituellement @file{config.txt} dans le répertoire de 
2217 base du desklet) aura le même effet.
2219 @subheading L'élément 'Configure' du menu contextuel peut-il appeler un éditeur n'utilisant pas la console?
2220 Oui, pourquoi pas? Depuis adesklets 0.4.13, l'interface du shell permet de 
2221 le faire facilement: utilisez l'option @command{adesklets -e} (editeur).
2223 @subheading Avez-vous prévu d'inclure le support d'SVG? J'aimerais utiliser une image SVG dans un de mes desklets.
2224 Désolé, ce n'est pas prévu. Ce n'est pas 
2225 qu'@weblink2{SVG,http://www.w3.org/Graphics/SVG/} est un mauvais format; il est même 
2226 assez bon. Mais c'est également un format orienté vers le dessin vectoriel (et assez 
2227 complexe), alors qu'Imlib2, sur laquelle @command{adesklets} se base entièrement, 
2228 est complètement orientée dessin de trame. Or c'est l'utilisation d'Imlib2 qui rend 
2229 @command{adesklets} simple, relativement rapide et peu consommateur de ressources.
2231 Ceci dit, il n'y a aucune raison que vous n'utilisiez pas d'image SVG dans vos 
2232 desklets, puisqu'il est assez simple de convertir des images SVG en PNG de haute 
2233 qualité en utilisant des programmes comme @weblink2{sodipodi,http://www.sodipodi.com/}, 
2234 @weblink2{inkscape,http://www.inkscape.org/} ou @weblink2{xsvg,http://xsvg.org/}. 
2235 Dans un répertoire plein de SVG, sur un système GNU vous pouvez aussi utiliser 
2236 une commande comme::
2237 @example
2238 ls *.svg | sed 's/\(.*\).svg/-z --file=& --export-png=\1.png --export-width=128 --export-height=128/' | xargs --max-lines=1 sodipodi
2239 @end example
2240 pour toutes les convertir en PNG semi-transparents de 128x128 pixels.
2242 @subheading J'aimerais utiliser certaines polices de mon système avec adesklets, mais mes desklets n'arrivent pas à les trouver. Que dois-je faire?
2244 D'abord, votre adesklets doit supporter fontconfig. Vérifiez-le en lisant le fichier 
2245 config.log issu de la phase de configuration. Si vous n'avez pas gardé le log, vous 
2246 pouvez aussi voir quelles bibliothèques dynamiques sont liées à l'interpréteur. 
2247 Sur un système disposant des binutils GNU, vous pouvez faire quelquechose comme:
2248 @example
2249 ldd `which adesklets` | grep fontconfig
2250 @end example
2251 Si vous obtenez une réponse du genre:
2252 @example
2253  libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x45c750000)
2254 @end example
2255 cela signifie que tout va bien. Autrement, vous devrez recompiler @command{adeskelts} 
2256 à partir des sources. Ensuite, vous pouvez utiliser la commande: 
2257 @example
2258 echo 'list_font_path' | adesklets :
2259 @end example
2260 pour voir dans quels répertoires adesklets recherche les polices TrueType. Consultez 
2261 la documentation de fontconfig si vous désirez les modifier (sur les systèmes à 
2262 jour, @code{man 5 fonts-conf} est un bon point de départ).
2263 De même:
2264 @example
2265 echo 'list_fonts' | adesklets :
2266 @end example
2267 Vous listera les polices actuellement disponibles... Gardez à l'esprit lorsque 
2268 vous les testerez que le nom des polices est sensible à la casse.
2270 Enventuellement, si vous n'arrivez pas à faire fonctionner fontconfig, une manière 
2271 de contourner le problème est de créer des liens symboliques vers les polices que 
2272 vous voulez utiliser dans n'importe quel répertoire listé par la commande 
2273 @code{echo 'list_font_path' ...} ci-dessus.
2275 @ifhtml
2276 @node Documentation du paquetage Python
2277 @appendix Documentation du paquetage Python
2279 Voici quelques liens intéressants vers la documentation du paquetage 
2280 Pyhton@footnote{NdT: elle est en anglais, certes... Mais je ne connais pas encore 
2281 de développeur anglophobe ;-)}:
2283 @itemize
2284 @item @weblink2{adesklets,../pydoc/adesklets.html}
2285 @item @weblink2{adesklets.events_handler,../pydoc/adesklets.events_handler.html}
2286 @item @weblink2{adesklets.commands,../pydoc/adesklets.commands.html}
2287 @item @weblink2{adesklets.utils,../pydoc/adesklets.utils.html}
2288 @item @weblink2{adesklets.configfile,../pydoc/adesklets.configfile.html}
2289 @end itemize
2291 @node Documentation du paquetage Perl
2292 @appendix Documentation du paquetage Perl
2294 Une vieille documentation (POD -- plain old documentation) est incluse dans 
2295 le paquetage; voici un
2296 @weblink2{lien vers la version formatée en html,../pod/adesklets.pm.html}.
2298 @end ifhtml
2300 @node Documentation d'Imlib2
2301 @appendix Documentation d'Imlib2
2303 Carsten Haitzler (@email{raster@@rasterman.com}) a pris le temps d'écrire une 
2304 documentation très réferencée d'Imlib2, mais pour certaines raisons (très 
2305 probablement des problèmes de taille), elle n'est pas incluse dans le 
2306 paquetage tar des sources d'Imlib2.@footnote{Bien qu'elle puisse être assez 
2307 facilement refaite avec doxygen.}.
2308 Vous pouvez 
2309 @ifhtml
2310 la récuperer @weblink2{ici,../imlib2}.
2311 @end ifhtml
2312 @ifnothtml
2313 la lire en ligne sur @weblink{http://adesklets.sf.net/doc/imlib2/}.
2314 @end ifnothtml
2317 La plupart des fonctions de l'API d'Imlib2 ont des homonymes leurs 
2318 correspondant dans @command{adesklets}. @xref{Programmation d'adesklets}, 
2319 pour plus détails sur la transition du développement avec Imlib2 à adesklets.
2321 @node GNU Makefile pour empaqueter les desklets
2322 @appendix GNU Makefile pour empaqueter les desklets 
2324 Voici un Makefile qui vous permettera d'automatiser la création de  
2325 paquetages contenant des desklets existants ou nouveaux sur un système GNU. 
2326 Copiez simplement le Makefile ci-dessous dans @file{GNUmakefile} dans le 
2327 répertoire de base de votre desklet pour vous en servir. Il n'y a rien du 
2328 tout à éditer, pourvu que le nom du répertoire de base soit de la forme 
2329 'NOM-MAJEURE.MINEURE.REVISION', par exemple @code{beast-0.666.0}.
2331 @verbatiminclude ../utils/GNUmakefile.desklet
2333 @node Soumettre un desklet
2334 @appendix Soumettre un desklet
2336 @section Minima requis dans un paquetage de desklet
2337 Les règles sur le contenu du paquetage d'un desklet sont maigres; les auteurs 
2338 sont libres de faire ce qu'ils veulent. Ils ne doivent absolument respecter que 
2339 deux choses:
2340 @enumerate
2341 @item Le répertoire de base de l'archive du desklet doit contenir un fichier 
2342 @file{README} très clair@footnote{NdT: et en anglais, pour plus de 'portabilité'.} et 
2343 tenu à jour. Il doit au moins contenir:
2344 @itemize
2345 @item le nom et l'adresse email de l'auteur@footnote{Ce serait surement une 
2346 mauvaise idée que de publier votre adresse email privée ici; pour éviter 
2347 le spam, vous devriez plutôt ouvrir un compte sur 
2348 @weblink2{SourceForge,http://sourceforge.net/}, ou un autre fournisseur similaire 
2349 disposant d'un bon système anti-spam.} 
2350 @item Une courte description du desklet
2351 @item Ses dépendances
2352 @item Comment s'en servir
2353 @end itemize
2354 @item Le paquetage doit être une archive tar bzippée ne contenant qu'un seul répertoire 
2355 source du type @code{NOM-MAJEURE.MINEURE.REVISION}, où @code{NAME} est le 
2356 nom de base du desklet, et @code{MAJOR.MINOR.REVISION} sa version. Veillez noter 
2357 qu'un makefile (@xref{GNU Makefile pour empaqueter les desklets}.) est aussi 
2358 fourni pour automatiser la création de ce genre d'archive sur les systèmes GNU.
2359 @end enumerate
2361 @section Le script @command{adesklets_submit}
2363 Depuis @command{adesklets} 0.4.4, les auteurs de desklets disposent d'un 
2364 script Pyhton automatisant la soumission de leurs desklets: 
2365 @file{utils/adesklets_submit} dans le paquetage des sources. Utilisez 
2366 l'option de configuration @code{--with-python-install-submission-scripts} 
2367 pour le placer dans votre répertoire @code{bindir} lors de l'installation.
2369 @file{adesklets_submit} peut être utilisé pour:
2370 @itemize
2371 @item Soumettre une nouvelle description, ou une mise à jour, à inclure dans 
2372 le @weblink2{site Internet d'adesklets,http://adesklets.sf.net/desklets.html}; 
2373 @item Soumettre une archive bzippée du desklet pour l'ajouter aux paquetages 
2374 de desklets de SourceForge (c'est optionel--vous pouvez choisir de l'héberger 
2375 vous-même).
2376 @end itemize
2378 @section Invoquer @command{adesklets_submit}
2379 La soumission du desklet commence par l'envoi d'un email formaté 
2380 spécifiquement à @email{adesklets@@mailworks.org}@footnote{Il est inutile 
2381 d'envoyer autre chose à cette adresse; tous les messages qui ne peuvent être 
2382 interprétés par le script de réception automatique seront simplement 
2383 supprimés. Ecrivez plutôt à @email{syfou@@users.sourceforge.net} si vous 
2384 désirez contacter le créateur du projet (qui parle très bien français, NdT).}.
2385 Le script @command{adesklets_submit} vous assiste dans la construction de cet 
2386 email en utilisant le fichier de configuration @file{$HOME/.adesklets_submit} 
2387 et des options de ligne de commande. Voici un exemple de configuration 
2388 valide du fichier @file{$HOME/.adesklets_submit}:
2390 @verbatiminclude ../utils/adesklets_submit.example
2392 Il s'explique assez bien de lui-même, mais voici quelques points moins clairs:
2394 @itemize
2395 @item
2396 Essayez autant que possible d'éviter les pseudonymes et les surnoms pour 
2397 @code{author_name}, sauf si, évidemment, vous avez déjà une indentité 
2398 virtuelle bien établie sous ce nom.
2399 @item
2400 @code{send_confirmation} précise si un email doit être envoyé en retour à 
2401 l'adresse @code{author_email} dès que votre desklet est publié correctement. 
2402 De toute façon si'l est rejeté vous serez toujours averti par email, avec 
2403 quelques explications. Géneralement, le gérant n'essaiera pas 
2404 de changer les données problématiques, il va seulement expliquer à l'auteur 
2405 ce qui n'était pas bon.
2406 @item
2407 @emph{Verifiez deux fois} l'adresse @code{author_email}, puisque c'est la 
2408 seule que le webmestre essaiera d'utiliser pour vous contacter, ce que les 
2409 en-têtes disent sera ignoré. Si vous ne fournissez pas une adresse valide 
2410 tous les messages ne pourront vous être envoyés, et toutes les nouvelles 
2411 entrées du desklet seront rejetées.
2412 @item
2413 Vous pouvez sans problème utiliser adesklets_submit sans aucun contact 
2414 préalable avec le webmestre d'adesklets (que ce soit par email, dans le 
2415 forum avec l'adresse donnée pour l'enregistrement, ou via la mailing-list), 
2416 mais un minimum de communication sera nécessaire avant la publication 
2417 simplement pour vérifier votre identité et sa relation effective avec 
2418 l'adresse email fournie.
2419 @item
2420 @code{desklets} est un dictionnaire de dictionnaires (un dictionnaire par 
2421 desklet, le nom des desklets étant les clefs); toutes les données se 
2422 réferant à des fichiers (miniatures, captures d'écran ou fichiers à 
2423 télecharger) peuvent être soit une adresse sur un site accessible publiquement 
2424 (de préference), soit un chemin absolu ou relatif à votre répertoire $HOME 
2425 vers des fichiers locaux. Dans ce cas, les fichiers requis seront attachés 
2426 en pièce jointe à l'email géneré. 
2427 @item
2428 Toutes les images seront rapatriées puis intégrées au site Internet 
2429 adesklets.sf.net, vous pourrez ensuite sans problème les retirer de votre 
2430 emplacement en ligne si vous avez fourni des URL.
2431 @item
2432 Si vous mettez à jour un desklet déjà en ligne, il n'y a pas besoin de 
2433 soumettre les images @code{thumbnail} ou @code{screenshot} si elles n'ont 
2434 pas changé; vous pouvez aussi facilement faire réference aux images 
2435 déjà installées sur SourceForge:
2436 @itemize
2437 @item @code{thumbnail} est toujours stockée sous 
2438 @code{http://adesklets.sf.net/images/NAME_thumb.[jpg|png]}
2439 @item @code{screenshot} est toujours stockée sous 
2440 @code{http://adesklets.sf.net/images/NAME_screen.[jpg|png]}
2441 où @code{NAME} est le nom de votre desklet.
2442 @end itemize
2443 @item
2444 En utilisant la valeur @code{host_on_sourceforge}, vous pouvez choisir 
2445 si le paquetage de votre desklet sera hébergé sur SourceForge ou sur votre 
2446 propre site si vous avez fourni une URL. Bien sur dans ce dernier cas 
2447 vous devrez le maintenir à l'emplacement donné.
2448 @item
2449 L'image @code{thumbnail} doit être au format JPG (de préference) ou 
2450 PNG (si vous avez @emph{vraiment} besoin de définitions plus élevées) 
2451 et d'une dimension comprise entre 190x35 pixels et 230x110 pixels.
2452 @item
2453 L'image @code{screenshot} doit être un JPG (de préference) ou un 
2454 PNG de 640x480 pixels. Elle doit mettre votre desklet en évidence, 
2455 et donc ne pas en contenir d'autres.
2456 @item
2457 Vous pouvez choisir de ne pas fournir de miniature ni/ou de capture 
2458 d'écran. Dans ce cas, par défaut, des images géneriques seront utilisées 
2459 à la place.
2460 @item
2461 @code{Category} est actuellement inutilisée, et sera juste ignorée.
2462 @item
2463 Tous les emails pesant plus de 300KB seront rejetés par le serveur email 
2464 du webmestre, adesklets_submit refusera donc d'en génerer. Au lieu de 
2465 soumettre d'aussi grosses entrées, utilisez la possibilité de donner des 
2466 URLs comme décrit ci-dessus pour alléger l'email. 
2467 @item @command{adeskets_submit} ne vérifie pas que vous respectez toutes 
2468 ces règles; il ne vérifie que ce qui est strictement nécessaire pour 
2469 construire un email de soumission adapté: l'existence des entrées de 
2470 dictionnaire, la disponibilité des fichiers, la validité des types de 
2471 fichiers locaux... Il est de votre devoir de s'assurer que les données 
2472 sont correctes si vous voulez éviter le rejet.
2473 @end itemize
2475 Par exemple, Belial Leviathan devrait d'abord vérifier les données de 
2476 son desklet @code{beast} en faisant quelquechose comme:
2477 @example
2478 adesklet_submit beast
2479 @end example
2481 Si tout fonctionne bien, l'email de soumission résultant sera affiché sur 
2482 @code{stdout}. A partir de là, Belial peut: 
2483 @itemize
2484 @item Le passer par un tuyau (pipe) à son MTA (agent de transfet d'email) 
2485 favori pour l'envoyer à @email{adesklets@@mailworks.org}.
2486 @item Demander à @command{adesklets_submit} de l'envoyer lui-même par 
2487 SMTP, en utilisant les paramètres @code{smtp_host} et @code{smtp_port} 
2488 dans son @file{$HOME/.adesklets_submit}. Pour cela, Belial devrait utiliser:
2489 @end itemize
2490 @example
2491 adesklets_submit --send beast
2492 @end example
2494 Une dernière chose: essayez d'éviter d'envoyer des corrections mineures à 
2495 plusieurs reprises, en particulier si vous utilisez des fichiers locaux. 
2496 Cela va charger à la fois le server email du webmestre et son travail de gestion. 
2497 Veillez essayer de créer une entrée valide @emph{puis} de l'envoyer, au 
2498 lieu de patauger autrement. 
2500 @appendixsubsec Validation approfondie d'une entrée avec @command{adesklets_checkin}
2501 Depuis @command{adesklets} 0.4.5, vous avez aussi à votre disposition 
2502 le script @command{adesklets_checkin}. C'est le script Python que le 
2503 webmestre utilise pour vérifier toutes les soumissions. @emph{N'oubliez pas 
2504 que ce script n'est fournit aux auteurs de desklets que par confort, 
2505 pour minimiser le nombre de rejets de soumissions--les développeurs ne 
2506 sont en aucun cas forcés de l'utiliser, et peuvent même être incapables 
2507 de le faire, puisque ce script n'a pas été écrit avec le souci de la 
2508 portabilité, contrairement à adesklets_submit. Lisez l'en-tête du 
2509 script pour une liste complète des pré-requis à son exécution.}
2511 @command{adesklets_checkin} a deux modes de fonctionnement: interactif et 
2512 non-interactif. Seul le mode non-interactif interessera les auteurs de 
2513 desklets. Dans ce mode, l'utilisation est franchement simple. Belial, 
2514 par exemple, ferait:
2515 @example
2516 adesklets_submit beast | adesklets_checkin
2517 @end example
2519 Si tout fonctionne bien, le résultat serait similaire à:
2520 @example
2521 Validation started. Please wait.
2522 Everything seems fine, but keep in mind a few things cannot be
2523 verified without human intervention. See documentation for details.
2524 @end example
2526 Sinon, vous aurez la trace de l'exception avec quelques explications 
2527 assez claires (espèrons-le).
2529 @appendixsubsec Limitations d'@command{adesklets_checkin} en mode non-interactif
2531 Voici quelques problèmes restants qu'@command{adesklets_checkin} ne 
2532 peut pas détecter et qui doivent donc être absolument résolus 
2533 manuellement (le webmestre en détectera la plupart, et vous aurez à 
2534 renvoyer l'email de toute façon):
2535 @itemize
2536 @item
2537 Un fichier README incomplet dans le répertoire de base (Est-ce qu'il 
2538 contient tous les détails énumerés ci-dessus?).
2539 @item
2540 Le fichier README n'est plus à jour (Est-ce que son contenu reflète 
2541 l'état actuel du desklet?).
2542 @item
2543 Le desklet ne peut pas fonctionner à la sortie de la boite (c'est-à-dire 
2544 sans ou avec un minimum de configuration) alors que les pré-requis du 
2545 fichier README et les instructions particulières sont respectés.
2546 @end itemize    
2548 @node Copier ce Manuel
2549 @appendix Copier ce Manuel
2551 @menu
2552 * GNU General Public License::  la licence permettant de copier ce manuel.
2553 @end menu
2554 NdT: La licence est laissée en version originale car seule cette version à une 
2555 valeur juridique. Néanmoins, pour en faciliter la compréhension, 
2556 il existe des traductions disponibles sur Internet, par exemple sur 
2557 @weblink{http://www.linux-france.org/article/these/gpl.html}.
2559 @include gpl.texi
2561 @node Clé publique Open PGP
2562 @appendix Clé publique Open PGP
2564 @verbatiminclude syfou.asc
2566 @noindent Vous pouvez également obtenir ce certificat d'un bon nombre de serveurs
2567 publics de clés sur Internet, tels @weblink{http://www.keyserver.net/}, ou
2568 @weblink{http://pgp.mit.edu/}. Contactez son auteur légitime, 
2569 Sylvain Fourmanoit, par courier électronique à l'adresse
2570 @email{syfou@@users.sourceforge.net} pour organiser une validation plus correcte
2571 de la clé si vous en avez besoin.
2573 @bye