1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-03-06 05:52:32 -08:00

Start redesigning portable mouse highlight. Not compiled.

xdisp.c (get_tool_bar_item, handle_tool_bar_click)
 (note_tool_bar_highlight, draw_glyphs, erase_phys_cursor)
 (show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
 (note_mode_line_or_margin_highlight, note_mouse_highlight)
 (x_clear_window_mouse_face, cancel_mouse_face, expose_frame):
 Replace Display_Info with Mouse_HLInfo everywhere where
 mouse_face_* members were accessed for mouse highlight purposes.
 frame.h (MOUSE_HL_INFO): New macro.
 lisp.h (Mouse_HLInfo): New data type.
 xterm.h (struct x_display_info):
 w32term.h (struct w32_display_info):
 nsterm.h (struct ns_display_info):
 termchar.h (struct tty_display_info): Use it instead of
 mouse_face_* members.
 dispextern.h (DPYINFO_DEFINED): Remove definition.
 (FRAME_X_DISPLAY_INFO): Remove definition.
 (show_mouse_face, clear_mouse_face): Update type of 1st argument.
This commit is contained in:
Eli Zaretskii 2010-10-31 20:50:02 +02:00
parent d009ae66b4
commit 7ea692f66f
9 changed files with 282 additions and 307 deletions

View file

@ -1,3 +1,27 @@
2010-10-31 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (get_tool_bar_item, handle_tool_bar_click)
(note_tool_bar_highlight, draw_glyphs, erase_phys_cursor)
(show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
(note_mode_line_or_margin_highlight, note_mouse_highlight)
(x_clear_window_mouse_face, cancel_mouse_face, expose_frame):
Replace Display_Info with Mouse_HLInfo everywhere where
mouse_face_* members were accessed for mouse highlight purposes.
* frame.h (MOUSE_HL_INFO): New macro.
* lisp.h (Mouse_HLInfo): New data type.
* xterm.h (struct x_display_info):
* w32term.h (struct w32_display_info):
* nsterm.h (struct ns_display_info):
* termchar.h (struct tty_display_info): Use it instead of
mouse_face_* members.
* dispextern.h (DPYINFO_DEFINED): Remove definition.
(FRAME_X_DISPLAY_INFO): Remove definition.
(show_mouse_face, clear_mouse_face): Update type of 1st argument.
2010-10-30 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (coords_in_mouse_face_p): Move prototype out of the

View file

@ -43,9 +43,12 @@ typedef struct {
#endif /* HAVE_X_WINDOWS */
#ifdef MSDOS
#include "msdos.h"
#endif
#ifdef HAVE_X_WINDOWS
typedef struct x_display_info Display_Info;
#define DPYINFO_DEFINED 1
typedef XImage * XImagePtr;
typedef XImagePtr XImagePtr_or_DC;
#define NativeRectangle XRectangle
@ -54,7 +57,6 @@ typedef XImagePtr XImagePtr_or_DC;
#ifdef HAVE_NTGUI
#include "w32gui.h"
typedef struct w32_display_info Display_Info;
#define DPYINFO_DEFINED 1
typedef XImage *XImagePtr;
typedef HDC XImagePtr_or_DC;
#endif
@ -63,32 +65,15 @@ typedef HDC XImagePtr_or_DC;
#include "nsgui.h"
/* following typedef needed to accomodate the MSDOS port, believe it or not */
typedef struct ns_display_info Display_Info;
#define DPYINFO_DEFINED 1
typedef Pixmap XImagePtr;
typedef XImagePtr XImagePtr_or_DC;
#endif
#ifndef DPYINFO_DEFINED
typedef struct tty_display_info Display_Info;
#ifndef HAVE_WINDOW_SYSTEM
typedef int Cursor;
#define No_Cursor (0)
#endif
#undef DPYINFO_DEFINED
#ifdef MSDOS
/* This defines FRAME_X_DISPLAY_INFO for MSDOS. */
#include "msdos.h"
#endif
#ifdef HAVE_GPM
#define FRAME_X_DISPLAY_INFO(f) gpm_tty
#endif
#ifndef FRAME_X_DISPLAY_INFO
#define FRAME_X_DISPLAY_INFO(f) NULL
#endif
#ifndef NativeRectangle
#define NativeRectangle int
#endif

View file

@ -544,6 +544,14 @@ typedef struct frame *FRAME_PTR;
#define FRAME_WINDOW_P(f) (0)
#endif
/* Return a pointer to the structure holding information about the
region of text, if any, that is currently shown in mouse-face on
frame F. */
#define MOUSE_HL_INFO(F) \
(FRAME_WINDOW_P(F) \
? &(FRAME_X_DISPLAY_INFO(F)->mouse_highlight) \
: &(((F)->output_data.tty)->mouse_highlight))
/* Nonzero if frame F is still alive (not deleted). */
#define FRAME_LIVE_P(f) ((f)->terminal != 0)

View file

@ -1563,6 +1563,41 @@ typedef struct {
/* The ID of the mode line highlighting face. */
#define GLYPH_MODE_LINE_FACE 1
/* Structure to hold mouse highlight data. This is here because other
header files need it for defining struct x_output etc. */
typedef struct {
/* These variables describe the range of text currently shown in its
mouse-face, together with the window they apply to. As long as
the mouse stays within this range, we need not redraw anything on
its account. Rows and columns are glyph matrix positions in
MOUSE_FACE_WINDOW. */
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
Lisp_Object mouse_face_overlay;
/* 1 if a mouse motion event came and we didn't handle it right away because
gc was in progress. */
int mouse_face_deferred_gc;
/* FRAME and X, Y position of mouse when last checked for
highlighting. X and Y can be negative or out of range for the frame. */
struct frame *mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
/* Nonzero means that the mouse highlight should not be shown. */
int mouse_face_hidden;
int mouse_face_image_state;
} Mouse_HLInfo;
/* Data type checking */
#define NILP(x) EQ (x, Qnil)

View file

@ -492,21 +492,9 @@ struct ns_display_info
/* The cursor to use for vertical scroll bars. */
Cursor vertical_scroll_bar_cursor;
/* most mouse face stuff moved in here as of 21+ (and reasonably so) */
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
int mouse_face_deferred_gc;
Lisp_Object mouse_face_overlay;
FRAME_PTR mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
int mouse_face_defer;
int mouse_face_hidden;
int mouse_face_image_state;
/* Information about the range of text currently shown in
mouse-face. */
Mouse_HLInfo mouse_highlight;
struct frame *x_highlight_frame;
struct frame *x_focus_frame;

View file

@ -70,34 +70,9 @@ struct tty_display_info
struct frame *previous_frame;
int previous_color_mode;
/* These variables describe the range of text currently shown in its
mouse-face, together with the window they apply to. As long as
the mouse stays within this range, we need not redraw anything on
its account. Rows and columns are glyph matrix positions in
MOUSE_FACE_WINDOW. */
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
Lisp_Object mouse_face_overlay;
/* 1 if a mouse motion event came and we didn't handle it right away because
gc was in progress. */
int mouse_face_deferred_gc;
/* FRAME and X, Y position of mouse when last checked for
highlighting. X and Y can be negative or out of range for the frame. */
struct frame *mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
/* Nonzero means that the mouse highlight should not be shown. */
int mouse_face_hidden;
/* Information about the range of text currently shown in
mouse-face. */
Mouse_HLInfo mouse_highlight;
/* Buffer used internally by termcap (see tgetent in the Termcap
manual). Only init_tty and delete_tty should change this. */

View file

@ -143,36 +143,9 @@ struct w32_display_info
/* Reusable Graphics Context for drawing a cursor in a non-default face. */
XGCValues *scratch_cursor_gc;
/* These variables describe the range of text currently shown in its
mouse-face, together with the window they apply to. As long as
the mouse stays within this range, we need not redraw anything on
its account. Rows and columns are glyph matrix positions in
MOUSE_FACE_WINDOW. */
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
Lisp_Object mouse_face_overlay;
/* 1 if a mouse motion event came and we didn't handle it right away because
gc was in progress. */
int mouse_face_deferred_gc;
/* FRAME and X, Y position of mouse when last checked for
highlighting. X and Y can be negative or out of range for the frame. */
struct frame *mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
/* Nonzero means that the mouse highlight should not be shown. */
int mouse_face_hidden;
int mouse_face_image_state;
/* Information about the range of text currently shown in
mouse-face. */
Mouse_HLInfo mouse_highlight;
char *w32_id_name;

View file

@ -10738,7 +10738,7 @@ static int
get_tool_bar_item (struct frame *f, int x, int y, struct glyph **glyph,
int *hpos, int *vpos, int *prop_idx)
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
struct window *w = XWINDOW (f->tool_bar_window);
int area;
@ -10753,14 +10753,14 @@ get_tool_bar_item (struct frame *f, int x, int y, struct glyph **glyph,
return -1;
/* Is mouse on the highlighted item? */
if (EQ (f->tool_bar_window, dpyinfo->mouse_face_window)
&& *vpos >= dpyinfo->mouse_face_beg_row
&& *vpos <= dpyinfo->mouse_face_end_row
&& (*vpos > dpyinfo->mouse_face_beg_row
|| *hpos >= dpyinfo->mouse_face_beg_col)
&& (*vpos < dpyinfo->mouse_face_end_row
|| *hpos < dpyinfo->mouse_face_end_col
|| dpyinfo->mouse_face_past_end))
if (EQ (f->tool_bar_window, hlinfo->mouse_face_window)
&& *vpos >= hlinfo->mouse_face_beg_row
&& *vpos <= hlinfo->mouse_face_end_row
&& (*vpos > hlinfo->mouse_face_beg_row
|| *hpos >= hlinfo->mouse_face_beg_col)
&& (*vpos < hlinfo->mouse_face_end_row
|| *hpos < hlinfo->mouse_face_end_col
|| hlinfo->mouse_face_past_end))
return 0;
return 1;
@ -10777,7 +10777,7 @@ void
handle_tool_bar_click (struct frame *f, int x, int y, int down_p,
unsigned int modifiers)
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
struct window *w = XWINDOW (f->tool_bar_window);
int hpos, vpos, prop_idx;
struct glyph *glyph;
@ -10796,8 +10796,8 @@ handle_tool_bar_click (struct frame *f, int x, int y, int down_p,
if (down_p)
{
/* Show item in pressed state. */
show_mouse_face (dpyinfo, DRAW_IMAGE_SUNKEN);
dpyinfo->mouse_face_image_state = DRAW_IMAGE_SUNKEN;
show_mouse_face (hlinfo, DRAW_IMAGE_SUNKEN);
hlinfo->mouse_face_image_state = DRAW_IMAGE_SUNKEN;
last_tool_bar_item = prop_idx;
}
else
@ -10807,8 +10807,8 @@ handle_tool_bar_click (struct frame *f, int x, int y, int down_p,
EVENT_INIT (event);
/* Show item in released state. */
show_mouse_face (dpyinfo, DRAW_IMAGE_RAISED);
dpyinfo->mouse_face_image_state = DRAW_IMAGE_RAISED;
show_mouse_face (hlinfo, DRAW_IMAGE_RAISED);
hlinfo->mouse_face_image_state = DRAW_IMAGE_RAISED;
key = AREF (f->tool_bar_items, prop_idx + TOOL_BAR_ITEM_KEY);
@ -10838,6 +10838,7 @@ note_tool_bar_highlight (struct frame *f, int x, int y)
Lisp_Object window = f->tool_bar_window;
struct window *w = XWINDOW (window);
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
int hpos, vpos;
struct glyph *glyph;
struct glyph_row *row;
@ -10851,7 +10852,7 @@ note_tool_bar_highlight (struct frame *f, int x, int y)
values when mouse moves outside of the frame. */
if (x <= 0 || y <= 0)
{
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
return;
}
@ -10859,14 +10860,14 @@ note_tool_bar_highlight (struct frame *f, int x, int y)
if (rc < 0)
{
/* Not on tool-bar item. */
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
return;
}
else if (rc == 0)
/* On same tool-bar item as before. */
goto set_help_echo;
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
/* Mouse is down, but on different tool-bar item? */
mouse_down_p = (dpyinfo->grabbed
@ -10876,7 +10877,7 @@ note_tool_bar_highlight (struct frame *f, int x, int y)
&& last_tool_bar_item != prop_idx)
return;
dpyinfo->mouse_face_image_state = DRAW_NORMAL_TEXT;
hlinfo->mouse_face_image_state = DRAW_NORMAL_TEXT;
draw = mouse_down_p ? DRAW_IMAGE_SUNKEN : DRAW_IMAGE_RAISED;
/* If tool-bar item is not enabled, don't highlight it. */
@ -10890,22 +10891,22 @@ note_tool_bar_highlight (struct frame *f, int x, int y)
x += row->glyphs[TEXT_AREA][i].pixel_width;
/* Record this as the current active region. */
dpyinfo->mouse_face_beg_col = hpos;
dpyinfo->mouse_face_beg_row = vpos;
dpyinfo->mouse_face_beg_x = x;
dpyinfo->mouse_face_beg_y = row->y;
dpyinfo->mouse_face_past_end = 0;
hlinfo->mouse_face_beg_col = hpos;
hlinfo->mouse_face_beg_row = vpos;
hlinfo->mouse_face_beg_x = x;
hlinfo->mouse_face_beg_y = row->y;
hlinfo->mouse_face_past_end = 0;
dpyinfo->mouse_face_end_col = hpos + 1;
dpyinfo->mouse_face_end_row = vpos;
dpyinfo->mouse_face_end_x = x + glyph->pixel_width;
dpyinfo->mouse_face_end_y = row->y;
dpyinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id = TOOL_BAR_FACE_ID;
hlinfo->mouse_face_end_col = hpos + 1;
hlinfo->mouse_face_end_row = vpos;
hlinfo->mouse_face_end_x = x + glyph->pixel_width;
hlinfo->mouse_face_end_y = row->y;
hlinfo->mouse_face_window = window;
hlinfo->mouse_face_face_id = TOOL_BAR_FACE_ID;
/* Display it as active. */
show_mouse_face (dpyinfo, draw);
dpyinfo->mouse_face_image_state = draw;
show_mouse_face (hlinfo, draw);
hlinfo->mouse_face_image_state = draw;
}
set_help_echo:
@ -21300,7 +21301,7 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row,
if (head && !overlaps && row->contains_overlapping_glyphs_p)
{
struct glyph_string *h, *t;
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
int mouse_beg_col, mouse_end_col, check_mouse_face = 0;
int dummy_x = 0;
@ -21310,16 +21311,16 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row,
{
struct glyph_row *mouse_beg_row, *mouse_end_row;
mouse_beg_row = MATRIX_ROW (w->current_matrix, dpyinfo->mouse_face_beg_row);
mouse_end_row = MATRIX_ROW (w->current_matrix, dpyinfo->mouse_face_end_row);
mouse_beg_row = MATRIX_ROW (w->current_matrix, hlinfo->mouse_face_beg_row);
mouse_end_row = MATRIX_ROW (w->current_matrix, hlinfo->mouse_face_end_row);
if (row >= mouse_beg_row && row <= mouse_end_row)
{
check_mouse_face = 1;
mouse_beg_col = (row == mouse_beg_row)
? dpyinfo->mouse_face_beg_col : 0;
? hlinfo->mouse_face_beg_col : 0;
mouse_end_col = (row == mouse_end_row)
? dpyinfo->mouse_face_end_col
? hlinfo->mouse_face_end_col
: row->used[TEXT_AREA];
}
}
@ -23363,7 +23364,7 @@ void
erase_phys_cursor (struct window *w)
{
struct frame *f = XFRAME (w->frame);
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
int hpos = w->phys_cursor.hpos;
int vpos = w->phys_cursor.vpos;
int mouse_face_here_p = 0;
@ -23419,7 +23420,7 @@ erase_phys_cursor (struct window *w)
/* If the cursor is in the mouse face area, redisplay that when
we clear the cursor. */
if (! NILP (dpyinfo->mouse_face_window)
if (! NILP (hlinfo->mouse_face_window)
&& coords_in_mouse_face_p (w, hpos, vpos)
/* Don't redraw the cursor's spot in mouse face if it is at the
end of a line (on a newline). The cursor appears there, but
@ -23611,40 +23612,52 @@ x_clear_cursor (struct window *w)
update_window_cursor (w, 0);
}
#endif /* HAVE_WINDOW_SYSTEM */
/* Implementation of draw_row_with_mouse_face for GUI sessions and
GPM. MSDOS has its own implementation on msdos.c. */
#ifndef MSDOS
void
draw_row_with_mouse_face (struct frame *w, int start_x, struct glyph_row *row,
draw_row_with_mouse_face (struct window *w, int start_x, struct glyph_row *row,
int start_hpos, int end_hpos,
enum draw_glyphs_face draw)
{
draw_glyphs (w, start_x, row, TEXT_AREA, start_hpos, end_hpos, draw, 0);
#ifdef HAVE_WINDOW_SYSTEM
if (FRAME_WINDOW_P (XFRAME (w->frame)))
{
draw_glyphs (w, start_x, row, TEXT_AREA, start_hpos, end_hpos, draw, 0);
return;
}
#endif
#ifdef HAVE_GPM
tty_draw_row_with_mouse_face (w, row, start_hpos, end_hpos, draw);
#endif
}
#endif /* HAVE_WINDOW_SYSTEM */
#endif /* not MSDOS */
/* EXPORT:
Display the active region described by mouse_face_* according to DRAW. */
void
show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
show_mouse_face (Mouse_HLInfo *hlinfo, enum draw_glyphs_face draw)
{
struct window *w = XWINDOW (dpyinfo->mouse_face_window);
struct window *w = XWINDOW (hlinfo->mouse_face_window);
struct frame *f = XFRAME (WINDOW_FRAME (w));
if (/* If window is in the process of being destroyed, don't bother
to do anything. */
w->current_matrix != NULL
/* Don't update mouse highlight if hidden */
&& (draw != DRAW_MOUSE_FACE || !dpyinfo->mouse_face_hidden)
&& (draw != DRAW_MOUSE_FACE || !hlinfo->mouse_face_hidden)
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */
&& dpyinfo->mouse_face_end_row < w->current_matrix->nrows)
&& hlinfo->mouse_face_end_row < w->current_matrix->nrows)
{
int phys_cursor_on_p = w->phys_cursor_on_p;
struct glyph_row *row, *first, *last;
first = MATRIX_ROW (w->current_matrix, dpyinfo->mouse_face_beg_row);
last = MATRIX_ROW (w->current_matrix, dpyinfo->mouse_face_end_row);
first = MATRIX_ROW (w->current_matrix, hlinfo->mouse_face_beg_row);
last = MATRIX_ROW (w->current_matrix, hlinfo->mouse_face_end_row);
for (row = first; row <= last && row->enabled_p; ++row)
{
@ -23659,13 +23672,13 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
highlighted area in R2L rows. */
if (!row->reversed_p)
{
start_hpos = dpyinfo->mouse_face_beg_col;
start_x = dpyinfo->mouse_face_beg_x;
start_hpos = hlinfo->mouse_face_beg_col;
start_x = hlinfo->mouse_face_beg_x;
}
else if (row == last)
{
start_hpos = dpyinfo->mouse_face_end_col;
start_x = dpyinfo->mouse_face_end_x;
start_hpos = hlinfo->mouse_face_end_col;
start_x = hlinfo->mouse_face_end_x;
}
else
{
@ -23675,8 +23688,8 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
}
else if (row->reversed_p && row == last)
{
start_hpos = dpyinfo->mouse_face_end_col;
start_x = dpyinfo->mouse_face_end_x;
start_hpos = hlinfo->mouse_face_end_col;
start_x = hlinfo->mouse_face_end_x;
}
else
{
@ -23687,9 +23700,9 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
if (row == last)
{
if (!row->reversed_p)
end_hpos = dpyinfo->mouse_face_end_col;
end_hpos = hlinfo->mouse_face_end_col;
else if (row == first)
end_hpos = dpyinfo->mouse_face_beg_col;
end_hpos = hlinfo->mouse_face_beg_col;
else
{
end_hpos = row->used[TEXT_AREA];
@ -23698,7 +23711,7 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
}
}
else if (row->reversed_p && row == first)
end_hpos = dpyinfo->mouse_face_beg_col;
end_hpos = hlinfo->mouse_face_beg_col;
else
{
end_hpos = row->used[TEXT_AREA];
@ -23732,7 +23745,7 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
#ifdef HAVE_WINDOW_SYSTEM
/* Change the mouse cursor. */
if (draw == DRAW_NORMAL_TEXT && !EQ (dpyinfo->mouse_face_window, f->tool_bar_window))
if (draw == DRAW_NORMAL_TEXT && !EQ (hlinfo->mouse_face_window, f->tool_bar_window))
FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->text_cursor);
else if (draw == DRAW_MOUSE_FACE)
FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->hand_cursor);
@ -23748,20 +23761,20 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
face was actually drawn unhighlighted. */
int
clear_mouse_face (Display_Info *dpyinfo)
clear_mouse_face (Mouse_HLInfo *hlinfo)
{
int cleared = 0;
if (!dpyinfo->mouse_face_hidden && !NILP (dpyinfo->mouse_face_window))
if (!hlinfo->mouse_face_hidden && !NILP (hlinfo->mouse_face_window))
{
show_mouse_face (dpyinfo, DRAW_NORMAL_TEXT);
show_mouse_face (hlinfo, DRAW_NORMAL_TEXT);
cleared = 1;
}
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;
dpyinfo->mouse_face_overlay = Qnil;
hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
hlinfo->mouse_face_window = Qnil;
hlinfo->mouse_face_overlay = Qnil;
return cleared;
}
@ -23770,43 +23783,43 @@ clear_mouse_face (Display_Info *dpyinfo)
static int
coords_in_mouse_face_p (struct window *w, int hpos, int vpos)
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (w->frame));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
/* Quickly resolve the easy cases. */
if (!(WINDOWP (dpyinfo->mouse_face_window)
&& XWINDOW (dpyinfo->mouse_face_window) == w))
if (!(WINDOWP (hlinfo->mouse_face_window)
&& XWINDOW (hlinfo->mouse_face_window) == w))
return 0;
if (vpos < dpyinfo->mouse_face_beg_row
|| vpos > dpyinfo->mouse_face_end_row)
if (vpos < hlinfo->mouse_face_beg_row
|| vpos > hlinfo->mouse_face_end_row)
return 0;
if (vpos > dpyinfo->mouse_face_beg_row
&& vpos < dpyinfo->mouse_face_end_row)
if (vpos > hlinfo->mouse_face_beg_row
&& vpos < hlinfo->mouse_face_end_row)
return 1;
if (!MATRIX_ROW (w->current_matrix, vpos)->reversed_p)
{
if (dpyinfo->mouse_face_beg_row == dpyinfo->mouse_face_end_row)
if (hlinfo->mouse_face_beg_row == hlinfo->mouse_face_end_row)
{
if (dpyinfo->mouse_face_beg_col <= hpos && hpos < dpyinfo->mouse_face_end_col)
if (hlinfo->mouse_face_beg_col <= hpos && hpos < hlinfo->mouse_face_end_col)
return 1;
}
else if ((vpos == dpyinfo->mouse_face_beg_row
&& hpos >= dpyinfo->mouse_face_beg_col)
|| (vpos == dpyinfo->mouse_face_end_row
&& hpos < dpyinfo->mouse_face_end_col))
else if ((vpos == hlinfo->mouse_face_beg_row
&& hpos >= hlinfo->mouse_face_beg_col)
|| (vpos == hlinfo->mouse_face_end_row
&& hpos < hlinfo->mouse_face_end_col))
return 1;
}
else
{
if (dpyinfo->mouse_face_beg_row == dpyinfo->mouse_face_end_row)
if (hlinfo->mouse_face_beg_row == hlinfo->mouse_face_end_row)
{
if (dpyinfo->mouse_face_end_col < hpos && hpos <= dpyinfo->mouse_face_beg_col)
if (hlinfo->mouse_face_end_col < hpos && hpos <= hlinfo->mouse_face_beg_col)
return 1;
}
else if ((vpos == dpyinfo->mouse_face_beg_row
&& hpos <= dpyinfo->mouse_face_beg_col)
|| (vpos == dpyinfo->mouse_face_end_row
&& hpos > dpyinfo->mouse_face_end_col))
else if ((vpos == hlinfo->mouse_face_beg_row
&& hpos <= hlinfo->mouse_face_beg_col)
|| (vpos == hlinfo->mouse_face_end_row
&& hpos > hlinfo->mouse_face_end_col))
return 1;
}
return 0;
@ -23947,7 +23960,7 @@ rows_from_pos_range (struct window *w,
}
}
/* This function sets the mouse_face_* elements of DPYINFO, assuming
/* This function sets the mouse_face_* elements of HLINFO, assuming
the mouse cursor is on a glyph with buffer charpos MOUSE_CHARPOS in
window WINDOW. START_CHARPOS and END_CHARPOS are buffer positions
for the overlay or run of text properties specifying the mouse
@ -23958,7 +23971,7 @@ rows_from_pos_range (struct window *w,
static void
mouse_face_from_buffer_pos (Lisp_Object window,
Display_Info *dpyinfo,
Mouse_HLInfo *hlinfo,
EMACS_INT mouse_charpos,
EMACS_INT start_charpos,
EMACS_INT end_charpos,
@ -24003,7 +24016,7 @@ mouse_face_from_buffer_pos (Lisp_Object window,
if (r2 == NULL)
{
r2 = MATRIX_ROW (w->current_matrix, XFASTINT (w->window_end_vpos));
dpyinfo->mouse_face_past_end = 1;
hlinfo->mouse_face_past_end = 1;
}
else if (!NILP (after_string))
{
@ -24032,10 +24045,10 @@ mouse_face_from_buffer_pos (Lisp_Object window,
r1 = tem;
}
dpyinfo->mouse_face_beg_y = r1->y;
dpyinfo->mouse_face_beg_row = MATRIX_ROW_VPOS (r1, w->current_matrix);
dpyinfo->mouse_face_end_y = r2->y;
dpyinfo->mouse_face_end_row = MATRIX_ROW_VPOS (r2, w->current_matrix);
hlinfo->mouse_face_beg_y = r1->y;
hlinfo->mouse_face_beg_row = MATRIX_ROW_VPOS (r1, w->current_matrix);
hlinfo->mouse_face_end_y = r2->y;
hlinfo->mouse_face_end_row = MATRIX_ROW_VPOS (r2, w->current_matrix);
/* For a bidi-reordered row, the positions of BEFORE_STRING,
AFTER_STRING, DISPLAY_STRING, START_CHARPOS, and END_CHARPOS
@ -24094,8 +24107,8 @@ mouse_face_from_buffer_pos (Lisp_Object window,
}
x += glyph->pixel_width;
}
dpyinfo->mouse_face_beg_x = x;
dpyinfo->mouse_face_beg_col = glyph - r1->glyphs[TEXT_AREA];
hlinfo->mouse_face_beg_x = x;
hlinfo->mouse_face_beg_col = glyph - r1->glyphs[TEXT_AREA];
}
else
{
@ -24147,8 +24160,8 @@ mouse_face_from_buffer_pos (Lisp_Object window,
glyph++; /* first glyph to the right of the highlighted area */
for (g = r1->glyphs[TEXT_AREA], x = r1->x; g < glyph; g++)
x += g->pixel_width;
dpyinfo->mouse_face_beg_x = x;
dpyinfo->mouse_face_beg_col = glyph - r1->glyphs[TEXT_AREA];
hlinfo->mouse_face_beg_x = x;
hlinfo->mouse_face_beg_col = glyph - r1->glyphs[TEXT_AREA];
}
/* If the highlight ends in a different row, compute GLYPH and END
@ -24211,8 +24224,8 @@ mouse_face_from_buffer_pos (Lisp_Object window,
for (; glyph <= end; ++glyph)
x += glyph->pixel_width;
dpyinfo->mouse_face_end_x = x;
dpyinfo->mouse_face_end_col = glyph - r2->glyphs[TEXT_AREA];
hlinfo->mouse_face_end_x = x;
hlinfo->mouse_face_end_col = glyph - r2->glyphs[TEXT_AREA];
}
else
{
@ -24258,16 +24271,16 @@ mouse_face_from_buffer_pos (Lisp_Object window,
}
x += end->pixel_width;
}
dpyinfo->mouse_face_end_x = x;
dpyinfo->mouse_face_end_col = end - r2->glyphs[TEXT_AREA];
hlinfo->mouse_face_end_x = x;
hlinfo->mouse_face_end_col = end - r2->glyphs[TEXT_AREA];
}
dpyinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id
hlinfo->mouse_face_window = window;
hlinfo->mouse_face_face_id
= face_at_buffer_position (w, mouse_charpos, 0, 0, &ignore,
mouse_charpos + 1,
!dpyinfo->mouse_face_hidden, -1);
show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
!hlinfo->mouse_face_hidden, -1);
show_mouse_face (hlinfo, DRAW_MOUSE_FACE);
}
/* The following function is not used anymore (replaced with
@ -24356,11 +24369,11 @@ fast_find_string_pos (struct window *w, EMACS_INT pos, Lisp_Object object,
/* Find the positions of the first and the last glyphs in window W's
current matrix that occlude positions [STARTPOS..ENDPOS] in OBJECT
(assumed to be a string), and return in DPYINFO's mouse_face
(assumed to be a string), and return in HLINFO's mouse_face_*
members the pixel and column/row coordinates of those glyphs. */
static void
mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo,
Lisp_Object object,
EMACS_INT startpos, EMACS_INT endpos)
{
@ -24385,10 +24398,10 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
if (EQ (g->object, object)
&& startpos <= g->charpos && g->charpos <= endpos)
{
dpyinfo->mouse_face_beg_row = r - w->current_matrix->rows;
dpyinfo->mouse_face_beg_y = r->y;
dpyinfo->mouse_face_beg_col = g - r->glyphs[TEXT_AREA];
dpyinfo->mouse_face_beg_x = gx;
hlinfo->mouse_face_beg_row = r - w->current_matrix->rows;
hlinfo->mouse_face_beg_y = r->y;
hlinfo->mouse_face_beg_col = g - r->glyphs[TEXT_AREA];
hlinfo->mouse_face_beg_x = gx;
found = 1;
break;
}
@ -24403,12 +24416,12 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
if (EQ ((g-1)->object, object)
&& startpos <= (g-1)->charpos && (g-1)->charpos <= endpos)
{
dpyinfo->mouse_face_beg_row = r - w->current_matrix->rows;
dpyinfo->mouse_face_beg_y = r->y;
dpyinfo->mouse_face_beg_col = g - r->glyphs[TEXT_AREA];
hlinfo->mouse_face_beg_row = r - w->current_matrix->rows;
hlinfo->mouse_face_beg_y = r->y;
hlinfo->mouse_face_beg_col = g - r->glyphs[TEXT_AREA];
for (gx = r->x, g1 = r->glyphs[TEXT_AREA]; g1 < g; ++g1)
gx += g1->pixel_width;
dpyinfo->mouse_face_beg_x = gx;
hlinfo->mouse_face_beg_x = gx;
found = 1;
break;
}
@ -24442,8 +24455,8 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
r--;
/* Set the end row and its vertical pixel coordinate. */
dpyinfo->mouse_face_end_row = r - w->current_matrix->rows;
dpyinfo->mouse_face_end_y = r->y;
hlinfo->mouse_face_end_row = r - w->current_matrix->rows;
hlinfo->mouse_face_end_y = r->y;
/* Compute and set the end column and the end column's horizontal
pixel coordinate. */
@ -24455,11 +24468,11 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
if (EQ ((e-1)->object, object)
&& startpos <= (e-1)->charpos && (e-1)->charpos <= endpos)
break;
dpyinfo->mouse_face_end_col = e - g;
hlinfo->mouse_face_end_col = e - g;
for (gx = r->x; g < e; ++g)
gx += g->pixel_width;
dpyinfo->mouse_face_end_x = gx;
hlinfo->mouse_face_end_x = gx;
}
else
{
@ -24472,8 +24485,8 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
break;
gx += e->pixel_width;
}
dpyinfo->mouse_face_end_col = e - r->glyphs[TEXT_AREA];
dpyinfo->mouse_face_end_x = gx;
hlinfo->mouse_face_end_col = e - r->glyphs[TEXT_AREA];
hlinfo->mouse_face_end_x = gx;
}
}
@ -24663,8 +24676,9 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
{
struct window *w = XWINDOW (window);
struct frame *f = XFRAME (w->frame);
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
#ifdef HAVE_WINDOW_SYSTEM
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Cursor cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
#else
Cursor cursor = No_Cursor;
@ -24871,58 +24885,58 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
/* If GLYPH's position is included in the region that is
already drawn in mouse face, we have nothing to do. */
if ( EQ (window, dpyinfo->mouse_face_window)
if ( EQ (window, hlinfo->mouse_face_window)
&& (!row->reversed_p
? (dpyinfo->mouse_face_beg_col <= hpos
&& hpos < dpyinfo->mouse_face_end_col)
? (hlinfo->mouse_face_beg_col <= hpos
&& hpos < hlinfo->mouse_face_end_col)
/* In R2L rows we swap BEG and END, see below. */
: (dpyinfo->mouse_face_end_col <= hpos
&& hpos < dpyinfo->mouse_face_beg_col))
&& dpyinfo->mouse_face_beg_row == vpos )
: (hlinfo->mouse_face_end_col <= hpos
&& hpos < hlinfo->mouse_face_beg_col))
&& hlinfo->mouse_face_beg_row == vpos )
return;
if (clear_mouse_face (dpyinfo))
if (clear_mouse_face (hlinfo))
cursor = No_Cursor;
if (!row->reversed_p)
{
dpyinfo->mouse_face_beg_col = hpos;
dpyinfo->mouse_face_beg_x = original_x_pixel
hlinfo->mouse_face_beg_col = hpos;
hlinfo->mouse_face_beg_x = original_x_pixel
- (total_pixel_width + dx);
dpyinfo->mouse_face_end_col = hpos + gseq_length;
dpyinfo->mouse_face_end_x = 0;
hlinfo->mouse_face_end_col = hpos + gseq_length;
hlinfo->mouse_face_end_x = 0;
}
else
{
/* In R2L rows, show_mouse_face expects BEG and END
coordinates to be swapped. */
dpyinfo->mouse_face_end_col = hpos;
dpyinfo->mouse_face_end_x = original_x_pixel
hlinfo->mouse_face_end_col = hpos;
hlinfo->mouse_face_end_x = original_x_pixel
- (total_pixel_width + dx);
dpyinfo->mouse_face_beg_col = hpos + gseq_length;
dpyinfo->mouse_face_beg_x = 0;
hlinfo->mouse_face_beg_col = hpos + gseq_length;
hlinfo->mouse_face_beg_x = 0;
}
dpyinfo->mouse_face_beg_row = vpos;
dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_beg_row;
dpyinfo->mouse_face_beg_y = 0;
dpyinfo->mouse_face_end_y = 0;
dpyinfo->mouse_face_past_end = 0;
dpyinfo->mouse_face_window = window;
hlinfo->mouse_face_beg_row = vpos;
hlinfo->mouse_face_end_row = hlinfo->mouse_face_beg_row;
hlinfo->mouse_face_beg_y = 0;
hlinfo->mouse_face_end_y = 0;
hlinfo->mouse_face_past_end = 0;
hlinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id = face_at_string_position (w, string,
charpos,
0, 0, 0,
&ignore,
glyph->face_id,
1);
show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
hlinfo->mouse_face_face_id = face_at_string_position (w, string,
charpos,
0, 0, 0,
&ignore,
glyph->face_id,
1);
show_mouse_face (hlinfo, DRAW_MOUSE_FACE);
if (NILP (pointer))
pointer = Qhand;
}
else if ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
}
#ifdef HAVE_WINDOW_SYSTEM
define_frame_cursor1 (f, cursor, pointer);
@ -24939,7 +24953,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
void
note_mouse_highlight (struct frame *f, int x, int y)
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
enum window_part part;
Lisp_Object window;
struct window *w;
@ -24958,16 +24972,16 @@ note_mouse_highlight (struct frame *f, int x, int y)
|| f->pointer_invisible)
return;
dpyinfo->mouse_face_mouse_x = x;
dpyinfo->mouse_face_mouse_y = y;
dpyinfo->mouse_face_mouse_frame = f;
hlinfo->mouse_face_mouse_x = x;
hlinfo->mouse_face_mouse_y = y;
hlinfo->mouse_face_mouse_frame = f;
if (dpyinfo->mouse_face_defer)
if (hlinfo->mouse_face_defer)
return;
if (gc_in_progress)
{
dpyinfo->mouse_face_deferred_gc = 1;
hlinfo->mouse_face_deferred_gc = 1;
return;
}
@ -24976,10 +24990,10 @@ note_mouse_highlight (struct frame *f, int x, int y)
/* If we were displaying active text in another window, clear that.
Also clear if we move out of text area in same window. */
if (! EQ (window, dpyinfo->mouse_face_window)
if (! EQ (window, hlinfo->mouse_face_window)
|| (part != ON_TEXT && part != ON_MODE_LINE && part != ON_HEADER_LINE
&& !NILP (dpyinfo->mouse_face_window)))
clear_mouse_face (dpyinfo);
&& !NILP (hlinfo->mouse_face_window)))
clear_mouse_face (hlinfo);
/* Not on a window -> return. */
if (!WINDOWP (window))
@ -25108,7 +25122,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
&& glyph->type == STRETCH_GLYPH
&& glyph->avoid_cursor_p))
{
if (clear_mouse_face (dpyinfo))
if (clear_mouse_face (hlinfo))
cursor = No_Cursor;
#ifdef HAVE_WINDOW_SYSTEM
if (NILP (pointer))
@ -25164,8 +25178,8 @@ note_mouse_highlight (struct frame *f, int x, int y)
the one we are currently highlighting, we have to
check if we enter the overlapping overlay, and then
highlight only that. */
|| (OVERLAYP (dpyinfo->mouse_face_overlay)
&& mouse_face_overlay_overlaps (dpyinfo->mouse_face_overlay)))
|| (OVERLAYP (hlinfo->mouse_face_overlay)
&& mouse_face_overlay_overlaps (hlinfo->mouse_face_overlay)))
{
/* Find the highest priority overlay with a mouse-face. */
overlay = Qnil;
@ -25178,12 +25192,12 @@ note_mouse_highlight (struct frame *f, int x, int y)
/* If we're highlighting the same overlay as before, there's
no need to do that again. */
if (!NILP (overlay) && EQ (overlay, dpyinfo->mouse_face_overlay))
if (!NILP (overlay) && EQ (overlay, hlinfo->mouse_face_overlay))
goto check_help_echo;
dpyinfo->mouse_face_overlay = overlay;
hlinfo->mouse_face_overlay = overlay;
/* Clear the display of the old active region, if any. */
if (clear_mouse_face (dpyinfo))
if (clear_mouse_face (hlinfo))
cursor = No_Cursor;
/* If no overlay applies, get a text property. */
@ -25207,14 +25221,14 @@ note_mouse_highlight (struct frame *f, int x, int y)
b = make_number (0);
if (NILP (e))
e = make_number (SCHARS (object) - 1);
mouse_face_from_string_pos (w, dpyinfo, object,
mouse_face_from_string_pos (w, hlinfo, object,
XINT (b), XINT (e));
dpyinfo->mouse_face_past_end = 0;
dpyinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id
hlinfo->mouse_face_past_end = 0;
hlinfo->mouse_face_window = window;
hlinfo->mouse_face_face_id
= face_at_string_position (w, object, pos, 0, 0, 0, &ignore,
glyph->face_id, 1);
show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
show_mouse_face (hlinfo, DRAW_MOUSE_FACE);
cursor = No_Cursor;
}
else
@ -25289,7 +25303,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
if (!STRINGP (after_string)) after_string = Qnil;
}
mouse_face_from_buffer_pos (window, dpyinfo, pos,
mouse_face_from_buffer_pos (window, hlinfo, pos,
XFASTINT (before),
XFASTINT (after),
before_string, after_string,
@ -25436,13 +25450,13 @@ note_mouse_highlight (struct frame *f, int x, int y)
void
x_clear_window_mouse_face (struct window *w)
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (w->frame));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
Lisp_Object window;
BLOCK_INPUT;
XSETWINDOW (window, w);
if (EQ (window, dpyinfo->mouse_face_window))
clear_mouse_face (dpyinfo);
if (EQ (window, hlinfo->mouse_face_window))
clear_mouse_face (hlinfo);
UNBLOCK_INPUT;
}
@ -25455,14 +25469,14 @@ void
cancel_mouse_face (struct frame *f)
{
Lisp_Object window;
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
window = dpyinfo->mouse_face_window;
window = hlinfo->mouse_face_window;
if (! NILP (window) && XFRAME (XWINDOW (window)->frame) == f)
{
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;
hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
hlinfo->mouse_face_window = Qnil;
}
}
@ -25923,12 +25937,12 @@ expose_frame (struct frame *f, int x, int y, int w, int h)
focus-follows-mouse with delayed raise. --jason 2001-10-12 */
if (mouse_face_overwritten_p && !FRAME_GARBAGED_P (f))
{
Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
if (f == dpyinfo->mouse_face_mouse_frame)
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
if (f == hlinfo->mouse_face_mouse_frame)
{
int x = dpyinfo->mouse_face_mouse_x;
int y = dpyinfo->mouse_face_mouse_y;
clear_mouse_face (dpyinfo);
int x = hlinfo->mouse_face_mouse_x;
int y = hlinfo->mouse_face_mouse_y;
clear_mouse_face (hlinfo);
note_mouse_highlight (f, x, y);
}
}

View file

@ -190,36 +190,9 @@ struct x_display_info
/* Reusable Graphics Context for drawing a cursor in a non-default face. */
GC scratch_cursor_gc;
/* These variables describe the range of text currently shown in its
mouse-face, together with the window they apply to. As long as
the mouse stays within this range, we need not redraw anything on
its account. Rows and columns are glyph matrix positions in
MOUSE_FACE_WINDOW. */
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
Lisp_Object mouse_face_overlay;
/* 1 if a mouse motion event came and we didn't handle it right away because
gc was in progress. */
int mouse_face_deferred_gc;
/* FRAME and X, Y position of mouse when last checked for
highlighting. X and Y can be negative or out of range for the frame. */
struct frame *mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
/* Nonzero means that the mouse highlight should not be shown. */
int mouse_face_hidden;
int mouse_face_image_state;
/* Information about the range of text currently shown in
mouse-face. */
Mouse_HLInfo mouse_highlight;
char *x_id_name;