[PATCH 1/3] user32: Wait before getting/setting the cursor position in send_hardware_message

Max Qian public at maxqia.com
Thu Sep 8 03:15:55 CDT 2016


It seems that send_hardware_message sends back the wrong x and y position because we haven't waited for the queue to process, let's do that.

Signed-off-by: Max Qian <public at maxqia.com>
---
 dlls/user32/message.c          | 16 +++++++++-------
 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, 12 insertions(+), 31 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 9bfb453..728bc65 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,15 @@ 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 e8b33b0..055e6ed 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
 
@@ -6365,6 +6361,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 515
+#define SERVER_PROTOCOL_VERSION 516
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 86b209e..1a3cb67 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 c479b38..9ccdda3 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2383,9 +2383,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:
@@ -2402,8 +2399,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 58aebbc..79e4df1 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1495,11 +1495,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 d99c4b2..41829b8 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




More information about the wine-patches mailing list