From: Max Qian Subject: [PATCH 3/3] winex11.drv: Don't trigger a MotionNotify event right after a RawMotion event and make only absolute movements change the cursor's last change time Message-Id: <20160908081557.9725-3-public@maxqia.com> Date: Thu, 8 Sep 2016 01:15:57 -0700 In-Reply-To: <20160908081557.9725-1-public@maxqia.com> References: <20160908081557.9725-1-public@maxqia.com> Signed-off-by: Max Qian --- dlls/winex11.drv/event.c | 12 +++++------- server/queue.c | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index a0bfe05..a3dd386 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -345,14 +345,9 @@ static enum event_merge_action merge_events( XEvent *prev, XEvent *next ) return MERGE_DISCARD; } break; -#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H - case GenericEvent: - if (next->xcookie.extension != xinput2_opcode) break; - if (next->xcookie.evtype != XI_RawMotion) break; - if (x11drv_thread_data()->warp_serial) break; - return MERGE_KEEP; } break; +#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H case GenericEvent: if (prev->xcookie.extension != xinput2_opcode) break; if (prev->xcookie.evtype != XI_RawMotion) break; @@ -363,9 +358,12 @@ static enum event_merge_action merge_events( XEvent *prev, XEvent *next ) if (next->xcookie.evtype != XI_RawMotion) break; if (x11drv_thread_data()->warp_serial) break; return merge_raw_motion_events( prev->xcookie.data, next->xcookie.data ); -#endif + case MotionNotify: + TRACE("discarding MotionNotify in favor of RawMotion\n"); + return MERGE_IGNORE; } break; +#endif } return MERGE_HANDLE; } diff --git a/server/queue.c b/server/queue.c index 9ccdda3..73c216a 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1610,10 +1610,9 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons WM_MOUSEHWHEEL /* 0x1000 = MOUSEEVENTF_HWHEEL */ }; - desktop->cursor.last_change = get_tick_count(); flags = input->mouse.flags; time = input->mouse.time; - if (!time) time = desktop->cursor.last_change; + if (!time) time = get_tick_count(); if (flags & MOUSEEVENTF_MOVE) { @@ -1621,6 +1620,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons { x = input->mouse.x; y = input->mouse.y; + desktop->cursor.last_change = get_tick_count(); if (flags & ~(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE) && x == desktop->cursor.x && y == desktop->cursor.y) flags &= ~MOUSEEVENTF_MOVE; -- 2.9.3