From ca45961da55a3dd2b1705ab449b6adb76baa0bea Mon Sep 17 00:00:00 2001 From: Andrew Choi Date: Sat, 31 Aug 2002 00:53:12 +0000 Subject: [PATCH] 2002-08-30 Andrew Choi * macterm.c (expose_overlaps): New function (merge code from xterm.c). (expose_window): Use it to fix the display of overlapping rows (merge code from xterm.c). --- src/ChangeLog | 5 +++++ src/macterm.c | 60 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 19b31c74466..086c5463c7f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -6,6 +6,11 @@ 2002-08-30 Andrew Choi + * macterm.c (expose_overlaps): New function (merge code from + xterm.c). + (expose_window): Use it to fix the display of overlapping + rows (merge code from xterm.c). + * macfns.c (Qbox): Add extern declaration. 2002-08-30 Juanma Barranquero diff --git a/src/macterm.c b/src/macterm.c index 460960e7beb..b69cdfa6c10 100644 --- a/src/macterm.c +++ b/src/macterm.c @@ -443,6 +443,8 @@ static void x_draw_bar_cursor P_ ((struct window *, struct glyph_row *, int)); static int x_intersect_rectangles P_ ((Rect *, Rect *, Rect *)); static void expose_frame P_ ((struct frame *, int, int, int, int)); static int expose_window_tree P_ ((struct window *, Rect *)); +static void expose_overlaps P_ ((struct window *, struct glyph_row *, + struct glyph_row *)); static int expose_window P_ ((struct window *, Rect *)); static void expose_area P_ ((struct window *, struct glyph_row *, Rect *, enum glyph_row_area)); @@ -6240,8 +6242,41 @@ x_phys_cursor_in_rect_p (w, r) } -/* Redraw the part of window W intersection rectagle FR. Pixel - coordinates in FR are frame relative. Call this function with +/* Redraw those parts of glyphs rows during expose event handling that + overlap other rows. Redrawing of an exposed line writes over parts + of lines overlapping that exposed line; this function fixes that. + + W is the window being exposed. FIRST_OVERLAPPING_ROW is the first + row in W's current matrix that is exposed and overlaps other rows. + LAST_OVERLAPPING_ROW is the last such row. */ + +static void +expose_overlaps (w, first_overlapping_row, last_overlapping_row) + struct window *w; + struct glyph_row *first_overlapping_row; + struct glyph_row *last_overlapping_row; +{ + struct glyph_row *row; + + for (row = first_overlapping_row; row <= last_overlapping_row; ++row) + if (row->overlapping_p) + { + xassert (row->enabled_p && !row->mode_line_p); + + if (row->used[LEFT_MARGIN_AREA]) + x_fix_overlapping_area (w, row, LEFT_MARGIN_AREA); + + if (row->used[TEXT_AREA]) + x_fix_overlapping_area (w, row, TEXT_AREA); + + if (row->used[RIGHT_MARGIN_AREA]) + x_fix_overlapping_area (w, row, RIGHT_MARGIN_AREA); + } +} + + +/* Redraw the part of window W intersection rectangle FR. Pixel + coordinates in FR are frame-relative. Call this function with input blocked. Value is non-zero if the exposure overwrites mouse-face. */ @@ -6281,7 +6316,8 @@ expose_window (w, fr) int yb = window_text_bottom_y (w); struct glyph_row *row; int cursor_cleared_p; - + struct glyph_row *first_overlapping_row, *last_overlapping_row; + TRACE ((stderr, "expose_window (%d, %d, %d, %d)\n", r.left, r.top, r.right, r.bottom)); @@ -6301,7 +6337,8 @@ expose_window (w, fr) else cursor_cleared_p = 0; - /* Find the first row intersecting the rectangle R. */ + /* Update lines intersecting rectangle R. */ + first_overlapping_row = last_overlapping_row = NULL; for (row = w->current_matrix->rows; row->enabled_p; ++row) @@ -6314,10 +6351,17 @@ expose_window (w, fr) || (r.top >= y0 && r.top < y1) || (r.bottom > y0 && r.bottom < y1)) { + if (row->overlapping_p) + { + if (first_overlapping_row == NULL) + first_overlapping_row = row; + last_overlapping_row = row; + } + if (expose_line (w, row, &r)) mouse_face_overwritten_p = 1; } - + if (y1 >= yb) break; } @@ -6334,9 +6378,13 @@ expose_window (w, fr) if (!w->pseudo_window_p) { + /* Fix the display of overlapping rows. */ + if (first_overlapping_row) + expose_overlaps (w, first_overlapping_row, last_overlapping_row); + /* Draw border between windows. */ x_draw_vertical_border (w); - + /* Turn the cursor on again. */ if (cursor_cleared_p) x_update_window_cursor (w, 1); -- 2.39.5