From 84e70bbae4e86a7832ead64c3f2f7240967ca4b7 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Mon, 2 Sep 2013 12:45:32 +0400 Subject: [PATCH] Use XGetMotionEvents to ask the last mouse motion time from X server. * xterm.c (X_MOTION_HISTORY): Default to 1. (x_last_mouse_movement_time) [X_MOTION_HISTORY]: New function. (x_last_mouse_movement_time) [!X_MOTION_HISTORY]: Legacy version. (note_mouse_movement, x_scroll_bar_note_movement) [!X_MOTION_HISTORY]: Ifdef away legacy code. (XTmouse_position, x_scroll_bar_report_motion): Use x_last_mouse_movement_time. --- src/ChangeLog | 11 +++++++++ src/xterm.c | 62 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 1806e642c71..85f3abb98b3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2013-09-02 Dmitry Antipov + + Use XGetMotionEvents to ask the last mouse motion time from X server. + * xterm.c (X_MOTION_HISTORY): Default to 1. + (x_last_mouse_movement_time) [X_MOTION_HISTORY]: New function. + (x_last_mouse_movement_time) [!X_MOTION_HISTORY]: Legacy version. + (note_mouse_movement, x_scroll_bar_note_movement) [!X_MOTION_HISTORY]: + Ifdef away legacy code. + (XTmouse_position, x_scroll_bar_report_motion): + Use x_last_mouse_movement_time. + 2013-09-02 Dmitry Antipov * msdos.c (last_mouse_window): Move to... diff --git a/src/xterm.c b/src/xterm.c index 4355e9d6b83..bc7dd639c6b 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -133,6 +133,9 @@ extern void _XEditResCheckMessages (Widget, XtPointer, XEvent *, Boolean *); #include #endif +/* Default to using XGetMotionEvents. */ +#define X_MOTION_HISTORY 1 + /* Default to using XIM if available. */ #ifdef USE_XIM int use_xim = 1; @@ -221,15 +224,6 @@ static struct frame *last_mouse_glyph_frame; static Lisp_Object last_mouse_scroll_bar; -/* This is a hack. We would really prefer that XTmouse_position would - return the time associated with the position it returns, but there - doesn't seem to be any way to wrest the time-stamp from the server - along with the position query. So, we just keep track of the time - of the last movement we received, and return that in hopes that - it's somewhat accurate. */ - -static Time last_mouse_movement_time; - /* Time for last user interaction as returned in X events. */ static Time last_user_time; @@ -3722,7 +3716,44 @@ construct_mouse_click (struct input_event *result, XButtonEvent *event, struct f return Qnil; } - +#ifdef X_MOTION_HISTORY + +/* Here we assume that X server supports XGetMotionEvents. If you hit + eassert in the function below, most probably your X server is too + old and/or buggy. Undef X_MOTION_HISTORY to enable legacy code. */ + +static Time +x_last_mouse_movement_time (struct frame *f) +{ + Time t; + int nevents; + XTimeCoord *xtc = XGetMotionEvents (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), + 1, last_user_time, &nevents); + eassert (xtc && nevents > 0); + t = xtc[nevents - 1].time; + XFree (xtc); + return t; +} + +#else /* no X_MOTION_HISTORY */ + +/* This is a hack. We would really prefer that XTmouse_position would + return the time associated with the position it returns, but there + doesn't seem to be any way to wrest the time-stamp from the server + along with the position query. So, we just keep track of the time + of the last movement we received, and return that in hopes that + it's somewhat accurate. */ + +static Time last_mouse_movement_time; + +static Time +x_last_mouse_movement_time (struct frame *f) +{ + return last_mouse_movement_time; +} + +#endif /* X_MOTION_HISTORY */ + /* Function to report a mouse movement to the mainstream Emacs code. The input handler calls this. @@ -3737,7 +3768,9 @@ static Lisp_Object last_mouse_motion_frame; static int note_mouse_movement (struct frame *frame, XMotionEvent *event) { +#ifndef X_MOTION_HISTORY last_mouse_movement_time = event->time; +#endif /* legacy */ last_mouse_motion_event = *event; XSETFRAME (last_mouse_motion_frame, frame); @@ -3993,7 +4026,7 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, *fp = f1; XSETINT (*x, win_x); XSETINT (*y, win_y); - *timestamp = last_mouse_movement_time; + *timestamp = x_last_mouse_movement_time (f1); } } } @@ -5499,9 +5532,9 @@ static void x_scroll_bar_note_movement (struct scroll_bar *bar, XEvent *event) { struct frame *f = XFRAME (XWINDOW (bar->window)->frame); - +#ifndef X_MOTION_HISTORY last_mouse_movement_time = event->xmotion.time; - +#endif /* legacy */ f->mouse_moved = 1; XSETVECTOR (last_mouse_scroll_bar, bar); @@ -5586,10 +5619,9 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, f->mouse_moved = 0; last_mouse_scroll_bar = Qnil; + *timestamp = x_last_mouse_movement_time (f); } - *timestamp = last_mouse_movement_time; - unblock_input (); } -- 2.39.2