mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-21 03:52:16 -08:00
Unify mouse highlight code of MSDOS and GUI sessions.
xdisp.c (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. (show_mouse_face): Call it, 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 ||. xmenu.c (popup_activated): Don't define on MSDOS. dispnew.c (mirror_make_current): Set Y coordinate of the mode-line and header-line rows. termchar.h (struct tty_display_info): Define mouse_face_* members not only for MSDOS. Delete stray whitespace. <mouse_face_beg_x, mouse_face_beg_y, mouse_face_overlay>: New struct members. dispextern.h (DPYINFO_DEFINED) [HAVE_X_WINDOWS]: Define. (DPYINFO_DEFINED) [HAVE_NTGUI]: Define. (DPYINFO_DEFINED) [HAVE_NS]: Define. (Display_Info) [!DPYINFO_DEFINED]: Define here. (FRAME_X_DISPLAY_INFO) [HAVE_GPM]: Define. (FRAME_X_DISPLAY_INFO): Define to NULL if not defined. (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. msdos.h (Display_Info): Don't define here. 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.
This commit is contained in:
parent
aeeb3dcb65
commit
d009ae66b4
8 changed files with 243 additions and 580 deletions
|
|
@ -1,3 +1,57 @@
|
|||
2010-10-30 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* xdisp.c (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.
|
||||
(show_mouse_face): Call it, 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 ||.
|
||||
|
||||
* xmenu.c (popup_activated): Don't define on MSDOS.
|
||||
|
||||
* dispnew.c (mirror_make_current): Set Y coordinate of the
|
||||
mode-line and header-line rows.
|
||||
|
||||
* termchar.h (struct tty_display_info): Define mouse_face_*
|
||||
members not only for MSDOS. Delete stray whitespace.
|
||||
<mouse_face_beg_x, mouse_face_beg_y, mouse_face_overlay>: New
|
||||
struct members.
|
||||
|
||||
* dispextern.h (DPYINFO_DEFINED) [HAVE_X_WINDOWS]: Define.
|
||||
(DPYINFO_DEFINED) [HAVE_NTGUI]: Define.
|
||||
(DPYINFO_DEFINED) [HAVE_NS]: Define.
|
||||
(Display_Info) [!DPYINFO_DEFINED]: Define here.
|
||||
(FRAME_X_DISPLAY_INFO) [HAVE_GPM]: Define.
|
||||
(FRAME_X_DISPLAY_INFO): Define to NULL if not defined.
|
||||
(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.
|
||||
|
||||
* msdos.h (Display_Info): Don't define here.
|
||||
|
||||
* 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.
|
||||
|
||||
2010-10-29 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* emacs.c (main): Call syms_of_filelock unconditionally.
|
||||
|
|
|
|||
|
|
@ -43,12 +43,9 @@ 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
|
||||
|
|
@ -57,6 +54,7 @@ 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
|
||||
|
|
@ -65,10 +63,32 @@ 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;
|
||||
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
|
||||
|
|
@ -3017,28 +3037,30 @@ 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 (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 draw_row_with_mouse_face (struct window *, int, struct glyph_row *,
|
||||
int, int, enum draw_glyphs_face);
|
||||
|
||||
|
||||
/* Flags passed to try_window. */
|
||||
#define TRY_WINDOW_CHECK_MARGINS (1 << 0)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
592
src/msdos.c
592
src/msdos.c
|
|
@ -941,551 +941,78 @@ 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, starting at x-position X. X is relative to TEXT_AREA
|
||||
in W. HL is a face override for drawing the glyphs. */
|
||||
void
|
||||
draw_row_with_mouse_face (struct window *w, int x, 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);
|
||||
|
||||
|
||||
/* 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 (tty->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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1769,9 +1296,9 @@ IT_frame_up_to_date (struct frame *f)
|
|||
{
|
||||
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);
|
||||
note_mouse_highlight (dpyinfo->mouse_face_mouse_frame,
|
||||
dpyinfo->mouse_face_mouse_x,
|
||||
dpyinfo->mouse_face_mouse_y);
|
||||
dpyinfo->mouse_face_deferred_gc = 0;
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
|
|
@ -3192,8 +2719,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))
|
||||
|
|
|
|||
|
|
@ -52,8 +52,6 @@ typedef int XRectangle;
|
|||
#define PIX_TYPE unsigned long
|
||||
#define XDISPLAY
|
||||
|
||||
typedef struct tty_display_info Display_Info;
|
||||
|
||||
extern struct tty_display_info the_only_display_info;
|
||||
|
||||
#define FRAME_X_DISPLAY(f) ((Display *) 0)
|
||||
|
|
|
|||
|
|
@ -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,22 +65,24 @@ 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_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. */
|
||||
|
|
@ -96,7 +98,6 @@ struct tty_display_info
|
|||
|
||||
/* Nonzero means that the mouse highlight should not be shown. */
|
||||
int mouse_face_hidden;
|
||||
#endif /* !MSDOS */
|
||||
|
||||
/* Buffer used internally by termcap (see tgetent in the Termcap
|
||||
manual). Only init_tty and delete_tty should change this. */
|
||||
|
|
@ -190,12 +191,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 +215,7 @@ struct tty_display_info
|
|||
lines from those operations. */
|
||||
|
||||
int specified_window;
|
||||
|
||||
|
||||
/* Flag used in tty_show/hide_cursor. */
|
||||
|
||||
int cursor_hidden;
|
||||
|
|
|
|||
89
src/xdisp.c
89
src/xdisp.c
|
|
@ -1085,12 +1085,13 @@ static void notice_overwritten_cursor (struct window *,
|
|||
int, int, int, int);
|
||||
static void append_stretch_glyph (struct it *, Lisp_Object,
|
||||
int, int, int);
|
||||
static int coords_in_mouse_face_p (struct window *, int, int);
|
||||
|
||||
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
static int coords_in_mouse_face_p (struct window *, int, int);
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
Window display dimensions
|
||||
|
|
@ -1782,8 +1783,6 @@ glyph_to_pixel_coords (struct window *w, int hpos, int vpos,
|
|||
}
|
||||
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
|
||||
/* Find the glyph under window-relative coordinates X/Y in window W.
|
||||
Consider only glyphs from buffer text, i.e. no glyphs from overlay
|
||||
strings. Return in *HPOS and *VPOS the row and column number of
|
||||
|
|
@ -1866,7 +1865,6 @@ x_y_to_hpos_vpos (struct window *w, int x, int y, int *hpos, int *vpos,
|
|||
return glyph;
|
||||
}
|
||||
|
||||
|
||||
/* EXPORT:
|
||||
Convert frame-relative x/y to coordinates relative to window W.
|
||||
Takes pseudo-windows into account. */
|
||||
|
|
@ -1889,6 +1887,8 @@ frame_to_window_pixel_xy (struct window *w, int *x, int *y)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
|
||||
/* EXPORT:
|
||||
Return in RECTS[] at most N clipping rectangles for glyph string S.
|
||||
Return the number of stored rectangles. */
|
||||
|
|
@ -15903,6 +15903,9 @@ try_window_id (struct window *w)
|
|||
+ (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0)
|
||||
+ window_internal_height (w));
|
||||
|
||||
#if defined (HAVE_GPM) || defined (MSDOS)
|
||||
x_clear_window_mouse_face (w);
|
||||
#endif
|
||||
/* Perform the operation on the screen. */
|
||||
if (dvpos > 0)
|
||||
{
|
||||
|
|
@ -23608,6 +23611,16 @@ x_clear_cursor (struct window *w)
|
|||
update_window_cursor (w, 0);
|
||||
}
|
||||
|
||||
void
|
||||
draw_row_with_mouse_face (struct frame *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);
|
||||
}
|
||||
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* EXPORT:
|
||||
Display the active region described by mouse_face_* according to DRAW. */
|
||||
|
|
@ -23695,15 +23708,15 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
|
|||
|
||||
if (end_hpos > start_hpos)
|
||||
{
|
||||
draw_glyphs (w, start_x, row, TEXT_AREA,
|
||||
start_hpos, end_hpos,
|
||||
draw, 0);
|
||||
draw_row_with_mouse_face (w, start_x, row,
|
||||
start_hpos, end_hpos, draw);
|
||||
|
||||
row->mouse_face_p
|
||||
= draw == DRAW_MOUSE_FACE || draw == DRAW_IMAGE_RAISED;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* When we've written over the cursor, arrange for it to
|
||||
be displayed again. */
|
||||
if (phys_cursor_on_p && !w->phys_cursor_on_p)
|
||||
|
|
@ -23714,8 +23727,10 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
|
|||
w->phys_cursor.x, w->phys_cursor.y);
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* Change the mouse cursor. */
|
||||
if (draw == DRAW_NORMAL_TEXT && !EQ (dpyinfo->mouse_face_window, f->tool_bar_window))
|
||||
FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->text_cursor);
|
||||
|
|
@ -23723,6 +23738,8 @@ show_mouse_face (Display_Info *dpyinfo, enum draw_glyphs_face draw)
|
|||
FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->hand_cursor);
|
||||
else
|
||||
FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->nontext_cursor);
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
}
|
||||
|
||||
/* EXPORT:
|
||||
|
|
@ -24066,13 +24083,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
|
|||
start_charpos);
|
||||
/* If pos == 0, it means before_string came from an
|
||||
overlay, not from a buffer position. */
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
else if (EQ (glyph->object, after_string))
|
||||
{
|
||||
pos = string_buffer_position (w, after_string, end_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
x += glyph->pixel_width;
|
||||
|
|
@ -24116,13 +24133,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
|
|||
pos = string_buffer_position (w, before_string, start_charpos);
|
||||
/* If pos == 0, it means before_string came from an
|
||||
overlay, not from a buffer position. */
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
else if (EQ (glyph->object, after_string))
|
||||
{
|
||||
pos = string_buffer_position (w, after_string, end_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -24180,13 +24197,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
|
|||
if (EQ (end->object, before_string))
|
||||
{
|
||||
pos = string_buffer_position (w, before_string, start_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
else if (EQ (end->object, after_string))
|
||||
{
|
||||
pos = string_buffer_position (w, after_string, end_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -24230,13 +24247,13 @@ mouse_face_from_buffer_pos (Lisp_Object window,
|
|||
if (EQ (end->object, before_string))
|
||||
{
|
||||
pos = string_buffer_position (w, before_string, start_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
else if (EQ (end->object, after_string))
|
||||
{
|
||||
pos = string_buffer_position (w, after_string, end_charpos);
|
||||
if (!pos || pos >= start_charpos && pos < end_charpos)
|
||||
if (!pos || (pos >= start_charpos && pos < end_charpos))
|
||||
break;
|
||||
}
|
||||
x += end->pixel_width;
|
||||
|
|
@ -24460,6 +24477,8 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
|
||||
/* See if position X, Y is within a hot-spot of an image. */
|
||||
|
||||
static int
|
||||
|
|
@ -24630,6 +24649,8 @@ define_frame_cursor1 (struct frame *f, Cursor cursor, Lisp_Object pointer)
|
|||
FRAME_RIF (f)->define_frame_cursor (f, cursor);
|
||||
}
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* Take proper action when mouse has moved to the mode or header line
|
||||
or marginal area AREA of window W, x-position X and y-position Y.
|
||||
X is relative to the start of the text display area of W, so the
|
||||
|
|
@ -24643,7 +24664,11 @@ 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);
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
Cursor cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
|
||||
#else
|
||||
Cursor cursor = No_Cursor;
|
||||
#endif
|
||||
Lisp_Object pointer = Qnil;
|
||||
int dx, dy, width, height;
|
||||
EMACS_INT charpos;
|
||||
|
|
@ -24695,6 +24720,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
|
|||
|
||||
help = Qnil;
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (IMAGEP (object))
|
||||
{
|
||||
Lisp_Object image_map, hotspot;
|
||||
|
|
@ -24731,6 +24757,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
|
|||
if (NILP (pointer))
|
||||
pointer = Fplist_get (XCDR (object), QCpointer);
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
if (STRINGP (string))
|
||||
{
|
||||
|
|
@ -24750,6 +24777,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (NILP (pointer))
|
||||
pointer = Fget_text_property (pos, Qpointer, string);
|
||||
|
||||
|
|
@ -24763,6 +24791,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
|
|||
if (!KEYMAPP (map))
|
||||
cursor = dpyinfo->vertical_scroll_bar_cursor;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Change the mouse face according to what is under X/Y. */
|
||||
mouse_face = Fget_text_property (pos, Qmouse_face, string);
|
||||
|
|
@ -24895,7 +24924,9 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y,
|
|||
else if ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))
|
||||
clear_mouse_face (dpyinfo);
|
||||
}
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
define_frame_cursor1 (f, cursor, pointer);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -24917,7 +24948,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
struct buffer *b;
|
||||
|
||||
/* When a menu is active, don't highlight because this looks odd. */
|
||||
#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS)
|
||||
#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) || defined (MSDOS)
|
||||
if (popup_activated ())
|
||||
return;
|
||||
#endif
|
||||
|
|
@ -24961,6 +24992,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
w = XWINDOW (window);
|
||||
frame_to_window_pixel_xy (w, &x, &y);
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* Handle tool-bar window differently since it doesn't display a
|
||||
buffer. */
|
||||
if (EQ (window, f->tool_bar_window))
|
||||
|
|
@ -24968,6 +25000,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
note_tool_bar_highlight (f, x, y);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Mouse is on the mode, header line or margin? */
|
||||
if (part == ON_MODE_LINE || part == ON_HEADER_LINE
|
||||
|
|
@ -24977,6 +25010,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (part == ON_VERTICAL_BORDER)
|
||||
{
|
||||
cursor = FRAME_X_OUTPUT (f)->horizontal_drag_cursor;
|
||||
|
|
@ -24987,6 +25021,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
|
||||
else
|
||||
cursor = FRAME_X_OUTPUT (f)->text_cursor;
|
||||
#endif
|
||||
|
||||
/* Are we in a window whose display is up to date?
|
||||
And verify the buffer's text has not changed. */
|
||||
|
|
@ -25010,6 +25045,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
/* Find the glyph under X/Y. */
|
||||
glyph = x_y_to_hpos_vpos (w, x, y, &hpos, &vpos, &dx, &dy, &area);
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* Look for :pointer property on image. */
|
||||
if (glyph != NULL && glyph->type == IMAGE_GLYPH)
|
||||
{
|
||||
|
|
@ -25051,11 +25087,18 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
pointer = Fplist_get (XCDR (img->spec), QCpointer);
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
/* Clear mouse face if X/Y not over text. */
|
||||
if (glyph == NULL
|
||||
|| area != TEXT_AREA
|
||||
|| !MATRIX_ROW (w->current_matrix, vpos)->displays_text_p
|
||||
/* Glyph's OBJECT is an integer for glyphs inserted by the
|
||||
display engine for its internal purposes, like truncation
|
||||
and continuation glyphs and blanks beyond the end of
|
||||
line's text on text terminals. If we are over such a
|
||||
glyph, we are not over any text. */
|
||||
|| INTEGERP (glyph->object)
|
||||
/* R2L rows have a stretch glyph at their front, which
|
||||
stands for no text, whereas L2R rows have no glyphs at
|
||||
all beyond the end of text. Treat such stretch glyphs
|
||||
|
|
@ -25067,6 +25110,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
{
|
||||
if (clear_mouse_face (dpyinfo))
|
||||
cursor = No_Cursor;
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
if (NILP (pointer))
|
||||
{
|
||||
if (area != TEXT_AREA)
|
||||
|
|
@ -25074,6 +25118,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
else
|
||||
pointer = Vvoid_text_area_pointer;
|
||||
}
|
||||
#endif
|
||||
goto set_cursor;
|
||||
}
|
||||
|
||||
|
|
@ -25323,6 +25368,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
/* Look for a `pointer' property. */
|
||||
if (NILP (pointer))
|
||||
{
|
||||
|
|
@ -25363,6 +25409,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
Qpointer, object);
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
BEGV = obegv;
|
||||
ZV = ozv;
|
||||
|
|
@ -25371,7 +25418,13 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
|||
|
||||
set_cursor:
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
define_frame_cursor1 (f, cursor, pointer);
|
||||
#else
|
||||
/* This is here to prevent a compiler error, due to "label at end of
|
||||
compound statement". */
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -25414,8 +25467,6 @@ cancel_mouse_face (struct frame *f)
|
|||
}
|
||||
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
Exposure Events
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue