[PATCH 1/2 v2] user32: Wait before getting/setting the cursor position in send_hardware_message
Max Qian
public at maxqia.com
Sat Aug 27 00:25:21 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 | 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
More information about the wine-patches
mailing list