Unify mouse-highlight code for all GUI and TTY sessions.

term.c: Remove static mouse_face_* variables.  All users
 changed.
 (term_show_mouse_face, term_clear_mouse_face)
 (fast_find_position, term_mouse_highlight): Functions deleted.
 (tty_draw_row_with_mouse_face): New function.
 (term_mouse_movement): Call note_mouse_highlight instead of
 term_mouse_highlight.
 nsterm.m (ns_update_window_begin, ns_update_window_end)
 (ns_update_end, x_destroy_window, ns_frame_up_to_date)
 (ns_dumpglyphs_box_or_relief, ns_maybe_dumpglyphs_background)
 (ns_dumpglyphs_image, ns_dumpglyphs_stretch)
 (ns_initialize_display_info, keyDown, mouseMoved, mouseExited):
 Replace Display_Info with Mouse_HLInfo everywhere where
 mouse_face_* members were accessed for mouse highlight purposes.
 xterm.c (x_update_window_begin, x_update_window_end)
 (x_update_end, XTframe_up_to_date, x_set_mouse_face_gc)
 (handle_one_xevent, x_free_frame_resources, x_term_init): Replace
 Display_Info with Mouse_HLInfo everywhere where mouse_face_*
 members were accessed for mouse highlight purposes.
 w32term.c (x_update_window_begin, x_update_window_end)
 (x_update_end, w32_read_socket, x_free_frame_resources)
 (w32_initialize_display_info): Replace Display_Info with
 Mouse_HLInfo everywhere where mouse_face_* members were accessed
 for mouse highlight purposes.
 xdisp.c (show_mouse_face, note_mode_line_or_margin_highlight)
 (note_mouse_highlight) [HAVE_WINDOW_SYSTEM]: Don't run GUI code
 unless the frame is on a window-system.
 (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.
 (coords_in_mouse_face_p): Move prototype out of the
 HAVE_WINDOW_SYSTEM conditional.
 (x_y_to_hpos_vpos, frame_to_window_pixel_xy): Move out of the
 HAVE_WINDOW_SYSTEM block.
 (try_window_id) [HAVE_GPM || MSDOS]: Call
 x_clear_window_mouse_face.
 (draw_row_with_mouse_face): Implementation for HAVE_WINDOW_SYSTEM
 systems.  Call tty_draw_row_with_mouse_face for TTY systems.
 (show_mouse_face): Call draw_row_with_mouse_face, instead of
 calling draw_glyphs directly.
 (show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
 (cursor_in_mouse_face_p, rows_from_pos_range)
 (mouse_face_from_buffer_pos, mouse_face_from_string_pos)
 (note_mode_line_or_margin_highlight, note_mouse_highlight)
 (x_clear_window_mouse_face, cancel_mouse_face): Move out of the
 HAVE_WINDOW_SYSTEM block.  Ifdef away window-system specific
 fragments.
 (note_mouse_highlight): Call popup_activated for MSDOS as well.
 Clear mouse highlight if pointer is over glyphs whose OBJECT is an
 integer.
 (mouse_face_from_buffer_pos): Add parentheses around && within ||.
 (x_consider_frame_title, tool_bar_lines_needed): Move
 prototypes to HAVE_WINDOW_SYSTEM-only part.
 (get_window_cursor_type): Move inside a HAVE_WINDOW_SYSTEM-only
 part.  Remove "#ifdef HAVE_WINDOW_SYSTEM" from body of function.
 (null_glyph_slice): Move declaration into HAVE_WINDOW_SYSTEM-only
 part.
 dispnew.c (mirror_make_current): Set Y coordinate of the
 mode-line and header-line rows.
 (init_display): Setup initial frame's output_data for text
 terminal frames.
 xmenu.c (popup_activated): Don't define on MSDOS, which now has
 its own definition on msdos.c.
 msdos.c (show_mouse_face, clear_mouse_face)
 (fast_find_position, IT_note_mode_line_highlight)
 (IT_note_mouse_highlight): Functions deleted.
 (IT_frame_up_to_date, dos_rawgetc): Call note_mouse_highlight
 instead of IT_note_mouse_highlight.
 (draw_row_with_mouse_face, popup_activated): New functions.
 (dos_set_window_size, draw_row_with_mouse_face, IT_update_begin)
 (IT_update_end, IT_frame_up_to_date, internal_terminal_init)
 (dos_rawgetc): Replace Display_Info with Mouse_HLInfo everywhere
 where mouse_face_* members were accessed for mouse highlight
 purposes.
 msdos.h (initialize_msdos_display): Add prototype.
 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 (show_mouse_face, clear_mouse_face): Update type of
 1st argument.
 (frame_to_window_pixel_xy, note_mouse_highlight)
 (x_clear_window_mouse_face, cancel_mouse_face, clear_mouse_face)
 (show_mouse_face, cursor_in_mouse_face_p): Move prototypes out of
 HAVE_WINDOW_SYSTEM conditional.
 (draw_row_with_mouse_face): Declare prototype.
 (tty_draw_row_with_mouse_face): Declare prototype.
This commit is contained in:
Eli Zaretskii 2010-11-06 10:28:31 +02:00
commit c1fc2d3a9c
17 changed files with 817 additions and 1515 deletions

View file

@ -1,3 +1,114 @@
2010-11-05 Eli Zaretskii <eliz@gnu.org>
Unify mouse-highlight code for all GUI and TTY sessions.
* term.c: Remove static mouse_face_* variables. All users
changed.
(term_show_mouse_face, term_clear_mouse_face)
(fast_find_position, term_mouse_highlight): Functions deleted.
(tty_draw_row_with_mouse_face): New function.
(term_mouse_movement): Call note_mouse_highlight instead of
term_mouse_highlight.
* nsterm.m (ns_update_window_begin, ns_update_window_end)
(ns_update_end, x_destroy_window, ns_frame_up_to_date)
(ns_dumpglyphs_box_or_relief, ns_maybe_dumpglyphs_background)
(ns_dumpglyphs_image, ns_dumpglyphs_stretch)
(ns_initialize_display_info, keyDown, mouseMoved, mouseExited):
Replace Display_Info with Mouse_HLInfo everywhere where
mouse_face_* members were accessed for mouse highlight purposes.
* xterm.c (x_update_window_begin, x_update_window_end)
(x_update_end, XTframe_up_to_date, x_set_mouse_face_gc)
(handle_one_xevent, x_free_frame_resources, x_term_init): Replace
Display_Info with Mouse_HLInfo everywhere where mouse_face_*
members were accessed for mouse highlight purposes.
* w32term.c (x_update_window_begin, x_update_window_end)
(x_update_end, w32_read_socket, x_free_frame_resources)
(w32_initialize_display_info): Replace Display_Info with
Mouse_HLInfo everywhere where mouse_face_* members were accessed
for mouse highlight purposes.
* xdisp.c (show_mouse_face, note_mode_line_or_margin_highlight)
(note_mouse_highlight) [HAVE_WINDOW_SYSTEM]: Don't run GUI code
unless the frame is on a window-system.
(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.
(coords_in_mouse_face_p): Move prototype out of the
HAVE_WINDOW_SYSTEM conditional.
(x_y_to_hpos_vpos, frame_to_window_pixel_xy): Move out of the
HAVE_WINDOW_SYSTEM block.
(try_window_id) [HAVE_GPM || MSDOS]: Call
x_clear_window_mouse_face.
(draw_row_with_mouse_face): Implementation for HAVE_WINDOW_SYSTEM
systems. Call tty_draw_row_with_mouse_face for TTY systems.
(show_mouse_face): Call draw_row_with_mouse_face, instead of
calling draw_glyphs directly.
(show_mouse_face, clear_mouse_face, coords_in_mouse_face_p)
(cursor_in_mouse_face_p, rows_from_pos_range)
(mouse_face_from_buffer_pos, mouse_face_from_string_pos)
(note_mode_line_or_margin_highlight, note_mouse_highlight)
(x_clear_window_mouse_face, cancel_mouse_face): Move out of the
HAVE_WINDOW_SYSTEM block. Ifdef away window-system specific
fragments.
(note_mouse_highlight): Call popup_activated for MSDOS as well.
Clear mouse highlight if pointer is over glyphs whose OBJECT is an
integer.
(mouse_face_from_buffer_pos): Add parentheses around && within ||.
(x_consider_frame_title, tool_bar_lines_needed): Move
prototypes to HAVE_WINDOW_SYSTEM-only part.
(get_window_cursor_type): Move inside a HAVE_WINDOW_SYSTEM-only
part. Remove "#ifdef HAVE_WINDOW_SYSTEM" from body of function.
(null_glyph_slice): Move declaration into HAVE_WINDOW_SYSTEM-only
part.
* dispnew.c (mirror_make_current): Set Y coordinate of the
mode-line and header-line rows.
(init_display): Setup initial frame's output_data for text
terminal frames.
* xmenu.c (popup_activated): Don't define on MSDOS, which now has
its own definition on msdos.c.
* msdos.c (show_mouse_face, clear_mouse_face)
(fast_find_position, IT_note_mode_line_highlight)
(IT_note_mouse_highlight): Functions deleted.
(IT_frame_up_to_date, dos_rawgetc): Call note_mouse_highlight
instead of IT_note_mouse_highlight.
(draw_row_with_mouse_face, popup_activated): New functions.
(dos_set_window_size, draw_row_with_mouse_face, IT_update_begin)
(IT_update_end, IT_frame_up_to_date, internal_terminal_init)
(dos_rawgetc): Replace Display_Info with Mouse_HLInfo everywhere
where mouse_face_* members were accessed for mouse highlight
purposes.
* msdos.h (initialize_msdos_display): Add prototype.
* 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 (show_mouse_face, clear_mouse_face): Update type of
1st argument.
(frame_to_window_pixel_xy, note_mouse_highlight)
(x_clear_window_mouse_face, cancel_mouse_face, clear_mouse_face)
(show_mouse_face, cursor_in_mouse_face_p): Move prototypes out of
HAVE_WINDOW_SYSTEM conditional.
(draw_row_with_mouse_face): Declare prototype.
(tty_draw_row_with_mouse_face): Declare prototype.
2010-11-05 Eli Zaretskii <eliz@gnu.org>
* term.c (append_glyphless_glyph, produce_glyphless_glyph): Remove

View file

@ -69,6 +69,11 @@ typedef Pixmap XImagePtr;
typedef XImagePtr XImagePtr_or_DC;
#endif
#ifndef HAVE_WINDOW_SYSTEM
typedef int Cursor;
#define No_Cursor (0)
#endif
#ifndef NativeRectangle
#define NativeRectangle int
#endif
@ -3060,28 +3065,31 @@ extern void x_update_cursor (struct frame *, int);
extern void x_clear_cursor (struct window *);
extern void x_draw_vertical_border (struct window *w);
extern void frame_to_window_pixel_xy (struct window *, int *, int *);
extern int get_glyph_string_clip_rects (struct glyph_string *,
NativeRectangle *, int);
extern void get_glyph_string_clip_rect (struct glyph_string *,
NativeRectangle *nr);
extern Lisp_Object find_hot_spot (Lisp_Object, int, int);
extern void note_mouse_highlight (struct frame *, int, int);
extern void x_clear_window_mouse_face (struct window *);
extern void cancel_mouse_face (struct frame *);
extern void handle_tool_bar_click (struct frame *,
int, int, int, unsigned int);
/* msdos.c defines its own versions of these functions. */
extern int clear_mouse_face (Display_Info *);
extern void show_mouse_face (Display_Info *, enum draw_glyphs_face);
extern int cursor_in_mouse_face_p (struct window *w);
extern void expose_frame (struct frame *, int, int, int, int);
extern int x_intersect_rectangles (XRectangle *, XRectangle *,
XRectangle *);
#endif
#endif /* HAVE_WINDOW_SYSTEM */
extern void frame_to_window_pixel_xy (struct window *, int *, int *);
extern void note_mouse_highlight (struct frame *, int, int);
extern void x_clear_window_mouse_face (struct window *);
extern void cancel_mouse_face (struct frame *);
extern int clear_mouse_face (Mouse_HLInfo *);
extern void show_mouse_face (Mouse_HLInfo *, enum draw_glyphs_face);
extern int cursor_in_mouse_face_p (struct window *w);
extern void draw_row_with_mouse_face (struct window *, int, struct glyph_row *,
int, int, enum draw_glyphs_face);
extern void tty_draw_row_with_mouse_face (struct window *, struct glyph_row *,
int, int, enum draw_glyphs_face);
/* Flags passed to try_window. */
#define TRY_WINDOW_CHECK_MARGINS (1 << 0)

View file

@ -2893,6 +2893,14 @@ mirror_make_current (struct window *w, int frame_row)
else
swap_glyph_pointers (desired_row, current_row);
current_row->enabled_p = 1;
/* Set the Y coordinate of the mode/header line's row.
It is needed in draw_row_with_mouse_face to find the
screen coordinates. (Window-based redisplay sets
this in update_window, but no one seems to do that
for frame-based redisplay.) */
if (current_row->mode_line_p)
current_row->y = row;
}
}
@ -6416,6 +6424,12 @@ init_display (void)
f->terminal = t;
t->reference_count++;
#ifdef MSDOS
f->output_data.tty->display_info = &the_only_display_info;
#else
if (f->output_method == output_termcap)
create_tty_output (f);
#endif
t->display_info.tty->top_frame = selected_frame;
change_frame_size (XFRAME (selected_frame),
FrameRows (t->display_info.tty),

View file

@ -544,6 +544,20 @@ 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. We need to define two versions because a TTY-only build
does not have FRAME_X_DISPLAY_INFO. */
#ifdef HAVE_WINDOW_SYSTEM
# define MOUSE_HL_INFO(F) \
(FRAME_WINDOW_P(F) \
? &(FRAME_X_DISPLAY_INFO(F)->mouse_highlight) \
: &(((F)->output_data.tty->display_info)->mouse_highlight))
#else
# define MOUSE_HL_INFO(F) \
(&(((F)->output_data.tty->display_info)->mouse_highlight))
#endif
/* 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

@ -584,14 +584,14 @@ dos_set_window_size (int *rows, int *cols)
if (current_rows != *rows || current_cols != *cols)
{
struct frame *f = SELECTED_FRAME();
struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Lisp_Object window = dpyinfo->mouse_face_window;
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
Lisp_Object 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;
}
}
@ -941,551 +941,79 @@ static Lisp_Object last_mouse_window;
static int mouse_preempted = 0; /* non-zero when XMenu gobbles mouse events */
/* Set the mouse pointer shape according to whether it is in the
area where the mouse highlight is in effect. */
static void
IT_set_mouse_pointer (int mode)
int
popup_activated (void)
{
/* A no-op for now. DOS text-mode mouse pointer doesn't offer too
many possibilities to change its shape, and the available
functionality pretty much sucks (e.g., almost every reasonable
shape will conceal the character it is on). Since the color of
the pointer changes in the highlighted area, it is not clear to
me whether anything else is required, anyway. */
return mouse_preempted;
}
/* Display the active region described by mouse_face_*
in its mouse-face if HL > 0, in its normal face if HL = 0. */
static void
show_mouse_face (struct tty_display_info *dpyinfo, int hl)
/* Draw TEXT_AREA glyphs between START and END of glyph row ROW on
window W. X is relative to TEXT_AREA in W. HL is a face override
for drawing the glyphs. */
void
tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *row,
int start_hpos, int end_hpos,
enum draw_glyphs_face hl)
{
struct window *w = XWINDOW (dpyinfo->mouse_face_window);
struct frame *f = XFRAME (WINDOW_FRAME (w));
int i;
struct face *fp;
struct tty_display_info *tty = FRAME_TTY (f);
Mouse_HLInfo *hlinfo = &tty->mouse_highlight;
/* If window is in the process of being destroyed, don't bother
doing anything. */
if (w->current_matrix == NULL)
goto set_cursor_shape;
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */
if (dpyinfo->mouse_face_end_row >= w->current_matrix->nrows)
goto set_cursor_shape;
/* There's no sense to do anything if the mouse face isn't realized. */
if (hl > 0)
if (hl == DRAW_MOUSE_FACE)
{
if (dpyinfo->mouse_face_hidden)
goto set_cursor_shape;
int vpos = row->y + WINDOW_TOP_EDGE_Y (w);
int kstart = start_hpos + WINDOW_LEFT_EDGE_X (w);
int nglyphs = end_hpos - start_hpos;
int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1;
int start_offset = offset;
fp = FACE_FROM_ID (SELECTED_FRAME(), dpyinfo->mouse_face_face_id);
if (!fp)
goto set_cursor_shape;
}
if (tty->termscript)
fprintf (tty->termscript, "\n<MH+ %d-%d:%d>",
kstart, kstart + nglyphs - 1, vpos);
/* Note that mouse_face_beg_row etc. are window relative. */
for (i = dpyinfo->mouse_face_beg_row;
i <= dpyinfo->mouse_face_end_row;
i++)
{
int start_hpos, end_hpos;
struct glyph_row *row = MATRIX_ROW (w->current_matrix, i);
/* Don't do anything if row doesn't have valid contents. */
if (!row->enabled_p)
continue;
/* For all but the first row, the highlight starts at column 0. */
if (i == dpyinfo->mouse_face_beg_row)
start_hpos = dpyinfo->mouse_face_beg_col;
else
start_hpos = 0;
if (i == dpyinfo->mouse_face_end_row)
end_hpos = dpyinfo->mouse_face_end_col;
else
end_hpos = row->used[TEXT_AREA];
if (end_hpos <= start_hpos)
continue;
/* Record that some glyphs of this row are displayed in
mouse-face. */
row->mouse_face_p = hl > 0;
if (hl > 0)
mouse_off ();
IT_set_face (hlinfo->mouse_face_face_id);
/* Since we are going to change only the _colors_ of already
displayed text, there's no need to go through all the pain of
generating and encoding the text from the glyphs. Instead,
we simply poke the attribute byte of each affected position
in video memory with the colors computed by IT_set_face! */
_farsetsel (_dos_ds);
while (nglyphs--)
{
int vpos = row->y + WINDOW_TOP_EDGE_Y (w);
int kstart = start_hpos + WINDOW_LEFT_EDGE_X (w);
int nglyphs = end_hpos - start_hpos;
int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1;
int start_offset = offset;
if (tty->termscript)
fprintf (tty->termscript, "\n<MH+ %d-%d:%d>",
kstart, kstart + nglyphs - 1, vpos);
mouse_off ();
IT_set_face (dpyinfo->mouse_face_face_id);
/* Since we are going to change only the _colors_ of the
displayed text, there's no need to go through all the
pain of generating and encoding the text from the glyphs.
Instead, we simply poke the attribute byte of each
affected position in video memory with the colors
computed by IT_set_face! */
_farsetsel (_dos_ds);
while (nglyphs--)
{
_farnspokeb (offset, ScreenAttrib);
offset += 2;
}
if (screen_virtual_segment)
dosv_refresh_virtual_screen (start_offset, end_hpos - start_hpos);
mouse_on ();
}
else
{
/* We are removing a previously-drawn mouse highlight. The
safest way to do so is to redraw the glyphs anew, since
all kinds of faces and display tables could have changed
behind our back. */
int nglyphs = end_hpos - start_hpos;
int save_x = new_pos_X, save_y = new_pos_Y;
if (end_hpos >= row->used[TEXT_AREA])
nglyphs = row->used[TEXT_AREA] - start_hpos;
/* IT_write_glyphs writes at cursor position, so we need to
temporarily move cursor coordinates to the beginning of
the highlight region. */
new_pos_X = start_hpos + WINDOW_LEFT_EDGE_X (w);
new_pos_Y = row->y + WINDOW_TOP_EDGE_Y (w);
if (tty->termscript)
fprintf (tty->termscript, "<MH- %d-%d:%d>",
new_pos_X, new_pos_X + nglyphs - 1, new_pos_Y);
IT_write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
if (tty->termscript)
fputs ("\n", tty->termscript);
new_pos_X = save_x;
new_pos_Y = save_y;
_farnspokeb (offset, ScreenAttrib);
offset += 2;
}
if (screen_virtual_segment)
dosv_refresh_virtual_screen (start_offset, end_hpos - start_hpos);
mouse_on ();
}
set_cursor_shape:
/* Change the mouse pointer shape. */
IT_set_mouse_pointer (hl);
}
/* Clear out the mouse-highlighted active region.
Redraw it un-highlighted first. */
static void
clear_mouse_face (struct tty_display_info *dpyinfo)
{
if (!dpyinfo->mouse_face_hidden && ! NILP (dpyinfo->mouse_face_window))
show_mouse_face (dpyinfo, 0);
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;
}
/* Find the glyph matrix position of buffer position POS in window W.
*HPOS and *VPOS are set to the positions found. W's current glyphs
must be up to date. If POS is above window start return (0, 0).
If POS is after end of W, return end of last line in W. */
static int
fast_find_position (struct window *w, int pos, int *hpos, int *vpos)
{
int i, lastcol, line_start_position, maybe_next_line_p = 0;
int yb = window_text_bottom_y (w);
struct glyph_row *row = MATRIX_ROW (w->current_matrix, 0), *best_row = row;
while (row->y < yb)
else if (hl == DRAW_NORMAL_TEXT)
{
if (row->used[TEXT_AREA])
line_start_position = row->glyphs[TEXT_AREA]->charpos;
else
line_start_position = 0;
/* We are removing a previously-drawn mouse highlight. The
safest way to do so is to redraw the glyphs anew, since all
kinds of faces and display tables could have changed behind
our back. */
int nglyphs = end_hpos - start_hpos;
int save_x = new_pos_X, save_y = new_pos_Y;
if (line_start_position > pos)
break;
/* If the position sought is the end of the buffer,
don't include the blank lines at the bottom of the window. */
else if (line_start_position == pos
&& pos == BUF_ZV (XBUFFER (w->buffer)))
{
maybe_next_line_p = 1;
break;
}
else if (line_start_position > 0)
best_row = row;
if (end_hpos >= row->used[TEXT_AREA])
nglyphs = row->used[TEXT_AREA] - start_hpos;
/* Don't overstep the last matrix row, lest we get into the
never-never land... */
if (row->y + 1 >= yb)
break;
/* IT_write_glyphs writes at cursor position, so we need to
temporarily move cursor coordinates to the beginning of
the highlight region. */
new_pos_X = start_hpos + WINDOW_LEFT_EDGE_X (w);
new_pos_Y = row->y + WINDOW_TOP_EDGE_Y (w);
++row;
}
/* Find the right column within BEST_ROW. */
lastcol = 0;
row = best_row;
for (i = 0; i < row->used[TEXT_AREA]; i++)
{
struct glyph *glyph = row->glyphs[TEXT_AREA] + i;
int charpos;
charpos = glyph->charpos;
if (charpos == pos)
{
*hpos = i;
*vpos = row->y;
return 1;
}
else if (charpos > pos)
break;
else if (charpos > 0)
lastcol = i;
}
/* If we're looking for the end of the buffer,
and we didn't find it in the line we scanned,
use the start of the following line. */
if (maybe_next_line_p)
{
++row;
lastcol = 0;
}
*vpos = row->y;
*hpos = lastcol + 1;
return 0;
}
/* Take proper action when mouse has moved to the mode or top line of
window W, x-position X. MODE_LINE_P non-zero means mouse is on the
mode line. X is relative to the start of the text display area of
W, so the width of fringes and scroll bars must be subtracted
to get a position relative to the start of the mode line. */
static void
IT_note_mode_line_highlight (struct window *w, int x, int mode_line_p)
{
struct glyph_row *row;
if (mode_line_p)
row = MATRIX_MODE_LINE_ROW (w->current_matrix);
else
row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
if (row->enabled_p)
{
struct glyph *glyph, *end;
Lisp_Object help;
/* Find the glyph under X. */
glyph = (row->glyphs[TEXT_AREA]
+ x
/* in case someone implements scroll bars some day... */
- WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w));
end = glyph + row->used[TEXT_AREA];
if (glyph < end
&& STRINGP (glyph->object)
&& STRING_INTERVALS (glyph->object)
&& glyph->charpos >= 0
&& glyph->charpos < SCHARS (glyph->object))
{
/* If we're on a string with `help-echo' text property,
arrange for the help to be displayed. This is done by
setting the global variable help_echo to the help string. */
help = Fget_text_property (make_number (glyph->charpos),
Qhelp_echo, glyph->object);
if (!NILP (help))
{
help_echo_string = help;
XSETWINDOW (help_echo_window, w);
help_echo_object = glyph->object;
help_echo_pos = glyph->charpos;
}
}
}
}
/* Take proper action when the mouse has moved to position X, Y on
frame F as regards highlighting characters that have mouse-face
properties. Also de-highlighting chars where the mouse was before.
X and Y can be negative or out of range. */
static void
IT_note_mouse_highlight (struct frame *f, int x, int y)
{
struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
enum window_part part = ON_NOTHING;
Lisp_Object window;
struct window *w;
/* When a menu is active, don't highlight because this looks odd. */
if (mouse_preempted)
return;
if (NILP (Vmouse_highlight)
|| !f->glyphs_initialized_p)
return;
dpyinfo->mouse_face_mouse_x = x;
dpyinfo->mouse_face_mouse_y = y;
dpyinfo->mouse_face_mouse_frame = f;
if (dpyinfo->mouse_face_defer)
return;
if (gc_in_progress)
{
dpyinfo->mouse_face_deferred_gc = 1;
return;
}
/* Which window is that in? */
window = window_from_coordinates (f, x, y, &part, &x, &y, 0);
/* If we were displaying active text in another window, clear that. */
if (! EQ (window, dpyinfo->mouse_face_window))
clear_mouse_face (dpyinfo);
/* Not on a window -> return. */
if (!WINDOWP (window))
return;
/* Convert to window-relative coordinates. */
w = XWINDOW (window);
if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
{
/* Mouse is on the mode or top line. */
IT_note_mode_line_highlight (w, x, part == ON_MODE_LINE);
return;
}
IT_set_mouse_pointer (0);
/* Are we in a window whose display is up to date?
And verify the buffer's text has not changed. */
if (part == ON_TEXT
&& EQ (w->window_end_valid, w->buffer)
&& XFASTINT (w->last_modified) == BUF_MODIFF (XBUFFER (w->buffer))
&& (XFASTINT (w->last_overlay_modified)
== BUF_OVERLAY_MODIFF (XBUFFER (w->buffer))))
{
int pos, i, nrows = w->current_matrix->nrows;
struct glyph_row *row;
struct glyph *glyph;
/* Find the glyph under X/Y. */
glyph = NULL;
if (y >= 0 && y < nrows)
{
row = MATRIX_ROW (w->current_matrix, y);
/* Give up if some row before the one we are looking for is
not enabled. */
for (i = 0; i <= y; i++)
if (!MATRIX_ROW (w->current_matrix, i)->enabled_p)
break;
if (i > y /* all rows upto and including the one at Y are enabled */
&& row->displays_text_p
&& x < window_box_width (w, TEXT_AREA))
{
glyph = row->glyphs[TEXT_AREA];
if (x >= row->used[TEXT_AREA])
glyph = NULL;
else
{
glyph += x;
if (!BUFFERP (glyph->object))
glyph = NULL;
}
}
}
/* Clear mouse face if X/Y not over text. */
if (glyph == NULL)
{
clear_mouse_face (dpyinfo);
return;
}
if (!BUFFERP (glyph->object))
abort ();
pos = glyph->charpos;
/* Check for mouse-face and help-echo. */
{
Lisp_Object mouse_face, overlay, position, *overlay_vec;
int noverlays, obegv, ozv;
struct buffer *obuf;
/* If we get an out-of-range value, return now; avoid an error. */
if (pos > BUF_Z (XBUFFER (w->buffer)))
return;
/* Make the window's buffer temporarily current for
overlays_at and compute_char_face. */
obuf = current_buffer;
current_buffer = XBUFFER (w->buffer);
obegv = BEGV;
ozv = ZV;
BEGV = BEG;
ZV = Z;
/* Is this char mouse-active or does it have help-echo? */
XSETINT (position, pos);
/* Put all the overlays we want in a vector in overlay_vec. */
GET_OVERLAYS_AT (pos, overlay_vec, noverlays, NULL, 0);
/* Sort overlays into increasing priority order. */
noverlays = sort_overlays (overlay_vec, noverlays, w);
/* Check mouse-face highlighting. */
if (! (EQ (window, dpyinfo->mouse_face_window)
&& y >= dpyinfo->mouse_face_beg_row
&& y <= dpyinfo->mouse_face_end_row
&& (y > dpyinfo->mouse_face_beg_row
|| x >= dpyinfo->mouse_face_beg_col)
&& (y < dpyinfo->mouse_face_end_row
|| x < dpyinfo->mouse_face_end_col
|| dpyinfo->mouse_face_past_end)))
{
/* Clear the display of the old active region, if any. */
clear_mouse_face (dpyinfo);
/* Find highest priority overlay that has a mouse-face prop. */
overlay = Qnil;
for (i = noverlays - 1; i >= 0; --i)
{
mouse_face = Foverlay_get (overlay_vec[i], Qmouse_face);
if (!NILP (mouse_face))
{
overlay = overlay_vec[i];
break;
}
}
/* If no overlay applies, get a text property. */
if (NILP (overlay))
mouse_face = Fget_text_property (position, Qmouse_face,
w->buffer);
/* Handle the overlay case. */
if (! NILP (overlay))
{
/* Find the range of text around this char that
should be active. */
Lisp_Object before, after;
EMACS_INT ignore;
before = Foverlay_start (overlay);
after = Foverlay_end (overlay);
/* Record this as the current active region. */
fast_find_position (w, XFASTINT (before),
&dpyinfo->mouse_face_beg_col,
&dpyinfo->mouse_face_beg_row);
dpyinfo->mouse_face_past_end
= !fast_find_position (w, XFASTINT (after),
&dpyinfo->mouse_face_end_col,
&dpyinfo->mouse_face_end_row);
dpyinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id
= face_at_buffer_position (w, pos, 0, 0,
&ignore, pos + 1,
!dpyinfo->mouse_face_hidden,
-1);
/* Display it as active. */
show_mouse_face (dpyinfo, 1);
}
/* Handle the text property case. */
else if (! NILP (mouse_face))
{
/* Find the range of text around this char that
should be active. */
Lisp_Object before, after, beginning, end;
EMACS_INT ignore;
beginning = Fmarker_position (w->start);
XSETINT (end, (BUF_Z (XBUFFER (w->buffer))
- XFASTINT (w->window_end_pos)));
before
= Fprevious_single_property_change (make_number (pos + 1),
Qmouse_face,
w->buffer, beginning);
after
= Fnext_single_property_change (position, Qmouse_face,
w->buffer, end);
/* Record this as the current active region. */
fast_find_position (w, XFASTINT (before),
&dpyinfo->mouse_face_beg_col,
&dpyinfo->mouse_face_beg_row);
dpyinfo->mouse_face_past_end
= !fast_find_position (w, XFASTINT (after),
&dpyinfo->mouse_face_end_col,
&dpyinfo->mouse_face_end_row);
dpyinfo->mouse_face_window = window;
dpyinfo->mouse_face_face_id
= face_at_buffer_position (w, pos, 0, 0,
&ignore, pos + 1,
!dpyinfo->mouse_face_hidden,
-1);
/* Display it as active. */
show_mouse_face (dpyinfo, 1);
}
}
/* Look for a `help-echo' property. */
{
Lisp_Object help;
/* Check overlays first. */
help = Qnil;
for (i = noverlays - 1; i >= 0 && NILP (help); --i)
{
overlay = overlay_vec[i];
help = Foverlay_get (overlay, Qhelp_echo);
}
if (!NILP (help))
{
help_echo_string = help;
help_echo_window = window;
help_echo_object = overlay;
help_echo_pos = pos;
}
/* Try text properties. */
else if (NILP (help)
&& ((STRINGP (glyph->object)
&& glyph->charpos >= 0
&& glyph->charpos < SCHARS (glyph->object))
|| (BUFFERP (glyph->object)
&& glyph->charpos >= BEGV
&& glyph->charpos < ZV)))
{
help = Fget_text_property (make_number (glyph->charpos),
Qhelp_echo, glyph->object);
if (!NILP (help))
{
help_echo_string = help;
help_echo_window = window;
help_echo_object = glyph->object;
help_echo_pos = glyph->charpos;
}
}
}
BEGV = obegv;
ZV = ozv;
current_buffer = obuf;
}
if (tty->termscript)
fprintf (tty->termscript, "<MH- %d-%d:%d>",
new_pos_X, new_pos_X + nglyphs - 1, new_pos_Y);
IT_write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
if (tty->termscript)
fputs ("\n", tty->termscript);
new_pos_X = save_x;
new_pos_Y = save_y;
}
}
@ -1689,7 +1217,8 @@ static void
IT_update_begin (struct frame *f)
{
struct tty_display_info *display_info = FRAME_X_DISPLAY_INFO (f);
struct frame *mouse_face_frame = display_info->mouse_face_mouse_frame;
Mouse_HLInfo *hlinfo = &display_info->mouse_highlight;
struct frame *mouse_face_frame = hlinfo->mouse_face_mouse_frame;
if (display_info->termscript)
fprintf (display_info->termscript, "\n\n<UPDATE_BEGIN");
@ -1699,28 +1228,28 @@ IT_update_begin (struct frame *f)
if (f && f == mouse_face_frame)
{
/* Don't do highlighting for mouse motion during the update. */
display_info->mouse_face_defer = 1;
hlinfo->mouse_face_defer = 1;
/* If F needs to be redrawn, simply forget about any prior mouse
highlighting. */
if (FRAME_GARBAGED_P (f))
display_info->mouse_face_window = Qnil;
hlinfo->mouse_face_window = Qnil;
/* Can we tell that this update does not affect the window
where the mouse highlight is? If so, no need to turn off.
Likewise, don't do anything if none of the enabled rows
contains glyphs highlighted in mouse face. */
if (!NILP (display_info->mouse_face_window)
&& WINDOWP (display_info->mouse_face_window))
if (!NILP (hlinfo->mouse_face_window)
&& WINDOWP (hlinfo->mouse_face_window))
{
struct window *w = XWINDOW (display_info->mouse_face_window);
struct window *w = XWINDOW (hlinfo->mouse_face_window);
int i;
/* If the mouse highlight is in the window that was deleted
(e.g., if it was popped by completion), clear highlight
unconditionally. */
if (NILP (w->buffer))
display_info->mouse_face_window = Qnil;
hlinfo->mouse_face_window = Qnil;
else
{
for (i = 0; i < w->desired_matrix->nrows; ++i)
@ -1730,18 +1259,18 @@ IT_update_begin (struct frame *f)
}
if (NILP (w->buffer) || i < w->desired_matrix->nrows)
clear_mouse_face (display_info);
clear_mouse_face (hlinfo);
}
}
else if (mouse_face_frame && !FRAME_LIVE_P (mouse_face_frame))
{
/* If the frame with mouse highlight was deleted, invalidate the
highlight info. */
display_info->mouse_face_beg_row = display_info->mouse_face_beg_col = -1;
display_info->mouse_face_end_row = display_info->mouse_face_end_col = -1;
display_info->mouse_face_window = Qnil;
display_info->mouse_face_deferred_gc = 0;
display_info->mouse_face_mouse_frame = NULL;
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_deferred_gc = 0;
hlinfo->mouse_face_mouse_frame = NULL;
}
UNBLOCK_INPUT;
@ -1754,25 +1283,25 @@ IT_update_end (struct frame *f)
if (dpyinfo->termscript)
fprintf (dpyinfo->termscript, "\n<UPDATE_END\n");
dpyinfo->mouse_face_defer = 0;
dpyinfo->mouse_highlight.mouse_face_defer = 0;
}
static void
IT_frame_up_to_date (struct frame *f)
{
struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
Lisp_Object new_cursor, frame_desired_cursor;
struct window *sw;
if (dpyinfo->mouse_face_deferred_gc
|| (f && f == dpyinfo->mouse_face_mouse_frame))
if (hlinfo->mouse_face_deferred_gc
|| (f && f == hlinfo->mouse_face_mouse_frame))
{
BLOCK_INPUT;
if (dpyinfo->mouse_face_mouse_frame)
IT_note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
dpyinfo->mouse_face_mouse_x,
dpyinfo->mouse_face_mouse_y);
dpyinfo->mouse_face_deferred_gc = 0;
if (hlinfo->mouse_face_mouse_frame)
note_mouse_highlight (hlinfo->mouse_face_mouse_frame,
hlinfo->mouse_face_mouse_x,
hlinfo->mouse_face_mouse_y);
hlinfo->mouse_face_deferred_gc = 0;
UNBLOCK_INPUT;
}
@ -2317,18 +1846,18 @@ internal_terminal_init (void)
if (colors[1] >= 0 && colors[1] < 16)
FRAME_BACKGROUND_PIXEL (SELECTED_FRAME ()) = colors[1];
}
the_only_display_info.mouse_face_mouse_frame = NULL;
the_only_display_info.mouse_face_deferred_gc = 0;
the_only_display_info.mouse_face_beg_row =
the_only_display_info.mouse_face_beg_col = -1;
the_only_display_info.mouse_face_end_row =
the_only_display_info.mouse_face_end_col = -1;
the_only_display_info.mouse_face_face_id = DEFAULT_FACE_ID;
the_only_display_info.mouse_face_window = Qnil;
the_only_display_info.mouse_face_mouse_x =
the_only_display_info.mouse_face_mouse_y = 0;
the_only_display_info.mouse_face_defer = 0;
the_only_display_info.mouse_face_hidden = 0;
the_only_display_info.mouse_highlight.mouse_face_mouse_frame = NULL;
the_only_display_info.mouse_highlight.mouse_face_deferred_gc = 0;
the_only_display_info.mouse_highlight.mouse_face_beg_row =
the_only_display_info.mouse_highlight.mouse_face_beg_col = -1;
the_only_display_info.mouse_highlight.mouse_face_end_row =
the_only_display_info.mouse_highlight.mouse_face_end_col = -1;
the_only_display_info.mouse_highlight.mouse_face_face_id = DEFAULT_FACE_ID;
the_only_display_info.mouse_highlight.mouse_face_window = Qnil;
the_only_display_info.mouse_highlight.mouse_face_mouse_x =
the_only_display_info.mouse_highlight.mouse_face_mouse_y = 0;
the_only_display_info.mouse_highlight.mouse_face_defer = 0;
the_only_display_info.mouse_highlight.mouse_face_hidden = 0;
if (have_mouse) /* detected in dos_ttraw, which see */
{
@ -2916,7 +2445,7 @@ dos_rawgetc (void)
{
struct input_event event;
union REGS regs;
struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (SELECTED_FRAME());
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (SELECTED_FRAME());
EVENT_INIT (event);
#ifndef HAVE_X_WINDOWS
@ -3126,10 +2655,10 @@ dos_rawgetc (void)
if (code == 0)
continue;
if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
if (code >= 0x100)
@ -3157,10 +2686,10 @@ dos_rawgetc (void)
might need to update mouse highlight. */
if (mouse_last_x != mouse_prev_x || mouse_last_y != mouse_prev_y)
{
if (dpyinfo->mouse_face_hidden)
if (hlinfo->mouse_face_hidden)
{
dpyinfo->mouse_face_hidden = 0;
clear_mouse_face (dpyinfo);
hlinfo->mouse_face_hidden = 0;
clear_mouse_face (hlinfo);
}
/* Generate SELECT_WINDOW_EVENTs when needed. */
@ -3192,8 +2721,7 @@ dos_rawgetc (void)
previous_help_echo_string = help_echo_string;
help_echo_string = help_echo_object = help_echo_window = Qnil;
help_echo_pos = -1;
IT_note_mouse_highlight (SELECTED_FRAME(),
mouse_last_x, mouse_last_y);
note_mouse_highlight (SELECTED_FRAME(), mouse_last_x, mouse_last_y);
/* If the contents of the global variable help_echo has
changed, generate a HELP_EVENT. */
if (!NILP (help_echo_string) || !NILP (previous_help_echo_string))

View file

@ -34,6 +34,7 @@ void dostounix_filename (char *);
char *rootrelativepath (char *);
void init_environment (int, char **, int);
void internal_terminal_init (void);
void initialize_msdos_display (struct terminal *);
extern int have_mouse;
void mouse_init (void);

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

@ -553,7 +553,7 @@ Free a pool and temporary objects it refers to (callable from C)
-------------------------------------------------------------------------- */
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
NSTRACE (ns_update_window_begin);
updated_window = w;
@ -561,15 +561,15 @@ Free a pool and temporary objects it refers to (callable from C)
BLOCK_INPUT;
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* Don't do highlighting for mouse motion during the update. */
dpyinfo->mouse_face_defer = 1;
hlinfo->mouse_face_defer = 1;
/* If the frame needs to be redrawn,
simply forget about any prior mouse highlighting. */
if (FRAME_GARBAGED_P (f))
dpyinfo->mouse_face_window = Qnil;
hlinfo->mouse_face_window = Qnil;
/* (further code for mouse faces ifdef'd out in other terms elided) */
}
@ -586,7 +586,7 @@ Free a pool and temporary objects it refers to (callable from C)
external (RIF) call; for one window called before update_end
-------------------------------------------------------------------------- */
{
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (XFRAME (w->frame));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
/* note: this fn is nearly identical in all terms */
if (!w->pseudo_window_p)
@ -608,9 +608,9 @@ Free a pool and temporary objects it refers to (callable from C)
frame_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;
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;
}
updated_window = NULL;
@ -627,8 +627,8 @@ Free a pool and temporary objects it refers to (callable from C)
{
NSView *view = FRAME_NS_VIEW (f);
/* if (f == FRAME_NS_DISPLAY_INFO (f)->mouse_face_mouse_frame) */
FRAME_NS_DISPLAY_INFO (f)->mouse_face_defer = 0;
/* if (f == MOUSE_HL_INFO (f)->mouse_face_mouse_frame) */
MOUSE_HL_INFO (f)->mouse_face_defer = 0;
BLOCK_INPUT;
@ -1032,6 +1032,7 @@ Free a pool and temporary objects it refers to (callable from C)
{
NSView *view = FRAME_NS_VIEW (f);
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
NSTRACE (x_destroy_window);
check_ns ();
@ -1048,13 +1049,13 @@ Free a pool and temporary objects it refers to (callable from C)
dpyinfo->x_focus_frame = 0;
if (f == dpyinfo->x_highlight_frame)
dpyinfo->x_highlight_frame = 0;
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
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_deferred_gc = 0;
dpyinfo->mouse_face_mouse_frame = 0;
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_deferred_gc = 0;
hlinfo->mouse_face_mouse_frame = 0;
}
xfree (f->output_data.ns);
@ -1772,18 +1773,18 @@ Free a pool and temporary objects it refers to (callable from C)
if (FRAME_NS_P (f))
{
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f);
if ((dpyinfo->mouse_face_deferred_gc||f ==dpyinfo->mouse_face_mouse_frame)
/*&& dpyinfo->mouse_face_mouse_frame*/)
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
if ((hlinfo->mouse_face_deferred_gc || f ==hlinfo->mouse_face_mouse_frame)
/*&& hlinfo->mouse_face_mouse_frame*/)
{
BLOCK_INPUT;
ns_update_begin(f);
if (dpyinfo->mouse_face_mouse_frame)
note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
dpyinfo->mouse_face_mouse_x,
dpyinfo->mouse_face_mouse_y);
dpyinfo->mouse_face_deferred_gc = 0;
ns_update_end(f);
ns_update_begin(f);
if (hlinfo->mouse_face_mouse_frame)
note_mouse_highlight (hlinfo->mouse_face_mouse_frame,
hlinfo->mouse_face_mouse_x,
hlinfo->mouse_face_mouse_y);
hlinfo->mouse_face_deferred_gc = 0;
ns_update_end(f);
UNBLOCK_INPUT;
}
}
@ -2595,8 +2596,7 @@ Function modeled after x_draw_glyph_string_box ().
if (s->hl == DRAW_MOUSE_FACE)
{
face = FACE_FROM_ID
(s->f, FRAME_NS_DISPLAY_INFO (s->f)->mouse_face_face_id);
face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
if (!face)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
}
@ -2663,8 +2663,8 @@ Function modeled after x_draw_glyph_string_box ().
struct face *face;
if (s->hl == DRAW_MOUSE_FACE)
{
face = FACE_FROM_ID
(s->f, FRAME_NS_DISPLAY_INFO (s->f)->mouse_face_face_id);
face = FACE_FROM_ID (s->f,
MOUSE_HL_INFO (s->f)->mouse_face_face_id);
if (!face)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
}
@ -2749,8 +2749,7 @@ Function modeled after x_draw_glyph_string_box ().
with its background color), we must clear just the image area. */
if (s->hl == DRAW_MOUSE_FACE)
{
face = FACE_FROM_ID
(s->f, FRAME_NS_DISPLAY_INFO (s->f)->mouse_face_face_id);
face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
if (!face)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
}
@ -2873,8 +2872,7 @@ overwriting cursor (usually when cursor on a tab) */
if (s->hl == DRAW_MOUSE_FACE)
{
face = FACE_FROM_ID
(s->f, FRAME_NS_DISPLAY_INFO (s->f)->mouse_face_face_id);
face = FACE_FROM_ID (s->f, MOUSE_HL_INFO (s->f)->mouse_face_face_id);
if (!face)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
}
@ -3545,6 +3543,7 @@ Convert modifier code (see lisp.h) to lisp symbol
{
NSScreen *screen = [NSScreen mainScreen];
NSWindowDepth depth = [screen depth];
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
dpyinfo->resx = 72.27; /* used 75.0, but this makes pt == pixel, expected */
dpyinfo->resy = 72.27;
@ -3559,16 +3558,16 @@ Convert modifier code (see lisp.h) to lisp symbol
dpyinfo->color_table->colors = NULL;
dpyinfo->root_window = 42; /* a placeholder.. */
dpyinfo->mouse_face_mouse_frame = NULL;
dpyinfo->mouse_face_deferred_gc = 0;
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_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_hidden = 0;
hlinfo->mouse_face_mouse_frame = NULL;
hlinfo->mouse_face_deferred_gc = 0;
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_face_id = DEFAULT_FACE_ID;
hlinfo->mouse_face_window = hlinfo->mouse_face_overlay = Qnil;
hlinfo->mouse_face_hidden = 0;
dpyinfo->mouse_face_mouse_x = dpyinfo->mouse_face_mouse_y = 0;
dpyinfo->mouse_face_defer = 0;
hlinfo->mouse_face_mouse_x = hlinfo->mouse_face_mouse_y = 0;
hlinfo->mouse_face_defer = 0;
dpyinfo->x_highlight_frame = dpyinfo->x_focus_frame = NULL;
@ -4351,7 +4350,7 @@ - (void)resetCursorRects
- (void)keyDown: (NSEvent *)theEvent
{
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (emacsframe);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (emacsframe);
int code;
unsigned fnKeysym = 0;
int flags;
@ -4389,10 +4388,10 @@ most recently updated (I guess), which is not the correct one. */
[NSCursor setHiddenUntilMouseMoves: YES];
if (dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
if (hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
if (!processingCompose)
@ -4829,7 +4828,7 @@ - (void) scrollWheel: (NSEvent *)theEvent
/* Tell emacs the mouse has moved. */
- (void)mouseMoved: (NSEvent *)e
{
struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (emacsframe);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (emacsframe);
Lisp_Object frame;
// NSTRACE (mouseMoved);
@ -4839,10 +4838,10 @@ - (void)mouseMoved: (NSEvent *)e
= [self convertPoint: [e locationInWindow] fromView: nil];
/* update any mouse face */
if (dpyinfo->mouse_face_hidden)
if (hlinfo->mouse_face_hidden)
{
dpyinfo->mouse_face_hidden = 0;
clear_mouse_face (dpyinfo);
hlinfo->mouse_face_hidden = 0;
clear_mouse_face (hlinfo);
}
/* tooltip handling */
@ -5308,20 +5307,19 @@ - (void)mouseExited: (NSEvent *)theEvent
{
NSPoint p = [self convertPoint: [theEvent locationInWindow] fromView: nil];
NSRect r;
struct ns_display_info *dpyinfo
= emacsframe ? FRAME_NS_DISPLAY_INFO (emacsframe) : NULL;
Mouse_HLInfo *hlinfo = emacsframe ? MOUSE_HL_INFO (emacsframe) : NULL;
NSTRACE (mouseExited);
if (!dpyinfo)
if (!hlinfo)
return;
last_mouse_movement_time = EV_TIMESTAMP (theEvent);
if (emacsframe == dpyinfo->mouse_face_mouse_frame)
if (emacsframe == hlinfo->mouse_face_mouse_frame)
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_mouse_frame = 0;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_mouse_frame = 0;
}
}

View file

@ -184,24 +184,10 @@ extern char *tgetstr (char *, char **);
#ifdef HAVE_GPM
#include <sys/fcntl.h>
static void term_clear_mouse_face (void);
static void term_mouse_highlight (struct frame *f, int x, int y);
/* The device for which we have enabled gpm support (or NULL). */
struct tty_display_info *gpm_tty = NULL;
/* 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. */
static int mouse_face_beg_row, mouse_face_beg_col;
static int mouse_face_end_row, mouse_face_end_col;
static int mouse_face_past_end;
static Lisp_Object mouse_face_window;
static int mouse_face_face_id;
static int pos_x, pos_y;
/* Last recorded mouse coordinates. */
static int last_mouse_x, last_mouse_y;
#endif /* HAVE_GPM */
@ -2686,416 +2672,36 @@ term_mouse_moveto (int x, int y)
last_mouse_y = y; */
}
static void
term_show_mouse_face (enum draw_glyphs_face draw)
/* Implementation of draw_row_with_mouse_face for TTY/GPM. */
void
tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *row,
int start_hpos, int end_hpos,
enum draw_glyphs_face draw)
{
struct window *w = XWINDOW (mouse_face_window);
int save_x, save_y;
int i;
struct frame *f = XFRAME (w->frame);
int nglyphs = end_hpos - start_hpos;
struct frame *f = XFRAME (WINDOW_FRAME (w));
struct tty_display_info *tty = FRAME_TTY (f);
int face_id = tty->mouse_highlight.mouse_face_face_id;
int save_x, save_y, pos_x, pos_y;
if (/* If window is in the process of being destroyed, don't bother
to do anything. */
w->current_matrix != NULL
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */
&& mouse_face_end_row < w->current_matrix->nrows)
{
/* write_glyphs writes at cursor position, so we need to
temporarily move cursor coordinates to the beginning of
the highlight region. */
if (end_hpos >= row->used[TEXT_AREA])
nglyphs = row->used[TEXT_AREA] - start_hpos;
/* Save current cursor co-ordinates */
save_y = curY (tty);
save_x = curX (tty);
pos_y = row->y + WINDOW_TOP_EDGE_Y (w);
pos_x = row->used[LEFT_MARGIN_AREA] + start_hpos + WINDOW_LEFT_EDGE_X (w);
/* Note that mouse_face_beg_row etc. are window relative. */
for (i = mouse_face_beg_row; i <= mouse_face_end_row; i++)
{
int start_hpos, end_hpos, nglyphs;
struct glyph_row *row = MATRIX_ROW (w->current_matrix, i);
/* Save current cursor co-ordinates. */
save_y = curY (tty);
save_x = curX (tty);
cursor_to (f, pos_y, pos_x);
/* Don't do anything if row doesn't have valid contents. */
if (!row->enabled_p)
continue;
if (draw == DRAW_MOUSE_FACE)
tty_write_glyphs_with_face (f, row->glyphs[TEXT_AREA] + start_hpos,
nglyphs, face_id);
else if (draw == DRAW_NORMAL_TEXT)
write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
/* For all but the first row, the highlight starts at column 0. */
if (i == mouse_face_beg_row)
start_hpos = mouse_face_beg_col;
else
start_hpos = 0;
if (i == mouse_face_end_row)
end_hpos = mouse_face_end_col;
else
{
end_hpos = row->used[TEXT_AREA];
if (draw == DRAW_NORMAL_TEXT)
row->fill_line_p = 1; /* Clear to end of line */
}
if (end_hpos <= start_hpos)
continue;
/* Record that some glyphs of this row are displayed in
mouse-face. */
row->mouse_face_p = draw > 0;
nglyphs = end_hpos - start_hpos;
if (end_hpos >= row->used[TEXT_AREA])
nglyphs = row->used[TEXT_AREA] - start_hpos;
pos_y = row->y + WINDOW_TOP_EDGE_Y (w);
pos_x = row->used[LEFT_MARGIN_AREA] + start_hpos
+ WINDOW_LEFT_EDGE_X (w);
cursor_to (f, pos_y, pos_x);
if (draw == DRAW_MOUSE_FACE)
{
tty_write_glyphs_with_face (f, row->glyphs[TEXT_AREA] + start_hpos,
nglyphs, mouse_face_face_id);
}
else /* draw == DRAW_NORMAL_TEXT */
write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs);
}
cursor_to (f, save_y, save_x);
}
}
static void
term_clear_mouse_face (void)
{
if (!NILP (mouse_face_window))
term_show_mouse_face (DRAW_NORMAL_TEXT);
mouse_face_beg_row = mouse_face_beg_col = -1;
mouse_face_end_row = mouse_face_end_col = -1;
mouse_face_window = Qnil;
}
/* Find the glyph matrix position of buffer position POS in window W.
*HPOS and *VPOS are set to the positions found. W's current glyphs
must be up to date. If POS is above window start return (0, 0).
If POS is after end of W, return end of last line in W.
- taken from msdos.c */
static int
fast_find_position (struct window *w, EMACS_INT pos, int *hpos, int *vpos)
{
int i, lastcol, maybe_next_line_p = 0;
EMACS_INT line_start_position;
int yb = window_text_bottom_y (w);
struct glyph_row *row = MATRIX_ROW (w->current_matrix, 0), *best_row = row;
while (row->y < yb)
{
if (row->used[TEXT_AREA])
line_start_position = row->glyphs[TEXT_AREA]->charpos;
else
line_start_position = 0;
if (line_start_position > pos)
break;
/* If the position sought is the end of the buffer,
don't include the blank lines at the bottom of the window. */
else if (line_start_position == pos
&& pos == BUF_ZV (XBUFFER (w->buffer)))
{
maybe_next_line_p = 1;
break;
}
else if (line_start_position > 0)
best_row = row;
/* Don't overstep the last matrix row, lest we get into the
never-never land... */
if (row->y + 1 >= yb)
break;
++row;
}
/* Find the right column within BEST_ROW. */
lastcol = 0;
row = best_row;
for (i = 0; i < row->used[TEXT_AREA]; i++)
{
struct glyph *glyph = row->glyphs[TEXT_AREA] + i;
EMACS_INT charpos;
charpos = glyph->charpos;
if (charpos == pos)
{
*hpos = i;
*vpos = row->y;
return 1;
}
else if (charpos > pos)
break;
else if (charpos > 0)
lastcol = i;
}
/* If we're looking for the end of the buffer,
and we didn't find it in the line we scanned,
use the start of the following line. */
if (maybe_next_line_p)
{
++row;
lastcol = 0;
}
*vpos = row->y;
*hpos = lastcol + 1;
return 0;
}
static void
term_mouse_highlight (struct frame *f, int x, int y)
{
enum window_part part;
Lisp_Object window;
struct window *w;
struct buffer *b;
if (NILP (Vmouse_highlight)
|| !f->glyphs_initialized_p)
return;
/* Which window is that in? */
window = window_from_coordinates (f, x, y, &part, &x, &y, 0);
/* Not on a window -> return. */
if (!WINDOWP (window))
return;
if (!EQ (window, mouse_face_window))
term_clear_mouse_face ();
w = XWINDOW (window);
/* Are we in a window whose display is up to date?
And verify the buffer's text has not changed. */
b = XBUFFER (w->buffer);
if (part == ON_TEXT
&& EQ (w->window_end_valid, w->buffer)
&& XFASTINT (w->last_modified) == BUF_MODIFF (b)
&& XFASTINT (w->last_overlay_modified) == BUF_OVERLAY_MODIFF (b))
{
int i, nrows = w->current_matrix->nrows;
EMACS_INT pos;
struct glyph_row *row;
struct glyph *glyph;
/* Find the glyph under X/Y. */
glyph = NULL;
if (y >= 0 && y < nrows)
{
row = MATRIX_ROW (w->current_matrix, y);
/* Give up if some row before the one we are looking for is
not enabled. */
for (i = 0; i <= y; i++)
if (!MATRIX_ROW (w->current_matrix, i)->enabled_p)
break;
if (i > y /* all rows upto and including the one at Y are enabled */
&& row->displays_text_p
&& x < window_box_width (w, TEXT_AREA))
{
glyph = row->glyphs[TEXT_AREA];
if (x >= row->used[TEXT_AREA])
glyph = NULL;
else
{
glyph += x;
if (!BUFFERP (glyph->object))
glyph = NULL;
}
}
}
/* Clear mouse face if X/Y not over text. */
if (glyph == NULL)
{
term_clear_mouse_face ();
return;
}
if (!BUFFERP (glyph->object))
abort ();
pos = glyph->charpos;
/* Check for mouse-face. */
{
Lisp_Object mouse_face, overlay, position, *overlay_vec;
int noverlays;
EMACS_INT obegv, ozv;
struct buffer *obuf;
/* If we get an out-of-range value, return now; avoid an error. */
if (pos > BUF_Z (b))
return;
/* Make the window's buffer temporarily current for
overlays_at and compute_char_face. */
obuf = current_buffer;
current_buffer = b;
obegv = BEGV;
ozv = ZV;
BEGV = BEG;
ZV = Z;
/* Is this char mouse-active? */
XSETINT (position, pos);
/* Put all the overlays we want in a vector in overlay_vec. */
GET_OVERLAYS_AT (pos, overlay_vec, noverlays, NULL, 0);
/* Sort overlays into increasing priority order. */
noverlays = sort_overlays (overlay_vec, noverlays, w);
/* Check mouse-face highlighting. */
if (!(EQ (window, mouse_face_window)
&& y >= mouse_face_beg_row
&& y <= mouse_face_end_row
&& (y > mouse_face_beg_row
|| x >= mouse_face_beg_col)
&& (y < mouse_face_end_row
|| x < mouse_face_end_col
|| mouse_face_past_end)))
{
/* Clear the display of the old active region, if any. */
term_clear_mouse_face ();
/* Find the highest priority overlay that has a mouse-face
property. */
overlay = Qnil;
for (i = noverlays - 1; i >= 0; --i)
{
mouse_face = Foverlay_get (overlay_vec[i], Qmouse_face);
if (!NILP (mouse_face))
{
overlay = overlay_vec[i];
break;
}
}
/* If no overlay applies, get a text property. */
if (NILP (overlay))
mouse_face = Fget_text_property (position, Qmouse_face,
w->buffer);
/* Handle the overlay case. */
if (!NILP (overlay))
{
/* Find the range of text around this char that
should be active. */
Lisp_Object before, after;
EMACS_INT ignore;
before = Foverlay_start (overlay);
after = Foverlay_end (overlay);
/* Record this as the current active region. */
fast_find_position (w, XFASTINT (before),
&mouse_face_beg_col,
&mouse_face_beg_row);
mouse_face_past_end
= !fast_find_position (w, XFASTINT (after),
&mouse_face_end_col,
&mouse_face_end_row);
mouse_face_window = window;
mouse_face_face_id
= face_at_buffer_position (w, pos, 0, 0,
&ignore, pos + 1, 1, -1);
/* Display it as active. */
term_show_mouse_face (DRAW_MOUSE_FACE);
}
/* Handle the text property case. */
else if (!NILP (mouse_face))
{
/* Find the range of text around this char that
should be active. */
Lisp_Object before, after, beginning, end;
EMACS_INT ignore;
beginning = Fmarker_position (w->start);
XSETINT (end, (BUF_Z (b) - XFASTINT (w->window_end_pos)));
before
= Fprevious_single_property_change (make_number (pos + 1),
Qmouse_face,
w->buffer, beginning);
after
= Fnext_single_property_change (position, Qmouse_face,
w->buffer, end);
/* Record this as the current active region. */
fast_find_position (w, XFASTINT (before),
&mouse_face_beg_col,
&mouse_face_beg_row);
mouse_face_past_end
= !fast_find_position (w, XFASTINT (after),
&mouse_face_end_col,
&mouse_face_end_row);
mouse_face_window = window;
mouse_face_face_id
= face_at_buffer_position (w, pos, 0, 0,
&ignore, pos + 1, 1, -1);
/* Display it as active. */
term_show_mouse_face (DRAW_MOUSE_FACE);
}
}
/* Look for a `help-echo' property. */
{
Lisp_Object help;
/* Check overlays first. */
help = Qnil;
for (i = noverlays - 1; i >= 0 && NILP (help); --i)
{
overlay = overlay_vec[i];
help = Foverlay_get (overlay, Qhelp_echo);
}
if (!NILP (help))
{
help_echo_string = help;
help_echo_window = window;
help_echo_object = overlay;
help_echo_pos = pos;
}
/* Try text properties. */
else if (NILP (help)
&& ((STRINGP (glyph->object)
&& glyph->charpos >= 0
&& glyph->charpos < SCHARS (glyph->object))
|| (BUFFERP (glyph->object)
&& glyph->charpos >= BEGV
&& glyph->charpos < ZV)))
{
help = Fget_text_property (make_number (glyph->charpos),
Qhelp_echo, glyph->object);
if (!NILP (help))
{
help_echo_string = help;
help_echo_window = window;
help_echo_object = glyph->object;
help_echo_pos = glyph->charpos;
}
}
}
BEGV = obegv;
ZV = ozv;
current_buffer = obuf;
}
}
cursor_to (f, save_y, save_x);
}
static int
@ -3105,7 +2711,7 @@ term_mouse_movement (FRAME_PTR frame, Gpm_Event *event)
if (event->x != last_mouse_x || event->y != last_mouse_y)
{
frame->mouse_moved = 1;
term_mouse_highlight (frame, event->x, event->y);
note_mouse_highlight (frame, event->x, event->y);
/* Remember which glyph we're now on. */
last_mouse_x = event->x;
last_mouse_y = event->y;
@ -3576,7 +3182,7 @@ init_tty (const char *name, const char *terminal_type, int must_succeed)
#ifdef HAVE_GPM
terminal->mouse_position_hook = term_mouse_position;
mouse_face_window = Qnil;
tty->mouse_highlight.mouse_face_window = Qnil;
#endif
@ -4211,8 +3817,6 @@ bigger, or it may make it blink, or it may do nothing at all. */);
#ifdef HAVE_GPM
defsubr (&Sgpm_mouse_start);
defsubr (&Sgpm_mouse_stop);
staticpro (&mouse_face_window);
#endif /* HAVE_GPM */
#ifndef DOS_NT

View file

@ -34,18 +34,18 @@ struct tty_output
struct tty_display_info
{
struct tty_display_info *next; /* Chain of all tty devices. */
char *name; /* The name of the device file or 0 if
stdin/stdout. */
char *type; /* The type of the tty. */
/* Input/output */
FILE *input; /* The stream to be used for terminal input.
NULL if the terminal is suspended. */
FILE *output; /* The stream to be used for terminal output.
NULL if the terminal is suspended. */
FILE *termscript; /* If nonzero, send all terminal output
characters to this stream also. */
@ -65,38 +65,14 @@ struct tty_display_info
/* Redisplay. */
Lisp_Object top_frame; /* The topmost frame on this tty. */
/* The previous frame we displayed on this tty. */
struct frame *previous_frame;
int previous_color_mode;
#ifdef MSDOS
/* 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_end_row, mouse_face_end_col;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
/* 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;
#endif /* !MSDOS */
/* 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. */
@ -190,12 +166,12 @@ struct tty_display_info
int RPov; /* # chars to start a TS_repeat */
int delete_in_insert_mode; /* delete mode == insert mode */
int se_is_so; /* 1 if same string both enters and leaves
standout mode */
int costs_set; /* Nonzero if costs have been calculated. */
int insert_mode; /* Nonzero when in insert mode. */
int standout_mode; /* Nonzero when in standout mode. */
@ -214,7 +190,7 @@ struct tty_display_info
lines from those operations. */
int specified_window;
/* Flag used in tty_show/hide_cursor. */
int cursor_hidden;

View file

@ -505,7 +505,7 @@ static void
x_update_window_begin (struct window *w)
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
/* Hide the system caret during an update. */
if (w32_use_visible_system_caret && w32_system_caret_hwnd)
@ -518,15 +518,15 @@ x_update_window_begin (struct window *w)
BLOCK_INPUT;
if (f == display_info->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* Don't do highlighting for mouse motion during the update. */
display_info->mouse_face_defer = 1;
hlinfo->mouse_face_defer = 1;
/* If F needs to be redrawn, simply forget about any prior mouse
highlighting. */
if (FRAME_GARBAGED_P (f))
display_info->mouse_face_window = Qnil;
hlinfo->mouse_face_window = Qnil;
#if 0 /* Rows in a current matrix containing glyphs in mouse-face have
their mouse_face_p flag set, which means that they are always
@ -540,8 +540,8 @@ x_update_window_begin (struct window *w)
Likewise, don't do anything if the frame is garbaged;
in that case, the frame's current matrix that we would use
is all wrong, and we will redisplay that line anyway. */
if (!NILP (display_info->mouse_face_window)
&& w == XWINDOW (display_info->mouse_face_window))
if (!NILP (hlinfo->mouse_face_window)
&& w == XWINDOW (hlinfo->mouse_face_window))
{
int i;
@ -550,7 +550,7 @@ x_update_window_begin (struct window *w)
break;
if (i < w->desired_matrix->nrows)
clear_mouse_face (display_info);
clear_mouse_face (hlinfo);
}
#endif /* 0 */
}
@ -601,7 +601,7 @@ static void
x_update_window_end (struct window *w, int cursor_on_p,
int mouse_face_overwritten_p)
{
struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (XFRAME (w->frame));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
if (!w->pseudo_window_p)
{
@ -622,9 +622,9 @@ x_update_window_end (struct window *w, int cursor_on_p,
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;
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;
}
/* Unhide the caret. This won't actually show the cursor, unless it
@ -649,7 +649,7 @@ x_update_end (struct frame *f)
return;
/* Mouse highlight may be displayed again. */
FRAME_W32_DISPLAY_INFO (f)->mouse_face_defer = 0;
MOUSE_HL_INFO (f)->mouse_face_defer = 0;
}
@ -662,17 +662,17 @@ w32_frame_up_to_date (struct frame *f)
{
if (FRAME_W32_P (f))
{
struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
if (dpyinfo->mouse_face_deferred_gc
|| f == dpyinfo->mouse_face_mouse_frame)
if (hlinfo->mouse_face_deferred_gc
|| f == hlinfo->mouse_face_mouse_frame)
{
BLOCK_INPUT;
if (dpyinfo->mouse_face_mouse_frame)
note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
dpyinfo->mouse_face_mouse_x,
dpyinfo->mouse_face_mouse_y);
dpyinfo->mouse_face_deferred_gc = 0;
if (hlinfo->mouse_face_mouse_frame)
note_mouse_highlight (hlinfo->mouse_face_mouse_frame,
hlinfo->mouse_face_mouse_x,
hlinfo->mouse_face_mouse_y);
hlinfo->mouse_face_deferred_gc = 0;
UNBLOCK_INPUT;
}
}
@ -999,7 +999,7 @@ x_set_mouse_face_gc (struct glyph_string *s)
struct face *face;
/* What face has to be used last for the mouse face? */
face_id = FRAME_W32_DISPLAY_INFO (s->f)->mouse_face_face_id;
face_id = MOUSE_HL_INFO (s->f)->mouse_face_face_id;
face = FACE_FROM_ID (s->f, face_id);
if (face == NULL)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
@ -4060,6 +4060,7 @@ w32_read_socket (struct terminal *terminal, int expected,
W32Msg msg;
struct frame *f;
struct w32_display_info *dpyinfo = &one_w32_display_info;
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
if (interrupt_input_blocked)
{
@ -4160,11 +4161,11 @@ w32_read_socket (struct terminal *terminal, int expected,
if (f && !f->iconified)
{
if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
if (temp_index == sizeof temp_buffer / sizeof (short))
@ -4185,11 +4186,11 @@ w32_read_socket (struct terminal *terminal, int expected,
if (f && !f->iconified)
{
if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
if (temp_index == sizeof temp_buffer / sizeof (short))
@ -4263,11 +4264,11 @@ w32_read_socket (struct terminal *terminal, int expected,
if (f && !f->iconified)
{
if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, dpyinfo->mouse_face_window))
if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
if (temp_index == sizeof temp_buffer / sizeof (short))
@ -4301,10 +4302,10 @@ w32_read_socket (struct terminal *terminal, int expected,
else
f = x_window_to_frame (dpyinfo, msg.msg.hwnd);
if (dpyinfo->mouse_face_hidden)
if (hlinfo->mouse_face_hidden)
{
dpyinfo->mouse_face_hidden = 0;
clear_mouse_face (dpyinfo);
hlinfo->mouse_face_hidden = 0;
clear_mouse_face (hlinfo);
}
if (f)
@ -4345,7 +4346,7 @@ w32_read_socket (struct terminal *terminal, int expected,
{
/* If we move outside the frame, then we're
certainly no longer on any text in the frame. */
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
}
/* If the contents of the global variable help_echo_string
@ -4634,12 +4635,12 @@ w32_read_socket (struct terminal *terminal, int expected,
f = x_any_window_to_frame (dpyinfo, msg.msg.hwnd);
if (f)
{
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
certainly no longer on any text in the frame. */
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_mouse_frame = 0;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_mouse_frame = 0;
}
/* Generate a nil HELP_EVENT to cancel a help-echo.
@ -4669,12 +4670,12 @@ w32_read_socket (struct terminal *terminal, int expected,
if (f == dpyinfo->w32_focus_frame)
x_new_focus_frame (dpyinfo, 0);
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
certainly no longer on any text in the frame. */
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_mouse_frame = 0;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_mouse_frame = 0;
}
/* Generate a nil HELP_EVENT to cancel a help-echo.
@ -5822,6 +5823,7 @@ void
x_free_frame_resources (struct frame *f)
{
struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
BLOCK_INPUT;
@ -5860,15 +5862,15 @@ x_free_frame_resources (struct frame *f)
if (f == dpyinfo->x_highlight_frame)
dpyinfo->x_highlight_frame = 0;
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
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_deferred_gc = 0;
dpyinfo->mouse_face_mouse_frame = 0;
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_deferred_gc = 0;
hlinfo->mouse_face_mouse_frame = 0;
}
UNBLOCK_INPUT;
@ -5934,6 +5936,7 @@ void
w32_initialize_display_info (Lisp_Object display_name)
{
struct w32_display_info *dpyinfo = &one_w32_display_info;
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
memset (dpyinfo, 0, sizeof (*dpyinfo));
@ -5959,12 +5962,12 @@ w32_initialize_display_info (Lisp_Object display_name)
dpyinfo->smallest_font_height = 1;
dpyinfo->smallest_char_width = 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_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = Qnil;
dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_hidden = 0;
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_face_id = DEFAULT_FACE_ID;
hlinfo->mouse_face_window = Qnil;
hlinfo->mouse_face_overlay = Qnil;
hlinfo->mouse_face_hidden = 0;
dpyinfo->vertical_scroll_bar_cursor = w32_load_cursor (IDC_ARROW);
/* TODO: dpyinfo->gray */

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;

File diff suppressed because it is too large Load diff

View file

@ -2533,13 +2533,16 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
#endif /* HAVE_MENUS */
/* Detect if a dialog or menu has been posted. */
#ifndef MSDOS
/* Detect if a dialog or menu has been posted. MSDOS has its own
implementation on msdos.c. */
int
popup_activated (void)
{
return popup_activated_flag;
}
#endif /* not MSDOS */
/* The following is used by delayed window autoselection. */

View file

@ -548,22 +548,22 @@ static void
x_update_window_begin (struct window *w)
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
struct x_display_info *display_info = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
updated_window = w;
set_output_cursor (&w->cursor);
BLOCK_INPUT;
if (f == display_info->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* Don't do highlighting for mouse motion during the update. */
display_info->mouse_face_defer = 1;
hlinfo->mouse_face_defer = 1;
/* If F needs to be redrawn, simply forget about any prior mouse
highlighting. */
if (FRAME_GARBAGED_P (f))
display_info->mouse_face_window = Qnil;
hlinfo->mouse_face_window = Qnil;
}
UNBLOCK_INPUT;
@ -603,7 +603,7 @@ x_draw_vertical_window_border (struct window *w, int x, int y0, int y1)
static void
x_update_window_end (struct window *w, int cursor_on_p, int mouse_face_overwritten_p)
{
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (w->frame));
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
if (!w->pseudo_window_p)
{
@ -624,9 +624,9 @@ x_update_window_end (struct window *w, int cursor_on_p, int mouse_face_overwritt
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;
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;
}
updated_window = NULL;
@ -640,7 +640,7 @@ static void
x_update_end (struct frame *f)
{
/* Mouse highlight may be displayed again. */
FRAME_X_DISPLAY_INFO (f)->mouse_face_defer = 0;
MOUSE_HL_INFO (f)->mouse_face_defer = 0;
#ifndef XFlush
BLOCK_INPUT;
@ -659,17 +659,17 @@ XTframe_up_to_date (struct frame *f)
{
if (FRAME_X_P (f))
{
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
if (dpyinfo->mouse_face_deferred_gc
|| f == dpyinfo->mouse_face_mouse_frame)
if (hlinfo->mouse_face_deferred_gc
|| f == hlinfo->mouse_face_mouse_frame)
{
BLOCK_INPUT;
if (dpyinfo->mouse_face_mouse_frame)
note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
dpyinfo->mouse_face_mouse_x,
dpyinfo->mouse_face_mouse_y);
dpyinfo->mouse_face_deferred_gc = 0;
if (hlinfo->mouse_face_mouse_frame)
note_mouse_highlight (hlinfo->mouse_face_mouse_frame,
hlinfo->mouse_face_mouse_x,
hlinfo->mouse_face_mouse_y);
hlinfo->mouse_face_deferred_gc = 0;
UNBLOCK_INPUT;
}
}
@ -970,7 +970,7 @@ x_set_mouse_face_gc (struct glyph_string *s)
struct face *face;
/* What face has to be used last for the mouse face? */
face_id = FRAME_X_DISPLAY_INFO (s->f)->mouse_face_face_id;
face_id = MOUSE_HL_INFO (s->f)->mouse_face_face_id;
face = FACE_FROM_ID (s->f, face_id);
if (face == NULL)
face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
@ -5788,6 +5788,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
struct frame *f = NULL;
struct coding_system coding;
XEvent event = *eventp;
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
*finish = X_EVENT_NORMAL;
@ -6237,12 +6238,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
/* If mouse-highlight is an integer, input clears out
mouse highlighting. */
if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
&& (f == 0
|| !EQ (f->tool_bar_window, dpyinfo->mouse_face_window)))
|| !EQ (f->tool_bar_window, hlinfo->mouse_face_window)))
{
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_hidden = 1;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_hidden = 1;
}
#if defined USE_MOTIF && defined USE_TOOLKIT_SCROLL_BARS
@ -6599,12 +6600,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
f = x_top_window_to_frame (dpyinfo, event.xcrossing.window);
if (f)
{
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
/* If we move outside the frame, then we're
certainly no longer on any text in the frame. */
clear_mouse_face (dpyinfo);
dpyinfo->mouse_face_mouse_frame = 0;
clear_mouse_face (hlinfo);
hlinfo->mouse_face_mouse_frame = 0;
}
/* Generate a nil HELP_EVENT to cancel a help-echo.
@ -6637,10 +6638,10 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
else
f = x_window_to_frame (dpyinfo, event.xmotion.window);
if (dpyinfo->mouse_face_hidden)
if (hlinfo->mouse_face_hidden)
{
dpyinfo->mouse_face_hidden = 0;
clear_mouse_face (dpyinfo);
hlinfo->mouse_face_hidden = 0;
clear_mouse_face (hlinfo);
}
#ifdef USE_GTK
@ -6695,7 +6696,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
/* If we move outside the frame, then we're
certainly no longer on any text in the frame. */
clear_mouse_face (dpyinfo);
clear_mouse_face (hlinfo);
}
/* If the contents of the global variable help_echo_string
@ -9385,6 +9386,7 @@ x_free_frame_resources (struct frame *f)
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Lisp_Object bar;
struct scroll_bar *b;
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
BLOCK_INPUT;
@ -9478,15 +9480,15 @@ x_free_frame_resources (struct frame *f)
if (f == dpyinfo->x_highlight_frame)
dpyinfo->x_highlight_frame = 0;
if (f == dpyinfo->mouse_face_mouse_frame)
if (f == hlinfo->mouse_face_mouse_frame)
{
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_deferred_gc = 0;
dpyinfo->mouse_face_mouse_frame = 0;
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_deferred_gc = 0;
hlinfo->mouse_face_mouse_frame = 0;
}
UNBLOCK_INPUT;
@ -9863,6 +9865,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
struct terminal *terminal;
struct x_display_info *dpyinfo;
XrmDatabase xrdb;
Mouse_HLInfo *hlinfo;
BLOCK_INPUT;
@ -9993,6 +9996,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
dpyinfo = (struct x_display_info *) xmalloc (sizeof (struct x_display_info));
memset (dpyinfo, 0, sizeof *dpyinfo);
hlinfo = &dpyinfo->mouse_highlight;
terminal = x_create_terminal (dpyinfo);
@ -10115,16 +10119,16 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
dpyinfo->bitmaps_size = 0;
dpyinfo->bitmaps_last = 0;
dpyinfo->scratch_cursor_gc = 0;
dpyinfo->mouse_face_mouse_frame = 0;
dpyinfo->mouse_face_deferred_gc = 0;
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_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = Qnil;
dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_mouse_x = dpyinfo->mouse_face_mouse_y = 0;
dpyinfo->mouse_face_defer = 0;
dpyinfo->mouse_face_hidden = 0;
hlinfo->mouse_face_mouse_frame = 0;
hlinfo->mouse_face_deferred_gc = 0;
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_face_id = DEFAULT_FACE_ID;
hlinfo->mouse_face_window = Qnil;
hlinfo->mouse_face_overlay = Qnil;
hlinfo->mouse_face_mouse_x = hlinfo->mouse_face_mouse_y = 0;
hlinfo->mouse_face_defer = 0;
hlinfo->mouse_face_hidden = 0;
dpyinfo->x_focus_frame = 0;
dpyinfo->x_focus_event_frame = 0;
dpyinfo->x_highlight_frame = 0;

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;