From 4da87999c234155300b30b01c5a7e221d65e4cc8 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Mon, 20 Nov 2017 09:18:59 +0100 Subject: [PATCH] Fix misbehavior when drawing three-pixel high horizontal dividers (Bug#29353) * src/xterm.c (x_draw_window_divider): * src/w32term.c (w32_draw_window_divider): Fix misbehavior when drawing three-pixel high horizontal dividers (Bug#29353). The misbehavior was noted by Keith David Bershatsky and analyzed by Alan Third. --- src/w32term.c | 12 ++++++++---- src/xterm.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/w32term.c b/src/w32term.c index e62d49dd947..7a3b2cc631f 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -660,21 +660,25 @@ w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1) ? face_last->foreground : FRAME_FOREGROUND_PIXEL (f)); - if (y1 - y0 > x1 - x0 && x1 - x0 > 2) - /* Vertical. */ + if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3)) + /* A vertical divider, at least three pixels wide: Draw first and + last pixels differently. */ { w32_fill_area_abs (f, hdc, color_first, x0, y0, x0 + 1, y1); w32_fill_area_abs (f, hdc, color, x0 + 1, y0, x1 - 1, y1); w32_fill_area_abs (f, hdc, color_last, x1 - 1, y0, x1, y1); } - else if (x1 - x0 > y1 - y0 && y1 - y0 > 3) - /* Horizontal. */ + else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3)) + /* A horizontal divider, at least three pixels high: Draw first and + last pixels differently. */ { w32_fill_area_abs (f, hdc, color_first, x0, y0, x1, y0 + 1); w32_fill_area_abs (f, hdc, color, x0, y0 + 1, x1, y1 - 1); w32_fill_area_abs (f, hdc, color_last, x0, y1 - 1, x1, y1); } else + /* In any other case do not draw the first and last pixels + differently. */ w32_fill_area_abs (f, hdc, color, x0, y0, x1, y1); release_frame_dc (f, hdc); diff --git a/src/xterm.c b/src/xterm.c index 28abfaecde9..1deb7b46013 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -1104,8 +1104,9 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1) : FRAME_FOREGROUND_PIXEL (f)); Display *display = FRAME_X_DISPLAY (f); - if (y1 - y0 > x1 - x0 && x1 - x0 > 2) - /* Vertical. */ + if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3)) + /* A vertical divider, at least three pixels wide: Draw first and + last pixels differently. */ { XSetForeground (display, f->output_data.x->normal_gc, color_first); x_fill_rectangle (f, f->output_data.x->normal_gc, @@ -1117,8 +1118,9 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1) x_fill_rectangle (f, f->output_data.x->normal_gc, x1 - 1, y0, 1, y1 - y0); } - else if (x1 - x0 > y1 - y0 && y1 - y0 > 3) - /* Horizontal. */ + else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3)) + /* A horizontal divider, at least three pixels high: Draw first and + last pixels differently. */ { XSetForeground (display, f->output_data.x->normal_gc, color_first); x_fill_rectangle (f, f->output_data.x->normal_gc, @@ -1132,6 +1134,8 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1) } else { + /* In any other case do not draw the first and last pixels + differently. */ XSetForeground (display, f->output_data.x->normal_gc, color); x_fill_rectangle (f, f->output_data.x->normal_gc, x0, y0, x1 - x0, y1 - y0); -- 2.39.2