summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/binary-int.h3
-rw-r--r--src/analysis/binary.c86
-rw-r--r--src/analysis/binary.h12
-rw-r--r--src/glibext/gbufferline.c20
-rw-r--r--src/glibext/gbufferline.h6
-rw-r--r--src/glibext/gcodebuffer.c47
-rw-r--r--src/glibext/gcodebuffer.h4
-rw-r--r--src/gtkext/gtkblockview.c8
-rw-r--r--src/gtkext/gtkbufferview.c15
-rw-r--r--src/gtkext/gtkbufferview.h2
-rw-r--r--src/gtkext/gtkgraphview.c9
-rw-r--r--src/gtkext/gtksourceview.c8
-rw-r--r--src/gtkext/gtkviewpanel-int.h8
-rw-r--r--src/gtkext/gtkviewpanel.c111
-rw-r--r--src/gtkext/gtkviewpanel.h11
-rw-r--r--src/gui/menus/view.c87
-rw-r--r--src/project.c4
17 files changed, 192 insertions, 249 deletions
diff --git a/src/analysis/binary-int.h b/src/analysis/binary-int.h
index 28d4594..fa06a25 100644
--- a/src/analysis/binary-int.h
+++ b/src/analysis/binary-int.h
@@ -77,7 +77,7 @@ struct _GLoadedBinary
size_t decbuf_count; /* Taille des tableaux */
size_t defsrc; /* Fichier source principal */
- bool text_display[BVW_COUNT][2]; /* Position et code binaire #1 */
+ bool col_display[BVW_COUNT][BLC_DISPLAY];/* Position et code binaire */
bool lines_display; /* Affichage des lignes */
};
@@ -90,6 +90,7 @@ struct _GLoadedBinaryClass
/* Signaux */
void (* disassembly_done) (GLoadedBinary *);
+ void (* display_changed) (GLoadedBinary *, BinaryView, BufferLineColumn);
};
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 18dca8c..6c8bcba 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -41,6 +41,7 @@
#include "../common/extstr.h"
#include "../common/cpp.h"
#include "../core/params.h"
+#include "../glibext/chrysamarshal.h"
@@ -117,6 +118,14 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ g_signal_new("display-changed",
+ G_TYPE_LOADED_BINARY,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GLoadedBinaryClass, display_changed),
+ NULL, NULL,
+ g_cclosure_user_marshal_VOID__ENUM_ENUM,
+ G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
+
}
@@ -144,12 +153,15 @@ static void g_loaded_binary_init(GLoadedBinary *binary)
binary->storages[DBF_SEGMENTS_DISPLAY] = DBS_ALL_LOCAL;
binary->storages[DBF_BOOKMARKS] = DBS_ALL_LOCAL;
- binary->text_display[BVW_BLOCK][0] = true;
- binary->text_display[BVW_BLOCK][1] = true;
- binary->text_display[BVW_BLOCK][2] = true;
- binary->text_display[BVW_GRAPH][0] = false;
- binary->text_display[BVW_GRAPH][1] = false;
- binary->text_display[BVW_GRAPH][2] = false;
+ binary->col_display[BVW_BLOCK][BLC_PHYSICAL] = true;
+ binary->col_display[BVW_BLOCK][BLC_VIRTUAL] = true;
+ binary->col_display[BVW_BLOCK][BLC_BINARY] = true;
+ binary->col_display[BVW_GRAPH][BLC_PHYSICAL] = false;
+ binary->col_display[BVW_GRAPH][BLC_VIRTUAL] = false;
+ binary->col_display[BVW_GRAPH][BLC_BINARY] = false;
+ binary->col_display[BVW_SOURCE][BLC_PHYSICAL] = false;
+ binary->col_display[BVW_SOURCE][BLC_VIRTUAL] = false;
+ binary->col_display[BVW_SOURCE][BLC_BINARY] = false;
binary->lines_display = true;
@@ -1305,39 +1317,60 @@ GCodeBuffer *g_loaded_binary_get_disassembled_buffer(const GLoadedBinary *binary
/******************************************************************************
* *
* Paramètres : binary = élément binaire à consulter. *
-* view = type de représentation visée. *
+* index = indice du fichier à retrouver. *
* *
-* Description : Indique si les adresses doivent apparaître dans le rendu. *
+* Description : Fournit le tampon associé au contenu d'un fichier source. *
* *
-* Retour : Consigne d'affichage. [OUT] *
+* Retour : Tampon mis en place ou NULL si aucun (!). *
* *
* Remarques : - *
* *
******************************************************************************/
-bool *g_loaded_binary_display_addresses_in_text(GLoadedBinary *binary, BinaryView view)
+GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, size_t index)
{
- return &binary->text_display[view][0];
+ GCodeBuffer *result; /* Tampon à retourner */
+
+ if (binary->decbuf_count == 0)
+ result = NULL;
+
+ else if (index >= binary->decbuf_count)
+ result = binary->dec_buffers[binary->defsrc];
+
+ else
+ result = binary->dec_buffers[index];
+
+ return result;
}
/******************************************************************************
* *
-* Paramètres : binary = élément binaire à consulter. *
+* Paramètres : binary = élément binaire à mettre à jour. *
* view = type de représentation visée. *
+* col = indice de colonne dont l'affichage est à modifier. *
+* state = nouvel état de l'affichage. *
* *
-* Description : Indique si le code doit apparaître dans le rendu. *
+* Description : Définit si une colonne donnée doit apparaître dans le rendu. *
* *
-* Retour : Consigne d'affichage. [OUT] *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-bool *g_loaded_binary_display_code_in_text(GLoadedBinary *binary, BinaryView view)
+void g_loaded_binary_set_column_display(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, bool state)
{
- return &binary->text_display[view][1];
+ bool old; /* Ancien état à remplacer */
+
+ old = binary->col_display[view][col];
+
+ if (state != old)
+ {
+ binary->col_display[view][col] = state;
+ g_signal_emit_by_name(binary, "display-changed", view, col);
+ }
}
@@ -1345,30 +1378,19 @@ bool *g_loaded_binary_display_code_in_text(GLoadedBinary *binary, BinaryView vie
/******************************************************************************
* *
* Paramètres : binary = élément binaire à consulter. *
-* index = indice du fichier à retrouver. *
+* view = type de représentation visée. *
* *
-* Description : Fournit le tampon associé au contenu d'un fichier source. *
+* Description : Indique quelles colonnes doivent apparaître dans le rendu. *
* *
-* Retour : Tampon mis en place ou NULL si aucun (!). *
+* Retour : Consigne d'affichage. [OUT] *
* *
* Remarques : - *
* *
******************************************************************************/
-GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, size_t index)
+const bool *g_loaded_binary_get_column_display(GLoadedBinary *binary, BinaryView view)
{
- GCodeBuffer *result; /* Tampon à retourner */
-
- if (binary->decbuf_count == 0)
- result = NULL;
-
- else if (index >= binary->decbuf_count)
- result = binary->dec_buffers[binary->defsrc];
-
- else
- result = binary->dec_buffers[index];
-
- return result;
+ return binary->col_display[view];
}
diff --git a/src/analysis/binary.h b/src/analysis/binary.h
index 17da200..8574f28 100644
--- a/src/analysis/binary.h
+++ b/src/analysis/binary.h
@@ -169,15 +169,15 @@ GArchInstruction *g_loaded_binary_get_instructions(const GLoadedBinary *);
/* Fournit le tampon associé au contenu assembleur d'un binaire. */
GCodeBuffer *g_loaded_binary_get_disassembled_buffer(const GLoadedBinary *);
-/* Indique si les adresses doivent apparaître dans le rendu. */
-bool *g_loaded_binary_display_addresses_in_text(GLoadedBinary *, BinaryView);
-
-/* Indique si le code doit apparaître dans le rendu. */
-bool *g_loaded_binary_display_code_in_text(GLoadedBinary *, BinaryView);
-
/* Fournit le tampon associé au contenu d'un fichier source. */
GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *, size_t);
+/* Définit si une colonne donnée doit apparaître dans le rendu. */
+void g_loaded_binary_set_column_display(GLoadedBinary *, BinaryView, BufferLineColumn, bool);
+
+/* Indique quelles colonnes doivent apparaître dans le rendu. */
+const bool *g_loaded_binary_get_column_display(GLoadedBinary *, BinaryView);
+
/* Indique si les lignes doivent apparaître dans le rendu. */
bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *);
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 758dff7..cb5c267 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -717,11 +717,9 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
/******************************************************************************
* *
-* Paramètres : line = ligne à venir compléter. *
-* merge = précise la première colonne marquant la fusion. [OUT]*
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* Paramètres : line = ligne à venir compléter. *
+* merge = précise la première colonne marquant la fusion. [OUT]*
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Fournit la dernière largeur d'une ligne avec fusion. *
* *
@@ -731,7 +729,7 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
* *
******************************************************************************/
-gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, bool phys, bool virt, bool code)
+gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, const bool *display)
{
gint result; /* Largeur à retourner */
@@ -779,9 +777,7 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)
* max_widths = largeurs de colonne à respecter. *
* x_init = abscisse du point d'impression de départ. *
* y = ordonnée du point d'impression. *
-* phys = indique si les positions doivent être affichées.*
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Imprime la ligne de texte représentée. *
* *
@@ -791,7 +787,7 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)
* *
******************************************************************************/
-void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, bool phys, bool virt, bool code)
+void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, const bool *display)
{
GBufferLineClass *class; /* Stockage de briques de base */
gint x; /* Point de départ d'impression*/
@@ -806,9 +802,7 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
for (i = 0; i < BLC_COUNT; i++)
{
- if (i == BLC_PHYSICAL && !phys) continue;
- if (i == BLC_VIRTUAL && !virt) continue;
- if (i == BLC_BINARY && !code) continue;
+ if (i < BLC_DISPLAY && !display[i]) continue;
draw_segments_of_column(&line->columns[i], cairo, x, y);
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index b96f7a6..8e436d9 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -69,6 +69,8 @@ typedef enum _BufferLineColumn
} BufferLineColumn;
+/* Première colonne toujours affichée */
+#define BLC_DISPLAY BLC_ASSEMBLY_HEAD
/* Confort pour l'insertion de texte */
@@ -113,13 +115,13 @@ char *g_buffer_line_get_text(const GBufferLine *);
gint g_buffer_line_get_column_width(GBufferLine *, BufferLineColumn);
/* Fournit la dernière largeur d'une ligne avec fusion. */
-gint g_buffer_line_get_merge_width(GBufferLine *, BufferLineColumn *, bool, bool, bool);
+gint g_buffer_line_get_merge_width(GBufferLine *, BufferLineColumn *, const bool *);
/* Définit la colonne à partir de laquelle la fusion opère. */
void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);
/* Imprime la ligne de texte représentée. */
-void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, bool, bool, bool);
+void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, const bool *);
/* Exporte la ligne de texte représentée. */
void g_buffer_line_export(GBufferLine *, int, BufferExportType, bool, bool, bool, bool);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 0ac3bb3..1ea8f69 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -182,7 +182,7 @@ static void g_buffer_view_reset_required_height(GBufferView *);
static void g_buffer_view_reset_required_widths(GBufferView *);
/* Calcule les largeurs requises par une visualisation. */
-static void g_buffer_view_compute_required_widths(GBufferView *, bool, bool, bool);
+static void g_buffer_view_compute_required_widths(GBufferView *, const bool *);
@@ -893,9 +893,7 @@ static void g_buffer_view_compute_required_height(GBufferView *view)
/******************************************************************************
* *
* Paramètres : view = visualisation à mettre à jour. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Calcule les largeurs requises par une visualisation. *
* *
@@ -905,7 +903,7 @@ static void g_buffer_view_compute_required_height(GBufferView *view)
* *
******************************************************************************/
-static void g_buffer_view_compute_required_widths(GBufferView *view, bool phys, bool virt, bool code)
+static void g_buffer_view_compute_required_widths(GBufferView *view, const bool *display)
{
GBufferLine **lines; /* Liste des lignes à traiter */
size_t first; /* Première ligne intégrée */
@@ -938,7 +936,7 @@ static void g_buffer_view_compute_required_widths(GBufferView *view, bool phys,
view->max_widths[j] = MAX(view->max_widths[j], width);
}
- width = g_buffer_line_get_merge_width(lines[i], &merge, phys, virt, code);
+ width = g_buffer_line_get_merge_width(lines[i], &merge, display);
view->last_width = MAX(view->last_width, width);
if (merge != BLC_COUNT)
{
@@ -980,10 +978,8 @@ gint g_buffer_view_get_line_height(GBufferView *view)
/******************************************************************************
* *
-* Paramètres : view = visualisation à consulter. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* Paramètres : view = visualisation à consulter. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Fournit la largeur requise par une visualisation. *
* *
@@ -993,7 +989,7 @@ gint g_buffer_view_get_line_height(GBufferView *view)
* *
******************************************************************************/
-gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
+gint g_buffer_view_get_width(GBufferView *view, const bool *display)
{
gint result; /* Taille à retourner */
gint col_width; /* Calcul selon les colonnes */
@@ -1001,7 +997,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
BufferLineColumn i; /* Boucle de parcours */
if (!WIDTHS_CACHED(view))
- g_buffer_view_compute_required_widths(view, phys, virt, code);
+ g_buffer_view_compute_required_widths(view, display);
result = view->left_text;
@@ -1012,9 +1008,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
for (i = 0; i < BLC_COUNT; i++)
{
- if (i == BLC_PHYSICAL && !phys) continue;
- if (i == BLC_VIRTUAL && !virt) continue;
- if (i == BLC_BINARY && !code) continue;
+ if (i < BLC_DISPLAY && !display[i]) continue;
col_width += view->max_widths[i];
@@ -1027,9 +1021,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
for (i = 0; i < view->last_merge; i++)
{
- if (i == BLC_PHYSICAL && !phys) continue;
- if (i == BLC_VIRTUAL && !virt) continue;
- if (i == BLC_BINARY && !code) continue;
+ if (i < BLC_DISPLAY && !display[i]) continue;
full_width += view->max_widths[i];
@@ -1344,14 +1336,12 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
/******************************************************************************
* *
-* Paramètres : view = visualisation à représenter. *
-* cr = contexte graphique dédié à la procédure. *
-* fake_x = abscisse réelle du point 0 à l'écran. *
-* fake_y = ordonnée réelle du point 0 à l'écran. *
-* area = position et surface à traiter. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* Paramètres : view = visualisation à représenter. *
+* cr = contexte graphique dédié à la procédure. *
+* fake_x = abscisse réelle du point 0 à l'écran. *
+* fake_y = ordonnée réelle du point 0 à l'écran. *
+* area = position et surface à traiter. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Imprime la visualisation du tampon de code désassemblé. *
* *
@@ -1361,7 +1351,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
* *
******************************************************************************/
-void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint fake_y, const cairo_rectangle_int_t *area, bool phys, bool virt, bool code)
+void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint fake_y, const cairo_rectangle_int_t *area, const bool *display)
{
gint real_x; /* Abscisse réelle pour tampon */
gint real_y; /* Ordonnée réelle pour tampon */
@@ -1397,8 +1387,7 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint
view->drawing_extra(lines[i], drawable, gc, fake_x, y, view->drawing_data);
*/
- g_buffer_line_draw(lines[i], cr,
- view->max_widths, real_x, y, phys, virt, code);
+ g_buffer_line_draw(lines[i], cr, view->max_widths, real_x, y, display);
y += view->line_height;
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 472d403..1387eb9 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -123,7 +123,7 @@ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *);
gint g_buffer_view_get_line_height(GBufferView *);
/* Fournit la largeur requise par une visualisation. */
-gint g_buffer_view_get_width(GBufferView *, bool, bool, bool);
+gint g_buffer_view_get_width(GBufferView *, const bool *);
/* Fournit la hauteur requise par une visualisation. */
gint g_buffer_view_get_height(const GBufferView *);
@@ -141,7 +141,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *);
void g_buffer_view_highlight_segments(GBufferView *, gint, gint);
/* Imprime la visualisation du tampon de code désassemblé. */
-void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, bool, bool, bool);
+void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, const bool *);
/* Fournit la ligne présente à une ordonnée donnée. */
GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *);
diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c
index 5e0a4cf..c0004b5 100644
--- a/src/gtkext/gtkblockview.c
+++ b/src/gtkext/gtkblockview.c
@@ -59,7 +59,7 @@ static gboolean gtk_block_view_button_press_event(GtkBlockView *, GdkEventButton
static gboolean gtk_block_view_need_redraw(GBufferView *, GtkBlockView *);
/* Prend acte de l'association d'un binaire chargé. */
-static void gtk_block_view_attach_binary(GtkBlockView *, GLoadedBinary *, bool *, bool *);
+static void gtk_block_view_attach_binary(GtkBlockView *, GLoadedBinary *);
@@ -212,8 +212,6 @@ static gboolean gtk_block_view_need_redraw(GBufferView *view, GtkBlockView *bloc
* *
* Paramètres : view = composant GTK à mettre à jour. *
* binary = binaire associé à intégrer. *
-* addr = indique si les positions doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
* *
* Description : Prend acte de l'association d'un binaire chargé. *
* *
@@ -223,7 +221,7 @@ static gboolean gtk_block_view_need_redraw(GBufferView *view, GtkBlockView *bloc
* *
******************************************************************************/
-static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *binary, bool *addr, bool *code)
+static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *binary)
{
GCodeBuffer *buffer; /* Tampon par défaut */
GBufferView *bview; /* Vue sur ce même tampon */
@@ -231,7 +229,7 @@ static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *bina
buffer = g_loaded_binary_get_disassembled_buffer(binary);
bview = g_buffer_view_new(buffer);
- gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), bview, addr, code);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), bview);
g_signal_connect(G_OBJECT(bview), "need-redraw",
G_CALLBACK(gtk_block_view_need_redraw), view);
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 4b515b4..d5780ed 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -380,8 +380,7 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
fake_y = 0;
gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y);
- g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area,
- *pview->display_phys, *pview->display_addr, *pview->display_code);
+ g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area, pview->display);
}
@@ -459,10 +458,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
static void gtk_buffer_view_compute_requested_size(GtkBufferView *view, gint *width, gint *height)
{
if (width != NULL && view->buffer_view != NULL)
- *width = g_buffer_view_get_width(view->buffer_view,
- *GTK_VIEW_PANEL(view)->display_phys,
- *GTK_VIEW_PANEL(view)->display_addr,
- *GTK_VIEW_PANEL(view)->display_code);
+ *width = g_buffer_view_get_width(view->buffer_view, GTK_VIEW_PANEL(view)->display);
if (height != NULL && view->buffer_view != NULL)
*height = g_buffer_view_get_height(view->buffer_view);
@@ -528,9 +524,6 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *view, cairo_t *cairo, co
* *
* Paramètres : view = composant GTK à mettre à jour. *
* buffer = tampon de lignes à encadrer. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
* *
* Description : Prend acte de l'association d'un tampon de lignes. *
* *
@@ -540,7 +533,7 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *view, cairo_t *cairo, co
* *
******************************************************************************/
-void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, /*bool *phys, */bool *addr, bool *code)
+void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer)
{
gint width; /* Largeur de l'objet actuelle */
gint height; /* Hauteur de l'objet actuelle */
@@ -564,7 +557,7 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, /*b
/* Validation finale */
- width = g_buffer_view_get_width(view->buffer_view, true/* FIXME : *phys*/, *addr, *code);
+ width = g_buffer_view_get_width(view->buffer_view, GTK_VIEW_PANEL(view)->display);
height = g_buffer_view_get_height(view->buffer_view);
width += -view->left_text + 1;
diff --git a/src/gtkext/gtkbufferview.h b/src/gtkext/gtkbufferview.h
index 7505cdd..1ee17fe 100644
--- a/src/gtkext/gtkbufferview.h
+++ b/src/gtkext/gtkbufferview.h
@@ -52,7 +52,7 @@ 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 *, GBufferView *, bool *, bool *);
+void gtk_buffer_view_attach_buffer(GtkBufferView *, GBufferView *);
/* 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 7919b32..0265518 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -661,8 +661,6 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
{
GtkViewPanel **result; /* Liste à retourner */
GCodeBuffer *buffer; /* Tampon brut à découper */
- bool *addr; /* Affichage des adresses ? */
- bool *code; /* Affichage du binaire ? */
size_t *count; /* Nombre d'éléments créés. */
GInstrBlock *main_block; /* Premier bloc rattaché */
GInstrBlock **blocks; /* Liste des blocs basiques */
@@ -673,9 +671,6 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
buffer = g_loaded_binary_get_disassembled_buffer(binary);
- addr = GTK_VIEW_PANEL(view)->display_addr;
- code = GTK_VIEW_PANEL(view)->display_code;
-
count = &view->children_count;
main_block = g_binary_routine_get_basic_blocks(routine);
@@ -690,7 +685,7 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
{
result[i] = GTK_VIEW_PANEL(gtk_block_view_new());
gtk_widget_show(GTK_WIDGET(result[i]));
- gtk_view_panel_attach_binary(result[i], binary, addr, code);
+ gtk_view_panel_attach_binary(result[i], binary, BVW_BLOCK);
gtk_view_panel_show_border(result[i], true);
@@ -698,7 +693,7 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
subview = g_buffer_view_new(buffer);
g_buffer_view_restrict(subview, first, last);
- gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview, addr, code);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview);
}
diff --git a/src/gtkext/gtksourceview.c b/src/gtkext/gtksourceview.c
index 4a04427..0b008fa 100644
--- a/src/gtkext/gtksourceview.c
+++ b/src/gtkext/gtksourceview.c
@@ -53,7 +53,7 @@ static void gtk_source_view_class_init(GtkSourceViewClass *);
static void gtk_source_view_init(GtkSourceView *);
/* Prend acte de l'association d'un binaire chargé. */
-static void gtk_source_view_attach_binary(GtkSourceView *, GLoadedBinary *, bool *, bool *);
+static void gtk_source_view_attach_binary(GtkSourceView *, GLoadedBinary *);
@@ -134,8 +134,6 @@ GtkWidget *gtk_source_view_new(void)
* *
* Paramètres : view = composant GTK à mettre à jour. *
* binary = binaire associé à intégrer. *
-* addr = indique si les positions doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
* *
* Description : Prend acte de l'association d'un binaire chargé. *
* *
@@ -145,7 +143,7 @@ GtkWidget *gtk_source_view_new(void)
* *
******************************************************************************/
-static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *binary, bool *addr, bool *code)
+static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *binary)
{
GCodeBuffer *buffer; /* Tampon par défaut */
@@ -153,6 +151,6 @@ static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *bi
/* Si une source existe... */
if (buffer != NULL)
- gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer), addr, code);
+ gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer));
}
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index f89fdcf..49b5195 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -37,7 +37,7 @@
typedef void (* compute_requested_size) (GtkViewPanel *, gint *, gint *);
/* Prend acte de l'association d'un binaire chargé. */
-typedef void (* attach_binary_fc) (GtkViewPanel *, GLoadedBinary *, bool *, bool *);
+typedef void (* attach_binary_fc) (GtkViewPanel *, GLoadedBinary *);
/* Réagit à la sélection externe d'une adresse. */
typedef void (* define_address_fc) (GtkViewPanel *, vmpa_t);
@@ -64,6 +64,8 @@ struct _GtkViewPanel
GtkScrollablePolicy vscroll_policy; /* Politique verticale */
bool show_border; /* Affichage d'une bordure ? */
+ BinaryView content; /* Type de contenu */
+ const bool *display; /* Affichage des colonnes ? */
GLoadedBinary *binary; /* Binaire à visualiser */
@@ -72,10 +74,6 @@ struct _GtkViewPanel
prepare_resize_fc resize; /* Prépare une nouvelle taille */
cache_glance_fc cache_glance; /* Cache de la mignature */
- bool *display_phys; /* Affichage des adresses ? */
- bool *display_addr; /* Affichage des adresses ? */
- bool *display_code; /* Affichage du code binaire ? */
-
};
/* Composant d'affichage générique (classe) */
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 1933add..27799b5 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -68,7 +68,8 @@ static void gtk_view_panel_update_adjustment(GtkViewPanel *, GtkOrientation);
/* Réagit à un défilement chez une barre associée au composant.*/
static void gtk_view_panel_adjustment_value_changed(GtkAdjustment *, GtkViewPanel *);
-
+/* Réagit à un changement des règles d'affichage. */
+static void on_view_panel_binary_display_change(GLoadedBinary *, BinaryView, BufferLineColumn, GtkViewPanel *);
@@ -576,32 +577,29 @@ static void gtk_view_panel_adjustment_value_changed(GtkAdjustment *adj, GtkViewP
/******************************************************************************
* *
-* Paramètres : panel = composant GTK à mettre à jour. *
-* show = état de l'affichage auquel parvenir. *
+* Paramètres : panel = composant GTK à consulter. *
* *
-* Description : Définit si une bordure est à afficher. *
+* Description : Indique le type de contenu représenté par le composant. *
* *
-* Retour : - *
+* Retour : Identifiant d'un type de représentation de contenu. *
* *
* Remarques : - *
* *
******************************************************************************/
-void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
+BinaryView gtk_view_panel_describe_content(const GtkViewPanel *panel)
{
- panel->show_border = show;
+ return panel->content;
}
/******************************************************************************
* *
-* Paramètres : panel = composant GTK à mettre à jour. *
-* binary = binaire associé à intégrer. *
-* addr = indique si les positions doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* Paramètres : panel = composant GTK à mettre à jour. *
+* show = état de l'affichage auquel parvenir. *
* *
-* Description : Associe à un panneau d'affichage un binaire chargé. *
+* Description : Définit si une bordure est à afficher. *
* *
* Retour : - *
* *
@@ -609,46 +607,20 @@ void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
* *
******************************************************************************/
-void gtk_view_panel_attach_binary(GtkViewPanel *panel, GLoadedBinary *binary, bool *addr, bool *code)
-{
- g_object_ref(G_OBJECT(binary));
- panel->binary = binary;
-
- panel->display_phys = addr;
- panel->display_addr = addr;
- panel->display_code = code;
-
- if (panel->attach != NULL) /* REMME ? */
- panel->attach(panel, binary, addr, code);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : panel = composant GTK à consulter. *
-* *
-* Description : Indique si les adresses doivent apparaître dans le rendu. *
-* *
-* Retour : Consigne d'affichage. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel)
+void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
{
- return *panel->display_addr;
+ panel->show_border = show;
}
/******************************************************************************
* *
-* Paramètres : panel = composant GTK à consulter. *
-* state = nouvel état à prendre en compte. *
+* Paramètres : panel = composant GTK à mettre à jour. *
+* binary = binaire associé à intégrer. *
+* view = aspect du binaire à présenter. *
* *
-* Description : Définit si les adresses doivent apparaître dans le rendu. *
+* Description : Associe à un panneau d'affichage un binaire chargé. *
* *
* Retour : - *
* *
@@ -656,49 +628,30 @@ bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel)
* *
******************************************************************************/
-void gtk_view_panel_set_addresses_display(GtkViewPanel *panel, bool state)
+void gtk_view_panel_attach_binary(GtkViewPanel *panel, GLoadedBinary *binary, BinaryView view)
{
- if (*panel->display_addr != state)
- {
- *panel->display_addr = state;
-
- if (panel->resize != NULL)
- panel->resize(panel);
-
- gtk_widget_queue_resize(gtk_widget_get_parent(GTK_WIDGET(panel)));
- gtk_widget_queue_resize(GTK_WIDGET(panel));
- gtk_widget_queue_draw(GTK_WIDGET(panel));
-
- }
-
-}
+ g_object_ref(G_OBJECT(binary));
+ panel->binary = binary;
+ panel->content = view;
+ panel->display = g_loaded_binary_get_column_display(binary, view);
-/******************************************************************************
-* *
-* Paramètres : panel = composant GTK à consulter. *
-* *
-* Description : Indique si le code doit apparaître dans le rendu. *
-* *
-* Retour : Consigne d'affichage. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ if (panel->attach != NULL) /* REMME */
+ panel->attach(panel, binary);
-bool gtk_view_panel_get_code_display(const GtkViewPanel *panel)
-{
- return *panel->display_code;
+ g_signal_connect(binary, "display-changed", G_CALLBACK(on_view_panel_binary_display_change), panel);
}
/******************************************************************************
* *
-* Paramètres : panel = composant GTK à consulter. *
-* state = nouvel état à prendre en compte. *
+* Paramètres : binary = bianire dont les consignes d'affichage ont évolué. *
+* view = type d'affichage à considérer. *
+* col = colonne dont le statut a changé. *
+* panel = composant GTK à consulter. *
* *
-* Description : Définit si le code doit apparaître dans le rendu. *
+* Description : Réagit à un changement des règles d'affichage. *
* *
* Retour : - *
* *
@@ -706,12 +659,10 @@ bool gtk_view_panel_get_code_display(const GtkViewPanel *panel)
* *
******************************************************************************/
-void gtk_view_panel_set_code_display(GtkViewPanel *panel, bool state)
+static void on_view_panel_binary_display_change(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, GtkViewPanel *panel)
{
- if (*panel->display_code != state)
+ if (panel->content == view)
{
- *panel->display_code = state;
-
if (panel->resize != NULL)
panel->resize(panel);
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index c8d0f6c..95f2084 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -50,21 +50,18 @@ typedef struct _GtkViewPanelClass GtkViewPanelClass;
/* Détermine le type du composant d'affichage générique. */
GType gtk_view_panel_get_type(void);
+/* Indique le type de contenu représenté par le composant. */
+BinaryView gtk_view_panel_describe_content(const GtkViewPanel *);
+
/* 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 *, GLoadedBinary *, bool *, bool *);
-
-/* Indique si les adresses doivent apparaître dans le rendu. */
-bool gtk_view_panel_get_addresses_display(const GtkViewPanel *);
+void gtk_view_panel_attach_binary(GtkViewPanel *, GLoadedBinary *, BinaryView);
/* Définit si les adresses doivent apparaître dans le rendu. */
void gtk_view_panel_set_addresses_display(GtkViewPanel *, bool);
-/* Indique si le code doit apparaître dans le rendu. */
-bool gtk_view_panel_get_code_display(const GtkViewPanel *);
-
/* Définit si le code doit apparaître dans le rendu. */
void gtk_view_panel_set_code_display(GtkViewPanel *, bool);
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 511d9db..9abcbd3 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -38,11 +38,8 @@
/* Réagit avec le menu "Affichage -> Vue xxx". */
static void mcb_view_change_support(GtkRadioMenuItem *, GMenuBar *);
-/* Réagit avec le menu "Affichage -> Adresse virtuelle". */
-static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *);
-
-/* Réagit avec le menu "Affichage -> code binaire". */
-static void mcb_view_code(GtkCheckMenuItem *, GMenuBar *);
+/* Réagit avec le menu "Affichage -> (colonne xxx)". */
+static void mcb_view_display_column(GtkCheckMenuItem *, GMenuBar *);
@@ -98,12 +95,19 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+ submenuitem = qck_create_check_menu_item(G_OBJECT(result), "off", _("Physical offset"),
+ G_CALLBACK(mcb_view_display_column), bar);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_PHYSICAL));
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
submenuitem = qck_create_check_menu_item(G_OBJECT(result), "addr", _("Virtual address"),
- G_CALLBACK(mcb_view_addresses), bar);
+ G_CALLBACK(mcb_view_display_column), bar);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_VIRTUAL));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
submenuitem = qck_create_check_menu_item(G_OBJECT(result), "code", _("Binary code"),
- G_CALLBACK(mcb_view_code), bar);
+ G_CALLBACK(mcb_view_display_column), bar);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_BINARY));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
submenuitem = qck_create_menu_separator();
@@ -130,30 +134,50 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar *bar)
{
+ GLoadedBinary *binary; /* Binaire courant */
+ BinaryView content; /* Type de vue active */
+ const bool *display; /* Règles d'affichage courantes*/
GtkWidget *submenuitem; /* Sous-élément de menu */
bool status; /* Consigne d'affichage */
+ binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar));
+
+ content = gtk_view_panel_describe_content(view);
+
+ display = g_loaded_binary_get_column_display(binary, content);
+
+ /* Positions physiques */
+
+ submenuitem = g_object_get_data(G_OBJECT(widget), "off");
+
+ g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
+
+ status = display[BLC_PHYSICAL];
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
+
+ g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar);
+
/* Adresses virtuelles */
submenuitem = g_object_get_data(G_OBJECT(widget), "addr");
- g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_addresses), bar);
+ g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
- status = gtk_view_panel_get_addresses_display(view);
+ status = display[BLC_VIRTUAL];
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
- g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_addresses), bar);
+ g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar);
/* Code binaire */
submenuitem = g_object_get_data(G_OBJECT(widget), "code");
- g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_code), bar);
+ g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
- status = gtk_view_panel_get_code_display(view);
+ status = display[BLC_BINARY];
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
- g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_code), bar);
+ g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar);
}
@@ -227,7 +251,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
* Paramètres : menuitem = élément de menu ayant basculé. *
* bar = barre de menu parente. *
* *
-* Description : Réagit avec le menu "Affichage -> Adresse virtuelle". *
+* Description : Réagit avec le menu "Affichage -> (colonne xxx)". *
* *
* Retour : - *
* *
@@ -235,40 +259,23 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
* *
******************************************************************************/
-static void mcb_view_addresses(GtkCheckMenuItem *menuitem, GMenuBar *bar)
+static void mcb_view_display_column(GtkCheckMenuItem *menuitem, GMenuBar *bar)
{
+ BufferLineColumn col; /* Colonne à traiter */
+ GLoadedBinary *binary; /* Binaire courant */
GtkViewPanel *panel; /* Affichage courant */
+ BinaryView view; /* Type de vue représentée */
gboolean active; /* Etat de sélection du menu */
- panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
- active = gtk_check_menu_item_get_active(menuitem);
-
- gtk_view_panel_set_addresses_display(panel, active);
-
-}
-
+ col = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_col"));
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* bar = barre de menu parente. *
-* *
-* Description : Réagit avec le menu "Affichage -> code binaire". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void mcb_view_code(GtkCheckMenuItem *menuitem, GMenuBar *bar)
-{
- GtkViewPanel *panel; /* Affichage courant */
- gboolean active; /* Etat de sélection du menu */
+ binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar));
panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
+ view = gtk_view_panel_describe_content(panel);
+
active = gtk_check_menu_item_get_active(menuitem);
- gtk_view_panel_set_code_display(panel, active);
+ g_loaded_binary_set_column_display(binary, view, col, active);
}
diff --git a/src/project.c b/src/project.c
index dc0c446..7c98d96 100644
--- a/src/project.c
+++ b/src/project.c
@@ -382,9 +382,7 @@ size_t g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *bina
loaded->views[i] = GTK_VIEW_PANEL(view);
- gtk_view_panel_attach_binary(loaded->views[i], binary,
- g_loaded_binary_display_addresses_in_text(binary, i),
- g_loaded_binary_display_code_in_text(binary, i));
+ gtk_view_panel_attach_binary(loaded->views[i], binary, i);
/* Intégration finale dans un support défilant */