Mercurial > emacs
changeset 47173:06302ff9b201
2002-08-30 Andrew Choi <akochoi@shaw.ca>
* 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).
author | Andrew Choi <akochoi@shaw.ca> |
---|---|
date | Sat, 31 Aug 2002 00:53:12 +0000 |
parents | dfcd4fdf6fb0 |
children | 68836f99f298 |
files | src/ChangeLog src/macterm.c |
diffstat | 2 files changed, 59 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Fri Aug 30 23:16:29 2002 +0000 +++ b/src/ChangeLog Sat Aug 31 00:53:12 2002 +0000 @@ -6,6 +6,11 @@ 2002-08-30 Andrew Choi <akochoi@shaw.ca> + * 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 <lektu@terra.es>
--- a/src/macterm.c Fri Aug 30 23:16:29 2002 +0000 +++ b/src/macterm.c Sat Aug 31 00:53:12 2002 +0000 @@ -443,6 +443,8 @@ 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 @@ } -/* 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 @@ 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 @@ 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 @@ || (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 @@ 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);