Commit 71b8321e authored by Gerd Moellmann's avatar Gerd Moellmann

(x_update_window_end): Add parameter

MOUSE_FACE_OVERWRITTEN_P.  If set, arrange for a mouse-highlight
redisplay in XTframe_up_to_date.
(x_clear_mouse_face): New function.
(x_redisplay_interface): Add pointer to x_clear_mouse_face.
parent 64d1e7d3
...@@ -398,7 +398,7 @@ enum draw_glyphs_face ...@@ -398,7 +398,7 @@ enum draw_glyphs_face
DRAW_IMAGE_SUNKEN DRAW_IMAGE_SUNKEN
}; };
static void x_update_window_end P_ ((struct window *, int)); static void x_update_window_end P_ ((struct window *, int, int));
static void frame_to_window_pixel_xy P_ ((struct window *, int *, int *)); static void frame_to_window_pixel_xy P_ ((struct window *, int *, int *));
void x_delete_display P_ ((struct x_display_info *)); void x_delete_display P_ ((struct x_display_info *));
static unsigned int x_x_to_emacs_modifiers P_ ((struct x_display_info *, static unsigned int x_x_to_emacs_modifiers P_ ((struct x_display_info *,
...@@ -657,24 +657,45 @@ x_draw_vertical_border (w) ...@@ -657,24 +657,45 @@ x_draw_vertical_border (w)
} }
/* End update of window W (which is equal to updated_window). Draw /* End update of window W (which is equal to updated_window).
vertical borders between horizontally adjacent windows, and display
W's cursor if CURSOR_ON_P is non-zero. W may be a menu bar Draw vertical borders between horizontally adjacent windows, and
pseudo-window in case we don't have X toolkit support. Such display W's cursor if CURSOR_ON_P is non-zero.
windows don't have a cursor, so don't display it here. */
MOUSE_FACE_OVERWRITTEN_P non-zero means that some row containing
glyphs in mouse-face were overwritten. In that case we have to
make sure that the mouse-highlight is properly redrawn.
W may be a menu bar pseudo-window in case we don't have X toolkit
support. Such windows don't have a cursor, so don't display it
here. */
static void static void
x_update_window_end (w, cursor_on_p) x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
struct window *w; struct window *w;
int cursor_on_p; int cursor_on_p, mouse_face_overwritten_p;
{ {
if (!w->pseudo_window_p) if (!w->pseudo_window_p)
{ {
struct x_display_info *dpyinfo
= FRAME_X_DISPLAY_INFO (XFRAME (w->frame));
BLOCK_INPUT; BLOCK_INPUT;
/* If a row with mouse-face was overwritten, arrange for
XTframe_up_to_date to redisplay the mouse highlight. */
if (mouse_face_overwritten_p)
{
dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
dpyinfo->mouse_face_window = Qnil;
}
if (cursor_on_p) if (cursor_on_p)
x_display_and_set_cursor (w, 1, output_cursor.hpos, x_display_and_set_cursor (w, 1, output_cursor.hpos,
output_cursor.vpos, output_cursor.vpos,
output_cursor.x, output_cursor.y); output_cursor.x, output_cursor.y);
x_draw_vertical_border (w); x_draw_vertical_border (w);
UNBLOCK_INPUT; UNBLOCK_INPUT;
} }
...@@ -710,6 +731,7 @@ XTframe_up_to_date (f) ...@@ -710,6 +731,7 @@ XTframe_up_to_date (f)
if (FRAME_X_P (f)) if (FRAME_X_P (f))
{ {
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
if (dpyinfo->mouse_face_deferred_gc if (dpyinfo->mouse_face_deferred_gc
|| f == dpyinfo->mouse_face_mouse_frame) || f == dpyinfo->mouse_face_mouse_frame)
{ {
...@@ -7079,6 +7101,24 @@ clear_mouse_face (dpyinfo) ...@@ -7079,6 +7101,24 @@ clear_mouse_face (dpyinfo)
dpyinfo->mouse_face_window = Qnil; dpyinfo->mouse_face_window = Qnil;
} }
/* Clear any mouse-face on window W. This function is part of the
redisplay interface, and is called from try_window_id and similar
functions to ensure the mouse-highlight is off. */
static void
x_clear_mouse_face (w)
struct window *w;
{
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (w->frame));
Lisp_Object window;
XSETWINDOW (window, w);
if (EQ (window, dpyinfo->mouse_face_window))
clear_mouse_face (dpyinfo);
}
/* Just discard the mouse face information for frame F, if any. /* Just discard the mouse face information for frame F, if any.
This is used when the size of F is changed. */ This is used when the size of F is changed. */
...@@ -13435,6 +13475,7 @@ static struct redisplay_interface x_redisplay_interface = ...@@ -13435,6 +13475,7 @@ static struct redisplay_interface x_redisplay_interface =
x_update_window_end, x_update_window_end,
XTcursor_to, XTcursor_to,
x_flush, x_flush,
x_clear_mouse_face,
x_get_glyph_overhangs, x_get_glyph_overhangs,
x_fix_overlapping_area x_fix_overlapping_area
}; };
......
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