From: Eli Zaretskii Date: Wed, 27 Jan 2021 15:52:51 +0000 (+0200) Subject: Fix display of stretches of whitespace in the display margins X-Git-Tag: emacs-28.0.90~4101 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ff0341126918e36777d1b85a3661577442b574cb;p=emacs.git Fix display of stretches of whitespace in the display margins * 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 . --- diff --git a/src/w32term.c b/src/w32term.c index 109aa58d732..0ee805a8526 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -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); diff --git a/src/xdisp.c b/src/xdisp.c index e1e4ff41365..11b9e1becfd 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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; diff --git a/src/xterm.c b/src/xterm.c index a855d2d67aa..744b80c68a0 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -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);