diff options
Diffstat (limited to 'src/gui/dialogs/about.c')
-rw-r--r-- | src/gui/dialogs/about.c | 167 |
1 files changed, 96 insertions, 71 deletions
diff --git a/src/gui/dialogs/about.c b/src/gui/dialogs/about.c index 574c7f2..1dca752 100644 --- a/src/gui/dialogs/about.c +++ b/src/gui/dialogs/about.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * about.h - boîte de dialogue d'information sur le programme * - * Copyright (C) 2015-2020 Cyrille Bagard + * Copyright (C) 2015-2024 Cyrille Bagard * * This file is part of Chrysalide. * @@ -33,143 +33,168 @@ #include <config.h> -#include "../../gtkext/easygtk.h" +#include "about-int.h" -/* Réagit à l'appui d'une touche sur la fenêtre 'A propos'. */ -static gboolean close_about_window_on_escape(GtkWidget *, GdkEventKey *, gpointer); +/* Procède à l'initialisation de la boîte "A propos de". */ +static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *); -/* Dessine un fond adapté pour la fenêtre sans toucher au thème. */ -static gboolean draw_black_background(GtkWidget *, cairo_t *, gpointer); +/* Procède à l'initialisation de la boîte "A propos de". */ +static void gtk_app_about_dialog_init(GtkAppAboutDialog *); +/* Supprime toutes les références externes. */ +static void gtk_app_about_dialog_dispose(GObject *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_app_about_dialog_finalize(GObject *); + + + +/* Détermine le type du composant d'affichage générique. */ +G_DEFINE_TYPE(GtkAppAboutDialog, gtk_app_about_dialog, GTK_TYPE_WINDOW); /****************************************************************************** * * -* Paramètres : parent = fenêtre parente à surpasser. * -* outb = constructeur à détruire après usage. [OUT] * +* Paramètres : class = classe GTK à initialiser. * * * -* Description : Construit la fenêtre d'informations sur le logiciel. * +* Description : Procède à l'initialisation de la boîte "A propos de". * * * -* Retour : Adresse de la fenêtre mise en place. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GtkWidget *create_about_dialog(GtkWindow *parent, GtkBuilder **outb) +static void gtk_app_about_dialog_class_init(GtkAppAboutDialogClass *class) { - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkBuilder *builder; /* Constructeur utilisé */ - unsigned int revision; /* Numéro de révision */ - unsigned int max; /* Nbre. de boucles à effectuer*/ - unsigned int i; /* Boucle de parcours */ - unsigned int level; /* Unité la plus importante */ - char buffer[64]; /* Nom d'image à forger */ - GtkImage *img; /* Composant d'affichage */ + GObjectClass *object; /* Plus haut niveau équivalent */ + GtkWidgetClass *widget; /* Classe de haut niveau */ - builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/about.ui"); - *outb = builder; + object = G_OBJECT_CLASS(class); - result = GTK_WIDGET(gtk_builder_get_object(builder, "window")); + object->dispose = gtk_app_about_dialog_dispose; + object->finalize = gtk_app_about_dialog_finalize; - gtk_window_set_transient_for(GTK_WINDOW(result), parent); + widget = GTK_WIDGET_CLASS(class); - /* Numéro de révision */ + gtk_widget_class_set_css_name(widget, "aboutdialog"); - revision = REVISION; - max = log(revision) / log(10); + gtk_widget_class_add_binding_action(widget, GDK_KEY_Escape, 0, "window.close", NULL); - assert(max <= 6); + gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/dialogs/about.ui"); - for (i = 0; i <= max; i++) - { - snprintf(buffer, 64, "revision_%u", i); +} - img = GTK_IMAGE(gtk_builder_get_object(builder, buffer)); - level = pow(10, max - i); +/****************************************************************************** +* * +* Paramètres : dialog = composant GTK à initialiser. * +* * +* Description : Procède à l'initialisation de la boîte "A propos de". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ - snprintf(buffer, 64, "/org/chrysalide/gui/dialogs/about/revision_%u.png", revision / level); +static void gtk_app_about_dialog_init(GtkAppAboutDialog *dialog) +{ + gtk_widget_init_template(GTK_WIDGET(dialog)); - gtk_image_set_from_resource(img, buffer); +} - revision %= level; - } +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ - /* Connexion des signaux */ +static void gtk_app_about_dialog_dispose(GObject *object) +{ + gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_APP_ABOUT_DIALOG); - gtk_builder_add_callback_symbols(builder, - BUILDER_CALLBACK(close_about_window_on_escape), - BUILDER_CALLBACK(draw_black_background), - NULL); + G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->dispose(object); - gtk_builder_connect_signals(builder, builder); +} - return result; + +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_app_about_dialog_finalize(GObject *object) +{ + G_OBJECT_CLASS(gtk_app_about_dialog_parent_class)->finalize(object); } /****************************************************************************** * * -* Paramètres : widget = fenêtre visée par la procédure. * -* event = informations liées à l'événement. * -* dummy = donnée non utilisée ici. * +* Paramètres : parent = fenêtre parente à surpasser. * * * -* Description : Réagit à l'appui d'une touche sur la fenêtre 'A propos'. * +* Description : Construit la fenêtre d'informations sur le logiciel. * * * -* Retour : TRUE pour interrompre la propagation, FALSE autrement. * +* Retour : Adresse de la fenêtre mise en place. * * * * Remarques : - * * * ******************************************************************************/ -static gboolean close_about_window_on_escape(GtkWidget *widget, GdkEventKey *event, gpointer dummy) +GtkWindow *gtk_app_about_dialog_new(GtkWindow *parent) { - gboolean result; /* Ordre à retourner */ + GtkWindow *result; /* Boite de dialogue à renvoyer*/ + + result = g_object_new(GTK_TYPE_APP_ABOUT_DIALOG, NULL); - if (event->keyval == GDK_KEY_Escape) - { - gtk_widget_destroy(widget); - result = TRUE; - } - else result = FALSE; + if (!gtk_app_about_dialog_create(GTK_APP_ABOUT_DIALOG(result), parent)) + g_clear_object(&result); return result; } + /****************************************************************************** * * -* Paramètres : widget = fenêtre visée par la procédure. * -* event = informations liées à l'événement. * -* dummy = donnée non utilisée ici. * +* Paramètres : dialog = boîte de dialogue à initialiser pleinement. * +* parent = fenêtre parente à surpasser. * * * -* Description : Dessine un fond adapté pour la fenêtre sans toucher au thème.* +* Description : Met en place la fenêtre d'informations sur le logiciel. * * * -* Retour : TRUE pour interrompre la propagation, FALSE autrement. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static gboolean draw_black_background(GtkWidget *widget, cairo_t *cr, gpointer dummy) +bool gtk_app_about_dialog_create(GtkAppAboutDialog *dialog, GtkWindow *parent) { - int width; /* Largeur du composant */ - int height; /* Hauteur du composant */ + bool result; /* Bilan à retourner */ - width = gtk_widget_get_allocated_width(widget); - height = gtk_widget_get_allocated_height(widget); + result = true; - cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); - cairo_rectangle(cr, 0, 0, width, height); - cairo_fill(cr); - - return FALSE; + return result; } |