]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix display of stretches of whitespace in the display margins
authorEli Zaretskii <eliz@gnu.org>
Wed, 27 Jan 2021 15:52:51 +0000 (17:52 +0200)
committerEli Zaretskii <eliz@gnu.org>
Wed, 27 Jan 2021 15:52:51 +0000 (17:52 +0200)
* src/xdisp.c (produce_stretch_glyph): Truncate the stretch glyph
due to line wrap only when drawing in the text area.
* src/xterm.c (x_draw_stretch_glyph_string):
* src/w32term.c (w32_draw_stretch_glyph_string): Fix the
adjustment of the stretch X and width so that stretch glyphs could
be drawn in the left margin.  Reported by Paul W. Rankin
<pwr@bydasein.com>.

src/w32term.c
src/xdisp.c
src/xterm.c

index 109aa58d73240cc69458b440b20efea8231e9056..0ee805a8526f208624396dc1cae0f954548e4b0c 100644 (file)
@@ -2404,14 +2404,29 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
   else if (!s->background_filled_p)
     {
       int background_width = s->background_width;
-      int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
+      int x = s->x, text_left_x = window_box_left_offset (s->w, TEXT_AREA);
 
-      /* Don't draw into left margin, fringe or scrollbar area
-         except for header line and mode line.  */
-      if (x < left_x && !s->row->mode_line_p)
+      /* Don't draw into left fringe or scrollbar area except for
+         header line and mode line.  */
+      if (x < text_left_x && !s->row->mode_line_p)
        {
-         background_width -= left_x - x;
-         x = left_x;
+         int left_x = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (s->w);
+         int right_x = text_left_x;
+
+         if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (s->w))
+           left_x += WINDOW_LEFT_FRINGE_WIDTH (s->w);
+         else
+           right_x -= WINDOW_LEFT_FRINGE_WIDTH (s->w);
+
+         /* Adjust X and BACKGROUND_WIDTH to fit inside the space
+            between LEFT_X and RIGHT_X.  */
+         if (x < left_x)
+           {
+             background_width -= left_x - x;
+             x = left_x;
+           }
+         if (x + background_width > right_x)
+           background_width = right_x - x;
        }
       if (background_width > 0)
        w32_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height);
index e1e4ff413652caa4528afe1f2969ecdb9baef97a..11b9e1becfd345941222c4185cd0f494f5b9fed9 100644 (file)
@@ -29813,7 +29813,8 @@ produce_stretch_glyph (struct it *it)
 #endif /* HAVE_WINDOW_SYSTEM */
     height = 1;
 
-  if (width > 0 && it->line_wrap != TRUNCATE
+  if (width > 0
+      && it->area == TEXT_AREA && it->line_wrap != TRUNCATE
       && it->current_x + width > it->last_visible_x)
     {
       width = it->last_visible_x - it->current_x;
index a855d2d67aacba8c9b0ab6a3937808ed423dbc39..744b80c68a002af14533b9a91717a333c81f8a75 100644 (file)
@@ -3585,14 +3585,29 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
   else if (!s->background_filled_p)
     {
       int background_width = s->background_width;
-      int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
+      int x = s->x, text_left_x = window_box_left_offset (s->w, TEXT_AREA);
 
-      /* Don't draw into left margin, fringe or scrollbar area
-         except for header line and mode line.  */
-      if (x < left_x && !s->row->mode_line_p)
+      /* Don't draw into left fringe or scrollbar area except for
+         header line and mode line.  */
+      if (x < text_left_x && !s->row->mode_line_p)
        {
-         background_width -= left_x - x;
-         x = left_x;
+         int left_x = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (s->w);
+         int right_x = text_left_x;
+
+         if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (s->w))
+           left_x += WINDOW_LEFT_FRINGE_WIDTH (s->w);
+         else
+           right_x -= WINDOW_LEFT_FRINGE_WIDTH (s->w);
+
+         /* Adjust X and BACKGROUND_WIDTH to fit inside the space
+            between LEFT_X and RIGHT_X.  */
+         if (x < left_x)
+           {
+             background_width -= left_x - x;
+             x = left_x;
+           }
+         if (x + background_width > right_x)
+           background_width = right_x - x;
        }
       if (background_width > 0)
        x_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height);