XV. Messages d'erreur▲
XV-A. Aperçu▲
XV-B. Amélioration de nos fonctions d'affichage d'erreur▲
Jusqu'à présent les messages d'erreurs étaient affichés à l'aide de la fonction printf, mais cela oblige l'utilisateur à lancer le programme dans une console, pas très conviviale. Encore une fois GTK+ vient à notre secours en proposant une classe GtkMessageDialog qui nous permet d'afficher un message simplement, sans avoir à créer une boîte de dialogue en partant de zéro.
Voici la fonction qui nous permet de créer notre boîte de dialogue :
GtkWidget *
gtk_message_dialog_new (
GtkWindow *
parent, GtkDialogFlags flags, GtkMessageType type, GtkButtonsType buttons,
const
gchar *
message_format, ...);
Donc nous avons besoin de notre fenêtre principale, pour cela il suffit d'inclure document.h, comme l'utilisateur doit d'abord valider notre message avant de continuer à utiliser l'éditeur, nous allons la rendre modale grâce à la constante GTK_DIALOG_MODAL. Ensuite vient le type de message, cela va dépendre de la fonction appelée (GTK_MESSAGE_INFO, GTK_MESSAGE_WARNING ou GTK_MESSAGE_ERROR). Le seul bouton dont l'utilisateur a besoin est le bouton OK pour fermer la boîte de dialogue (GTK_BUTTONS_OK) et pour finir, la fonction attend le message à afficher (sous la même forme que la fonction printf).
Comme seuls le type de message et le message vont changer selon la fonction print_* appelée, une nouvelle fonction est la bienvenue :
static
void
print_message (
GtkMessageType type, const
gchar *
format, va_list va)
{
gchar *
message =
NULL
;
GtkWidget *
p_dialog =
NULL
;
message =
g_strdup_vprintf (
format, va);
p_dialog =
gtk_message_dialog_new (
docs.p_main_window, GTK_DIALOG_MODAL, type, GTK_BUTTONS_OK, message);
g_free (
message), message =
NULL
;
gtk_dialog_run (
GTK_DIALOG (
p_dialog));
gtk_widget_destroy (
p_dialog);
}
Les fonctions de la famille de g_strdup_printf sont extrêmement intéressantes puisqu'elles permettent de créer une nouvelle chaîne de caractères en utilisant la puissance des fonctions de la famille de printf (Voici un exemple d'implémentation de ce genre de fonction : Créer une chaîne de caractères formatée).
Il nous reste plus qu'à modifier nos trois fonctions d'affichage de message, voici l'exemple pour print_info :
void
print_info (
char
*
format, ...)
{
va_list va;
va_start (
va, format);
print_message (
GTK_MESSAGE_INFO, format, va);
}
En C99, avec les macros à nombres variables, nous pourrions remplacer nos fonctions par des macros :
#define print_info(chat *format, ...) print_message (GTK_MESSAGE_INFO, (format), __VA_ARGS__)