From: Po Lu Date: Wed, 22 Jun 2022 01:49:16 +0000 (+0800) Subject: Fix setting user time for mouse movement events X-Git-Tag: emacs-29.0.90~1447^2~1546 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d5a3fbe7c8b320cae26458ce353a5d933ded7bb9;p=emacs.git Fix setting user time for mouse movement events * src/xterm.c (x_note_mouse_movement, XTmouse_position) (x_scroll_bar_note_movement, handle_one_xevent): Record whether or not mouse movement was send_event before using the mouse movement time. * src/xterm.h (struct x_display_info): New field `last_mouse_movement_time_send_event'. --- diff --git a/src/xterm.c b/src/xterm.c index ee78da085e2..f97452a2e56 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -12335,10 +12335,11 @@ x_construct_mouse_click (struct input_event *result, The XMotionEvent structure passed as EVENT might not come from the X server, and instead be artificially constructed from input extension events. In these special events, the only fields that - are initialized are `time', `window', and `x' and `y'. This - function should not access any other fields in EVENT without also - initializing the corresponding fields in `ev' under the XI_Motion, - XI_Enter and XI_Leave labels inside `handle_one_xevent'. */ + are initialized are `time', `window', `send_event', `x' and `y'. + This function should not access any other fields in EVENT without + also initializing the corresponding fields in `ev' under the + XI_Motion, XI_Enter and XI_Leave labels inside + `handle_one_xevent'. */ static bool x_note_mouse_movement (struct frame *frame, const XMotionEvent *event, @@ -12352,6 +12353,7 @@ x_note_mouse_movement (struct frame *frame, const XMotionEvent *event, dpyinfo = FRAME_DISPLAY_INFO (frame); dpyinfo->last_mouse_movement_time = event->time; + dpyinfo->last_mouse_movement_time_send_event = event->send_event; dpyinfo->last_mouse_motion_frame = frame; dpyinfo->last_mouse_motion_x = event->x; dpyinfo->last_mouse_motion_y = event->y; @@ -12667,7 +12669,8 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, && (dpyinfo->last_user_time < dpyinfo->last_mouse_movement_time)) x_display_set_last_user_time (dpyinfo, - dpyinfo->last_mouse_movement_time, false); + dpyinfo->last_mouse_movement_time, + dpyinfo->last_mouse_movement_time_send_event); if ((!f1 || FRAME_TOOLTIP_P (f1)) && (EQ (track_mouse, Qdropping) @@ -15075,6 +15078,7 @@ x_scroll_bar_note_movement (struct scroll_bar *bar, struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); dpyinfo->last_mouse_movement_time = event->time; + dpyinfo->last_mouse_movement_send_event = event->send_event; dpyinfo->last_mouse_scroll_bar = bar; f->mouse_moved = true; @@ -19168,10 +19172,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, any = x_top_window_to_frame (dpyinfo, enter->event); source = xi_device_from_id (dpyinfo, enter->sourceid); + ev.x = lrint (enter->event_x); ev.y = lrint (enter->event_y); ev.window = enter->event; ev.time = enter->time; + ev.send_event = enter->send_event; x_display_set_last_user_time (dpyinfo, enter->time, enter->send_event); @@ -19262,6 +19268,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, ev.y = lrint (leave->event_y); ev.window = leave->event; ev.time = leave->time; + ev.send_event = leave->send_event; #endif any = x_top_window_to_frame (dpyinfo, leave->event); @@ -19680,6 +19687,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, ev.y = lrint (xev->event_y); ev.window = xev->event; ev.time = xev->time; + ev.send_event = xev->send_event; #ifdef USE_MOTIF use_copy = true; diff --git a/src/xterm.h b/src/xterm.h index 3d243f3eabf..f136b6b97fe 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -515,6 +515,9 @@ struct x_display_info received, and return that in hopes that it's somewhat accurate. */ Time last_mouse_movement_time; + /* Whether or not the last mouse motion was synthetic. */ + bool last_mouse_movement_time_send_event; + /* The gray pixmap. */ Pixmap gray;