diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-10-21 23:11:30 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-10-21 23:11:30 (GMT) |
commit | 085fef16a819cb321fd38e7e0926d3cca863777a (patch) | |
tree | f2f24c6205134338999760f1a4a427b0c6c8be27 /src | |
parent | ec6aa436f4a1ae486feb7a88b2b8e793b59674d4 (diff) |
Cleaned, fixed and improved the rules for the display of view columns.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@416 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/binary-int.h | 3 | ||||
-rw-r--r-- | src/analysis/binary.c | 86 | ||||
-rw-r--r-- | src/analysis/binary.h | 12 | ||||
-rw-r--r-- | src/glibext/gbufferline.c | 20 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 6 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 47 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 4 | ||||
-rw-r--r-- | src/gtkext/gtkblockview.c | 8 | ||||
-rw-r--r-- | src/gtkext/gtkbufferview.c | 15 | ||||
-rw-r--r-- | src/gtkext/gtkbufferview.h | 2 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.c | 9 | ||||
-rw-r--r-- | src/gtkext/gtksourceview.c | 8 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel-int.h | 8 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 111 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.h | 11 | ||||
-rw-r--r-- | src/gui/menus/view.c | 87 | ||||
-rw-r--r-- | src/project.c | 4 |
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 */ |