diff options
Diffstat (limited to 'doc/fr/weechat_dev.fr.adoc')
-rw-r--r-- | doc/fr/weechat_dev.fr.adoc | 1123 |
1 files changed, 1123 insertions, 0 deletions
diff --git a/doc/fr/weechat_dev.fr.adoc b/doc/fr/weechat_dev.fr.adoc new file mode 100644 index 000000000..ebfd70cf4 --- /dev/null +++ b/doc/fr/weechat_dev.fr.adoc @@ -0,0 +1,1123 @@ += Guide du développeur WeeChat +:author: Sébastien Helleu +:email: flashcode@flashtux.org +:lang: fr +:toc: left +:toclevels: 3 +:toc-title: Table des matières +:sectnums: +:docinfo1: + + +Ce manuel documente le client de messagerie instantanée WeeChat, il fait +partie de WeeChat. + +La dernière version de ce document peut être téléchargée sur cette page : +https://weechat.org/doc + + +[[introduction]] +== Introduction + +WeeChat (Wee Enhanced Environment for Chat) est un client de discussion libre, +rapide et léger, conçu pour différents systèmes d'exploitation. + +Ce manuel documente l'intérieur de WeeChat : + +* dépôts +* règles de développement +* le cœur +* les extensions +* comment contribuer à WeeChat. + +[[repositories]] +== Dépôts + +Les dépôts de WeeChat sont dans l'organisation "weechat" de GitHub : +https://github.com/weechat + +Liste des dépôts : + +weechat:: + dépôt principal avec le code source et la documentation + +scripts:: + les scripts _officiels_ soumis sur weechat.org + +weechat.org:: + le code source du site de WeeChat : https://weechat.org/ + +weercd:: + serveur de test IRC + +qweechat:: + interface Qt distante pour WeeChat. + +Ce manuel documente seulement le dépôt _weechat_. + +[[overview]] +=== Vue d'ensemble + +Les répertoires principaux de WeeChat sont : + +[width="100%",cols="1m,3",options="header"] +|=== +| Répertoire | Description +| src/ | Racine des sources +| core/ | Fonctions du cœur : point d'entrée, structures internes +| gui/ | Fonctions pour les tampons, fenêtres, ... (utilisées par toutes les interfaces) +| curses/ | Interface Curses +| plugins/ | API extension/script +| alias/ | Extension Alias +| aspell/ | Extension Aspell +| charset/ | Extension Charset +| exec/ | Extension Exec +| fifo/ | Extension Fifo (tube FIFO utilisé pour envoyer des commandes à WeeChat) +| guile/ | API script Guile (scheme) +| irc/ | Extension IRC (Internet Relay Chat) +| javascript/ | API script Javascript +| logger/ | Extension Logger (enregistrer les messages affichés dans des fichiers) +| lua/ | API script Lua +| perl/ | API script Perl +| python/ | API script Python +| relay/ | Extension Relay (proxy IRC + relai pour interfaces distantes) +| ruby/ | API script Ruby +| script/ | Gestionnaire de scripts +| tcl/ | API script Tcl +| trigger/ | Extension Trigger +| xfer/ | Extension Xfer (IRC DCC fichier/discussion) +| tests/ | Tests +| unit/ | Tests unitaires +| core/ | Tests unitaires pour les fonctions du cœur +| doc/ | Documentation +| po/ | Fichiers de traductions (gettext) +| debian/ | Empaquetage Debian +|=== + +[[sources]] +=== Sources + +[[sources_core]] +==== Cœur + +Le cœur de WeeChat est situé dans les répertoires suivants : + +* _src/core/_ : fonctions du cœur (pour manipuler des données) +* _src/gui/_ : fonctions pour l'interface (tampons, fenêtres, ...) + +[width="100%",cols="1m,3",options="header"] +|=== +| Chemin/fichier | Description +| core/ | Fonctions du cœur : point d'entrée, structures internes +| wee-arraylist.c | Listes avec tableau (« arraylists ») +| wee-backtrace.c | Afficher une trace après un plantage +| wee-command.c | Commandes du cœur de WeeChat +| wee-completion.c | Complétions par défaut +| wee-config-file.c | Gestion des fichiers de configuration +| wee-config.c | Options de configuration du cœur de WeeChat (fichier weechat.conf) +| wee-debug.c | Quelques fonctions de debug +| wee-eval.c | Évaluation d'expressions avec des références à des variables internes +| wee-hashtable.c | Tables de hachage +| wee-hdata.c | Hdata (accès direct aux données en utilisant des tables de hachage) +| wee-hook.c | Crochets ("hooks") +| wee-infolist.c | Infolists (listes avec les données des objets) +| wee-input.c | Entrée de commandes/texte +| wee-list.c | Listes triées +| wee-log.c | Écriture dans le fichier de log WeeChat (weechat.log) +| wee-network.c | Fonctions réseau (connexion aux serveurs/proxies) +| wee-proxy.c | Gestion des proxies +| wee-secure.c | Options des données sécurisées (fichier sec.conf) +| wee-string.c | Fonctions sur les chaînes de caractères +| wee-upgrade-file.c | Système de mise à jour interne +| wee-upgrade.c | Mise à jour du cœur de WeeChat (tampons, lignes, historique, ...) +| wee-url.c | Transfert d'URL (en utilisant libcurl) +| wee-utf8.c | Fonctions UTF-8 +| wee-util.c | Quelques autres fonctions utilitaires +| wee-version.c | Fonctions pour la version de WeeChat +| weechat.c | Fonctions principales : options de ligne de commande, démarrage +| gui/ | Fonctions pour les tampons, fenêtres, ... (utilisées par toutes les interfaces) +| gui-bar-item.c | Objets de barre +| gui-bar-window.c | Fenêtres de barre +| gui-bar.c | Barres +| gui-buffer.c | Tampons +| gui-chat.c | Fonctions pour la discussion (afficher un message, ...) +| gui-color.c | Fonctions de couleur +| gui-completion.c | Complétion sur la ligne de commande +| gui-cursor.c | Mode curseur (mouvement libre du curseur) +| gui-filter.c | Filtres +| gui-focus.c | Fonctions concernant le focus (pour les modes curseur et souris) +| gui-history.c | Commandes/texte sauvés dans les tampons +| gui-hotlist.c | Gestion de la "hotlist" (liste des tampons avec activité) +| gui-input.c | Fonctions d'entrée (barre "input") +| gui-key.c | Fonctions pour le clavier +| gui-layout.c | Dispositions ("layouts") +| gui-line.c | Lignes dans les tampons +| gui-mouse.c | Souris +| gui-nick.c | Fonctions pour les pseudos +| gui-nicklist.c | Liste de pseudos dans les tampons +| gui-window.c | Fenêtres +| curses/ | Interface Curses +| gui-curses-bar-window.c | Affichage dans les fenêtres de barre +| gui-curses-chat.c | Affichage dans la zone de discussion (messages) +| gui-curses-color.c | Fonctions pour les couleurs +| gui-curses-key.c | Fonctions pour le clavier (touches par défaut, lecture du clavier) +| gui-curses-main.c | Boucle principale de WeeChat (attente des évènements clavier/réseau) +| gui-curses-mouse.c | Souris +| gui-curses-term.c | Fonctions pour le terminal +| gui-curses-window.c | Fenêtres +| main.c | Point d'entrée +|=== + +[[sources_plugins]] +==== Extensions + +[width="100%",cols="1m,3",options="header"] +|=== +| Chemin/fichier | Description +| plugins/ | Racine des extensions +| plugin.c | Gestion des extensions (chargement/déchargement des librairies C dynamiques) +| plugin-api.c | Fonctions supplémentaires pour l'API extension (enveloppes autour des fonctions du cœur de WeeChat) +| plugin-config.c | Options de configuration des extensions (fichier plugins.conf) +| plugin-script.c | Fonctions communes utilisés par les extensions pour les scripts +| plugin-script-api.c | Fonctions pour l'API script : enveloppes autour de quelques fonctions de l'API extension +| weechat-plugin.h | En-tête destiné à être distribué avec les extensions WeeChat, pour les compiler +| alias/ | Extension Alias +| alias.c | Fonctions principales pour les alias +| alias-command.c | Commandes Alias +| alias-completion.c | Complétions pour Alias +| alias-config.c | Options de configuration des alias (fichier alias.conf) +| alias-info.c | Info/infolists/hdata pour les alias +| aspell/ | Extension Aspell +| weechat-aspell.c | Fonctions principales pour Aspell +| weechat-aspell-bar-item.c | Objets de barre Aspell +| weechat-aspell-command.c | Commandes Aspell +| weechat-aspell-completion.c | Complétions pour Aspell +| weechat-aspell-config.c | Options de configuration pour Aspell (fichier aspell.conf) +| weechat-aspell-info.c | Info/infolists/hdata pour Aspell +| weechat-aspell-speller.c | Gestion des correcteurs orthographiques +| charset/ | Extension Charset +| charset.c | Fonctions pour Charset +| exec/ | Extension Exec +| exec.c | Fonctions principales de Exec +| exec-buffer.c | Tampon Exec +| exec-command.c | Commandes pour Exec +| exec-completion.c | Complétions pour Exec +| exec-config.c | Options de configuration pour Exec (fichier exec.conf) +| fifo/ | Extension Fifo +| fifo.c | Fonctions principales de Fifo +| fifo-command.c | Commandes pour Fifo +| fifo-info.c | Info/infolists/hdata pour Fifo +| guile/ | Extension Guile (scheme) +| weechat-guile.c | Fonctions principales pour Guile (chargement/déchargement des scripts, exécution de code Guile) +| weechat-guile-api.c | Fonctions de l'API script Guile +| irc/ | Extension IRC (Internet Relay Chat) +| irc.c | Fonctions principales IRC +| irc-bar-item.c | Objets de barre IRC +| irc-buffer.c | Tampons IRC +| irc-channel.c | Canaux IRC +| irc-color.c | Couleurs IRC +| irc-command.c | Commandes IRC +| irc-completion.c | Complétions IRC +| irc-config.c | Options de configuration IRC (fichier irc.conf) +| irc-ctcp.c | CTCP IRC +| irc-debug.c | Fonctions de debug IRC +| irc-ignore.c | Ignore IRC +| irc-info.c | Info/infolists/hdata pour IRC +| irc-input.c | Entrée de commandes/texte +| irc-message.c | Fonctions pour manipuler les messages IRC +| irc-mode.c | Fonctions pour les modes de canal/pseudo +| irc-msgbuffer.c | Tampon cible pour les messages IRC +| irc-nick.c | Pseudos IRC +| irc-notify.c | Listes de notification IRC +| irc-protocol.c | Protocole IRC (RFCs 1459/2810/2811/2812/2813) +| irc-raw.c | Tampon des données brutes IRC +| irc-redirect.c | Redirection de la sortie des commandes IRC +| irc-sasl.c | Authentification SASL avec le serveur IRC +| irc-server.c | Communication avec le serveur IRC +| irc-upgrade.c | Sauvegarde/restauration des données IRC lors de la mise à jour de WeeChat +| javascript/ | Extension Javascript +| weechat-js.cpp | Fonctions principales pour Javascript (chargement/déchargement des scripts, exécution de code Javascript) +| weechat-js-api.cpp | Fonctions de l'API script Javascript +| weechat-js-v8.cpp | Fonctions Javascript v8 +| logger/ | Extension Logger +| logger.c | Fonctions principales pour Logger +| logger-buffer.c | Gestion des listes de tampons pour Logger +| logger-config.c | Options de configuration pour Logger (fichier logger.conf) +| logger-info.c | Info/infolists/hdata pour Logger +| logger-tail.c | Fonctions pour obtenir les dernières lignes d'un fichier +| lua/ | Extension Lua +| weechat-lua.c | Fonctions principales pour Lua (chargement/déchargement des scripts, exécution de code Lua) +| weechat-lua-api.c | Fonctions de l'API script Lua +| perl/ | Extension Perl +| weechat-perl.c | Fonctions principales pour Perl (chargement/déchargement des scripts, exécution de code Perl) +| weechat-perl-api.c | Fonctions de l'API script Perl +| python/ | Extension Python +| weechat-python.c | Fonctions principales pour Python (chargement/déchargement des scripts, exécution de code Python) +| weechat-python-api.c | Fonctions de l'API script Python +| relay/ | Extension Relay (proxy IRC et relai pour des interfaces distantes) +| relay.c | Fonctions principales de Relay +| relay-buffer.c | Tampon Relay +| relay-client.c | Clients du relai +| relay-command.c | Commandes de Relay +| relay-completion.c | Complétions de Relay +| relay-config.c | Options de configuration pour Relay (fichier relay.conf) +| relay-info.c | Info/infolists/hdata pour Relay +| relay-network.c | Fonctions de réseau pour Relay +| relay-raw.c | Tampon des données brutes de Relay +| relay-server.c | Serveur Relay +| relay-upgrade.c | Sauvegarde/restauration des données Relay lors de la mise à jour de WeeChat +| relay-websocket.c | Fonctions pour le serveur WebSocket (RFC 6455) +| irc/ | Proxy IRC +| relay-irc.c | Fonctions principales pour le proxy IRC +| weechat/ | Relai pour les interfaces distantes +| relay-weechat.c | Relai pour les interfaces distantes (fonctions principales) +| relay-weechat-msg.c | Envoi de messages binaires aux clients +| relay-weechat-nicklist.c | Fonctions pour la liste de pseudos +| relay-weechat-protocol.c | Lecture des commandes des clients +| ruby/ | Extension Ruby +| weechat-ruby.c | Fonctions principales pour Ruby (chargement/déchargement des scripts, exécution de code Ruby) +| weechat-ruby-api.c | Fonctions de l'API script Ruby +| script/ | Gestionnaire de scripts +| script.c | Fonctions principales du gestionnaire de scripts +| script-action.c | Actions sur les scripts (chargement/déchargement, installation/suppression, ...) +| script-buffer.c | Tampon pour le gestionnaire de scripts +| script-command.c | Commandes pour le gestionnaire de scripts +| script-completion.c | Complétions pour le gestionnaire de scripts +| script-config.c | Options de configuration pour le gestionnaire de scripts (fichier script.conf) +| script-info.c | Info/infolists/hdata pour le gestionnaire de scripts +| script-repo.c | Téléchargement et lecture du dépôt de scripts +| tcl/ | Extension Tcl +| weechat-tcl.c | Fonctions principales pour Tcl (chargement/déchargement des scripts, exécution de code Tcl) +| weechat-tcl-api.c | Fonctions de l'API script Tcl +| trigger/ | Extension Trigger +| trigger.c | Fonctions principales de Trigger +| trigger-buffer.c | Tampon Trigger +| trigger-callback.c | Callbacks de Trigger +| trigger-command.c | Commandes pour Trigger +| trigger-completion.c | Complétions pour Trigger +| trigger-config.c | Options de configuration pour Trigger (fichier trigger.conf) +| xfer/ | Extension Xfer (IRC DCC fichier/discussion) +| xfer.c | Fonctions principales de Xfer +| xfer-buffer.c | Tampon Xfer +| xfer-chat.c | Discussion DCC +| xfer-command.c | Commandes pour Xfer +| xfer-completion.c | Complétions pour Xfer +| xfer-config.c | Options de configuration pour Xfer (fichier xfer.conf) +| xfer-dcc.c | Transfert de fichier par DCC +| xfer-file.c | Fonctions pour les fichiers dans Xfer +| xfer-info.c | Info/infolists/hdata pour Xfer +| xfer-network.c | Fonctions réseau pour Xfer +| xfer-upgrade.c | Sauvegarde/restauration des données Xfer lors de la mise à jour de WeeChat +|=== + +[[sources_tests]] +==== Tests + +[width="100%",cols="1m,3",options="header"] +|=== +| Chemin/fichier | Description +| tests/ | Racine des tests +| tests.cpp | Programme utilisé pour lancer les tests +| unit/ | Racine des tests unitaires +| core/ | Racine des tests unitaires pour le cœur +| test-arraylist.cpp | Tests : listes avec tableau (« arraylists ») +| test-eval.cpp | Tests : évaluation d'expressions +| test-hashtble.cpp | Tests : tables de hachage +| test-hdata.cpp | Tests : hdata +| test-infolist.cpp | Tests : infolists +| test-list.cpp | Tests : listes +| test-string.cpp | Tests : chaînes +| test-url.cpp | Tests : URLs +| test-utf8.cpp | Tests : UTF-8 +| test-util.cpp | Tests : fonctions utiles +|=== + +[[documentation_translations]] +=== Documentation / traductions + +Fichiers de documentation : + +[width="100%",cols="1m,3",options="header"] +|=== +| Chemin/fichier | Description +| doc/ | Documentation +| docinfo.html | Style Asciidoctor +| docgen.py | Script Python pour construire les fichiers dans le répertoire _autogen/_ (voir ci-dessous) +| XX/ | Documentation pour la langue XX (langues : en, fr, de, it, ...) +| cmdline_options.XX.adoc | Options de ligne de commande (fichier inclus dans la page de manuel et le guide utilisateur) +| weechat.1.XX.adoc | Page de manuel (`man weechat`) +| weechat_dev.XX.adoc | Guide du développeur (ce document) +| weechat_faq.XX.adoc | FAQ (questions fréquemment posées) +| weechat_plugin_api.XX.adoc | Référence API extension +| weechat_quickstart.XX.adoc | Guide de démarrage +| weechat_relay_protocol.XX.adoc | Protocole Relay (pour les interfaces distantes) +| weechat_scripting.XX.adoc | Guide pour scripts +| weechat_tester.XX.adoc | Guide du testeur +| weechat_user.XX.adoc | Guide utilisateur +| autogen/ | Fichiers automatiquement générés avec le script docgen.py +| user/ | Fichiers automatiquement générés pour le guide utilisateur (ne *JAMAIS* les mettre à jour manuellement !) +| plugin_api/ | Fichiers automatiquement générés pour l'API extension (ne *JAMAIS* les mettre à jour manuellement !) +|=== + +Les traductions pour WeeChat et les extensions sont effectuées avec gettext, les +fichiers sont dans le répertoire _po/_ : + +[width="100%",cols="1m,3",options="header"] +|=== +| Chemin/fichier | Description +| po/ | Fichiers de traduction (gettext) +| XX.po | Traductions pour la langue XX (fr, de, it, ...), la langue par défaut est l'anglais +| weechat.pot | Modèle pour les traductions (automatiquement généré) +|=== + +[[coding_rules]] +== Règles de développement + +[[coding_general_rules]] +=== Règles générales + +* Dans le code source, vos commentaires, noms de variables, ... doivent être + écrits en anglais *uniquement* (aucune autre langue n'est autorisée). +* Utilisez un en-tête de copyright dans chaque nouveau fichier source avec : +** une brève description du fichier (une seule ligne), +** la date, +** le nom, +** l'e-mail, +** la licence. + +Exemple en C : + +[source,C] +---- +/* + * weechat.c - core functions for WeeChat + * + * Copyright (C) 2016 Your Name <your@email.com> + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * WeeChat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with WeeChat. If not, see <http://www.gnu.org/licenses/>. + */ +---- + +[[coding_c_style]] +=== Style C + +Quelques règles basiques que vous *devez* suivre quand vous écrivez du code C : + +* Utilisez 4 espaces pour l'indentation. N'utilisez pas de tabulations, c'est le + mal. +* Essayez de ne pas dépasser 80 caractères par ligne, sauf si cela est + nécessaire pour améliorer la lisibilité. +* Utilisez les commentaires `/* comment */` (pas de style C99 comme + `// comment`). +* Ajoutez un commentaire avant chaque fonction, pour expliquer ce qu'elle fait + (utilisez toujours un commentaire multi-lignes, même si la description est + très courte). + +Exemple : + +[source,C] +---- +/* + * Checks if a string with boolean value is valid. + * + * Returns: + * 1: boolean value is valid + * 0: boolean value is NOT valid + */ + +int +foo () +{ + int i; + + /* one line comment */ + i = 1; + + /* + * multi-line comment: this is a very long description about next block + * of code + */ + i = 2; + printf ("%d\n", i); +} +---- + +* Utilisez des noms de variable explicites, par exemple "nicks_count" au lieu de + "n" ou "nc". Exception : dans les boucles `for`, où les variables comme "i" ou + "n" sont OK. +* Initialisez les variables locales après la déclaration, dans le corps de la + fonction, exemple : + +[source,C] +---- +void +foo () +{ + int nick_count, buffer_count; + + nick_count = 0; + buffer_count = 1; + /* ... */ +} +---- + +* Utilisez des parenthèses pour montrer explicitement comment l'expression est + évaluée, même si cela n'est pas obligatoire, par exemple écrivez `x + (y * z)` + au lieu de `x + y * z`. +* Disposez les accolades `{ }` seules sur la ligne, et indentez les avec le + nombre d'espaces utilisés sur la ligne au dessus de l'accolade ouvrante (le + `if` dans l'exemple) : + +[source,C] +---- +if (nicks_count == 1) +{ + /* something */ +} +---- + +* Utilisez des lignes vides pour séparer différents blocs dans les fonctions, et + si possible ajoutez un commentaire pour chacun, comme ceci : + +[source,C] +---- +/* + * Sends a message from out queue. + */ + +void +irc_server_outqueue_send (struct t_irc_server *server) +{ + /* ... */ + + /* send signal with command that will be sent to server */ + irc_server_send_signal (server, "irc_out", + server->outqueue[priority]->command, + server->outqueue[priority]->message_after_mod, + NULL); + tags_to_send = irc_server_get_tags_to_send (server->outqueue[priority]->tags); + irc_server_send_signal (server, "irc_outtags", + server->outqueue[priority]->command, + server->outqueue[priority]->message_after_mod, + (tags_to_send) ? tags_to_send : ""); + if (tags_to_send) + free (tags_to_send); + + /* send command */ + irc_server_send (server, server->outqueue[priority]->message_after_mod, + strlen (server->outqueue[priority]->message_after_mod)); + server->last_user_message = time_now; + + /* start redirection if redirect is set */ + if (server->outqueue[priority]->redirect) + { + irc_redirect_init_command (server->outqueue[priority]->redirect, + server->outqueue[priority]->message_after_mod); + } + + /* ... */ +} +---- + +* Indentez les conditions `if`, et utilisez des parenthèses autour des + conditions avec un opérateur (pas nécessaire pour un booléen simple), comme + ceci : + +[source,C] +---- +if (something) +{ + /* something */ +} +else +{ + /* something else */ +} + +if (my_boolean1 && my_boolean2 && (i == 10) + && ((buffer1 != buffer2) || (window1 != window2))) +{ + /* something */ +} +else +{ + /* something else */ +} +---- + +* Indentez les `switch` comme ceci : + +[source,C] +---- +switch (string[0]) +{ + case 'A': /* first case */ + foo ("abc", "def"); + break; + case 'B': /* second case */ + bar (1, 2, 3); + break; + default: /* other cases */ + baz (); + break; +} +---- + +* Utilisez `typedef` pur les prototypes de fonctions mais pas pour les + structures : + +[source,C] +---- +typedef int (t_hook_callback_fd)(void *data, int fd); + +struct t_hook_fd +{ + t_hook_callback_fd *callback; /* fd callback */ + int fd; /* socket or file descriptor */ + int flags; /* fd flags (read,write,..) */ + int error; /* contains errno if error occurred */ + /* with fd */ +}; + +/* ... */ + +struct t_hook_fd *new_hook_fd; + +new_hook_fd = malloc (sizeof (*new_hook_fd)); +---- + +* Ce code Lisp peut être utilisé dans votre _~/.emacs.el_ pour indenter + correctement si vous utilisez l'éditeur de texte Emacs : + +[source,lisp] +---- +(add-hook 'c-mode-common-hook + '(lambda () + (c-toggle-hungry-state t) + (c-set-style "k&r") + (setq c-basic-offset 4) + (c-tab-always-indent t) + (c-set-offset 'case-label '+))) +---- + +[[coding_python_style]] +=== Style Python + +Voir http://www.python.org/dev/peps/pep-0008/ + +[[core_internals]] +== Intérieur du cœur + +[[naming_convention]] +=== Conventions pour les noms + +[[naming_convention_files]] +==== Fichiers + +Les noms de fichiers sont composés de lettres et tirets, avec le format : +_xxx-yyyyy.[ch]_, où _xxx_ est le répertoire/composant (peut être une +abréviation) et _yyyyy_ un nom pour le fichier. + +Le fichier principal d'un répertoire peut avoir le même nom que le répertoire, +par exemple _irc.c_ pour l'extension irc. + +Exemples : + +[width="100%",cols="1m,3",options="header"] +|=== +| Répertoire | Fichiers +| src/core/ | weechat.c, wee-backtrace.c, wee-command.c, ... +| src/gui/ | gui-bar.c, gui-bar-item.c, gui-bar-window.c, ... +| src/gui/curses/ | gui-curses-bar.c, gui-curses-bar-window.c, gui-curses-chat.c, ... +| src/plugins/ | plugin.c, plugin-api.c, plugin-config.c, plugin-script.c, ... +| src/plugins/irc/ | irc.c, irc-bar-item.c, irc-buffer.c, ... +| src/plugins/python/ | weechat-python.c, weechat-python-api.c, ... +|=== + +Les en-têtes des fichiers C doivent avoir le même nom que le fichier, par +exemple _wee-command.h_ pour le fichier _wee-command.c_. + +[[naming_convention_structures]] +==== Structures + +Les structures ont le nom _t_X_Y_ ou _t_X_Y_Z_ : + +* _X_ : répertoire/composant (peut être une abréviation) +* _Y_ : fin du nom de fichier +* _Z_ : nom de la structure (facultatif) + +Exemple : un pseudo IRC (de _src/plugins/irc/irc-nick.h_) : + +[source,C] +---- +struct t_irc_nick +{ + char *name; /* nickname */ + char *host; /* full hostname */ + char *prefixes; /* string with prefixes enabled for nick */ + char prefix[2]; /* current prefix (higher prefix set in */ + /* prefixes) */ + int away; /* 1 if nick is away */ + char *color; /* color for nickname in chat window */ + struct t_irc_nick *prev_nick; /* link to previous nick on channel */ + struct t_irc_nick *next_nick; /* link to next nick on channel */ +}; +---- + +[[naming_convention_variables]] +==== Variables + +Les variables globales (en dehors des fonctions) ont le nom _X_Y_Z_ : + +* _X_ : répertoire/composant (peut être une abréviation) +* _Y_ : fin du nom de fichier +* _Z_ : nom de la variable + +Exception : pour les variables des derniers éléments d'une liste, le nom est +_last_X_ (où _X_ est le nom de la variable, en utilisant le singulier). + +Exemple : fenêtres (de _src/gui/gui-window.c_) : + +[source,C] +---- +struct t_gui_window *gui_windows = NULL; /* first window */ +struct t_gui_window *last_gui_window = NULL; /* last window */ +struct t_gui_window *gui_current_window = NULL; /* current window */ +---- + +Il n'y a pas de convention pour les variables locales (dans les fonctions). +La seule recommandation est que le nom soit explicite (et pas trop court). + +Cependant, les pointeurs vers les structures sont souvent nommés _ptr_xxxx_, par +exemple un pointeur sur _struct t_gui_buffer *_ sera : _*ptr_buffer_. + +[[naming_convention_functions]] +==== Fonctions + +La convention pour les noms des fonctions est le même que celui des +<<naming_convention_variables,variables>>. + +Exemple : création d'une nouvelle fenêtre (de _src/gui/gui-window.c_) : + +[source,C] +---- +/* + * Creates a new window. + * + * Returns pointer to new window, NULL if error. + */ + +struct t_gui_window * +gui_window_new (struct t_gui_window *parent_window, struct t_gui_buffer *buffer, + int x, int y, int width, int height, + int width_pct, int height_pct) +{ + /* ... */ + + return new_window; +} +---- + +[[single_thread]] +=== Thread unique + +WeeChat a un seul thread. Cela signifie que chaque partie du code doit +s'exécuter très rapidement, et que les appels aux fonctions comme `sleep` sont +*strictement interdits* (cela est vrai pour le cœur de WeeChat mais aussi les +extensions et les scripts). + +Si pour une raison quelconque vous devez attendre un peu, utilisez `hook_timer` +avec un "callback". + +[[doubly_linked_lists]] +=== Listes doublement chaînées + +La plupart des listes chaînes WeeChat sont doublement chaînées : chaque nœud a +un pointeur vers le nœud précédent/suivant. + +Exemple : liste des tampons (de _src/gui/gui-buffer.h_) : + +[source,C] +---- +struct t_gui_buffer +{ + /* data */ + + /* ... */ + + struct t_gui_buffer *prev_buffer; /* link to previous buffer */ + struct t_gui_buffer *next_buffer; /* link to next buffer */ +}; +---- + +Et les deux pointeurs vers la tête et la fin de liste : + +[source,C] +---- +struct t_gui_buffer *gui_buffers = NULL; /* first buffer */ +struct t_gui_buffer *last_gui_buffer = NULL; /* last buffer */ +---- + +[[color_codes_in_strings]] +=== Codes couleur dans les chaînes + +WeeChat utilise ses propres codes couleur dans les chaînes pour afficher les +attributs (gras, souligné, ...) et les couleurs à l'écran. + +Tous les attributs/couleurs sont préfixés par un caractère dans la chaîne, qui +peuvent être : + +* _0x19_ : code couleur (suivi par un/des code(s) couleur) +* _0x1A_ : activer un attribut (suivi par un attribut sur un caractère) +* _0x1B_ : supprimer un attribut (suivi par un attribut sur un caractère) +* _0x1C_ : réinitialiser (rien après) + +Les attributs autorisés sont (un ou plusieurs caractères) : + +* `*` : gras +* `!` : vidéo inverse +* `/` : italique +* `_` : souligné +* `|` : garder les attributs + +Les couleurs possibles sont : + +* couleur standard : attributs facultatifs + nombre sur 2 digits +* couleur étendue : `@` + attributs facultatifs + nombre sur 5 digits + +Dans le tableau qui suit, les conventions suivantes sont utilisées : + +* `STD` : couleur standard (2 digits) +* `(A)STD` : couleur standard avec des attributs facultatifs + (attributs + 2 digits) +* `EXT` : couleur étendue (`@` + 5 digits) +* `(A)EXT` : couleur étendue avec des attributs facultatifs + (`@` + attributs + 5 digits) +* `ATTR` : un caractère d'attribut (`*`, `!`, `/`, `_` ou `|`) + +Toutes les combinaisons sont résumées dans ce tableau : + +[width="100%",cols="4,2,2,8",options="header"] +|=== +| Code | Exemple | Aires | Description +| [hex]#19# + STD | [hex]#19# `01` | chat + barres | Définir les attributs et la couleur en utilisant une option, voir le tableau ci-dessous +| [hex]#19# + EXT | [hex]#19# `@00001` | chat | Définir une couleur avec la paire ncurses (utilisé seulement sur le tampon `/color`) +| [hex]#19# + "F" + (A)STD | [hex]#19# `F*05` | chat + barres | Définir la couleur de texte (couleur WeeChat) +| [hex]#19# + "F" + (A)EXT | [hex]#19# `F@00214` | chat + barres | Définir la couleur de texte (couleur étendue) +| [hex]#19# + "B" + STD | [hex]#19# `B05` | chat + barres | Définir la couleur de fond (couleur WeeChat) +| [hex]#19# + "B" + EXT | [hex]#19# `B@00124` | chat + barres | Définir le couleur de fond (couleur étendue) +| [hex]#19# + "*" + (A)STD | [hex]#19# `*05` | chat + barres | Définir la couleur de texte (couleur WeeChat) +| [hex]#19# + "*" + (A)EXT | [hex]#19# `*@00214` | chat + barres | Définir la couleur de texte (couleur étendue) +| [hex]#19# + "*" + (A)STD + "," + STD | [hex]#19# `*08,05` | chat + barres | Définir la couleur de texte/fond (couleurs WeeChat) +| [hex]#19# + "*" + (A)STD + "," + EXT | [hex]#19# `*01,@00214` | chat + barres | Définir la couleur de texte (couleur WeeChat) et de fond (couleur étendue) +| [hex]#19# + "*" + (A)EXT + "," + STD | [hex]#19# `*@00214,05` | chat + barres | Définir la couleur de texte (couleur étendue) et de fond (couleur WeeChat) +| [hex]#19# + "*" + (A)EXT + "," + EXT | [hex]#19# `*@00214,@00017` | chat + barres | Définir la couleur de texte/fond (couleurs étendues) +| [hex]#19# + "b" + "F" | [hex]#19# `bF` | barres | Définir la couleur de texte de la barre +| [hex]#19# + "b" + "D" | [hex]#19# `bD` | barres | Définir la couleur du délimiteur de la barre +| [hex]#19# + "b" + "B" | [hex]#19# `bB` | barres | Définir la couleur de fond de la barre +| [hex]#19# + "b" + "_" | [hex]#19# `b_` | barre input | Caractère de démarrage dans l'entrée (utilisé seulement dans l'objet "input_text") +| [hex]#19# + "b" + "-" | [hex]#19# `b-` | barre input | Caractère de démarrage caché dans l'entrée (utilisé seulement dans l'objet "input_text") +| [hex]#19# + "b" + "#" | [hex]#19# `b#` | barre input | Caractère de déplacement du curseur (utilisé seulement dans l'objet "input_text") +| [hex]#19# + "b" + "i" | [hex]#19# `bi` | barres | Début d'objet +| [hex]#19# + "b" + "l" (lower L) | [hex]#19# `bl` | barres | Ligne de démarrage d'objet +| [hex]#19# + "E" | [hex]#19# `E` | chat + barres | Texte mis en valeur _(WeeChat ≥ 0.4.2)_ +| [hex]#19# + [hex]#1C# | [hex]#19# [hex]#1C# | chat + barres | Réinitialiser la couleur (garder les attributs) +| [hex]#1A# + ATTR | [hex]#1A# `*` | chat + barres | Activer un attribut +| [hex]#1B# + ATTR | [hex]#1B# `*` | chat + barres | Supprimer un attribut +| [hex]#1C# | [hex]#1C# | chat + barres | Réinitialiser les attributs et la couleur +|=== + +Les codes couleur utilisant des options (voir _t_gui_color_enum_, dans le +fichier _src/gui/gui-color.h_) : + +[width="70%",cols="^1m,10",options="header"] +|=== +| Code | Option +| 00 | weechat.color.separator +| 01 | weechat.color.chat +| 02 | weechat.color.chat_time +| 03 | weechat.color.chat_time_delimiters +| 04 | weechat.color.chat_prefix_error +| 05 | weechat.color.chat_prefix_network +| 06 | weechat.color.chat_prefix_action +| 07 | weechat.color.chat_prefix_join +| 08 | weechat.color.chat_prefix_quit +| 09 | weechat.color.chat_prefix_more +| 10 | weechat.color.chat_prefix_suffix +| 11 | weechat.color.chat_buffer +| 12 | weechat.color.chat_server +| 13 | weechat.color.chat_channel +| 14 | weechat.color.chat_nick +| 15 | weechat.color.chat_nick_self +| 16 | weechat.color.chat_nick_other +| 17 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 18 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 19 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 20 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 21 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 22 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 23 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 24 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 25 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 26 | _(n'est plus utilisé depuis WeeChat 0.3.4)_ +| 27 | weechat.color.chat_host +| 28 | weechat.color.chat_delimiters +| 29 | weechat.color.chat_highlight +| 30 | weechat.color.chat_read_marker +| 31 | weechat.color.chat_text_found +| 32 | weechat.color.chat_value +| 33 | weechat.color.chat_prefix_buffer +| 34 | weechat.color.chat_tags _(WeeChat ≥ 0.3.6)_ +| 35 | weechat.color.chat_inactive_window _(WeeChat ≥ 0.3.6)_ +| 36 | weechat.color.chat_inactive_buffer _(WeeChat ≥ 0.3.6)_ +| 37 | weechat.color.chat_prefix_buffer_inactive_buffer _(WeeChat ≥ 0.3.6)_ +| 38 | weechat.color.chat_nick_offline _(WeeChat ≥ 0.3.9)_ +| 39 | weechat.color.chat_nick_offline_highlight _(WeeChat ≥ 0.3.9)_ +| 40 | weechat.color.chat_nick_prefix _(WeeChat ≥ 0.4.1)_ +| 41 | weechat.color.chat_nick_suffix _(WeeChat ≥ 0.4.1)_ +| 42 | weechat.color.emphasized _(WeeChat ≥ 0.4.2)_ +| 43 | weechat.color.chat_day_change _(WeeChat ≥ 0.4.2)_ +| 44 | weechat.color.chat_value_null _(WeeChat ≥ 1.4)_ +|=== + +Les couleurs WeeChat sont : + +[width="70%",cols="^1m,10",options="header"] +|=== +| Code | Couleur +| 00 | Défaut (couleur de texte/fond du terminal) +| 01 | Noir +| 02 | Gris foncé +| 03 | Rouge foncé +| 04 | Rouge clair +| 05 | Vert foncé +| 06 | Vert clair +| 07 | Marron +| 08 | Jaune +| 09 | Bleu foncé +| 10 | Bleu clair +| 11 | Magenta foncé +| 12 | Magenta clair +| 13 | Cyan foncé +| 14 | Cyan clair +| 15 | Gris +| 16 | Blanc +|=== + +Exemples de codes couleur : + +[width="70%",cols="1,2",options="header"] +|=== +| Code | Description +| [hex]#19# `01` | Couleur de l'option "01" (texte de discussion) +| [hex]#19# `*08,03` | Jaune sur rouge +| [hex]#19# `*@00214` | Orange (couleur étendue 214) +| [hex]#19# `*@*_00214,@00017` | Orange (214) gras souligné sur bleu foncé (17) +| [hex]#1A# `_` | Activer le souligné +| [hex]#1B# `_` | Supprimer le souligné +| [hex]#1C# | Réinitialiser les attributs et la couleur +|=== + +[[plugin_internals]] +== Intérieur des extensions + +Le fichier _src/plugins/weechat-plugin.h_ définit et exporte toutes les +fonctions disponibles dans l'API. + +Une structure appelée _t_weechat_plugin_ est utilisée pour stocker les +informations sur l'extension (nom de fichier, nom, auteur, description, ...) et +toutes les fonctions de l'API, sous forme de pointeurs vers les fonctions +WeeChat. + +Et puis des macros sont utilisées pour appeler ces fonctions. + +Par exemple, la fonction _hook_timer_ est définie dans la structure +_t_weechat_plugin_ comme ceci : + +[source,C] +---- +struct t_hook *(*hook_timer) (struct t_weechat_plugin *plugin, + long interval, + int align_second, + int max_calls, + int (*callback)(void *data, + int remaining_calls), + void *callback_data); +---- + +Et la macro utilisée pour appeler cette fonction est : + +[source,C] +---- +#define weechat_hook_timer(__interval, __align_second, __max_calls, \ + __callback, __data) \ + weechat_plugin->hook_timer(weechat_plugin, __interval, \ + __align_second, __max_calls, \ + __callback, __data) +---- + +Donc dans une extension, l'appel à cette fonction sera par exemple : + +[source,C] +---- +server->hook_timer_sasl = weechat_hook_timer (timeout * 1000, + 0, 1, + &irc_server_timer_sasl_cb, + server); +---- + +[[contribute]] +== Contribuer à WeeChat + +[[git_repository]] +=== Dépôt Git + +Le dépôt Git est à cette URL : https://github.com/weechat/weechat + +Tout patch pour un bug ou une nouvelle fonctionnalité doit être effectué sur la +branche master, le format préféré étant une "pull request" sur GitHub. Un patch +peut aussi être envoyé par e-mail (fait avec `git diff` ou `git format-patch`). + +Le format du message de commit est le suivant (pour fermer un bug GitHub) : + +---- +component: fix a problem (closes #123) +---- + +Pour un bug Savannah : + +---- +component: fix a problem (bug #12345) +---- + +Où _component_ est : + +* pour le cœur WeeChat : _core_ (les fichiers dans le répertoire racine, _po/_ + et _src/_, sauf _src/plugins/_) +* fichiers de documentation : _doc_ (fichiers dans le répertoire _doc/_) +* nom d'une extension : _irc_, _python_, _relay_, ... (fichiers dans le + répertoire _src/plugins/_) + +Quelques règles à suivre : + +* utilisez seulement l'anglais +* utilisez des verbes à l'infinitif +* si le commit est relatif au tracker, écrivez-le entre parenthèses après le + message, avec ce format : +** GitHub : closes #123 +** Savannah : bug #12345, task #12345, patch #12345 + +Exemples de messages de commit : + +---- +irc: add command /unquiet (closes #36) +core: add callback "nickcmp" for nick comparison in buffers +irc: fix freeze when reading on socket with SSL enabled (bug #35097) +ruby: add detection of ruby version 1.9.3 in cmake +python: fix crash when unloading a script without pointer to interpreter +core: update Japanese translations (patch #7783) +---- + +[[translations]] +=== Traductions + +[[gettext]] +==== Gettext + +Les fichiers gettext sont dans le répertoire _po/_. + +Si vous souhaitez initialiser une nouvelle langue, utilisez la commande +`msginit`. Par exemple pour créer un fichier qui est prêt à traduire en +néerlandais : + +---- +$ cd po +$ msginit -i weechat.pot -l nl_NL -o nl.po +---- + +La langue de base pour WeeChat est l'anglais, donc vous devez évidemment +comprendre parfaitement l'anglais pour traduire vers votre langue. + +Une fois terminé, vous *devez* vérifier votre fichier avec le script +_msgcheck.py_ (https://github.com/flashcode/msgcheck) : + +---- +$ msgcheck.py xx.po +---- + +[[build_autogen_files]] +===== Construire les fichiers auto-générés + +Les fichiers dans le répertoire _doc/XX/autogen/_ sont automatiquement générés +par le script _doc/docgen.py_. + +Copiez ce script python dans votre répertoire python (par exemple +_~/.weechat/python_). +Vous pouvez alors charger le script dans votre WeeChat, et configurer le chemin +vers votre répertoire _/doc_ : + +---- +/python load docgen.py +/set plugins.var.python.docgen.path "~/src/weechat/doc" +---- + +Créez alors cet alias pour construire les fichiers : + +---- +/alias add doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /javascript unload; /python load docgen.py; /wait 1ms /docgen +---- + +Et utilisez la commande `/doc` pour construire tous les fichiers, pour toutes +les langues. + +[IMPORTANT] +En utilisant la commande `/doc`, assurez-vous que toutes les extensions (irc, +charset, ...) sont chargées, car les fichiers sont construits en utilisant les +données actuellement en mémoire. + +[[asciidoc]] +==== Asciidoc + +Les fichiers Asciidoc donc dans le répertoire _doc/XX/_ où _XX_ est la langue +(en, fr, de, it, ...). + +Faites d'abord une copie du fichier asciidoc en anglais (dans le répertoire +_doc/en/_), puis travaillez dessus. + +Les traductions manquantes dans les fichiers sont indiquées par cette chaîne : + +---- +// TRANSLATION MISSING +---- + +Vous devez traduire tout le fichier sauf les liens et les mots-clés spéciaux +pour les notes, avertissements, ... Ces mots doivent être gardés tels quels : + +---- +[[link_name]] +<<link_name>> + +[NOTE] +[TIP] +[IMPORTANT] +[WARNING] +[CAUTION] +---- + +Lorsqu'il y a un nom après `<<link_name>>`, alors vous devez le traduire : + +---- +<<link_name,ce texte doit être traduit>> +---- |