Commit f60e429a authored by Dmitry Antipov's avatar Dmitry Antipov

Redesign redisplay interface to drop global output_cursor.

* dispextern.h (struct redisplay_interface): Remove cursor_to member.
(toplevel): Remove declaration of output_cursor.
(set_output_cursor, x_cursor_to): Remove prototype.
* window.h (struct window): New member output_cursor.
(output_cursor_to): New function to replace RIF member.
* dispnew.c (redraw_overlapped_rows, update_marginal_area)
(update_text_area, set_window_cursor_after_update): Use it.
* xdisp.c (output_cursor, set_output_cursor, x_cursor_to): Remove.
(x_write_glyphs, x_insert_glyphs, x_clear_end_of_line):
* nsterm.m (ns_update_window_begin, ns_update_window_end):
* w32term.c (x_update_window_begin, x_update_window_end):
* xterm.c (x_update_window_begin, x_update_window_end):
Adjust to use per-window output cursor.
parent 0acfedd3
2013-08-28 Dmitry Antipov <dmantipov@yandex.ru>
Redesign redisplay interface to drop global output_cursor.
* dispextern.h (struct redisplay_interface): Remove cursor_to member.
(toplevel): Remove declaration of output_cursor.
(set_output_cursor, x_cursor_to): Remove prototype.
* window.h (struct window): New member output_cursor.
(output_cursor_to): New function to replace RIF member.
* dispnew.c (redraw_overlapped_rows, update_marginal_area)
(update_text_area, set_window_cursor_after_update): Use it.
* xdisp.c (output_cursor, set_output_cursor, x_cursor_to): Remove.
(x_write_glyphs, x_insert_glyphs, x_clear_end_of_line):
* nsterm.m (ns_update_window_begin, ns_update_window_end):
* w32term.c (x_update_window_begin, x_update_window_end):
* xterm.c (x_update_window_begin, x_update_window_end):
Adjust to use per-window output cursor.
2013-08-27 Paul Eggert <eggert@cs.ucla.edu> 2013-08-27 Paul Eggert <eggert@cs.ucla.edu>
Simplify SELECT_TYPE-related code. Simplify SELECT_TYPE-related code.
......
...@@ -2790,11 +2790,6 @@ struct redisplay_interface ...@@ -2790,11 +2790,6 @@ struct redisplay_interface
void (*update_window_end_hook) (struct window *w, bool cursor_on_p, void (*update_window_end_hook) (struct window *w, bool cursor_on_p,
bool mouse_face_overwritten_p); bool mouse_face_overwritten_p);
/* Move cursor to row/column position VPOS/HPOS, pixel coordinates
Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
are window-relative pixel positions. */
void (*cursor_to) (struct window *w, int vpos, int hpos, int y, int x);
/* Flush the display of frame F. For X, this is XFlush. */ /* Flush the display of frame F. For X, this is XFlush. */
void (*flush_display) (struct frame *f); void (*flush_display) (struct frame *f);
...@@ -3232,9 +3227,6 @@ extern void x_insert_glyphs (struct window *, struct glyph_row *, ...@@ -3232,9 +3227,6 @@ extern void x_insert_glyphs (struct window *, struct glyph_row *,
struct glyph *, enum glyph_row_area, int); struct glyph *, enum glyph_row_area, int);
extern void x_clear_end_of_line (struct window *, struct glyph_row *, extern void x_clear_end_of_line (struct window *, struct glyph_row *,
enum glyph_row_area, int); enum glyph_row_area, int);
extern struct cursor_pos output_cursor;
extern void x_fix_overlapping_area (struct window *, struct glyph_row *, extern void x_fix_overlapping_area (struct window *, struct glyph_row *,
enum glyph_row_area, int); enum glyph_row_area, int);
extern void draw_phys_cursor_glyph (struct window *, extern void draw_phys_cursor_glyph (struct window *,
...@@ -3244,10 +3236,6 @@ extern void get_phys_cursor_geometry (struct window *, struct glyph_row *, ...@@ -3244,10 +3236,6 @@ extern void get_phys_cursor_geometry (struct window *, struct glyph_row *,
struct glyph *, int *, int *, int *); struct glyph *, int *, int *, int *);
extern void erase_phys_cursor (struct window *); extern void erase_phys_cursor (struct window *);
extern void display_and_set_cursor (struct window *, bool, int, int, int, int); extern void display_and_set_cursor (struct window *, bool, int, int, int, int);
extern void set_output_cursor (struct cursor_pos *);
extern void x_cursor_to (struct window *, int, int, int, int);
extern void x_update_cursor (struct frame *, bool); extern void x_update_cursor (struct frame *, bool);
extern void x_clear_cursor (struct window *); extern void x_clear_cursor (struct window *);
extern void x_draw_vertical_border (struct window *w); extern void x_draw_vertical_border (struct window *w);
......
...@@ -3223,8 +3223,8 @@ redraw_overlapped_rows (struct window *w, int yb) ...@@ -3223,8 +3223,8 @@ redraw_overlapped_rows (struct window *w, int yb)
for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
{ {
FRAME_RIF (f)->cursor_to (w, i, 0, row->y, output_cursor_to (w, i, 0, row->y,
area == TEXT_AREA ? row->x : 0); area == TEXT_AREA ? row->x : 0);
if (row->used[area]) if (row->used[area])
FRAME_RIF (f)->write_glyphs (w, row, row->glyphs[area], FRAME_RIF (f)->write_glyphs (w, row, row->glyphs[area],
area, row->used[area]); area, row->used[area]);
...@@ -3481,7 +3481,7 @@ update_window (struct window *w, bool force_p) ...@@ -3481,7 +3481,7 @@ update_window (struct window *w, bool force_p)
/* End the update of window W. Don't set the cursor if we /* End the update of window W. Don't set the cursor if we
paused updating the display because in this case, paused updating the display because in this case,
set_window_cursor_after_update hasn't been called, and set_window_cursor_after_update hasn't been called, and
output_cursor doesn't contain the cursor location. */ W->output_cursor doesn't contain the cursor location. */
rif->update_window_end_hook (w, !paused_p, mouse_face_overwritten_p); rif->update_window_end_hook (w, !paused_p, mouse_face_overwritten_p);
} }
else else
...@@ -3511,7 +3511,7 @@ update_marginal_area (struct window *w, struct glyph_row *updated_row, ...@@ -3511,7 +3511,7 @@ update_marginal_area (struct window *w, struct glyph_row *updated_row,
/* Set cursor to start of glyphs, write them, and clear to the end /* Set cursor to start of glyphs, write them, and clear to the end
of the area. I don't think that something more sophisticated is of the area. I don't think that something more sophisticated is
necessary here, since marginal areas will not be the default. */ necessary here, since marginal areas will not be the default. */
rif->cursor_to (w, vpos, 0, desired_row->y, 0); output_cursor_to (w, vpos, 0, desired_row->y, 0);
if (desired_row->used[area]) if (desired_row->used[area])
rif->write_glyphs (w, updated_row, desired_row->glyphs[area], rif->write_glyphs (w, updated_row, desired_row->glyphs[area],
area, desired_row->used[area]); area, desired_row->used[area]);
...@@ -3549,7 +3549,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos) ...@@ -3549,7 +3549,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
&& !(current_row->mode_line_p && vpos > 0)) && !(current_row->mode_line_p && vpos > 0))
|| current_row->x != desired_row->x) || current_row->x != desired_row->x)
{ {
rif->cursor_to (w, vpos, 0, desired_row->y, desired_row->x); output_cursor_to (w, vpos, 0, desired_row->y, desired_row->x);
if (desired_row->used[TEXT_AREA]) if (desired_row->used[TEXT_AREA])
rif->write_glyphs (w, updated_row, desired_row->glyphs[TEXT_AREA], rif->write_glyphs (w, updated_row, desired_row->glyphs[TEXT_AREA],
...@@ -3692,7 +3692,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos) ...@@ -3692,7 +3692,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
break; break;
} }
rif->cursor_to (w, vpos, start_hpos, desired_row->y, start_x); output_cursor_to (w, vpos, start_hpos, desired_row->y, start_x);
rif->write_glyphs (w, updated_row, start, rif->write_glyphs (w, updated_row, start,
TEXT_AREA, i - start_hpos); TEXT_AREA, i - start_hpos);
changed_p = 1; changed_p = 1;
...@@ -3702,7 +3702,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos) ...@@ -3702,7 +3702,7 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
/* Write the rest. */ /* Write the rest. */
if (i < desired_row->used[TEXT_AREA]) if (i < desired_row->used[TEXT_AREA])
{ {
rif->cursor_to (w, vpos, i, desired_row->y, x); output_cursor_to (w, vpos, i, desired_row->y, x);
rif->write_glyphs (w, updated_row, desired_glyph, rif->write_glyphs (w, updated_row, desired_glyph,
TEXT_AREA, desired_row->used[TEXT_AREA] - i); TEXT_AREA, desired_row->used[TEXT_AREA] - i);
changed_p = 1; changed_p = 1;
...@@ -3724,8 +3724,8 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos) ...@@ -3724,8 +3724,8 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
{ {
/* If old row extends to the end of the text area, clear. */ /* If old row extends to the end of the text area, clear. */
if (i >= desired_row->used[TEXT_AREA]) if (i >= desired_row->used[TEXT_AREA])
rif->cursor_to (w, vpos, i, desired_row->y, output_cursor_to (w, vpos, i, desired_row->y,
desired_row->pixel_width); desired_row->pixel_width);
rif->clear_end_of_line (w, updated_row, TEXT_AREA, -1); rif->clear_end_of_line (w, updated_row, TEXT_AREA, -1);
changed_p = 1; changed_p = 1;
} }
...@@ -3736,8 +3736,8 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos) ...@@ -3736,8 +3736,8 @@ update_text_area (struct window *w, struct glyph_row *updated_row, int vpos)
int xlim; int xlim;
if (i >= desired_row->used[TEXT_AREA]) if (i >= desired_row->used[TEXT_AREA])
rif->cursor_to (w, vpos, i, desired_row->y, output_cursor_to (w, vpos, i, desired_row->y,
desired_row->pixel_width); desired_row->pixel_width);
/* If cursor is displayed at the end of the line, make sure /* If cursor is displayed at the end of the line, make sure
it's cleared. Nowadays we don't have a phys_cursor_glyph it's cleared. Nowadays we don't have a phys_cursor_glyph
...@@ -3836,7 +3836,6 @@ static void ...@@ -3836,7 +3836,6 @@ static void
set_window_cursor_after_update (struct window *w) set_window_cursor_after_update (struct window *w)
{ {
struct frame *f = XFRAME (w->frame); struct frame *f = XFRAME (w->frame);
struct redisplay_interface *rif = FRAME_RIF (f);
int cx, cy, vpos, hpos; int cx, cy, vpos, hpos;
/* Not intended for frame matrix updates. */ /* Not intended for frame matrix updates. */
...@@ -3908,7 +3907,7 @@ set_window_cursor_after_update (struct window *w) ...@@ -3908,7 +3907,7 @@ set_window_cursor_after_update (struct window *w)
Horizontal position is -1 when cursor is on the left fringe. */ Horizontal position is -1 when cursor is on the left fringe. */
hpos = clip_to_bounds (-1, hpos, w->current_matrix->matrix_w - 1); hpos = clip_to_bounds (-1, hpos, w->current_matrix->matrix_w - 1);
vpos = clip_to_bounds (0, vpos, w->current_matrix->nrows - 1); vpos = clip_to_bounds (0, vpos, w->current_matrix->nrows - 1);
rif->cursor_to (w, vpos, hpos, cy, cx); output_cursor_to (w, vpos, hpos, cy, cx);
} }
......
...@@ -720,7 +720,7 @@ Free a pool and temporary objects it refers to (callable from C) ...@@ -720,7 +720,7 @@ Free a pool and temporary objects it refers to (callable from C)
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
NSTRACE (ns_update_window_begin); NSTRACE (ns_update_window_begin);
set_output_cursor (&w->cursor); w->output_cursor = w->cursor;
block_input (); block_input ();
...@@ -756,8 +756,8 @@ Free a pool and temporary objects it refers to (callable from C) ...@@ -756,8 +756,8 @@ Free a pool and temporary objects it refers to (callable from C)
if (cursor_on_p) if (cursor_on_p)
display_and_set_cursor (w, 1, display_and_set_cursor (w, 1,
output_cursor.hpos, output_cursor.vpos, w->output_cursor.hpos, w->output_cursor.vpos,
output_cursor.x, output_cursor.y); w->output_cursor.x, w->output_cursor.y);
if (draw_window_fringes (w, 1)) if (draw_window_fringes (w, 1))
x_draw_vertical_border (w); x_draw_vertical_border (w);
...@@ -1989,9 +1989,6 @@ Free a pool and temporary objects it refers to (callable from C) ...@@ -1989,9 +1989,6 @@ Free a pool and temporary objects it refers to (callable from C)
mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f))); mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f)));
output_cursor.hpos = output_cursor.vpos = 0;
output_cursor.x = -1;
r = [view bounds]; r = [view bounds];
block_input (); block_input ();
...@@ -3978,7 +3975,6 @@ static Lisp_Object ns_string_to_lispmod (const char *s) ...@@ -3978,7 +3975,6 @@ static Lisp_Object ns_string_to_lispmod (const char *s)
ns_after_update_window_line, ns_after_update_window_line,
ns_update_window_begin, ns_update_window_begin,
ns_update_window_end, ns_update_window_end,
x_cursor_to,
ns_flush, ns_flush,
0, /* flush_display_optional */ 0, /* flush_display_optional */
x_clear_window_mouse_face, x_clear_window_mouse_face,
......
...@@ -576,8 +576,7 @@ x_update_begin (struct frame *f) ...@@ -576,8 +576,7 @@ x_update_begin (struct frame *f)
} }
/* Start update of window W. Set output_cursor to the cursor /* Start update of window W. */
position of W. */
static void static void
x_update_window_begin (struct window *w) x_update_window_begin (struct window *w)
...@@ -591,7 +590,7 @@ x_update_window_begin (struct window *w) ...@@ -591,7 +590,7 @@ x_update_window_begin (struct window *w)
SendMessage (w32_system_caret_hwnd, WM_EMACS_HIDE_CARET, 0, 0); SendMessage (w32_system_caret_hwnd, WM_EMACS_HIDE_CARET, 0, 0);
} }
set_output_cursor (&w->cursor); w->output_cursor = w->cursor;
block_input (); block_input ();
...@@ -683,9 +682,9 @@ x_update_window_end (struct window *w, bool cursor_on_p, ...@@ -683,9 +682,9 @@ x_update_window_end (struct window *w, bool cursor_on_p,
block_input (); block_input ();
if (cursor_on_p) if (cursor_on_p)
display_and_set_cursor (w, 1, output_cursor.hpos, display_and_set_cursor (w, 1,
output_cursor.vpos, w->output_cursor.hpos, w->output_cursor.vpos,
output_cursor.x, output_cursor.y); w->output_cursor.x, w->output_cursor.y);
if (draw_window_fringes (w, 1)) if (draw_window_fringes (w, 1))
x_draw_vertical_border (w); x_draw_vertical_border (w);
...@@ -2651,11 +2650,7 @@ x_clear_frame (struct frame *f) ...@@ -2651,11 +2650,7 @@ x_clear_frame (struct frame *f)
/* Clearing the frame will erase any cursor, so mark them all as no /* Clearing the frame will erase any cursor, so mark them all as no
longer visible. */ longer visible. */
mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f))); mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f)));
output_cursor.hpos = output_cursor.vpos = 0;
output_cursor.x = -1;
/* We don't set the output cursor here because there will always
follow an explicit cursor_to. */
block_input (); block_input ();
w32_clear_window (f); w32_clear_window (f);
...@@ -6321,7 +6316,6 @@ static struct redisplay_interface w32_redisplay_interface = ...@@ -6321,7 +6316,6 @@ static struct redisplay_interface w32_redisplay_interface =
x_after_update_window_line, x_after_update_window_line,
x_update_window_begin, x_update_window_begin,
x_update_window_end, x_update_window_end,
x_cursor_to,
x_flush, x_flush,
0, /* flush_display_optional */ 0, /* flush_display_optional */
x_clear_window_mouse_face, x_clear_window_mouse_face,
......
...@@ -236,6 +236,9 @@ struct window ...@@ -236,6 +236,9 @@ struct window
/* Where the cursor actually is. */ /* Where the cursor actually is. */
struct cursor_pos phys_cursor; struct cursor_pos phys_cursor;
/* Internally used for redisplay purposes. */
struct cursor_pos output_cursor;
/* Vertical cursor position as of last update that completed /* Vertical cursor position as of last update that completed
without pause. This is the position of last_point. */ without pause. This is the position of last_point. */
int last_cursor_vpos; int last_cursor_vpos;
...@@ -956,6 +959,22 @@ extern void init_window (void); ...@@ -956,6 +959,22 @@ extern void init_window (void);
extern void syms_of_window (void); extern void syms_of_window (void);
extern void keys_of_window (void); extern void keys_of_window (void);
/* Move cursor to row/column position VPOS/HPOS, pixel coordinates
Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
are window-relative pixel positions. This is always done during
window update, so the position is the future output cursor position
for currently updated window W. */
WINDOW_INLINE void
output_cursor_to (struct window *w, int vpos, int hpos, int y, int x)
{
eassert (w);
w->output_cursor.hpos = hpos;
w->output_cursor.vpos = vpos;
w->output_cursor.x = x;
w->output_cursor.y = y;
}
INLINE_HEADER_END INLINE_HEADER_END
#endif /* not WINDOW_H_INCLUDED */ #endif /* not WINDOW_H_INCLUDED */
...@@ -11445,62 +11445,6 @@ update_menu_bar (struct frame *f, int save_match_data, int hooks_run) ...@@ -11445,62 +11445,6 @@ update_menu_bar (struct frame *f, int save_match_data, int hooks_run)
return hooks_run; return hooks_run;
} }
/***********************************************************************
Output Cursor
***********************************************************************/
#ifdef HAVE_WINDOW_SYSTEM
/* EXPORT:
Nominal cursor position -- where to draw output.
HPOS and VPOS are window relative glyph matrix coordinates.
X and Y are window relative pixel coordinates. */
struct cursor_pos output_cursor;
/* EXPORT:
Set the global variable output_cursor to CURSOR. All cursor
positions are relative to currently updated window. */
void
set_output_cursor (struct cursor_pos *cursor)
{
output_cursor.hpos = cursor->hpos;
output_cursor.vpos = cursor->vpos;
output_cursor.x = cursor->x;
output_cursor.y = cursor->y;
}
/* EXPORT for RIF:
Set a nominal cursor position.
HPOS and VPOS are column/row positions in a window glyph matrix.
X and Y are window text area relative pixel positions.
This is always done during window update, so the position is the
future output cursor position for currently updated window W.
NOTE: W is used only to check whether this function is called
in a consistent manner via the redisplay interface. */
void
x_cursor_to (struct window *w, int vpos, int hpos, int y, int x)
{
eassert (w);
/* Set the output cursor. */
output_cursor.hpos = hpos;
output_cursor.vpos = vpos;
output_cursor.x = x;
output_cursor.y = y;
}
#endif /* HAVE_WINDOW_SYSTEM */
/*********************************************************************** /***********************************************************************
Tool-bars Tool-bars
***********************************************************************/ ***********************************************************************/
...@@ -25790,7 +25734,7 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row, ...@@ -25790,7 +25734,7 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row,
/* Write glyphs. */ /* Write glyphs. */
hpos = start - updated_row->glyphs[updated_area]; hpos = start - updated_row->glyphs[updated_area];
x = draw_glyphs (w, output_cursor.x, x = draw_glyphs (w, w->output_cursor.x,
updated_row, updated_area, updated_row, updated_area,
hpos, hpos + len, hpos, hpos + len,
DRAW_NORMAL_TEXT, 0); DRAW_NORMAL_TEXT, 0);
...@@ -25798,7 +25742,7 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row, ...@@ -25798,7 +25742,7 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row,
/* Invalidate old phys cursor if the glyph at its hpos is redrawn. */ /* Invalidate old phys cursor if the glyph at its hpos is redrawn. */
if (updated_area == TEXT_AREA if (updated_area == TEXT_AREA
&& w->phys_cursor_on_p && w->phys_cursor_on_p
&& w->phys_cursor.vpos == output_cursor.vpos && w->phys_cursor.vpos == w->output_cursor.vpos
&& chpos >= hpos && chpos >= hpos
&& chpos < hpos + len) && chpos < hpos + len)
w->phys_cursor_on_p = 0; w->phys_cursor_on_p = 0;
...@@ -25806,8 +25750,8 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row, ...@@ -25806,8 +25750,8 @@ x_write_glyphs (struct window *w, struct glyph_row *updated_row,
unblock_input (); unblock_input ();
/* Advance the output cursor. */ /* Advance the output cursor. */
output_cursor.hpos += len; w->output_cursor.hpos += len;
output_cursor.x = x; w->output_cursor.x = x;
} }
...@@ -25840,25 +25784,25 @@ x_insert_glyphs (struct window *w, struct glyph_row *updated_row, ...@@ -25840,25 +25784,25 @@ x_insert_glyphs (struct window *w, struct glyph_row *updated_row,
/* Get the width of the region to shift right. */ /* Get the width of the region to shift right. */
shifted_region_width = (window_box_width (w, updated_area) shifted_region_width = (window_box_width (w, updated_area)
- output_cursor.x - w->output_cursor.x
- shift_by_width); - shift_by_width);
/* Shift right. */ /* Shift right. */
frame_x = window_box_left (w, updated_area) + output_cursor.x; frame_x = window_box_left (w, updated_area) + w->output_cursor.x;
frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, output_cursor.y); frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, w->output_cursor.y);
FRAME_RIF (f)->shift_glyphs_for_insert (f, frame_x, frame_y, shifted_region_width, FRAME_RIF (f)->shift_glyphs_for_insert (f, frame_x, frame_y, shifted_region_width,
line_height, shift_by_width); line_height, shift_by_width);
/* Write the glyphs. */ /* Write the glyphs. */
hpos = start - row->glyphs[updated_area]; hpos = start - row->glyphs[updated_area];
draw_glyphs (w, output_cursor.x, row, updated_area, draw_glyphs (w, w->output_cursor.x, row, updated_area,
hpos, hpos + len, hpos, hpos + len,
DRAW_NORMAL_TEXT, 0); DRAW_NORMAL_TEXT, 0);
/* Advance the output cursor. */ /* Advance the output cursor. */
output_cursor.hpos += len; w->output_cursor.hpos += len;
output_cursor.x += shift_by_width; w->output_cursor.x += shift_by_width;
unblock_input (); unblock_input ();
} }
...@@ -25897,16 +25841,16 @@ x_clear_end_of_line (struct window *w, struct glyph_row *updated_row, ...@@ -25897,16 +25841,16 @@ x_clear_end_of_line (struct window *w, struct glyph_row *updated_row,
else else
to_x = min (to_x, max_x); to_x = min (to_x, max_x);
to_y = min (max_y, output_cursor.y + updated_row->height); to_y = min (max_y, w->output_cursor.y + updated_row->height);
/* Notice if the cursor will be cleared by this operation. */ /* Notice if the cursor will be cleared by this operation. */
if (!updated_row->full_width_p) if (!updated_row->full_width_p)
notice_overwritten_cursor (w, updated_area, notice_overwritten_cursor (w, updated_area,
output_cursor.x, -1, w->output_cursor.x, -1,
updated_row->y, updated_row->y,
MATRIX_ROW_BOTTOM_Y (updated_row)); MATRIX_ROW_BOTTOM_Y (updated_row));
from_x = output_cursor.x; from_x = w->output_cursor.x;
/* Translate to frame coordinates. */ /* Translate to frame coordinates. */
if (updated_row->full_width_p) if (updated_row->full_width_p)
...@@ -25922,7 +25866,7 @@ x_clear_end_of_line (struct window *w, struct glyph_row *updated_row, ...@@ -25922,7 +25866,7 @@ x_clear_end_of_line (struct window *w, struct glyph_row *updated_row,
} }
min_y = WINDOW_HEADER_LINE_HEIGHT (w); min_y = WINDOW_HEADER_LINE_HEIGHT (w);
from_y = WINDOW_TO_FRAME_PIXEL_Y (w, max (min_y, output_cursor.y)); from_y = WINDOW_TO_FRAME_PIXEL_Y (w, max (min_y, w->output_cursor.y));
to_y = WINDOW_TO_FRAME_PIXEL_Y (w, to_y); to_y = WINDOW_TO_FRAME_PIXEL_Y (w, to_y);
/* Prevent inadvertently clearing to end of the X window. */ /* Prevent inadvertently clearing to end of the X window. */
......
...@@ -551,8 +551,7 @@ x_update_begin (struct frame *f) ...@@ -551,8 +551,7 @@ x_update_begin (struct frame *f)
} }
/* Start update of window W. Set output_cursor to the cursor /* Start update of window W. */
position of W. */
static void static void
x_update_window_begin (struct window *w) x_update_window_begin (struct window *w)
...@@ -560,7 +559,7 @@ x_update_window_begin (struct window *w) ...@@ -560,7 +559,7 @@ x_update_window_begin (struct window *w)
struct frame *f = XFRAME (WINDOW_FRAME (w)); struct frame *f = XFRAME (WINDOW_FRAME (w));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
set_output_cursor (&w->cursor); w->output_cursor = w->cursor;
block_input (); block_input ();
...@@ -618,9 +617,9 @@ x_update_window_end (struct window *w, bool cursor_on_p, ...@@ -618,9 +617,9 @@ x_update_window_end (struct window *w, bool cursor_on_p,
block_input (); block_input ();
if (cursor_on_p) if (cursor_on_p)
display_and_set_cursor (w, 1, output_cursor.hpos, display_and_set_cursor (w, 1,
output_cursor.vpos, w->output_cursor.hpos, w->output_cursor.vpos,
output_cursor.x, output_cursor.y); w->output_cursor.x, w->output_cursor.y);
if (draw_window_fringes (w, 1)) if (draw_window_fringes (w, 1))
x_draw_vertical_border (w); x_draw_vertical_border (w);
...@@ -2983,11 +2982,7 @@ x_clear_frame (struct frame *f) ...@@ -2983,11 +2982,7 @@ x_clear_frame (struct frame *f)
/* Clearing the frame will erase any cursor, so mark them all as no /* Clearing the frame will erase any cursor, so mark them all as no
longer visible. */ longer visible. */
mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f))); mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f)));
output_cursor.hpos = output_cursor.vpos = 0;
output_cursor.x = -1;
/* We don't set the output cursor here because there will always
follow an explicit cursor_to. */
block_input (); block_input ();
XClearWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f)); XClearWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f));
...@@ -10448,7 +10443,6 @@ static struct redisplay_interface x_redisplay_interface = ...@@ -10448,7 +10443,6 @@ static struct redisplay_interface x_redisplay_interface =
x_after_update_window_line, x_after_update_window_line,
x_update_window_begin, x_update_window_begin,
x_update_window_end, x_update_window_end,
x_cursor_to,
x_flush, x_flush,
#ifdef XFlush #ifdef XFlush
x_flush, x_flush,
......
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