summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkgraphview.c
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/gtkgraphview.c
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/gtkgraphview.c')
-rw-r--r--src/gtkext/gtkgraphview.c268
1 files changed, 215 insertions, 53 deletions
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;
-
- }
-
-}
-
-