From 4563123b929366e93973a1d6aa3269bd7b3f47d6 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 23 Oct 2018 23:16:35 +0200 Subject: Indented code labels in the assembly views. --- src/core/params.c | 3 +++ src/core/params.h | 1 + src/format/symbol.c | 6 +++--- src/glibext/gbinportion.c | 4 ++-- src/glibext/gbuffercache.c | 5 +++-- src/glibext/gbuffercache.h | 2 +- src/glibext/gbufferline.c | 13 +++++-------- src/glibext/gbufferline.h | 6 +++--- src/glibext/gbufferview.c | 5 +++-- src/glibext/gbufferview.h | 2 +- src/glibext/generators/rborder.c | 4 ++-- src/gtkext/gtkblockdisplay.c | 2 ++ src/gtkext/gtkbufferdisplay-int.h | 1 + src/gtkext/gtkbufferdisplay.c | 9 ++++++++- 14 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/core/params.c b/src/core/params.c index 8cc7b3a..d71a0eb 100644 --- a/src/core/params.c +++ b/src/core/params.c @@ -204,6 +204,9 @@ bool load_main_config_parameters(void) param = g_generic_config_create_param(config, MPK_WELCOME_CHECK, CPT_BOOLEAN, false); if (param == NULL) return false; + param = g_generic_config_create_param(config, MPK_LABEL_OFFSET, CPT_INTEGER, 10); + if (param == NULL) return false; + param = g_generic_config_create_param(config, MPK_SELECTION_LINE, CPT_BOOLEAN, true); if (param == NULL) return false; diff --git a/src/core/params.h b/src/core/params.h index bcb6f53..da9dcb9 100644 --- a/src/core/params.h +++ b/src/core/params.h @@ -62,6 +62,7 @@ #define MPK_ELLIPSIS_TAB "gui.editor.panels.ellipsis_tab" #define MPK_WELCOME_STARTUP "gui.editor.panels.welcome.show_at_startup" #define MPK_WELCOME_CHECK "gui.editor.panels.welcome.check_version" +#define MPK_LABEL_OFFSET "gui.editor.views.label_offset" #define MPK_SELECTION_LINE "gui.editor.views.selection_line" #define MPK_TOOLTIP_MAX_CALLS "gui.editor.views.tooltip_max_calls" #define MPK_TOOLTIP_MAX_STRINGS "gui.editor.views.tooltip_max_strings" diff --git a/src/format/symbol.c b/src/format/symbol.c index 9c8a6e0..899740a 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -621,9 +621,9 @@ static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t if (label != NULL) { - g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(label), RTT_LABEL, NULL); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, ":", 1, RTT_PUNCT, NULL); + g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_LABEL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_LABEL, SL(label), RTT_LABEL, NULL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_LABEL, ":", 1, RTT_PUNCT, NULL); free(label); diff --git a/src/glibext/gbinportion.c b/src/glibext/gbinportion.c index 2ffe253..8247910 100644 --- a/src/glibext/gbinportion.c +++ b/src/glibext/gbinportion.c @@ -1138,9 +1138,9 @@ static void g_binary_portion_print(GBinPortion *portion, GBufferLine *line, size if (portion->text[repeat] != NULL) { - g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); + g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_LABEL); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(portion->text[repeat]), RTT_COMMENT, NULL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_LABEL, SL(portion->text[repeat]), RTT_COMMENT, NULL); } diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index 866d696..e4ddf06 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -1466,6 +1466,7 @@ void g_buffer_cache_collect_widths(GBufferCache *cache, size_t index, line_width * last = dernière ligne à dessiner. * * area = position et surface à traiter. * * options = règles d'affichage des colonnes modulables. * +* offsets = décalages supplémentaires à appliquer. * * selected = ordonnée d'une ligne sélectionnée ou NULL. * * list = liste de contenus à mettre en évidence. * * * @@ -1477,7 +1478,7 @@ void g_buffer_cache_collect_widths(GBufferCache *cache, size_t index, line_width * * ******************************************************************************/ -void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, size_t last, const cairo_rectangle_int_t *area, const GDisplayOptions *options, const gint *selected, const segcnt_list *list) +void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, size_t last, const cairo_rectangle_int_t *area, const GDisplayOptions *options, const line_width_summary *offsets, const gint *selected, const segcnt_list *list) { GBufferCacheClass *class; /* Classe des tampons */ gint y; /* Point de départ en ordonnée */ @@ -1515,7 +1516,7 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s line = get_cache_info_line(info, i, cache->content); - g_buffer_line_draw(line, cr, &summary, class->text_pos, y, options, list); + g_buffer_line_draw(line, cr, &summary, class->text_pos, y, options, offsets, list); g_object_unref(G_OBJECT(line)); diff --git a/src/glibext/gbuffercache.h b/src/glibext/gbuffercache.h index 077c5f9..8059357 100644 --- a/src/glibext/gbuffercache.h +++ b/src/glibext/gbuffercache.h @@ -106,7 +106,7 @@ GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *, size_t); void g_buffer_cache_collect_widths(GBufferCache *, size_t, line_width_summary *); /* Imprime une partie choisie du tampon contenant des lignes. */ -void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const GDisplayOptions *, const gint *, const segcnt_list *); +void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const GDisplayOptions *, const line_width_summary *, const gint *, const segcnt_list *); /* Indique l'indice correspondant à une adresse donnée. */ size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool, size_t, size_t); diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 39ef0ce..af27426 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -959,13 +959,6 @@ void g_buffer_line_collect_widths(GBufferLine *line, line_width_summary *summary { width = get_column_width(&line->columns[i]); - - /* - if (i == BLC_ASSEMBLY_HEAD) - assert(width > 0); - */ - - if (i < line->merge_start) summary->max_widths[i] = MAX(summary->max_widths[i], width); @@ -1484,6 +1477,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, * x_init = abscisse du point d'impression de départ. * * y = ordonnée du point d'impression. * * options = règles d'affichage des colonnes modulables. * +* offsets = décalages supplémentaires à appliquer. * * list = liste de contenus à mettre en évidence. * * * * Description : Imprime la ligne de texte représentée. * @@ -1494,7 +1488,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, * * ******************************************************************************/ -void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summary *summary, gint x_init, gint y, const GDisplayOptions *options, const segcnt_list *list) +void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summary *summary, gint x_init, gint y, const GDisplayOptions *options, const line_width_summary *offsets, const segcnt_list *list) { GBufferLineClass *class; /* Stockage de briques de base */ bool has_src_surface; /* Note une présence définie */ @@ -1543,6 +1537,9 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summ { max_width = g_buffer_line_compute_max_width(line, i, summary); + if (max_width == 0) + max_width = offsets->max_widths[i]; + if (max_width > 0) x += max_width + COL_MARGIN; diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index 21b3ec9..3fb21fc 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -44,7 +44,6 @@ #define G_BUFFER_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_LINE, GBufferLineClass)) - /* Représentation de fragments de texte en ligne (instance) */ typedef struct _GBufferLine GBufferLine; @@ -58,6 +57,7 @@ typedef enum _BufferLineColumn BLC_PHYSICAL, /* Position physique */ BLC_VIRTUAL, /* Adresse virtuelle */ BLC_BINARY, /* Contenu sous forme binaire */ + BLC_ASSEMBLY_LABEL, /* Etiquette dans les données */ BLC_ASSEMBLY_HEAD, /* Instruction pour assembleur */ BLC_ASSEMBLY, /* Code pour assembleur */ BLC_COMMENTS, /* Commentaires éventuels */ @@ -74,7 +74,7 @@ typedef enum _BufferLineColumn #define BLC_FIRST BLC_PHYSICAL /* Première colonne toujours affichée */ -#define BLC_DISPLAY BLC_ASSEMBLY_HEAD +#define BLC_DISPLAY BLC_ASSEMBLY_LABEL /* Confort pour l'insertion de texte */ @@ -211,7 +211,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *, const line_width_summ bool g_buffer_line_find_near_coord(const GBufferLine *, col_coord_t *, const line_width_summary *, const GDisplayOptions *, GdkScrollDirection, gint *); /* Imprime la ligne de texte représentée. */ -void g_buffer_line_draw(GBufferLine *, cairo_t *, const line_width_summary *, gint, gint, const GDisplayOptions *, const segcnt_list *); +void g_buffer_line_draw(GBufferLine *, cairo_t *, const line_width_summary *, gint, gint, const GDisplayOptions *, const line_width_summary *, const segcnt_list *); diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c index f3b0147..79a475e 100644 --- a/src/glibext/gbufferview.c +++ b/src/glibext/gbufferview.c @@ -1083,6 +1083,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G * virt_y = ordonnée réelle du point 0 à l'écran. * * area = position et surface à traiter. * * options = règles d'affichage des colonnes modulables. * +* offsets = décalages supplémentaires à appliquer. * * selected = ordonnée d'une ligne sélectionnée ou NULL. * * * * Description : Imprime la visualisation du tampon de lignes quelconques. * @@ -1093,7 +1094,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G * * ******************************************************************************/ -void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const cairo_rectangle_int_t *area, const GDisplayOptions *options, gint *selected) +void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const cairo_rectangle_int_t *area, const GDisplayOptions *options, const line_width_summary *offsets, gint *selected) { gint line_height; /* Hauteur d'une ligne */ gint cr_y; /* Ordonnée pour le dessin */ @@ -1128,7 +1129,7 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const if (selected != NULL) *selected -= cr_y; - g_buffer_cache_draw(view->cache, cr, first, last, area, options, selected, view->highlighted); + g_buffer_cache_draw(view->cache, cr, first, last, area, options, offsets, selected, view->highlighted); } diff --git a/src/glibext/gbufferview.h b/src/glibext/gbufferview.h index 04e4bbb..2a678f6 100644 --- a/src/glibext/gbufferview.h +++ b/src/glibext/gbufferview.h @@ -98,7 +98,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *); bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const GDisplayOptions *); /* Imprime la visualisation du tampon de lignes quelconques. */ -void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, const cairo_rectangle_int_t *, const GDisplayOptions *, gint *); +void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, const cairo_rectangle_int_t *, const GDisplayOptions *, const line_width_summary *, gint *); diff --git a/src/glibext/generators/rborder.c b/src/glibext/generators/rborder.c index 62c374d..640fa2d 100644 --- a/src/glibext/generators/rborder.c +++ b/src/glibext/generators/rborder.c @@ -364,8 +364,8 @@ static void g_border_generator_print(GBorderGenerator *generator, GBufferLine *l text = strdup(generator->start ? ROUTINE_INTRO_MSG : ROUTINE_OUTRO_MSG); g_coding_language_encapsulate_comment(generator->lang, &text); - g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(text), RTT_COMMENT, NULL); + g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_LABEL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_LABEL, SL(text), RTT_COMMENT, NULL); free(text); diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c index a6f16a5..6aaaac6 100644 --- a/src/gtkext/gtkblockdisplay.c +++ b/src/gtkext/gtkblockdisplay.c @@ -464,4 +464,6 @@ void gtk_block_display_override_view_index(GtkBlockDisplay *display, unsigned in panel->view_index = index; panel->options = g_loaded_content_get_display_options(G_LOADED_CONTENT(panel->binary), index); + GTK_BUFFER_DISPLAY(display)->offsets.max_widths[BLC_ASSEMBLY_LABEL] = 0; + } diff --git a/src/gtkext/gtkbufferdisplay-int.h b/src/gtkext/gtkbufferdisplay-int.h index 9a5980f..2d78b1d 100644 --- a/src/gtkext/gtkbufferdisplay-int.h +++ b/src/gtkext/gtkbufferdisplay-int.h @@ -42,6 +42,7 @@ struct _GtkBufferDisplay GtkDisplayPanel parent; /* A laisser en premier */ GBufferView *view; /* Vue sur le contenu affiché */ + line_width_summary offsets; /* Décalages supplémentaires */ cairo_rectangle_int_t caret; /* Emplacement du curseur #1 */ vmpa2t caret_addr; /* Position mémoire du curseur */ diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 60b1f40..6329668 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -186,6 +186,13 @@ static void gtk_buffer_display_class_init(GtkBufferDisplayClass *class) static void gtk_buffer_display_init(GtkBufferDisplay *display) { + int offset; /* Décalage des étiquettes */ + + memset(&display->offsets, 0, sizeof(line_width_summary)); + + g_generic_config_get_value(get_main_configuration(), MPK_LABEL_OFFSET, &offset); + display->offsets.max_widths[BLC_ASSEMBLY_LABEL] = offset; + display->cursor = NULL; } @@ -439,7 +446,7 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr) area.x -= virt_x; virt_y += area.y; - g_buffer_view_draw(display->view, cr, virt_y, &area, parent->options, selected); + g_buffer_view_draw(display->view, cr, virt_y, &area, parent->options, &display->offsets, selected); } -- cgit v0.11.2-87-g4458