summaryrefslogtreecommitdiff
path: root/src/macterm.c
diff options
context:
space:
mode:
authorAndrew Choi <akochoi@shaw.ca>2002-08-31 00:53:12 +0000
committerAndrew Choi <akochoi@shaw.ca>2002-08-31 00:53:12 +0000
commitca45961da55a3dd2b1705ab449b6adb76baa0bea (patch)
tree0ced062412acb99a536808ec0e71bad5dd4d499d /src/macterm.c
parentd5ec54b6eaa660f3c34d64378c31d5293888b2ce (diff)
downloademacs-ca45961da55a3dd2b1705ab449b6adb76baa0bea.tar.gz
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).
Diffstat (limited to 'src/macterm.c')
-rw-r--r--src/macterm.c60
1 files changed, 54 insertions, 6 deletions
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);