From: Max Qian Subject: [PATCH 1/2] user32: Wait before getting/setting the cursor position in send_hardware_message Message-Id: <20160827043508.2591-1-public@maxqia.com> Date: Fri, 26 Aug 2016 21:35:07 -0700 Signed-off-by: Max Qian --- dlls/user32/message.c | 20 +++++++++++++------- include/wine/server_protocol.h | 8 ++------ server/protocol.def | 4 ---- server/queue.c | 5 ----- server/request.h | 6 +----- server/trace.c | 4 ---- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index bc6b661..83dd95c 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3296,7 +3296,6 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) { struct user_key_state_info *key_state_info = get_user_thread_info()->key_state; struct send_message_info info; - int prev_x, prev_y, new_x, new_y; INT counter = global_key_state_counter; NTSTATUS ret; BOOL wait; @@ -3338,10 +3337,6 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) sizeof(key_state_info->state) ); ret = wine_server_call( req ); wait = reply->wait; - prev_x = reply->prev_x; - prev_y = reply->prev_y; - new_x = reply->new_x; - new_y = reply->new_y; } SERVER_END_REQ; @@ -3352,8 +3347,6 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) key_state_info->time = GetTickCount(); key_state_info->counter = counter; } - if ((flags & SEND_HWMSG_INJECTED) && (prev_x != new_x || prev_y != new_y)) - USER_Driver->pSetCursorPos( new_x, new_y ); } if (wait) @@ -3362,6 +3355,19 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) wait_message_reply( 0 ); retrieve_reply( &info, 0, &ignored ); } + + if (flags & SEND_HWMSG_INJECTED) + { + SERVER_START_REQ( set_cursor ) + { + if (!wine_server_call( req )) + { + USER_Driver->pSetCursorPos( reply->new_x, reply->new_y ); + } + } + SERVER_END_REQ; + } + return ret; } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index a52c001..c1854b5 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -3016,12 +3016,8 @@ struct send_hardware_message_reply { struct reply_header __header; int wait; - int prev_x; - int prev_y; - int new_x; - int new_y; /* VARARG(keystate,bytes); */ - char __pad_28[4]; + char __pad_12[4]; }; #define SEND_HWMSG_INJECTED 0x01 @@ -6318,6 +6314,6 @@ union generic_reply struct terminate_job_reply terminate_job_reply; }; -#define SERVER_PROTOCOL_VERSION 513 +#define SERVER_PROTOCOL_VERSION 514 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 523f5bf..379a2b5 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2213,10 +2213,6 @@ enum message_type unsigned int flags; /* flags (see below) */ @REPLY int wait; /* do we need to wait for a reply? */ - int prev_x; /* previous cursor position */ - int prev_y; - int new_x; /* new cursor position */ - int new_y; VARARG(keystate,bytes); /* global state array for all the keys */ @END #define SEND_HWMSG_INJECTED 0x01 diff --git a/server/queue.c b/server/queue.c index f82060f..d09a905 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2356,9 +2356,6 @@ DECL_HANDLER(send_hardware_message) } } - reply->prev_x = desktop->cursor.x; - reply->prev_y = desktop->cursor.y; - switch (req->input.type) { case INPUT_MOUSE: @@ -2375,8 +2372,6 @@ DECL_HANDLER(send_hardware_message) } if (thread) release_object( thread ); - reply->new_x = desktop->cursor.x; - reply->new_y = desktop->cursor.y; set_reply_data( desktop->keystate, size ); release_object( desktop ); } diff --git a/server/request.h b/server/request.h index c5236f5..71e7083 100644 --- a/server/request.h +++ b/server/request.h @@ -1489,11 +1489,7 @@ C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, input) == 16 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, flags) == 48 ); C_ASSERT( sizeof(struct send_hardware_message_request) == 56 ); C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, wait) == 8 ); -C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, prev_x) == 12 ); -C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, prev_y) == 16 ); -C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, new_x) == 20 ); -C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, new_y) == 24 ); -C_ASSERT( sizeof(struct send_hardware_message_reply) == 32 ); +C_ASSERT( sizeof(struct send_hardware_message_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, flags) == 12 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, get_win) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, get_first) == 20 ); diff --git a/server/trace.c b/server/trace.c index 6c9518e..4d56465 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2738,10 +2738,6 @@ static void dump_send_hardware_message_request( const struct send_hardware_messa static void dump_send_hardware_message_reply( const struct send_hardware_message_reply *req ) { fprintf( stderr, " wait=%d", req->wait ); - fprintf( stderr, ", prev_x=%d", req->prev_x ); - fprintf( stderr, ", prev_y=%d", req->prev_y ); - fprintf( stderr, ", new_x=%d", req->new_x ); - fprintf( stderr, ", new_y=%d", req->new_y ); dump_varargs_bytes( ", keystate=", cur_size ); } -- 2.9.3