From baef7fad5e4a7f19926c8722e8ab1e1d426d4433 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 17 Nov 2020 08:30:08 +0100 Subject: Fixed raw data display. --- src/glibext/generators/hex.c | 16 ++++++++++------ src/glibext/generators/hex.h | 2 +- src/glibext/widthtracker.c | 29 +++++++++++++++++++++++++++++ src/glibext/widthtracker.h | 3 +++ src/gtkext/hexdisplay.c | 10 +++++++--- 5 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/glibext/generators/hex.c b/src/glibext/generators/hex.c index 9285e00..7de2d6b 100644 --- a/src/glibext/generators/hex.c +++ b/src/glibext/generators/hex.c @@ -45,6 +45,7 @@ struct _GHexGenerator GBinContent *content; /* Contenu à représenter */ gint left_start; /* Abscisse des impressions */ + gint padding; /* Bourrage supplémentaire */ phys_t bytes_per_line; /* Nombre d'octets par ligne */ @@ -347,7 +348,7 @@ static void g_hex_generator_compute_cursor(const GHexGenerator *generator, gint } else { - x -= (bytes_width + COL_MARGIN); + x -= (bytes_width + COL_MARGIN + generator->padding + COL_MARGIN); phys += (x / class->char_width); @@ -571,6 +572,7 @@ GBinContent *g_hex_generator_get_content(const GHexGenerator *generator) * Paramètres : generator = générateur à ajuster. * * left = position de départ à gauche pour le texte. * * show_pos = affichage des positions sur la gauche ? * +* padding = bourrage entre les colonnes de brut et ASCII. * * width = largeur maximale disponible. * * * * Description : Ajuste la génération à une nouvelle largeur de rendu. * @@ -581,7 +583,7 @@ GBinContent *g_hex_generator_get_content(const GHexGenerator *generator) * * ******************************************************************************/ -bool g_hex_generator_auto_fit(GHexGenerator *generator, gint left, bool show_pos, gint width) +bool g_hex_generator_auto_fit(GHexGenerator *generator, gint left, bool show_pos, gint padding, gint width) { bool result; /* Bilan à faire remonter */ GHexGeneratorClass *class; /* Accès aux informations */ @@ -592,16 +594,14 @@ bool g_hex_generator_auto_fit(GHexGenerator *generator, gint left, bool show_pos class = G_HEX_GENERATOR_GET_CLASS(generator); generator->left_start = left; + generator->padding = padding; if (show_pos) generator->left_start += class->addr_width + COL_MARGIN; for (i = 4; ; i += 4) { - requested = left; - - if (show_pos) - requested += class->addr_width + COL_MARGIN; + requested = generator->left_start; block_count = (i / 4); @@ -609,7 +609,11 @@ bool g_hex_generator_auto_fit(GHexGenerator *generator, gint left, bool show_pos requested += (block_count > 1 ? block_count - 1 : 0) * class->sep_width; requested += COL_MARGIN; + requested += padding; + requested += COL_MARGIN; + requested += i * class->char_width; + requested += COL_MARGIN; /* Limite atteinte ? */ if (requested > width) diff --git a/src/glibext/generators/hex.h b/src/glibext/generators/hex.h index 0a8b1a7..f4aeb03 100644 --- a/src/glibext/generators/hex.h +++ b/src/glibext/generators/hex.h @@ -57,7 +57,7 @@ GHexGenerator *g_hex_generator_new(GBinContent *); GBinContent *g_hex_generator_get_content(const GHexGenerator *); /* Ajuste la génération à une nouvelle largeur de rendu. */ -bool g_hex_generator_auto_fit(GHexGenerator *, gint, bool, gint); +bool g_hex_generator_auto_fit(GHexGenerator *, gint, bool, gint, gint); /* Indique le nombre d'octets programmés constituer une ligne. */ phys_t g_hex_generator_get_bytes_per_line(const GHexGenerator *); diff --git a/src/glibext/widthtracker.c b/src/glibext/widthtracker.c index 33d809b..eba30c1 100644 --- a/src/glibext/widthtracker.c +++ b/src/glibext/widthtracker.c @@ -592,6 +592,32 @@ size_t g_width_tracker_count_columns(const GWidthTracker *tracker) * * * Paramètres : tracker = gestionnaire de largeurs de lignes à mettre jour. * * col = indice de colonne visée. * +* * +* Description : Indique la largeur minimale pour une colonne donnée. * +* * +* Retour : Largeur minimale à imposée, nulle ou positive. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gint g_width_tracker_get_column_min_width(GWidthTracker *tracker, size_t col) +{ + gint result; /* Largeur à renvoyer */ + + assert(col < tracker->col_count); + + result = tracker->min_widths[col]; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : tracker = gestionnaire de largeurs de lignes à mettre jour. * +* col = indice de colonne visée. * * width = largeur minimale à imposer. * * * * Description : Impose une largeur minimale pour une colonne donnée. * @@ -606,6 +632,9 @@ void g_width_tracker_set_column_min_width(GWidthTracker *tracker, size_t col, gi { assert(col < tracker->col_count); + if (width < 0) + width = 0; + tracker->min_widths[col] = width; } diff --git a/src/glibext/widthtracker.h b/src/glibext/widthtracker.h index 4920f9b..113cf8a 100644 --- a/src/glibext/widthtracker.h +++ b/src/glibext/widthtracker.h @@ -79,6 +79,9 @@ GWidthTracker *g_width_tracker_new_restricted(const GWidthTracker *, size_t, siz /* Indique le nombre de colonnes prises en compte. */ size_t g_width_tracker_count_columns(const GWidthTracker *); +/* Indique la largeur minimale pour une colonne donnée. */ +gint g_width_tracker_get_column_min_width(GWidthTracker *, size_t); + /* Impose une largeur minimale pour une colonne donnée. */ void g_width_tracker_set_column_min_width(GWidthTracker *, size_t, gint); diff --git a/src/gtkext/hexdisplay.c b/src/gtkext/hexdisplay.c index 49da03a..f557513 100644 --- a/src/gtkext/hexdisplay.c +++ b/src/gtkext/hexdisplay.c @@ -232,19 +232,23 @@ static void gtk_hex_display_size_allocate(GtkWidget *widget, GtkAllocation *allo GBufferCache *cache; /* Contenu représenté */ gint text_pos; /* Abscisse minimale du texte */ bool show_pos; /* Affichage des positions ? */ + GWidthTracker *tracker; /* Gestionnaire de largeurs */ + gint padding; /* Bourrage supplémentaire */ bool changed; /* Note toute variation */ display = GTK_HEX_DISPLAY(widget); cache = g_buffer_view_get_cache(GTK_BUFFER_DISPLAY(display)->view); - text_pos = g_buffer_cache_get_text_position(cache); - g_object_unref(G_OBJECT(cache)); show_pos = g_display_options_get(GTK_DISPLAY_PANEL(widget)->options, 0); - changed = g_hex_generator_auto_fit(display->generator, text_pos, show_pos, allocation->width); + tracker = g_buffer_cache_get_width_tracker(display->cache); + padding = g_width_tracker_get_column_min_width(tracker, HLC_PADDING); + g_object_unref(G_OBJECT(tracker)); + + changed = g_hex_generator_auto_fit(display->generator, text_pos, show_pos, padding, allocation->width); if (changed) gtk_hex_display_populate_cache(display); -- cgit v0.11.2-87-g4458