From d4239799ad149f65e1e480d898ccb16756f4d518 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 20 Nov 2018 23:23:57 +0100
Subject: Located the caret at the right position in case of minimal widths.

---
 src/glibext/gbufferline.c     | 33 ++++++++++++++++------------
 src/glibext/gbufferline.h     | 10 ++++-----
 src/glibext/gbufferview.c     | 51 ++++++++++++++++++++++++++-----------------
 src/glibext/gbufferview.h     |  8 +++----
 src/gtkext/gtkblockdisplay.c  | 11 +++++++---
 src/gtkext/gtkbufferdisplay.c |  9 +++++---
 6 files changed, 73 insertions(+), 49 deletions(-)

diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index af27426..2a3a04f 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -984,6 +984,7 @@ void g_buffer_line_collect_widths(GBufferLine *line, line_width_summary *summary
 *  Paramètres  : line    = ligne à venir consulter.                           *
 *                index   = indice de la colonne visée.                        *
 *                summary = résumé des largeurs maximales.                     *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                                                                             *
 *  Description : Fournit la largeur d'une colonne finalement appliquée.       *
 *                                                                             *
@@ -993,7 +994,7 @@ void g_buffer_line_collect_widths(GBufferLine *line, line_width_summary *summary
 *                                                                             *
 ******************************************************************************/
 
-gint g_buffer_line_compute_max_width(const GBufferLine *line, BufferLineColumn index, const line_width_summary *summary)
+gint g_buffer_line_compute_max_width(const GBufferLine *line, BufferLineColumn index, const line_width_summary *summary, const line_width_summary *offsets)
 {
     gint result;                            /* Largeur à retourner         */
 
@@ -1005,6 +1006,9 @@ gint g_buffer_line_compute_max_width(const GBufferLine *line, BufferLineColumn i
     else
         result = summary->max_widths[index];
 
+    if (result < offsets->max_widths[index])
+        result = offsets->max_widths[index];
+
     return result;
 
 }
@@ -1044,6 +1048,7 @@ const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *line
 *  Paramètres  : line    = ligne à venir consulter.                           *
 *                summary = résumé des largeurs maximales.                     *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                base    = position jusqu'au segment trouvé. [OUT]            *
 *                offset  = position à la colonne visée. [OUT]                 *
 *                dir     = direction d'un éventuel déplacement en cours.      *
@@ -1058,7 +1063,7 @@ const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *line
 *                                                                             *
 ******************************************************************************/
 
-bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force, col_coord_t *coord)
+bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, const line_width_summary *offsets, gint *base, gint *offset, GdkScrollDirection dir, bool force, col_coord_t *coord)
 {
     bool result;                            /* Bilan à retourner           */
     BufferLineColumn last;                  /* Dernière colonne remplie    */
@@ -1098,7 +1103,7 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar
 
         if (i < line->merge_start)
         {
-            width = g_buffer_line_compute_max_width(line, i, summary);
+            width = g_buffer_line_compute_max_width(line, i, summary, offsets);
 
             /* Si la colonne n'est absolument pas visible, on ne s'arrête pas dessus ! */
             if (width == 0) continue;
@@ -1172,7 +1177,7 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar
                 {
                     if ((i - 1) < line->merge_start)
                     {
-                        width = g_buffer_line_compute_max_width(line, i - 1, summary);
+                        width = g_buffer_line_compute_max_width(line, i - 1, summary, offsets);
 
                         if (width > 0)
                             *base += (width + COL_MARGIN);
@@ -1250,6 +1255,7 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar
 *  Paramètres  : line    = ligne à venir consulter.                           *
 *                summary = résumé des largeurs maximales.                     *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                base    = position jusqu'au segment trouvé. [OUT]            *
 *                offset  = position à la colonne visée. [OUT]                 *
 *                dir     = direction d'un éventuel déplacement en cours.      *
@@ -1263,13 +1269,13 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar
 *                                                                             *
 ******************************************************************************/
 
-const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force)
+const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, const line_width_summary *offsets, gint *base, gint *offset, GdkScrollDirection dir, bool force)
 {
     const line_segment *result;             /* Trouvaille à retourner      */
     col_coord_t coord;                      /* Emplacement du contenu visé */
     bool status;                            /* Bilan de la localisation    */
 
-    status = g_buffer_line_get_coord_at(line, summary, options, base, offset, dir, force, &coord);
+    status = g_buffer_line_get_coord_at(line, summary, options, offsets, base, offset, dir, force, &coord);
 
     if (status)
         result = g_buffer_line_get_segment_from_coord(line, &coord);
@@ -1286,6 +1292,7 @@ const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const
 *  Paramètres  : line    = ligne à venir consulter.                           *
 *                summary = résumé des largeurs maximales.                     *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                base    = position jusqu'au segment trouvé. [OUT]            *
 *                offset  = position à la colonne visée. [OUT]                 *
 *                dir     = direction d'un éventuel déplacement en cours.      *
@@ -1299,7 +1306,7 @@ const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const
 *                                                                             *
 ******************************************************************************/
 
-GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force)
+GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, const line_width_summary *offsets, gint *base, gint *offset, GdkScrollDirection dir, bool force)
 {
     GObject *result;                        /* Trouvaille à retourner      */
     col_coord_t target;                     /* Emplacement du contenu visé */
@@ -1309,7 +1316,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_
 
     result = NULL;
 
-    status = g_buffer_line_get_coord_at(line, summary, options, base, offset, dir, force, &target);
+    status = g_buffer_line_get_coord_at(line, summary, options, offsets, base, offset, dir, force, &target);
 
     if (status)
     {
@@ -1338,6 +1345,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_
 *                coord   = cordonnées à consulter puis renseigner. [OUT]      *
 *                summary = résumé des largeurs maximales.                     *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                dir     = orientation des recherches.                        *
 *                offset  = décalage pour amener à l'extrémité nouvelle. [OUT] *
 *                                                                             *
@@ -1349,7 +1357,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_
 *                                                                             *
 ******************************************************************************/
 
-bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, const line_width_summary *summary, const GDisplayOptions *options, GdkScrollDirection dir, gint *offset)
+bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, const line_width_summary *summary, const GDisplayOptions *options, const line_width_summary *offsets, GdkScrollDirection dir, gint *offset)
 {
     bool result;                            /* Bilan à retourner           */
     size_t count;                           /* Qté de colonnes en option   */
@@ -1435,7 +1443,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord,
 
             if (displayed)
             {
-                width = g_buffer_line_compute_max_width(line, k, summary);
+                width = g_buffer_line_compute_max_width(line, k, summary, offsets);
 
                 if (width > 0)
                 {
@@ -1535,10 +1543,7 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summ
 
         if (i < line->merge_start)
         {
-            max_width = g_buffer_line_compute_max_width(line, i, summary);
-
-            if (max_width == 0)
-                max_width = offsets->max_widths[i];
+            max_width = g_buffer_line_compute_max_width(line, i, summary, offsets);
 
             if (max_width > 0)
                 x += max_width + COL_MARGIN;
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 3fb21fc..1d36d95 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -193,22 +193,22 @@ typedef struct _col_coord_t
 void g_buffer_line_collect_widths(GBufferLine *, line_width_summary *);
 
 /* Fournit la largeur d'une colonne finalement appliquée. */
-gint g_buffer_line_compute_max_width(const GBufferLine *, BufferLineColumn, const line_width_summary *);
+gint g_buffer_line_compute_max_width(const GBufferLine *, BufferLineColumn, const line_width_summary *, const line_width_summary *);
 
 /* Fournit le segment présent à une position donnée. */
 const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *, const col_coord_t *);
 
 /* Fournit les coordonnées correspondant à une abscisse donnée. */
-bool g_buffer_line_get_coord_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool, col_coord_t *);
+bool g_buffer_line_get_coord_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, const line_width_summary *, gint *, gint *, GdkScrollDirection, bool, col_coord_t *);
 
 /* Donne le segment présent à une abscisse donnée. */
-const line_segment *g_buffer_line_get_segment_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool);
+const line_segment *g_buffer_line_get_segment_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, const line_width_summary *, gint *, gint *, GdkScrollDirection, bool);
 
 /* Donne le créateur présent à une abscisse donnée. */
-GObject *g_buffer_line_get_creator_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool);
+GObject *g_buffer_line_get_creator_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, const line_width_summary *, gint *, gint *, GdkScrollDirection, bool);
 
 /* Fournit des coordonnées voisines selon une direction donnée. */
-bool g_buffer_line_find_near_coord(const GBufferLine *, col_coord_t *, const line_width_summary *, const GDisplayOptions *, GdkScrollDirection, gint *);
+bool g_buffer_line_find_near_coord(const GBufferLine *, col_coord_t *, const line_width_summary *, const GDisplayOptions *, const line_width_summary *, 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 line_width_summary *, const segcnt_list *);
diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c
index 79a475e..bc8cf54 100644
--- a/src/glibext/gbufferview.c
+++ b/src/glibext/gbufferview.c
@@ -77,10 +77,10 @@ static void g_buffer_view_finalize(GBufferView *);
 static void on_buffer_cache_size_changed(const GBufferCache *, bool, size_t, size_t, GBufferView *);
 
 /* Calcule la position idéale de curseur pour un point donné. */
-bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **);
+bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, const line_width_summary *, cairo_rectangle_int_t *, GLineCursor **);
 
 /* Déplace le curseur au sein d'une vue de tampon. */
-static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *);
+static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *, const line_width_summary *);
 
 
 /* Fournit la ligne présente à une ordonnée donnée. */
@@ -579,6 +579,7 @@ gint g_buffer_view_get_height(const GBufferView *view)
 *                x       = abscisse proposée pour le nouvel emplacement.      *
 *                y       = ordonnée proposée pour le nouvel emplacement.      *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                caret   = position du curseur à construire. [OUT]            *
 *                cursor  = emplacement correspondant à cette position. [OUT]  *
 *                                                                             *
@@ -590,7 +591,7 @@ gint g_buffer_view_get_height(const GBufferView *view)
 *                                                                             *
 ******************************************************************************/
 
-bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor)
+bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const GDisplayOptions *options, const line_width_summary *offsets, cairo_rectangle_int_t *caret, GLineCursor **cursor)
 {
     bool result;                            /* Bilan à retourner           */
     gint lheight;                           /* Hauteur d'une ligne         */
@@ -615,7 +616,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G
 
     /* Calcul d'une position */
 
-    result = _g_buffer_view_compute_caret_full(view, x, line, index, options, caret, cursor);
+    result = _g_buffer_view_compute_caret_full(view, x, line, index, options, offsets, caret, cursor);
 
     g_object_unref(G_OBJECT(line));
 
@@ -633,6 +634,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G
 *                line    = ligne correspondant à la position.                 *
 *                index   = indice de cette même ligne dans le tampon.         *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                caret   = position du curseur à construire. [OUT]            *
 *                cursor  = emplacement correspondant à cette position. [OUT]  *
 *                                                                             *
@@ -644,7 +646,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const G
 *                                                                             *
 ******************************************************************************/
 
-bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *line, size_t index, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor)
+bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *line, size_t index, const GDisplayOptions *options, const line_width_summary *offsets, cairo_rectangle_int_t *caret, GLineCursor **cursor)
 {
     bool result;                            /* Bilan à retourner           */
     gint text_pos;                          /* Abscisse de départ du texte */
@@ -668,7 +670,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l
 
     x -= text_pos;
 
-    status = g_buffer_line_get_coord_at(line, &summary, options, &base, &x,
+    status = g_buffer_line_get_coord_at(line, &summary, options, offsets, &base, &x,
                                         GDK_SCROLL_LEFT, true, (col_coord_t []) { { 0 } });
 
     if (!status)
@@ -705,6 +707,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l
 *                ctrl    = indique la demande d'un parcours rapide.           *
 *                dir     = direction du parcours.                             *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                                                                             *
 *  Description : Déplace le curseur au sein d'une vue de tampon.              *
 *                                                                             *
@@ -714,7 +717,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l
 *                                                                             *
 ******************************************************************************/
 
-static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, size_t index, cairo_rectangle_int_t *caret, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options)
+static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, size_t index, cairo_rectangle_int_t *caret, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options, const line_width_summary *offsets)
 {
     bool result;                            /* Bilan à retourner           */
     gint text_pos;                          /* Abscisse de départ du texte */
@@ -740,7 +743,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line
 
     /* Déplacement au sein du segment courant ? */
 
-    result = g_buffer_line_get_coord_at(line, &summary, options, &base, &offset, dir, false, &coord);
+    result = g_buffer_line_get_coord_at(line, &summary, options, offsets, &base, &offset, dir, false, &coord);
 
     if (result)
     {
@@ -756,7 +759,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line
     {
         base = 0;
 
-        result = g_buffer_line_find_near_coord(line, &coord, &summary, options, dir, &offset);
+        result = g_buffer_line_find_near_coord(line, &coord, &summary, options, offsets, dir, &offset);
 
     }
 
@@ -778,6 +781,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line
 *                ctrl    = indique la demande d'un parcours rapide.           *
 *                dir     = direction du parcours.                             *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                caret   = position du curseur à faire évoluer. [OUT]         *
 *                cursor  = emplacement correspondant à cette position. [OUT]  *
 *                                                                             *
@@ -789,7 +793,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line
 *                                                                             *
 ******************************************************************************/
 
-bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor)
+bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options, const line_width_summary *offsets, cairo_rectangle_int_t *caret, GLineCursor **cursor)
 {
     bool result;                            /* Bilan à retourner           */
     size_t index;                           /* Indice de ligne de tampon   */
@@ -817,7 +821,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
                 index--;
 
                 other = g_buffer_cache_find_line_by_index(view->cache, index);
-                result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, caret, cursor);
+                result = _g_buffer_view_compute_caret_full(view, caret->x, other, index,
+                                                           options, offsets, caret, cursor);
                 g_object_unref(G_OBJECT(other));
 
             }
@@ -831,7 +836,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
                 index++;
 
                 other = g_buffer_cache_find_line_by_index(view->cache, index);
-                result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, caret, cursor);
+                result = _g_buffer_view_compute_caret_full(view, caret->x, other, index,
+                                                           options, offsets, caret, cursor);
                 g_object_unref(G_OBJECT(other));
 
             }
@@ -840,7 +846,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
 
         case GDK_SCROLL_LEFT:
 
-            moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_LEFT, options);
+            moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_LEFT, options, offsets);
 
             if (moved)
             {
@@ -853,7 +859,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
                 index--;
 
                 other = g_buffer_cache_find_line_by_index(view->cache, index);
-                result = _g_buffer_view_compute_caret_full(view, INT_MAX, other, index, options, caret, cursor);
+                result = _g_buffer_view_compute_caret_full(view, INT_MAX, other, index,
+                                                           options, offsets, caret, cursor);
                 g_object_unref(G_OBJECT(other));
 
             }
@@ -862,7 +869,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
 
         case GDK_SCROLL_RIGHT:
 
-            moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_RIGHT, options);
+            moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_RIGHT, options, offsets);
 
             if (moved)
             {
@@ -877,7 +884,8 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
                 text_pos = g_buffer_cache_get_text_position(view->cache);
 
                 other = g_buffer_cache_find_line_by_index(view->cache, index);
-                result = _g_buffer_view_compute_caret_full(view, text_pos, other, index, options, caret, cursor);
+                result = _g_buffer_view_compute_caret_full(view, text_pos, other, index,
+                                                           options, offsets, caret, cursor);
                 g_object_unref(G_OBJECT(other));
 
             }
@@ -910,6 +918,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
 *                x       = abscisse de la zone principale à traiter.          *
 *                y       = ordonnée de la zone principale à traiter.          *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                                                                             *
 *  Description : Trouve le créateur à l'origine d'un emplacement donné.       *
 *                                                                             *
@@ -919,7 +928,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d
 *                                                                             *
 ******************************************************************************/
 
-GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDisplayOptions *options)
+GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDisplayOptions *options, const line_width_summary *offsets)
 {
     GObject *result;                        /* Trouvaille à faire remonter */
     gint text_pos;                          /* Abscisse de départ du texte */
@@ -957,7 +966,8 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDi
 
     x -= text_pos;
 
-    result = g_buffer_line_get_creator_at(line, &summary, options, (gint []) { 0 }, &x, GDK_SCROLL_LEFT, false);
+    result = g_buffer_line_get_creator_at(line, &summary, options, offsets,
+                                          (gint []) { 0 }, &x, GDK_SCROLL_LEFT, false);
 
     g_object_unref(G_OBJECT(line));
 
@@ -1003,6 +1013,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view)
 *                x       = abscisse de la zone principale à traiter.          *
 *                y       = ordonnée de la zone principale à traiter.          *
 *                options = règles d'affichage des colonnes modulables.        *
+*                offsets = décalages supplémentaires à appliquer.             *
 *                                                                             *
 *  Description : Surligne tous les segments similaires à celui sous la souris.*
 *                                                                             *
@@ -1012,7 +1023,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view)
 *                                                                             *
 ******************************************************************************/
 
-bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const GDisplayOptions *options)
+bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const GDisplayOptions *options, const line_width_summary *offsets)
 {
     bool result;                            /* Besoin à faire remonter     */
     gint text_pos;                          /* Abscisse de départ du texte */
@@ -1056,7 +1067,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const G
 
     x -= text_pos;
 
-    segment = g_buffer_line_get_segment_at(line, &summary, options,
+    segment = g_buffer_line_get_segment_at(line, &summary, options, offsets,
                                            (gint []) { 0 }, &x, GDK_SCROLL_LEFT, true);
 
     g_object_unref(G_OBJECT(line));
diff --git a/src/glibext/gbufferview.h b/src/glibext/gbufferview.h
index 2a678f6..7e29cfd 100644
--- a/src/glibext/gbufferview.h
+++ b/src/glibext/gbufferview.h
@@ -79,15 +79,15 @@ gint g_buffer_view_get_height(const GBufferView *);
 
 
 /* Calcule la position idéale de curseur pour un point donné. */
-bool g_buffer_view_compute_caret_full(GBufferView *, gint, gint, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **);
+bool g_buffer_view_compute_caret_full(GBufferView *, gint, gint, const GDisplayOptions *, const line_width_summary *, cairo_rectangle_int_t *, GLineCursor **);
 
 /* Déplace le curseur au sein d'une vue de tampon. */
-bool g_buffer_view_move_caret(GBufferView *, bool, GdkScrollDirection, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **);
+bool g_buffer_view_move_caret(GBufferView *, bool, GdkScrollDirection, const GDisplayOptions *, const line_width_summary *, cairo_rectangle_int_t *, GLineCursor **);
 
 
 
 /* Trouve le créateur à l'origine d'un emplacement donné. */
-GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const GDisplayOptions *);
+GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const GDisplayOptions *, const line_width_summary *);
 
 
 
@@ -95,7 +95,7 @@ GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const GDisplayOpt
 bool g_buffer_view_unhighlight_segments(GBufferView *);
 
 /* Surligne tous les segments similaires à celui sous la souris. */
-bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const GDisplayOptions *);
+bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const GDisplayOptions *, const line_width_summary *);
 
 /* 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 *, const line_width_summary *, gint *);
diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c
index 6aaaac6..bbba06c 100644
--- a/src/gtkext/gtkblockdisplay.c
+++ b/src/gtkext/gtkblockdisplay.c
@@ -261,7 +261,9 @@ static gboolean gtk_block_display_button_press(GtkWidget *widget, GdkEventButton
 
         view = gtk_buffer_display_get_view(GTK_BUFFER_DISPLAY(display));
 
-        changed = g_buffer_view_highlight_segments(view, real_x, real_y, GTK_DISPLAY_PANEL(display)->options);
+        changed = g_buffer_view_highlight_segments(view, real_x, real_y,
+                                                   GTK_DISPLAY_PANEL(display)->options,
+                                                   &GTK_BUFFER_DISPLAY(display)->offsets);
 
         g_object_unref(G_OBJECT(view));
 
@@ -312,7 +314,8 @@ static gboolean gtk_block_display_query_tooltip(GtkWidget *widget, gint x, gint
     real_y = y;
     gtk_display_panel_compute_real_coord(panel, &real_x, &real_y);
 
-    creator = g_buffer_view_find_creator(GTK_BUFFER_DISPLAY(display)->view, real_x, real_y, panel->options);
+    creator = g_buffer_view_find_creator(GTK_BUFFER_DISPLAY(display)->view, real_x, real_y,
+                                         panel->options, &GTK_BUFFER_DISPLAY(display)->offsets);
 
     if (creator != NULL)
     {
@@ -430,7 +433,9 @@ static bool gtk_block_display_notify_caret_relocation(GtkBlockDisplay *display,
 
     view = gtk_buffer_display_get_view(GTK_BUFFER_DISPLAY(display));
 
-    result = g_buffer_view_highlight_segments(view, area->x, area->y, GTK_DISPLAY_PANEL(display)->options);
+    result = g_buffer_view_highlight_segments(view, area->x, area->y,
+                                              GTK_DISPLAY_PANEL(display)->options,
+                                              &GTK_BUFFER_DISPLAY(display)->offsets);
 
     g_object_unref(G_OBJECT(view));
 
diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c
index 6329668..1989b1c 100644
--- a/src/gtkext/gtkbufferdisplay.c
+++ b/src/gtkext/gtkbufferdisplay.c
@@ -524,7 +524,8 @@ static gboolean gtk_buffer_display_key_press(GtkWidget *widget, GdkEventKey *eve
         ctrl = (event->state & GDK_CONTROL_MASK);
         area = display->caret;
 
-        status = g_buffer_view_move_caret(display->view, ctrl, dir, panel->options, &area, &cursor);
+        status = g_buffer_view_move_caret(display->view, ctrl, dir, panel->options, &display->offsets,
+                                          &area, &cursor);
 
         if (status)
         {
@@ -745,7 +746,8 @@ GObject *gtk_buffer_display_get_active_object(const GtkBufferDisplay *display)
     else
         result = g_buffer_view_find_creator(display->view,
                                             display->caret.x, display->caret.y,
-                                            GTK_DISPLAY_PANEL(display)->options);
+                                            GTK_DISPLAY_PANEL(display)->options,
+                                            &display->offsets);
 
     return result;
 
@@ -833,7 +835,8 @@ static bool _gtk_buffer_display_move_caret_to(GtkBufferDisplay *display, gint x,
 
     panel = GTK_DISPLAY_PANEL(display);
 
-    result = g_buffer_view_compute_caret_full(display->view, x, y, panel->options, &new, &cursor);
+    result = g_buffer_view_compute_caret_full(display->view, x, y, panel->options, &display->offsets,
+                                              &new, &cursor);
 
     if (result)
         gtk_buffer_display_relocate_caret(display, &new, cursor);
-- 
cgit v0.11.2-87-g4458