diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-07-31 23:34:56 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-07-31 23:34:56 (GMT) |
commit | d02deb2425d6559c357bdd00e1c0fb05f35d5fc9 (patch) | |
tree | 1a78849aa7d51706856a6c6127f66b48c188d0fc /src/gtkext | |
parent | fd2abec30a224279c62a7ab4892d95e56cb08dff (diff) |
Processed disassembling in a dedicated thread.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@104 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/Makefile.am | 1 | ||||
-rw-r--r-- | src/gtkext/gtkblockview.c | 2 | ||||
-rw-r--r-- | src/gtkext/gtkextstatusbar.c | 228 | ||||
-rw-r--r-- | src/gtkext/gtkextstatusbar.h | 88 |
4 files changed, 318 insertions, 1 deletions
diff --git a/src/gtkext/Makefile.am b/src/gtkext/Makefile.am index 51bea0f..fbfa0b6 100644 --- a/src/gtkext/Makefile.am +++ b/src/gtkext/Makefile.am @@ -5,6 +5,7 @@ noinst_LTLIBRARIES = libgtkext.la libgtkext_la_SOURCES = \ easygtk.h easygtk.c \ + gtkextstatusbar.h gtkextstatusbar.c \ gtkbinview-int.h \ gtkbinview.h gtkbinview.c \ gtkblockview.h gtkblockview.c \ diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c index ad0aded..2659b0d 100644 --- a/src/gtkext/gtkblockview.c +++ b/src/gtkext/gtkblockview.c @@ -357,7 +357,7 @@ static gboolean gtk_block_view_expose(GtkWidget *widget, GdkEventExpose *event) y = event->area.y - y; - for ( ; iter != NULL; + for ( ; iter != NULL && y < (event->area.y + event->area.height); iter = g_rendering_line_get_next_iter(view->lines, iter, view->last)) { g_rendering_line_draw(iter, GDK_DRAWABLE(widget->window), view->gc, diff --git a/src/gtkext/gtkextstatusbar.c b/src/gtkext/gtkextstatusbar.c new file mode 100644 index 0000000..cb6851d --- /dev/null +++ b/src/gtkext/gtkextstatusbar.c @@ -0,0 +1,228 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * gtkextstatusbar.h - prototypes pour la barre de statut améliorée + * + * Copyright (C) 2009 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA 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. + * + * OpenIDA 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 Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "gtkextstatusbar.h" + + +#include <malloc.h> +#include <string.h> + + + +/* 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 *); + + + +/* 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); + +} + + +/****************************************************************************** +* * +* 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 : - * +* * +******************************************************************************/ + +guint gtk_extended_status_bar_push(GtkExtStatusBar *bar, const gchar *message, gboolean progressive) +{ + guint result; /* Identifiant à retourner */ + + result = gtk_statusbar_push(GTK_STATUSBAR(bar), bar->context, message); + + bar->msg_count++; + bar->msg_id = (guint *)realloc(bar->msg_id, bar->msg_count * sizeof(guint)); + bar->is_progressive = (gboolean *)realloc(bar->is_progressive, bar->msg_count * sizeof(gboolean)); + + bar->msg_id[bar->msg_count - 1] = result; + bar->is_progressive[bar->msg_count - 1] = progressive; + + if (progressive) + { + gtk_progress_bar_set_fraction(bar->progress, 0.0); + gtk_progress_bar_set_text(bar->progress, "0%"); + + gtk_widget_show(GTK_WIDGET(bar->progress)); + + } + else gtk_widget_hide(GTK_WIDGET(bar->progress)); + + 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, guint id, gdouble value) +{ + gchar percent[5]; /* Pourcentage en version txt. */ + + if (bar->msg_count == 0) return; + + gdk_threads_enter(); + + if (id == bar->msg_id[bar->msg_count - 1] && bar->is_progressive[bar->msg_count - 1]) + { + g_snprintf(percent, 5, "%.0f%%", value * 100); + + gtk_progress_bar_set_fraction(bar->progress, value); + gtk_progress_bar_set_text(bar->progress, percent); + + } + + gdk_flush (); + + gdk_threads_leave(); + +} + + +/****************************************************************************** +* * +* 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, guint id) +{ + size_t i; /* Boucle de parcours */ + + gtk_statusbar_remove(GTK_STATUSBAR(bar), bar->context, id); + + for (i = 0; i < bar->msg_count; i++) + if (bar->msg_id[i] == id) + break; + + if ((i + 1) < bar->msg_count) + { + memmove(&bar->msg_id[i], &bar->msg_id[i + 1], (bar->msg_count - i - 1) * sizeof(guint)); + memmove(&bar->is_progressive[i], &bar->is_progressive[i + 1], (bar->msg_count - i - 1) * sizeof(gboolean)); + } + + bar->msg_count--; + bar->msg_id = (guint *)realloc(bar->msg_id, bar->msg_count * sizeof(guint)); + bar->is_progressive = (gboolean *)realloc(bar->is_progressive, bar->msg_count * sizeof(gboolean)); + + if (bar->msg_count > 0 && bar->is_progressive[bar->msg_count - 1]) + gtk_widget_show(GTK_WIDGET(bar->progress)); + + else + gtk_widget_hide(GTK_WIDGET(bar->progress)); + +} diff --git a/src/gtkext/gtkextstatusbar.h b/src/gtkext/gtkextstatusbar.h new file mode 100644 index 0000000..2342b56 --- /dev/null +++ b/src/gtkext/gtkextstatusbar.h @@ -0,0 +1,88 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * gtkextstatusbar.h - prototypes pour la barre de statut améliorée + * + * Copyright (C) 2009 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA 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. + * + * OpenIDA 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 Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GTKEXT_GTKEXTSTATUSBAR_H +#define _GTKEXT_GTKEXTSTATUSBAR_H + + +#include <gtk/gtk.h> + + + +G_BEGIN_DECLS + + + +#define GTK_TYPE_EXT_STATUS_BAR (gtk_extended_status_bar_get_type()) +#define GTK_EXT_STATUS_BAR(obj) GTK_CHECK_CAST(obj, gtk_extended_status_bar_get_type (), GtkExtStatusBar) +#define GTK_EXT_STATUS_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, gtk_extended_status_bar_get_type(), GtkExtStatusBarClass) +#define GTK_IS_EXT_STATUS_BAR(obj) GTK_CHECK_TYPE(obj, gtk_extended_status_bar_get_type()) + + +typedef struct _GtkExtStatusBar GtkExtStatusBar; +typedef struct _GtkExtStatusBarClass GtkExtStatusBarClass; + + + +struct _GtkExtStatusBar +{ + GtkStatusbar bar; /* Présence obligatoire en 1er */ + + guint context; /* Nouvel identifiant */ + + GtkProgressBar *progress; /* Barre de progression */ + + guint *msg_id; /* Liste des identifiants */ + gboolean *is_progressive; /* Utilisations de progression */ + size_t msg_count; /* Nombre de messages empilés */ + +}; + +struct _GtkExtStatusBarClass +{ + GtkStatusbarClass parent_class; /* Présence obligatoire en 1er */ + +}; + + +/* Détermine le type de la barre de statut améliorée. */ +GtkType 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. */ +guint gtk_extended_status_bar_push(GtkExtStatusBar *, const gchar *, gboolean); + +/* Met à jour la barre de progression de la barre de statut. */ +void gtk_extended_status_bar_update_activity(GtkExtStatusBar *, guint, gdouble); + +/* Retire de la barre un statut, visible ou non. */ +void gtk_extended_status_bar_remove(GtkExtStatusBar *, guint); + + + +G_END_DECLS + + +#endif /* _GTKEXT_GTKEXTSTATUSBAR_H */ |