(remember_mouse_glyph): New function.

(note_mouse_movement): Use it to remember the current glyph if
changed.
(XTmouse_position): Fix calculation of fake glyph under mouse.
Move code to calculate glyph under mouse into
remember_mouse_glyph.
This commit is contained in:
Jason Rumney 2005-10-10 19:02:10 +00:00
parent 720a5d03f4
commit 9b909870cd
2 changed files with 52 additions and 26 deletions

View file

@ -1,3 +1,12 @@
2005-10-10 Jason Rumney <jasonr@gnu.org>
* xterm.c (remember_mouse_glyph): New function.
(note_mouse_movement): Use it to remember the current glyph if
changed.
(XTmouse_position): Fix calculation of fake glyph under mouse.
Move code to calculate glyph under mouse into
remember_mouse_glyph.
2005-10-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* emacs.c (USAGE3, standard_args): -nb => -nbi

View file

@ -3582,6 +3582,8 @@ construct_mouse_click (result, event, f)
static XMotionEvent last_mouse_motion_event;
static Lisp_Object last_mouse_motion_frame;
static void remember_mouse_glyph P_ ((struct frame *, int, int));
static void
note_mouse_movement (frame, event)
FRAME_PTR frame;
@ -3607,6 +3609,8 @@ note_mouse_movement (frame, event)
frame->mouse_moved = 1;
last_mouse_scroll_bar = Qnil;
note_mouse_highlight (frame, event->x, event->y);
/* Remember which glyph we're now on. */
remember_mouse_glyph (frame, event->x, event->y);
}
}
@ -3677,6 +3681,44 @@ glyph_rect (f, x, y, rect)
}
/* Remember which glyph the mouse is over.
*/
static void
remember_mouse_glyph (f1, win_x, win_y)
FRAME_PTR f1;
int win_x, win_y;
{
int width, height, gx, gy;
/* Try getting the rectangle of the actual glyph. */
if (!glyph_rect (f1, win_x, win_y, &last_mouse_glyph))
{
/* If there is no glyph under the mouse, then we divide the screen
into a grid of the smallest glyph in the frame, and use that
as our "glyph". */
width = FRAME_SMALLEST_CHAR_WIDTH (f1);
height = FRAME_SMALLEST_FONT_HEIGHT (f1);
gx = win_x;
gy = win_y;
/* Arrange for the division in FRAME_PIXEL_X_TO_COL etc. to
round down even for negative values. */
if (gx < 0)
gx -= width - 1;
if (gy < 0)
gy -= height - 1;
gx = gx / width * width;
gy = gy / width * width;
last_mouse_glyph.width = width;
last_mouse_glyph.height = height;
last_mouse_glyph.x = gx;
last_mouse_glyph.y = gy;
}
}
/* Return the current position of the mouse.
*FP should be a frame which indicates which display to ask about.
@ -3863,32 +3905,7 @@ XTmouse_position (fp, insist, bar_window, part, x, y, time)
on it, i.e. into the same rectangles that matrices on
the frame are divided into. */
int width, height, gx, gy;
XRectangle rect;
if (glyph_rect (f1, win_x, win_y, &rect))
last_mouse_glyph = rect;
else
{
width = FRAME_SMALLEST_CHAR_WIDTH (f1);
height = FRAME_SMALLEST_FONT_HEIGHT (f1);
gx = win_x;
gy = win_y;
/* Arrange for the division in FRAME_PIXEL_X_TO_COL etc. to
round down even for negative values. */
if (gx < 0)
gx -= width - 1;
if (gy < 0)
gy -= height - 1;
gx = (gx + width - 1) / width * width;
gy = (gy + height - 1) / height * height;
last_mouse_glyph.width = width;
last_mouse_glyph.height = height;
last_mouse_glyph.x = gx;
last_mouse_glyph.y = gy;
}
remember_mouse_glyph (f1, win_x, win_y);
*bar_window = Qnil;
*part = 0;