diff options
-rw-r--r-- | src/gtkext/Makefile.am | 1 | ||||
-rw-r--r-- | src/gtkext/gtkextstatusbar.c | 632 | ||||
-rw-r--r-- | src/gtkext/gtkextstatusbar.h | 91 |
3 files changed, 0 insertions, 724 deletions
diff --git a/src/gtkext/Makefile.am b/src/gtkext/Makefile.am index 87df3b9..45719d2 100644 --- a/src/gtkext/Makefile.am +++ b/src/gtkext/Makefile.am @@ -4,7 +4,6 @@ noinst_LTLIBRARIES = libgtkext.la libgtkext_la_SOURCES = \ easygtk.h easygtk.c \ gtkbinarystrip.h gtkbinarystrip.c \ - gtkextstatusbar.h gtkextstatusbar.c \ gtkblockdisplay.h gtkblockdisplay.c \ gtkbufferdisplay-int.h \ gtkbufferdisplay.h gtkbufferdisplay.c \ diff --git a/src/gtkext/gtkextstatusbar.c b/src/gtkext/gtkextstatusbar.c deleted file mode 100644 index 4ec6c0e..0000000 --- a/src/gtkext/gtkextstatusbar.c +++ /dev/null @@ -1,632 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * gtkextstatusbar.h - prototypes pour la barre de statut améliorée - * - * Copyright (C) 2009-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide 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. - * - * Chrysalide 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "gtkextstatusbar.h" - - -#include <assert.h> -#include <malloc.h> -#include <string.h> - - - -/* ------------------------- GESTION EXTERIEURE DE LA BARRE ------------------------- */ - - -/* Elément de statut */ -typedef struct _bar_item -{ - char *message; /* Message à afficher */ - bool is_progressive; /* Utilisations de progression */ - double value; /* Valeur courante */ - - size_t index; /* Valeur pour l'identifiant */ - -} bar_item; - - -/* Abstration d'une gestion de barre de statut (instance) */ -struct _GtkExtStatusBar -{ - GtkStatusbar bar; /* Présence obligatoire en 1er */ - - guint context; /* Nouvel identifiant */ - guint cur_msg; /* Message courant */ - - GtkProgressBar *progress; /* Barre de progression */ - - bar_item *stack; /* Pile de statut de la barre */ - size_t stack_size; /* Taille de la pile */ - GMutex stack_access; /* Accès à la pile */ - -}; - -/* Abstration d'une gestion de barre de statut (classe) */ -struct _GtkExtStatusBarClass -{ - GtkStatusbarClass parent_class; /* Présence obligatoire en 1er */ - -}; - - -/* Initialise la classe des barres de statut améliorées. */ -static void gtk_extended_status_bar_class_init(GtkExtStatusBarClass *); - -/* Initialise une instance de barre de statut améliorée. */ -static void gtk_extended_status_bar_init(GtkExtStatusBar *); - - - -/* ----------------------- MISES A JOUR EN CONTEXTE PRINCIPAL ----------------------- */ - - -/* Type de commande */ -typedef enum _DelayedUpdateCmd -{ - DUC_CHANGE_CONTENT, /* Elément ajouté ou retiré */ - DUC_UPDATE_ACTIVITY /* Mise à jour de progression */ - -} DelayedUpdateCmd; - -/* Transfert des commandes */ -typedef struct _bar_update_info -{ - GtkExtStatusBar *bar; /* Barre associée */ - DelayedUpdateCmd cmd; /* Type de commande */ - -} bar_update_info; - - -/* Met à jour la partie graphique de la barre de statut. */ -static gboolean gtk_extended_status_update(bar_update_info *); - -/* Libère la mémoire occupée par la transmission. */ -static void free_bar_update_info(bar_update_info *); - -/* Place un nouveau message dans la barre de statut. */ -static void _gtk_extended_status_bar_change_content(GtkExtStatusBar *); - -/* Met à jour la barre de progression de la barre de statut. */ -static void _gtk_extended_status_bar_update_activity(GtkExtStatusBar *); - - - -/* -------------------------- GESTION EN VUE MACROSCOPIQUE -------------------------- */ - - -/* Concentré d'informations utiles */ -struct _status_blob_info -{ - GtkExtStatusBar *bar; /* Barre de statut utilisée */ - bstatus_id_t id; /* Identifiant du message */ - - double current; /* Valeur courante représentée */ - double max; /* Valeur maximale à atteindre */ - -}; - - - -/* ---------------------------------------------------------------------------------- */ -/* GESTION EXTERIEURE DE LA BARRE */ -/* ---------------------------------------------------------------------------------- */ - - -/* Détermine le type de la barre de statut améliorée. */ -G_DEFINE_TYPE(GtkExtStatusBar, gtk_extended_status_bar, GTK_TYPE_STATUSBAR) - - -/****************************************************************************** -* * -* Paramètres : klass = classe GTK à initialiser. * -* * -* Description : Initialise la classe des barres de statut améliorées. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_extended_status_bar_class_init(GtkExtStatusBarClass *klass) -{ - -} - - -/****************************************************************************** -* * -* Paramètres : bar = instance GTK à initialiser. * -* * -* Description : Initialise une instance de barre de statut améliorée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_extended_status_bar_init(GtkExtStatusBar *bar) -{ - bar->context = gtk_statusbar_get_context_id(GTK_STATUSBAR(bar), ""); - - bar->progress = GTK_PROGRESS_BAR(gtk_progress_bar_new()); - - gtk_widget_set_size_request(GTK_WIDGET(bar->progress), 200, -1); - - gtk_progress_bar_set_fraction(bar->progress, 0.5); - gtk_progress_bar_set_text(bar->progress, "50%"); - - gtk_box_pack_start(GTK_BOX(bar), GTK_WIDGET(bar->progress), FALSE, FALSE, 4); - - g_mutex_init(&bar->stack_access); - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Crée une nouvelle instance de barre de statut. * -* * -* Retour : Composant GTK mis en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *gtk_extended_status_bar_new(void) -{ - return g_object_new(GTK_TYPE_EXT_STATUS_BAR, NULL); - -} - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* message = message à afficher pour l'utilisateur. * -* progressive = utilisation de la barre de progression. * -* * -* Description : Place un nouveau message dans la barre de statut. * -* * -* Retour : Identifiant du nouveau statut défini. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bstatus_id_t gtk_extended_status_bar_push(GtkExtStatusBar *bar, const char *message, bool progressive) -{ - bstatus_id_t result; /* Identifiant à retourner */ - size_t index; /* Indice du nouvel élément */ - bar_update_info *info; /* Informations à mémoriser */ - - return 0; - - if (bar == NULL) return 0; - - /* Mise à jour de la pile */ - - g_mutex_lock(&bar->stack_access); - - bar->stack = (bar_item *)realloc(bar->stack, ++bar->stack_size * sizeof(bar_item)); - - index = bar->stack_size - 1; - - bar->stack[index].message = strdup(message); - bar->stack[index].is_progressive = progressive; - bar->stack[index].value = 0.0; - bar->stack[index].index = index; - - result = &bar->stack[index].index; - - g_mutex_unlock(&bar->stack_access); - - /* Mise à jour de l'affichage */ - - info = (bar_update_info *)calloc(1, sizeof(bar_update_info)); - - info->bar = bar; - g_object_ref(G_OBJECT(bar)); - info->cmd = DUC_CHANGE_CONTENT; - - gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)gtk_extended_status_update, - info, (GDestroyNotify)free_bar_update_info); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* id = identifiant du message concerné. * -* value = valeur actuelle de la progression. * -* * -* Description : Met à jour la barre de progression de la barre de statut. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_extended_status_bar_update_activity(GtkExtStatusBar *bar, bstatus_id_t id, double value) -{ - bar_update_info *info; /* Informations à mémoriser */ - - return; - - if (bar == NULL) return; - - /* Mise à jour de la pile */ - - g_mutex_lock(&bar->stack_access); - - bar->stack[*id].value = value; - - g_mutex_unlock(&bar->stack_access); - - /* Mise à jour de l'affichage */ - - info = (bar_update_info *)calloc(1, sizeof(bar_update_info)); - - info->bar = bar; - g_object_ref(G_OBJECT(bar)); - info->cmd = DUC_UPDATE_ACTIVITY; - - gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)gtk_extended_status_update, - info, (GDestroyNotify)free_bar_update_info); - -} - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* id = identifiant du statut à supprimer. * -* * -* Description : Retire de la barre un statut, visible ou non. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_extended_status_bar_remove(GtkExtStatusBar *bar, bstatus_id_t id) -{ - size_t index; /* Indice de l'élément visé */ - size_t i; /* Boucle de parcours */ - bar_update_info *info; /* Informations à mémoriser */ - - return; - - if (bar == NULL) return; - - /* Mise à jour de la pile */ - - g_mutex_lock(&bar->stack_access); - - index = *id; - - free(bar->stack[index].message); - - if ((index + 1) < bar->stack_size) - { - memmove(&bar->stack[index], &bar->stack[index + 1], - (bar->stack_size - index - 1) * sizeof(bar_item)); - - for (i = index; i < bar->stack_size; i++) - bar->stack[i].index = i; - - } - - bar->stack = (bar_item *)realloc(bar->stack, --bar->stack_size * sizeof(bar_item)); - - g_mutex_unlock(&bar->stack_access); - - /* Mise à jour de l'affichage */ - - info = (bar_update_info *)calloc(1, sizeof(bar_update_info)); - - info->bar = bar; - g_object_ref(G_OBJECT(bar)); - info->cmd = DUC_CHANGE_CONTENT; - - gdk_threads_add_idle_full(G_PRIORITY_HIGH_IDLE, (GSourceFunc)gtk_extended_status_update, - info, (GDestroyNotify)free_bar_update_info); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* MISES A JOUR EN CONTEXTE PRINCIPAL */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : info = informations à consulter pour l'opération. * -* * -* Description : Met à jour la partie graphique de la barre de statut. * -* * -* Retour : FALSE pour faire disparaître la mise à jour ensuite. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean gtk_extended_status_update(bar_update_info *info) -{ - switch (info->cmd) - { - case DUC_CHANGE_CONTENT: - _gtk_extended_status_bar_change_content(info->bar); - /*break;*/ - - case DUC_UPDATE_ACTIVITY: - _gtk_extended_status_bar_update_activity(info->bar); - break; - - } - - return FALSE; - -} - - -/****************************************************************************** -* * -* Paramètres : info = informations à libérer de la mémoire. * -* * -* Description : Libère la mémoire occupée par la transmission. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void free_bar_update_info(bar_update_info *info) -{ - if (info->bar != NULL) - - g_object_unref(G_OBJECT(info->bar)); - - free(info); - -} - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* * -* Description : Place un nouveau message dans la barre de statut. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void _gtk_extended_status_bar_change_content(GtkExtStatusBar *bar) -{ - size_t top; /* Indice de l'élément visé */ - - if (bar == NULL) return; - - g_mutex_lock(&bar->stack_access); - - if (bar->cur_msg > 0) - gtk_statusbar_remove(GTK_STATUSBAR(bar), bar->context, bar->cur_msg); - - if (bar->stack_size == 0) - gtk_widget_hide(GTK_WIDGET(bar->progress)); - - else - { - top = bar->stack_size - 1; - - bar->cur_msg = gtk_statusbar_push(GTK_STATUSBAR(bar), bar->context, - bar->stack[top].message); - - if (bar->stack[top].is_progressive) - gtk_widget_show(GTK_WIDGET(bar->progress)); - else - gtk_widget_hide(GTK_WIDGET(bar->progress)); - - } - - g_mutex_unlock(&bar->stack_access); - -} - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* * -* Description : Met à jour la barre de progression de la barre de statut. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void _gtk_extended_status_bar_update_activity(GtkExtStatusBar *bar) -{ - size_t top; /* Indice de l'élément visé */ - double value; /* Valeur à prendre en compte */ - gchar percent[5]; /* Pourcentage en version txt. */ - - if (bar == NULL) return; - - g_mutex_lock(&bar->stack_access); - - if (bar->stack_size > 0) - { - top = bar->stack_size - 1; - - if (bar->stack[top].is_progressive) - { - value = bar->stack[top].value; - - if (value != 1.0 && value - gtk_progress_bar_get_fraction(bar->progress) < 0.01) - goto gesbua_exit; - - g_snprintf(percent, 5, "%.0f%%", value * 100); - - gtk_progress_bar_set_fraction(bar->progress, value); - gtk_progress_bar_set_text(bar->progress, percent); - - } - - } - - gesbua_exit: - - g_mutex_unlock(&bar->stack_access); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* GESTION EN VUE MACROSCOPIQUE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : bar = barre de statut à manipuler. * -* message = message à afficher pour l'utilisateur. * -* val = valeur de départ à afficher initialement. * -* max = valeur maximale de progression (négative = aucune).* -* * -* Description : Met en place rapidement un message progressiste de statut. * -* * -* Retour : Structure opaque contenant le nécessaire pour les opérations * -* ultérieures. * -* * -* Remarques : - * -* * -******************************************************************************/ - -status_blob_info *init_progessive_status(GtkExtStatusBar *bar, const char *message, double val, double max) -{ - status_blob_info *result; /* Information à retourner */ - - return NULL; - - result = (status_blob_info *)calloc(1, sizeof(status_blob_info)); - - if (bar != NULL) - g_object_ref(G_OBJECT(bar)); - - result->bar = bar; - - result->id = gtk_extended_status_bar_push(bar, message, max > 0.0); - - result->current = 0.0; - result->max = max; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : info = regroupement d'informations à manipuler. * -* * -* Description : Fait disparaître la glue d'affichage de progression. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void fini_progessive_status(status_blob_info *info) -{ - return; - gtk_extended_status_bar_remove(info->bar, info->id); - - if (info->bar != NULL) - g_object_unref(G_OBJECT(info->bar)); - - free(info); - -} - - -/****************************************************************************** -* * -* Paramètres : info = regroupement d'informations à manipuler. * -* * -* Description : Indique la valeur courante utilisée pour la progression. * -* * -* Retour : Valeur courante. * -* * -* Remarques : - * -* * -******************************************************************************/ - -double get_current_progessive_status(const status_blob_info *info) -{ - return 0.0; - return info->current; - -} - - -/****************************************************************************** -* * -* Paramètres : info = regroupement d'informations à manipuler. * -* inc = valeur de la progression à prendre en compte. * -* * -* Description : Augmente la progression visible dans la barre de statut. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void inc_progessive_status(status_blob_info *info, double inc) -{ - return; - assert((info->current + inc) < info->max); - - info->current += inc; - - gtk_extended_status_bar_update_activity(info->bar, info->id, info->current / info->max); - -} diff --git a/src/gtkext/gtkextstatusbar.h b/src/gtkext/gtkextstatusbar.h deleted file mode 100644 index 485e5bd..0000000 --- a/src/gtkext/gtkextstatusbar.h +++ /dev/null @@ -1,91 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * gtkextstatusbar.h - prototypes pour la barre de statut améliorée - * - * Copyright (C) 2009-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide 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. - * - * Chrysalide 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef _GTKEXT_GTKEXTSTATUSBAR_H -#define _GTKEXT_GTKEXTSTATUSBAR_H - - -#include <stdbool.h> -#include <gtk/gtk.h> - - - -/* ------------------------- GESTION EXTERIEURE DE LA BARRE ------------------------- */ - - -#define GTK_TYPE_EXT_STATUS_BAR (gtk_extended_status_bar_get_type()) -#define GTK_EXT_STATUS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, gtk_extended_status_bar_get_type (), GtkExtStatusBar)) -#define GTK_IS_EXT_STATUS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, gtk_extended_status_bar_get_type())) -#define GTK_EXT_STATUS_BAR_CLASS(klass) (G_LOADED_BINARY_GET_CLASS(klass, gtk_extended_status_bar_get_type(), GtkExtStatusBarClass)) - - -/* Abstration d'une gestion de barre de statut (instance) */ -typedef struct _GtkExtStatusBar GtkExtStatusBar; - -/* Abstration d'une gestion de barre de statut (classe) */ -typedef struct _GtkExtStatusBarClass GtkExtStatusBarClass; - - -/* Identifiant d'un message de statut */ -typedef size_t * bstatus_id_t; - - -/* Détermine le type de la barre de statut améliorée. */ -GType gtk_extended_status_bar_get_type(void); - -/* Crée une nouvelle instance de barre de statut. */ -GtkWidget *gtk_extended_status_bar_new(void); - -/* Place un nouveau message dans la barre de statut. */ -bstatus_id_t gtk_extended_status_bar_push(GtkExtStatusBar *, const gchar *, bool); - -/* Met à jour la barre de progression de la barre de statut. */ -void gtk_extended_status_bar_update_activity(GtkExtStatusBar *, bstatus_id_t, double); - -/* Retire de la barre un statut, visible ou non. */ -void gtk_extended_status_bar_remove(GtkExtStatusBar *, bstatus_id_t); - - - -/* -------------------------- GESTION EN VUE MACROSCOPIQUE -------------------------- */ - - -/* Concentré d'informations utiles */ -typedef struct _status_blob_info status_blob_info; - - -/* Met en place rapidement un message progressiste de statut. */ -status_blob_info *init_progessive_status(GtkExtStatusBar *, const char *, double, double); - -/* Fait disparaître la glue d'affichage de progression. */ -void fini_progessive_status(status_blob_info *); - -/* Indique la valeur courante utilisée pour la progression. */ -double get_current_progessive_status(const status_blob_info *); - -/* Augmente la progression visible dans la barre de statut. */ -void inc_progessive_status(status_blob_info *, double); - - - -#endif /* _GTKEXT_GTKEXTSTATUSBAR_H */ |