From baef7fad5e4a7f19926c8722e8ab1e1d426d4433 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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