summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2005-10-10 18:58:43 +0000
committerJason Rumney <jasonr@gnu.org>2005-10-10 18:58:43 +0000
commit396dcb783109e6a9a84541b110badd27cd90619f (patch)
treeb7b6b6886dbe005a7a0463596bbc8013d6851cf1 /src/xterm.c
parent6a00154a5556a9e60656ee48e4dceac5a2490d1e (diff)
downloademacs-396dcb783109e6a9a84541b110badd27cd90619f.tar.gz
(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.
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/src/xterm.c b/src/xterm.c
index af62cfd0c75..c2fb207bcb1 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -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;