summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-06-24 15:04:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-06-24 15:04:46 (GMT)
commita4b70be160203f0c0c50e9ba4d8ab07db08bdeb6 (patch)
tree88eff9a8ccb6bcab73ef5a823fef632c38d0a24b /src/gtkext
parent923776410a0b4d847f09428d93101a8b63c9ae60 (diff)
Updated code to prepare the return of graph views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@245 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/gtkblockview.c4
-rw-r--r--src/gtkext/gtkbufferview.c25
-rw-r--r--src/gtkext/gtkbufferview.h5
-rw-r--r--src/gtkext/gtkgraphview.c268
-rw-r--r--src/gtkext/gtkviewpanel.c43
-rw-r--r--src/gtkext/gtkviewpanel.h6
6 files changed, 292 insertions, 59 deletions
diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c
index a420194..cd2d99d 100644
--- a/src/gtkext/gtkblockview.c
+++ b/src/gtkext/gtkblockview.c
@@ -123,7 +123,7 @@ GtkWidget *gtk_block_view_new(void)
{
GtkBlockView *result; /* Composant à retourner */
- result = gtk_type_new(GTK_TYPE_BLOCK_VIEW);
+ result = g_object_new(GTK_TYPE_BLOCK_VIEW, NULL);
return GTK_WIDGET(result);
@@ -151,6 +151,6 @@ static void gtk_block_view_attach_binary(GtkBlockView *view, GOpenidaBinary *bin
buffer = g_openida_binary_get_disassembled_buffer(binary);
- gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), buffer, addr, code);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer), addr, code);
}
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index c3457e9..99b67ab 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -397,7 +397,7 @@ static void gtk_buffer_view_scroll(GtkBufferView *view)
* *
******************************************************************************/
-void gtk_buffer_view_attach_buffer(GtkBufferView *view, GCodeBuffer *buffer, bool *addr, bool *code)
+void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, bool *addr, bool *code)
{
gint width; /* Largeur de l'objet actuelle */
gint height; /* Hauteur de l'objet actuelle */
@@ -408,10 +408,10 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GCodeBuffer *buffer, boo
g_object_unref(G_OBJECT(view->buffer_view));
}
- view->buffer = buffer;
+ view->buffer = g_buffer_view_get_buffer(buffer);
g_object_ref(G_OBJECT(view->buffer));
- view->buffer_view = g_buffer_view_new(view->buffer);
+ view->buffer_view = buffer;
//gdk_threads_enter();
@@ -436,3 +436,22 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GCodeBuffer *buffer, boo
//gdk_threads_leave();
}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à consulter. *
+* *
+* Description : Fournit la vue associée au tampon de lignes courant. *
+* *
+* Retour : Vue mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBufferView *gtk_buffer_view_get_buffer(const GtkBufferView *view)
+{
+ return view->buffer_view;
+
+}
diff --git a/src/gtkext/gtkbufferview.h b/src/gtkext/gtkbufferview.h
index da04533..df34b72 100644
--- a/src/gtkext/gtkbufferview.h
+++ b/src/gtkext/gtkbufferview.h
@@ -52,7 +52,10 @@ typedef struct _GtkBufferViewClass GtkBufferViewClass;
GType gtk_buffer_view_get_type(void);
/* Prend acte de l'association d'un tampon de lignes. */
-void gtk_buffer_view_attach_buffer(GtkBufferView *, GCodeBuffer *, bool *, bool *);
+void gtk_buffer_view_attach_buffer(GtkBufferView *, GBufferView *, bool *, bool *);
+
+/* Fournit la vue associée au tampon de lignes courant. */
+GBufferView *gtk_buffer_view_get_buffer(const GtkBufferView *);
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index ff020d4..263ab7d 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -25,6 +25,7 @@
#include "gtkblockview.h"
+#include "gtkbufferview.h"
#include "gtkviewpanel-int.h"
@@ -37,6 +38,9 @@ struct _GtkGraphView
GtkRequisition requisition; /* Espace requis d'affichage */ /* A garder ?? */
+ vmpa_t start; /* Début de la portion vue */
+ vmpa_t end; /* Fin de la portion affichée */
+
GtkBlockView **childs; /* Liste des sous-blocs */
size_t childs_count; /* Taille de cette liste */
@@ -69,9 +73,15 @@ static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *);
/* Met à jour l'affichage de la vue sous forme graphique. */
static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *);
+/* Indique la position d'affichage d'une adresse donnée. */
+static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *);
+
/* Réagit à un défilement quelconque. */
static void gtk_graph_view_scroll(GtkGraphView *);
+/* Supprime tout contenu de l'afficheur de code en graphique. */
+static void gtk_graph_view_reset(GtkGraphView *);
+
/* Détermine le type du composant d'affichage en graphique. */
@@ -122,6 +132,7 @@ static void gtk_graph_view_init(GtkGraphView *view)
viewpanel = GTK_VIEW_PANEL(view);
+ viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll;
//binview = GTK_BIN_VIEW(view);
@@ -131,7 +142,7 @@ static void gtk_graph_view_init(GtkGraphView *view)
//binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
view->support = GTK_FIXED(gtk_fixed_new());
- gtk_fixed_set_has_window(view->support, TRUE);
+ gtk_widget_set_has_window(GTK_WIDGET(view->support), TRUE);
g_signal_connect(G_OBJECT(view->support), "expose-event",
G_CALLBACK(gtk_graph_view_expose), view);
@@ -276,6 +287,31 @@ static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event,
/******************************************************************************
* *
+* Paramètres : view = composant GTK à consulter. *
+* addr = adresse à présenter à l'écran. *
+* x = position horizontale au sein du composant. [OUT] *
+* y = position verticale au sein du composant. [OUT] *
+* *
+* Description : Indique la position d'affichage d'une adresse donnée. *
+* *
+* Retour : true si l'adresse fait partie du composant, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, vmpa_t addr, gint *x, gint *y)
+{
+
+
+
+ return false;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = composant GTK à mettre à jour. *
* *
* Description : Réagit à un défilement quelconque. *
@@ -365,6 +401,184 @@ void gtk_graph_view_attach_links(GtkGraphView *view, GtkLinkRenderer **links, si
}
+/******************************************************************************
+* *
+* Paramètres : view = instance GTK à réinitialiser. *
+* *
+* Description : Supprime tout contenu de l'afficheur de code en graphique. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_reset(GtkGraphView *view)
+{
+ size_t i; /* Boucle de parcours */
+
+ view->requisition.width = 0;
+ view->requisition.height = 0;
+
+ view->start = VMPA_MAX;
+ view->end = VMPA_MAX;
+
+ for (i = 0; i < view->links_count; i++)
+ gtk_object_destroy(GTK_OBJECT(view->links[i]));
+
+ if (view->links_count > 0)
+ {
+ free(view->links);
+ view->links = NULL;
+
+ view->links_count = 0;
+
+ }
+
+ for (i = 0; i < view->childs_count; i++)
+ gtk_widget_destroy(GTK_WIDGET(view->childs[i]));
+
+ if (view->childs_count > 0)
+ {
+ free(view->childs);
+ view->childs = NULL;
+
+ view->childs_count = 0;
+
+ }
+
+}
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant d'affichage GTK à mettre à jour. *
+* binary = contenu binaire à l'origine des lignes. *
+* start = première adresse à traiter. *
+* end = première adresse hors cadre de l'opération. *
+* *
+* Description : Définit la liste complète des éléments du futur graphique. *
+* *
+* Retour : Liste d'éléments du graphique à placer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GOpenidaBinary *binary, vmpa_t start, vmpa_t end)
+{
+ GtkViewPanel **result; /* Liste à retourner */
+ size_t *count; /* Nombre d'éléments créés. */
+ GArchInstruction *list; /* Liste des instructions */
+ GCodeBuffer *buffer; /* Tampon brut à découper */
+ bool *addr; /* Affichage des adresses ? */
+ bool *code; /* Affichage du binaire ? */
+ vmpa_t first; /* Début d'un groupe de lignes */
+ GArchInstruction *iter; /* Boucle de parcours */
+ vmpa_t last; /* Fin d'un groupe de lignes */
+ GBufferView *subview; /* Partie affichée du tampon */
+
+ result = NULL;
+
+ count = &view->childs_count;
+ *count = 0;
+
+ list = g_openida_binary_get_instructions(binary);
+ buffer = g_openida_binary_get_disassembled_buffer(binary);
+
+ addr = g_openida_binary_display_addresses_in_text(binary);
+ code = g_openida_binary_display_code_in_text(binary);
+
+ first = start;
+
+ for (iter = g_arch_instruction_find_by_address(list, start, true);
+ iter != NULL;
+ iter = g_arch_instruction_get_next_iter(list, iter, end))
+ {
+ if (g_arch_instruction_has_sources(iter))
+ {
+ result = (GtkViewPanel **)realloc(result, ++(*count) * sizeof(GtkViewPanel *));
+
+ result[*count - 1] = GTK_VIEW_PANEL(gtk_block_view_new());
+
+ gtk_view_panel_show_border(result[*count - 1], true);
+
+ subview = g_buffer_view_new(buffer);
+ //g_buffer_view_restrict(subview, size_t first, size_t last);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[*count - 1]),
+ subview, addr, code);
+
+ first = VMPA_MAX;
+
+ }
+
+ g_arch_instruction_get_location(iter, NULL, NULL, &last);
+ if (first == VMPA_MAX) first = last;
+
+ if (g_arch_instruction_has_destinations(iter))
+ {
+ result = (GtkViewPanel **)realloc(result, ++(*count) * sizeof(GtkViewPanel *));
+
+ result[*count - 1] = GTK_VIEW_PANEL(gtk_block_view_new());
+
+ gtk_view_panel_show_border(result[*count - 1], true);
+
+ subview = g_buffer_view_new(buffer);
+ //g_buffer_view_restrict(subview, size_t first, size_t last);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[*count - 1]),
+ subview, addr, code);
+
+ first = VMPA_MAX;
+
+ }
+
+ }
+
+ if (first != VMPA_MAX)
+ {
+ result = (GtkViewPanel **)realloc(result, ++(*count) * sizeof(GtkViewPanel *));
+
+ result[*count - 1] = GTK_VIEW_PANEL(gtk_block_view_new());
+
+ gtk_view_panel_show_border(result[*count - 1], true);
+
+ subview = g_buffer_view_new(buffer);
+ //g_buffer_view_restrict(subview, size_t first, size_t last);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[*count - 1]),
+ subview, addr, code);
+
+ }
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -424,9 +638,6 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *);
/* Initialise une instance d'afficheur de code en graphique. */
static void gtk_graph_view_init(GtkGraphView *);
-/* Supprime tout contenu de l'afficheur de code en graphique. */
-static void gtk_graph_view_reset(GtkGraphView *);
-
/* Définit les lignes du graphique de représentation. */
static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *);
@@ -524,55 +735,6 @@ static void gtk_graph_view_init(GtkGraphView *view)
-/******************************************************************************
-* *
-* Paramètres : view = instance GTK à réinitialiser. *
-* *
-* Description : Supprime tout contenu de l'afficheur de code en graphique. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void gtk_graph_view_reset(GtkGraphView *view)
-{
- size_t i; /* Boucle de parcours */
-
- view->requisition.width = 0;
- view->requisition.height = 0;
-
- view->start = 0;
- view->end = 0;
-
- for (i = 0; i < view->links_count; i++)
- gtk_object_destroy(view->links[i]);
-
- if (view->links_count > 0)
- {
- free(view->links);
- view->links = NULL;
-
- view->links_count = 0;
-
- }
-
- for (i = 0; i < view->childs_count; i++)
- gtk_widget_destroy(view->childs[i]);
-
- if (view->childs_count > 0)
- {
- free(view->childs);
- view->childs = NULL;
-
- view->childs_count = 0;
-
- }
-
-}
-
-
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 35cfa5c..2dac981 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -323,6 +323,26 @@ static gboolean gtk_view_panel_expose(GtkWidget *widget, GdkEventExpose *event)
/******************************************************************************
* *
+* Paramètres : panel = composant GTK à mettre à jour. *
+* show = état de l'affichage auquel parvenir. *
+* *
+* Description : Définit si une bordure est à afficher. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
+{
+ panel->show_border = show;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : panel = composant GTK à mettre à jour. *
* binary = binaire associé à intégrer. *
* addr = indique si les positions doivent être affichées. *
@@ -457,6 +477,29 @@ GOpenidaBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel)
/******************************************************************************
* *
+* Paramètres : view = composant GTK à manipuler. *
+* addr = adresse à rechercher. *
+* *
+* Description : Indique si la vue contient une addrese donnée. *
+* *
+* Retour : true si l'adresse est présente, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr)
+{
+ gint dummy_x; /* Abscisse pour l'appel */
+ gint dummy_y; /* Ordonnée pour l'appel */
+
+ return panel->get_coordinates(panel, addr, &dummy_x, &dummy_y);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : panel = composant GTK à manipuler. *
* addr = adresse à présenter à l'écran. *
* *
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index ccac08b..12b0e44 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -50,6 +50,9 @@ typedef struct _GtkViewPanelClass GtkViewPanelClass;
/* Détermine le type du composant d'affichage générique. */
GType gtk_view_panel_get_type(void);
+/* Définit si une bordure est à afficher. */
+void gtk_view_panel_show_border(GtkViewPanel *, bool);
+
/* Associe à un panneau d'affichage un binaire chargé. */
void gtk_view_panel_attach_binary(GtkViewPanel *, GOpenidaBinary *, bool *, bool *);
@@ -68,6 +71,9 @@ void gtk_view_panel_set_code_display(const GtkViewPanel *, bool);
/* Fournit le binaire associé à la représentation. */
GOpenidaBinary *gtk_view_panel_get_binary(const GtkViewPanel *);
+/* Indique si la vue contient une addrese donnée. */
+bool gtk_view_panel_contain_address(const GtkViewPanel *, vmpa_t);
+
/* S'assure qu'une adresse donnée est visible à l'écran. */
void gtk_view_panel_scroll_to_address(const GtkViewPanel *, vmpa_t);