Commit ca45961d authored by Andrew Choi's avatar Andrew Choi
Browse files

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).
parent d5ec54b6
......@@ -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>
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment