summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--src/gtkext/easygtk.c81
-rw-r--r--src/gtkext/easygtk.h3
-rw-r--r--src/gtkext/theme.c1
-rw-r--r--src/gui/panels/Makefile.am1
-rw-r--r--src/gui/panels/history.c308
-rw-r--r--src/gui/panels/history.h65
-rw-r--r--src/gui/panels/panel.c4
-rw-r--r--src/gui/panels/symbols.c10
-rw-r--r--themes/clean.pngbin0 -> 741 bytes
-rw-r--r--themes/icons.css27
-rw-r--r--themes/redo.pngbin0 -> 617 bytes
-rw-r--r--themes/undo.pngbin0 -> 602 bytes
13 files changed, 523 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 1463aad..5c8bbd4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+15-07-25 Cyrille Bagard <nocbos@gmail.com>
+
+ * src/gtkext/easygtk.c:
+ * src/gtkext/easygtk.h:
+ Create a wrapper to provide buttons with images from CSS.
+
+ * src/gtkext/theme.c:
+ Load an extra style from the 'icons.css' file.
+
+ * src/gui/panels/history.c:
+ * src/gui/panels/history.h:
+ New entries: create an (empty) panel for evolution history.
+
+ * src/gui/panels/Makefile.am:
+ Add the 'history.[ch]' files to libguipanels_la_SOURCES.
+
+ * src/gui/panels/panel.c:
+ Update code.
+
+ * src/gui/panels/symbols.c:
+ Typo.
+
+ * themes/clean.png:
+ * themes/icons.css:
+ * themes/redo.png:
+ * themes/undo.png:
+ New entries: define a style for button pictures.
+
15-07-24 Cyrille Bagard <nocbos@gmail.com>
* src/analysis/binary.c:
diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c
index fa99f38..fcbaa19 100644
--- a/src/gtkext/easygtk.c
+++ b/src/gtkext/easygtk.c
@@ -401,6 +401,87 @@ GtkWidget *qck_create_button_with_img(GObject *object, const char *name, const c
* *
* Paramètres : object = espace dédié à l'inscription de références. *
* name = nom à donner au nouveau composant. *
+* image = nom de l'image stockée dans GTK. *
+* label = contenu de l'étiquette éventuelle associée. *
+* handler = éventuelle fonction de sélection associée. *
+* data = données à transmettre avec l'événement si besoin. *
+* *
+* Description : Crée et enregistre un composant 'GtkButton'. *
+* *
+* Retour : Simple bouton mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GtkWidget *qck_create_button_with_css_img(GObject *object, const char *name, const char *image, const char *label, GCallback handler, gpointer data)
+{
+ GtkWidget *result; /* Résultat à renvoyer */
+ GtkWidget *picture; /* Image de représentation */
+ GtkWidget *caption; /* Etiquette à coller */
+ GtkWidget *hbox; /* Séparation horizontale */
+
+ result = gtk_button_new();
+ gtk_widget_set_can_default(result, TRUE);
+
+ /* Création des éléments internes */
+
+ if (image != NULL)
+ {
+ picture = gtk_image_new();
+ gtk_widget_show(picture);
+
+ gtk_widget_set_name(picture, image);
+
+ }
+
+ if (label != NULL)
+ {
+ caption = gtk_label_new_with_mnemonic(label);
+ gtk_widget_show(caption);
+ }
+
+ /* Mise en place */
+
+ if (image != NULL && label != NULL)
+ {
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_widget_show(hbox);
+ gtk_container_add(GTK_CONTAINER(result), hbox);
+
+ gtk_box_pack_start(GTK_BOX(hbox), picture, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), caption, FALSE, FALSE, 0);
+
+ }
+
+ else if (image != NULL)
+ gtk_container_add(GTK_CONTAINER(result), picture);
+
+ else /*if (label != NULL)*/
+ gtk_container_add(GTK_CONTAINER(result), caption);
+
+ /* Interactions GTK... */
+
+ if (G_IS_OBJECT(object) && name != NULL)
+ {
+ g_object_ref(G_OBJECT(result));
+ g_object_set_data_full(object, name, result, (GDestroyNotify)g_object_unref);
+ }
+
+ gtk_widget_show(result);
+
+ if (handler != NULL)
+ g_signal_connect(result, "clicked", handler, data);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : object = espace dédié à l'inscription de références. *
+* name = nom à donner au nouveau composant. *
* caption = désignation apparaîssant sur le corps de l'objet. *
* handler = éventuelle fonction de sélection associée. *
* data = données à transmettre avec l'événement si besoin. *
diff --git a/src/gtkext/easygtk.h b/src/gtkext/easygtk.h
index 65d1127..58229af 100644
--- a/src/gtkext/easygtk.h
+++ b/src/gtkext/easygtk.h
@@ -62,6 +62,9 @@ GtkWidget *qck_create_button(GObject *, const char *, const char *, GCallback, g
/* Crée et enregistre un composant 'GtkButton'. */
GtkWidget *qck_create_button_with_img(GObject *, const char *, const char *, GCallback, gpointer);
+/* Crée et enregistre un composant 'GtkButton'. */
+GtkWidget *qck_create_button_with_css_img(GObject *, const char *, const char *, const char *, GCallback, gpointer);
+
/* Crée et enregistre un composant 'GtkCheckButton'. */
GtkWidget *qck_create_check_button(GObject *, const char *, const char *, GCallback, gpointer);
diff --git a/src/gtkext/theme.c b/src/gtkext/theme.c
index 41e0b4a..ba846bb 100644
--- a/src/gtkext/theme.c
+++ b/src/gtkext/theme.c
@@ -63,6 +63,7 @@ bool load_extra_gtk_theme(void)
static const char *css_files[] = {
"portions.css",
"segments.css",
+ "icons.css",
NULL
};
diff --git a/src/gui/panels/Makefile.am b/src/gui/panels/Makefile.am
index ad8c6b2..70cf597 100644
--- a/src/gui/panels/Makefile.am
+++ b/src/gui/panels/Makefile.am
@@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libguipanels.la
libguipanels_la_SOURCES = \
bookmarks.h bookmarks.c \
glance.h glance.c \
+ history.h history.c \
log.h log.c \
panel.h panel.c \
regedit.h regedit.c \
diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c
new file mode 100644
index 0000000..a827961
--- /dev/null
+++ b/src/gui/panels/history.c
@@ -0,0 +1,308 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * history.c - panneau de la liste des évolutions d'utilisateur(s)
+ *
+ * Copyright (C) 2008-2013 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include "history.h"
+
+
+#include <cairo-gobject.h>
+
+
+#include <i18n.h>
+
+
+#include "panel-int.h"
+#include "../../gtkext/easygtk.h"
+
+
+
+/* Panneau de la liste des évolutions utilisateur(s) (instance) */
+struct _GHistoryPanel
+{
+ GPanelItem parent; /* A laisser en premier */
+
+ GtkTreeView *treeview; /* Composant d'affichage */
+ GtkTreeStore *store; /* Modèle de gestion */
+
+ GLoadedBinary *binary; /* Binaire à prendre en compte */
+
+};
+
+/* Panneau de la liste des évolutions utilisateur(s) (classe) */
+struct _GHistoryPanelClass
+{
+ GPanelItemClass parent; /* A laisser en premier */
+
+};
+
+
+/* Colonnes de la liste des évolutions */
+typedef enum _HistoryColumn
+{
+ HTC_ITEM, /* Elément d'évolution */
+
+ HTC_PICTURE, /* Image de représentation */
+ HTC_LABEL, /* Désignation humaine */
+
+ HTC_COUNT /* Nombre de colonnes */
+
+} HistoryColumn;
+
+
+/* Initialise la classe des panneaux de la liste des évolutions utilisateur(s). */
+static void g_history_panel_class_init(GHistoryPanelClass *);
+
+/* Initialise une instance de panneau d'aperçu de graphiques. */
+static void g_history_panel_init(GHistoryPanel *);
+
+/* Supprime toutes les références externes. */
+static void g_history_panel_dispose(GHistoryPanel *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_history_panel_finalize(GHistoryPanel *);
+
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_history_panel_current_binary(GHistoryPanel *, GLoadedBinary *);
+
+
+
+/* Indique le type définit pour un panneau d'aperçu de graphiques. */
+G_DEFINE_TYPE(GHistoryPanel, g_history_panel, G_TYPE_PANEL_ITEM);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des panneaux d'aperçu de graphiques. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_history_panel_class_init(GHistoryPanelClass *klass)
+{
+ GObjectClass *object; /* Autre version de la classe */
+ GEditorItemClass *editem; /* Encore une autre vision... */
+
+ object = G_OBJECT_CLASS(klass);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_history_panel_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_history_panel_finalize;
+
+ editem = G_EDITOR_ITEM_CLASS(klass);
+
+ editem->update_binary = (update_item_binary_fc)change_history_panel_current_binary;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = instance à initialiser. *
+* *
+* Description : Initialise une instance de panneau d'aperçu de graphiques. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_history_panel_init(GHistoryPanel *panel)
+{
+ GEditorItem *base; /* Version basique d'instance */
+ GObject *ref; /* Espace de référencement */
+ GtkWidget *scrollwnd; /* Support défilant */
+ GtkWidget *treeview; /* Affichage de la liste */
+ GtkWidget *box; /* Séparation horizontale */
+ GtkWidget *button; /* Bouton de cette même barre */
+
+ base = G_EDITOR_ITEM(panel);
+
+ base->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
+ gtk_container_set_border_width(GTK_CONTAINER(base->widget), 8);
+ gtk_widget_show(base->widget);
+
+ ref = G_OBJECT(base->widget);
+ g_object_set_data(ref, "panel", panel);
+
+ /* Liste des éléments d'évolution */
+
+ scrollwnd = gtk_scrolled_window_new(NULL, NULL);
+ gtk_widget_show(scrollwnd);
+ gtk_box_pack_start(GTK_BOX(base->widget), scrollwnd, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN);
+
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN);
+
+ panel->store = gtk_tree_store_new(HTC_COUNT, G_TYPE_OBJECT, CAIRO_GOBJECT_TYPE_SURFACE, G_TYPE_STRING);
+
+ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(panel->store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+ gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(treeview), TRUE);
+
+ panel->treeview = GTK_TREE_VIEW(treeview);
+
+ gtk_widget_show(treeview);
+ gtk_container_add(GTK_CONTAINER(scrollwnd), treeview);
+
+ g_object_unref(G_OBJECT(panel->store));
+
+ /* Eléments de contrôle inférieurs */
+
+ box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
+ gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
+ gtk_widget_show(box);
+ gtk_box_pack_start(GTK_BOX(base->widget), box, FALSE, TRUE, 0);
+
+ button = qck_create_button_with_css_img(NULL, NULL, "img-undo", _("Undo"),
+ G_CALLBACK(NULL), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+
+ button = qck_create_button_with_css_img(NULL, NULL, "img-redo", _("Redo"),
+ G_CALLBACK(NULL), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+
+ button = qck_create_button_with_css_img(NULL, NULL, "img-clean", _("Clean"),
+ G_CALLBACK(NULL), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_history_panel_dispose(GHistoryPanel *panel)
+{
+ if (panel->binary != NULL)
+ g_object_unref(G_OBJECT(panel->binary));
+
+ G_OBJECT_CLASS(g_history_panel_parent_class)->dispose(G_OBJECT(panel));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_history_panel_finalize(GHistoryPanel *panel)
+{
+ G_OBJECT_CLASS(g_history_panel_parent_class)->finalize(G_OBJECT(panel));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = espace de référencement global. *
+* *
+* Description : Crée un panneau d'affichage des symboles. *
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GEditorItem *g_history_panel_new(GObject *ref)
+{
+ GEditorItem *result; /* Structure à retourner */
+
+ result = g_object_new(G_TYPE_HISTORY_PANEL, NULL);
+
+ g_panel_item_init_ext(G_PANEL_ITEM(result), ref, PANEL_HISTORY_ID,
+ _("Change history"), G_EDITOR_ITEM(result)->widget, "eM");
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = espace de référencement global. *
+* *
+* Description : Construit et intègre un panneau d'affichage des symboles. *
+* *
+* Retour : Adresse du panneau mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GPanelItem *create_history_panel(GObject *ref)
+{
+ GEditorItem *result; /* Elément réactif à renvoyer */
+
+ result = g_history_panel_new(ref);
+
+ /* Enregistre correctement le tout */
+ register_editor_item(result);
+
+ return G_PANEL_ITEM(result);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = panneau à mettre à jour. *
+* binary = nouvelle instance de binaire analysé. *
+* *
+* Description : Réagit à un changement d'affichage principal de contenu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBinary *binary)
+{
+
+ /* TODO */
+
+}
diff --git a/src/gui/panels/history.h b/src/gui/panels/history.h
new file mode 100644
index 0000000..5b5b83b
--- /dev/null
+++ b/src/gui/panels/history.h
@@ -0,0 +1,65 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * history.h - prototypes pour le panneau de la liste des évolutions d'utilisateur(s)
+ *
+ * Copyright (C) 2015 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#ifndef _GUI_PANELS_HISTORY_H
+#define _GUI_PANELS_HISTORY_H
+
+
+#include <i18n.h>
+
+
+#include "panel.h"
+
+
+
+#define PANEL_HISTORY_ID _("History")
+
+
+#define G_TYPE_HISTORY_PANEL g_history_panel_get_type()
+#define G_HISTORY_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_history_panel_get_type(), GHistoryPanel))
+#define G_IS_HISTORY_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_history_panel_get_type()))
+#define G_HISTORY_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_HISTORY_PANEL, GHistoryPanelClass))
+#define G_IS_HISTORY_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_HISTORY_PANEL))
+#define G_HISTORY_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_HISTORY_PANEL, GHistoryPanelClass))
+
+
+/* Panneau de la liste des évolutions utilisateur(s) (instance) */
+typedef struct _GHistoryPanel GHistoryPanel;
+
+/* Panneau de la liste des évolutions utilisateur(s) (classe) */
+typedef struct _GHistoryPanelClass GHistoryPanelClass;
+
+
+/* Indique le type définit pour un panneau d'affichage des symboles. */
+GType g_history_panel_get_type(void);
+
+/* Crée un panneau d'affichage des symboles. */
+GEditorItem *g_history_panel_new(GObject *);
+
+/* Construit et intègre un panneau d'affichage des symboles. */
+GPanelItem *create_history_panel(GObject *);
+
+
+
+#endif /* _GUI_PANELS_HISTORY_H */
diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c
index 41d3b0a..8a46025 100644
--- a/src/gui/panels/panel.c
+++ b/src/gui/panels/panel.c
@@ -32,6 +32,7 @@
#include "bookmarks.h"
#include "glance.h"
+#include "history.h"
#include "log.h"
#include "panel-int.h"
#include "regedit.h"
@@ -383,6 +384,9 @@ void load_main_panels(GObject *ref)
item = create_symbols_panel(ref);
g_panel_item_dock(item);
+ item = create_history_panel(ref);
+ g_panel_item_dock(item);
+
item = create_strings_panel(ref);
g_panel_item_dock(item);
diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c
index 9b32aa5..2a9d612 100644
--- a/src/gui/panels/symbols.c
+++ b/src/gui/panels/symbols.c
@@ -89,10 +89,10 @@ typedef enum _SymbolsColumn
} SymbolsColumn;
-/* Initialise la classe des panneaux d'aperçu de graphiques. */
+/* Initialise la classe des panneaux d'affichage des symboles. */
static void g_symbols_panel_class_init(GSymbolsPanelClass *);
-/* Initialise une instance de panneau d'aperçu de graphiques. */
+/* Initialise une instance de panneau d'affichage des symboles. */
static void g_symbols_panel_init(GSymbolsPanel *);
/* Supprime toutes les références externes. */
@@ -160,7 +160,7 @@ static bool is_symbol_filtered(GSymbolsPanel *, const GBinSymbol *);
/* ---------------------------------------------------------------------------------- */
-/* Indique le type définit pour un panneau d'aperçu de graphiques. */
+/* Indique le type définit pour un panneau d'affichage des symboles. */
G_DEFINE_TYPE(GSymbolsPanel, g_symbols_panel, G_TYPE_PANEL_ITEM);
@@ -168,7 +168,7 @@ G_DEFINE_TYPE(GSymbolsPanel, g_symbols_panel, G_TYPE_PANEL_ITEM);
* *
* Paramètres : klass = classe à initialiser. *
* *
-* Description : Initialise la classe des panneaux d'aperçu de graphiques. *
+* Description : Initialise la classe des panneaux d'affichage des symboles. *
* *
* Retour : - *
* *
@@ -219,7 +219,7 @@ static void g_symbols_panel_class_init(GSymbolsPanelClass *klass)
* *
* Paramètres : panel = instance à initialiser. *
* *
-* Description : Initialise une instance de panneau d'aperçu de graphiques. *
+* Description : Initialise une instance de panneau d'affichage des symboles. *
* *
* Retour : - *
* *
diff --git a/themes/clean.png b/themes/clean.png
new file mode 100644
index 0000000..f8f8c78
--- /dev/null
+++ b/themes/clean.png
Binary files differ
diff --git a/themes/icons.css b/themes/icons.css
new file mode 100644
index 0000000..4986ab2
--- /dev/null
+++ b/themes/icons.css
@@ -0,0 +1,27 @@
+
+#img-undo {
+
+ background-image: url("undo.png");
+ background-repeat: space;
+
+ padding-right: 10px;
+
+}
+
+#img-redo {
+
+ background-image: url("redo.png");
+ background-repeat: space;
+
+ padding-right: 10px;
+
+}
+
+#img-clean {
+
+ background-image: url("clean.png");
+ background-repeat: space;
+
+ padding-right: 10px;
+
+}
diff --git a/themes/redo.png b/themes/redo.png
new file mode 100644
index 0000000..9fb3199
--- /dev/null
+++ b/themes/redo.png
Binary files differ
diff --git a/themes/undo.png b/themes/undo.png
new file mode 100644
index 0000000..55b8c34
--- /dev/null
+++ b/themes/undo.png
Binary files differ