emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master d5a3fbe7c8: Fix setting user time for mouse movement events


From: Po Lu
Subject: master d5a3fbe7c8: Fix setting user time for mouse movement events
Date: Tue, 21 Jun 2022 21:49:39 -0400 (EDT)

branch: master
commit d5a3fbe7c8b320cae26458ce353a5d933ded7bb9
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    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'.
---
 src/xterm.c | 18 +++++++++++++-----
 src/xterm.h |  3 +++
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index ee78da085e..f97452a2e5 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 3d243f3eab..f136b6b97f 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;
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]