SERVER_START_REQ( send_hardware_message )
{
- req->id = (injected_flags & LLKHF_INJECTED) ? 0 : GetCurrentThreadId();
req->win = wine_server_user_handle( hwnd );
req->msg = message;
req->wparam = wVk;
SERVER_START_REQ( send_hardware_message )
{
- req->id = (injected_flags & LLMHF_INJECTED) ? 0 : GetCurrentThreadId();
req->win = wine_server_user_handle( hwnd );
req->msg = message;
req->wparam = MAKEWPARAM( 0, data );
struct send_hardware_message_request
{
struct request_header __header;
- thread_id_t id;
user_handle_t win;
unsigned int msg;
+ unsigned int time;
lparam_t wparam;
lparam_t lparam;
lparam_t info;
int x;
int y;
- unsigned int time;
- char __pad_60[4];
};
struct send_hardware_message_reply
{
struct reply_header __header;
- user_handle_t cursor;
- int count;
};
struct set_cursor_reply set_cursor_reply;
};
-#define SERVER_PROTOCOL_VERSION 414
+#define SERVER_PROTOCOL_VERSION 415
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
/* Send a hardware message to a thread queue */
@REQ(send_hardware_message)
- thread_id_t id; /* thread id */
user_handle_t win; /* window handle */
unsigned int msg; /* message code */
+ unsigned int time; /* message time */
lparam_t wparam; /* parameters */
lparam_t lparam; /* parameters */
lparam_t info; /* extra info */
int x; /* x position */
int y; /* y position */
- unsigned int time; /* message time */
-@REPLY
- user_handle_t cursor; /* current cursor for the target thread input */
- int count; /* current cursor count */
@END
}
/* find the window that should receive a given hardware message */
-static user_handle_t find_hardware_message_window( struct thread_input *input, struct message *msg,
- unsigned int *msg_code )
+static user_handle_t find_hardware_message_window( struct desktop *desktop, struct thread_input *input,
+ struct message *msg, unsigned int *msg_code )
{
struct hardware_msg_data *data = msg->data;
user_handle_t win = 0;
if (!input || !(win = input->capture))
{
if (!(win = msg->win) || !is_window_visible( win ) || is_window_transparent( win ))
- {
- if (input) win = window_from_point( input->desktop, data->x, data->y );
- }
+ win = window_from_point( desktop, data->x, data->y );
}
}
return win;
}
/* queue a hardware message into a given thread input */
-static void queue_hardware_message( struct desktop *desktop, struct thread_input *input,
- struct message *msg )
+static void queue_hardware_message( struct desktop *desktop, struct message *msg )
{
user_handle_t win;
struct thread *thread;
+ struct thread_input *input;
unsigned int msg_code;
struct hardware_msg_data *data = msg->data;
data->x = desktop->cursor_x;
data->y = desktop->cursor_y;
- win = find_hardware_message_window( input, msg, &msg_code );
+ if (msg->win && (thread = get_window_thread( msg->win )))
+ {
+ input = thread->queue->input;
+ release_object( thread );
+ }
+ else input = desktop->foreground_input;
+
+ win = find_hardware_message_window( desktop, input, msg, &msg_code );
if (!win || !(thread = get_window_thread(win)))
{
if (input) update_input_key_state( input->desktop, input->keystate, msg );
struct hardware_msg_data *data = msg->data;
ptr = list_next( &input->msg_list, ptr );
- win = find_hardware_message_window( input, msg, &msg_code );
+ win = find_hardware_message_window( input->desktop, input, msg, &msg_code );
if (!win || !(win_thread = get_window_thread( win )))
{
/* no window at all, remove it */
{
struct message *msg;
struct thread *thread = NULL;
- struct desktop *desktop = NULL;
+ struct desktop *desktop;
struct hardware_msg_data *data;
- struct thread_input *input;
- if (req->id)
- {
- if (!(thread = get_thread_from_id( req->id ))) return;
- if (!thread->queue)
- {
- set_error( STATUS_INVALID_PARAMETER );
- release_object( thread );
- return;
- }
- input = thread->queue->input;
- desktop = (struct desktop *)grab_object( input->desktop );
- reply->cursor = input->cursor;
- reply->count = input->cursor_count;
- }
- else
+ if (req->win)
{
- if (!(desktop = get_thread_desktop( current, 0 ))) return;
- input = desktop->foreground_input;
+ if (!(thread = get_window_thread( req->win ))) return;
+ desktop = (struct desktop *)grab_object( thread->queue->input->desktop );
}
+ else if (!(desktop = get_thread_desktop( current, 0 ))) return;
- if (!req->msg || !(data = mem_alloc( sizeof(*data) ))) goto done;
+ if (!(data = mem_alloc( sizeof(*data) ))) goto done;
memset( data, 0, sizeof(*data) );
data->x = req->x;
msg->result = NULL;
msg->data = data;
msg->data_size = sizeof(*data);
- queue_hardware_message( desktop, input, msg );
+ queue_hardware_message( desktop, msg );
}
else free( data );
C_ASSERT( sizeof(struct send_message_request) == 56 );
C_ASSERT( FIELD_OFFSET(struct post_quit_message_request, exit_code) == 12 );
C_ASSERT( sizeof(struct post_quit_message_request) == 16 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, id) == 12 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, win) == 16 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, msg) == 20 );
+C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, win) == 12 );
+C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, msg) == 16 );
+C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, time) == 20 );
C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, wparam) == 24 );
C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, lparam) == 32 );
C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, info) == 40 );
C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, x) == 48 );
C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, y) == 52 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_request, time) == 56 );
-C_ASSERT( sizeof(struct send_hardware_message_request) == 64 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, cursor) == 8 );
-C_ASSERT( FIELD_OFFSET(struct send_hardware_message_reply, count) == 12 );
-C_ASSERT( sizeof(struct send_hardware_message_reply) == 16 );
+C_ASSERT( sizeof(struct send_hardware_message_request) == 56 );
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 );
static void dump_send_hardware_message_request( const struct send_hardware_message_request *req )
{
- fprintf( stderr, " id=%04x", req->id );
- fprintf( stderr, ", win=%08x", req->win );
+ fprintf( stderr, " win=%08x", req->win );
fprintf( stderr, ", msg=%08x", req->msg );
+ fprintf( stderr, ", time=%08x", req->time );
dump_uint64( ", wparam=", &req->wparam );
dump_uint64( ", lparam=", &req->lparam );
dump_uint64( ", info=", &req->info );
fprintf( stderr, ", x=%d", req->x );
fprintf( stderr, ", y=%d", req->y );
- fprintf( stderr, ", time=%08x", req->time );
-}
-
-static void dump_send_hardware_message_reply( const struct send_hardware_message_reply *req )
-{
- fprintf( stderr, " cursor=%08x", req->cursor );
- fprintf( stderr, ", count=%d", req->count );
}
static void dump_get_message_request( const struct get_message_request *req )
(dump_func)dump_get_process_idle_event_reply,
NULL,
NULL,
- (dump_func)dump_send_hardware_message_reply,
+ NULL,
(dump_func)dump_get_message_reply,
NULL,
NULL,