summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-07-31 23:34:56 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-07-31 23:34:56 (GMT)
commitd02deb2425d6559c357bdd00e1c0fb05f35d5fc9 (patch)
tree1a78849aa7d51706856a6c6127f66b48c188d0fc /src/gtkext
parentfd2abec30a224279c62a7ab4892d95e56cb08dff (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.am1
-rw-r--r--src/gtkext/gtkblockview.c2
-rw-r--r--src/gtkext/gtkextstatusbar.c228
-rw-r--r--src/gtkext/gtkextstatusbar.h88
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 */