server: Store data for hardware messages in the message extra data.

This commit is contained in:
Alexandre Julliard 2008-12-24 11:59:09 +01:00
parent 9605eb5af2
commit d1d7b9f3f7
5 changed files with 77 additions and 76 deletions

View File

@ -2025,7 +2025,6 @@ static inline void call_sendmsg_callback( SENDASYNCPROC callback, HWND hwnd, UIN
static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags, UINT changed_mask ) static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags, UINT changed_mask )
{ {
LRESULT result; LRESULT result;
ULONG_PTR extra_info = 0;
struct user_thread_info *thread_info = get_user_thread_info(); struct user_thread_info *thread_info = get_user_thread_info();
struct received_message_info info, *old_info; struct received_message_info info, *old_info;
unsigned int hw_id = 0; /* id of previous hardware message */ unsigned int hw_id = 0; /* id of previous hardware message */
@ -2059,10 +2058,9 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
info.msg.wParam = reply->wparam; info.msg.wParam = reply->wparam;
info.msg.lParam = reply->lparam; info.msg.lParam = reply->lparam;
info.msg.time = reply->time; info.msg.time = reply->time;
info.msg.pt.x = reply->x; info.msg.pt.x = 0;
info.msg.pt.y = reply->y; info.msg.pt.y = 0;
hw_id = reply->hw_id; hw_id = 0;
extra_info = reply->info;
thread_info->active_hooks = reply->active_hooks; thread_info->active_hooks = reply->active_hooks;
} }
else buffer_size = reply->total; else buffer_size = reply->total;
@ -2151,14 +2149,27 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
} }
break; break;
case MSG_HARDWARE: case MSG_HARDWARE:
if (!process_hardware_message( &info.msg, hw_id, extra_info, if (size >= sizeof(struct hardware_msg_data))
hwnd, first, last, flags & PM_REMOVE ))
{ {
TRACE("dropping msg %x\n", info.msg.message ); const struct hardware_msg_data *data = buffer;
continue; /* ignore it */ info.msg.pt.x = data->x;
info.msg.pt.y = data->y;
hw_id = data->hw_id;
if (!process_hardware_message( &info.msg, hw_id, data->info,
hwnd, first, last, flags & PM_REMOVE ))
{
TRACE("dropping msg %x\n", info.msg.message );
continue; /* ignore it */
}
*msg = info.msg;
thread_info->GetMessagePosVal = MAKELONG( info.msg.pt.x, info.msg.pt.y );
thread_info->GetMessageTimeVal = info.msg.time;
thread_info->GetMessageExtraInfoVal = data->info;
if (buffer != local_buffer) HeapFree( GetProcessHeap(), 0, buffer );
HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, flags & PM_REMOVE, (LPARAM)msg, TRUE );
return TRUE;
} }
thread_info->GetMessagePosVal = MAKELONG( info.msg.pt.x, info.msg.pt.y ); continue;
/* fall through */
case MSG_POSTED: case MSG_POSTED:
if (info.msg.message & 0x80000000) /* internal message */ if (info.msg.message & 0x80000000) /* internal message */
{ {
@ -2184,7 +2195,7 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
msg->pt.x = (short)LOWORD( thread_info->GetMessagePosVal ); msg->pt.x = (short)LOWORD( thread_info->GetMessagePosVal );
msg->pt.y = (short)HIWORD( thread_info->GetMessagePosVal ); msg->pt.y = (short)HIWORD( thread_info->GetMessagePosVal );
thread_info->GetMessageTimeVal = info.msg.time; thread_info->GetMessageTimeVal = info.msg.time;
thread_info->GetMessageExtraInfoVal = extra_info; thread_info->GetMessageExtraInfoVal = 0;
if (buffer != local_buffer) HeapFree( GetProcessHeap(), 0, buffer ); if (buffer != local_buffer) HeapFree( GetProcessHeap(), 0, buffer );
HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, flags & PM_REMOVE, (LPARAM)msg, TRUE ); HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, flags & PM_REMOVE, (LPARAM)msg, TRUE );
return TRUE; return TRUE;

View File

@ -171,6 +171,14 @@ typedef struct
struct hardware_msg_data
{
lparam_t info;
int x;
int y;
unsigned int hw_id;
};
struct callback_msg_data struct callback_msg_data
{ {
void *callback; void *callback;
@ -2523,15 +2531,11 @@ struct get_message_reply
{ {
struct reply_header __header; struct reply_header __header;
user_handle_t win; user_handle_t win;
int type;
unsigned int msg; unsigned int msg;
lparam_t wparam; lparam_t wparam;
lparam_t lparam; lparam_t lparam;
lparam_t info; int type;
int x;
int y;
unsigned int time; unsigned int time;
unsigned int hw_id;
unsigned int active_hooks; unsigned int active_hooks;
data_size_t total; data_size_t total;
/* VARARG(data,message_data); */ /* VARARG(data,message_data); */
@ -5049,6 +5053,6 @@ union generic_reply
struct set_window_layered_info_reply set_window_layered_info_reply; struct set_window_layered_info_reply set_window_layered_info_reply;
}; };
#define SERVER_PROTOCOL_VERSION 351 #define SERVER_PROTOCOL_VERSION 352
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -187,6 +187,14 @@ typedef struct
/* structures for extra message data */ /* structures for extra message data */
struct hardware_msg_data
{
lparam_t info; /* extra info */
int x; /* x position */
int y; /* y position */
unsigned int hw_id; /* unique id */
};
struct callback_msg_data struct callback_msg_data
{ {
void *callback; /* callback function */ void *callback; /* callback function */
@ -1874,15 +1882,11 @@ enum message_type
unsigned int changed_mask; /* changed bits mask */ unsigned int changed_mask; /* changed bits mask */
@REPLY @REPLY
user_handle_t win; /* window handle */ user_handle_t win; /* window handle */
int type; /* message type */
unsigned int msg; /* message code */ unsigned int msg; /* message code */
lparam_t wparam; /* parameters */ lparam_t wparam; /* parameters */
lparam_t lparam; /* parameters */ lparam_t lparam; /* parameters */
lparam_t info; /* extra info */ int type; /* message type */
int x; /* x position */
int y; /* y position */
unsigned int time; /* message time */ unsigned int time; /* message time */
unsigned int hw_id; /* id if hardware message */
unsigned int active_hooks; /* active hooks bitmap */ unsigned int active_hooks; /* active hooks bitmap */
data_size_t total; /* total size of extra data */ data_size_t total; /* total size of extra data */
VARARG(data,message_data); /* message data for sent messages */ VARARG(data,message_data); /* message data for sent messages */

View File

@ -72,9 +72,6 @@ struct message
unsigned int msg; /* message code */ unsigned int msg; /* message code */
lparam_t wparam; /* parameters */ lparam_t wparam; /* parameters */
lparam_t lparam; /* parameters */ lparam_t lparam; /* parameters */
lparam_t info; /* extra info */
int x; /* x position */
int y; /* y position */
unsigned int time; /* message time */ unsigned int time; /* message time */
void *data; /* message data for sent messages */ void *data; /* message data for sent messages */
unsigned int data_size; /* size of message data */ unsigned int data_size; /* size of message data */
@ -415,10 +412,15 @@ static int merge_message( struct thread_input *input, const struct message *msg
/* now we can merge it */ /* now we can merge it */
prev->wparam = msg->wparam; prev->wparam = msg->wparam;
prev->lparam = msg->lparam; prev->lparam = msg->lparam;
prev->x = msg->x;
prev->y = msg->y;
prev->time = msg->time; prev->time = msg->time;
prev->info = msg->info; if (msg->type == MSG_HARDWARE && prev->data && msg->data)
{
struct hardware_msg_data *prev_data = prev->data;
struct hardware_msg_data *msg_data = msg->data;
prev_data->x = msg_data->x;
prev_data->y = msg_data->y;
prev_data->info = msg_data->info;
}
return 1; return 1;
} }
@ -568,9 +570,6 @@ static struct message_result *alloc_message_result( struct msg_queue *send_queue
callback_msg->wparam = 0; callback_msg->wparam = 0;
callback_msg->lparam = 0; callback_msg->lparam = 0;
callback_msg->time = get_tick_count(); callback_msg->time = get_tick_count();
callback_msg->x = 0;
callback_msg->y = 0;
callback_msg->info = 0;
callback_msg->result = NULL; callback_msg->result = NULL;
/* steal the data from the original message */ /* steal the data from the original message */
callback_msg->data = msg->data; callback_msg->data = msg->data;
@ -610,10 +609,7 @@ static void receive_message( struct msg_queue *queue, struct message *msg,
reply->msg = msg->msg; reply->msg = msg->msg;
reply->wparam = msg->wparam; reply->wparam = msg->wparam;
reply->lparam = msg->lparam; reply->lparam = msg->lparam;
reply->x = msg->x;
reply->y = msg->y;
reply->time = msg->time; reply->time = msg->time;
reply->info = msg->info;
if (msg->data) set_reply_data_ptr( msg->data, msg->data_size ); if (msg->data) set_reply_data_ptr( msg->data, msg->data_size );
@ -681,10 +677,7 @@ found:
reply->msg = msg->msg; reply->msg = msg->msg;
reply->wparam = msg->wparam; reply->wparam = msg->wparam;
reply->lparam = msg->lparam; reply->lparam = msg->lparam;
reply->x = msg->x;
reply->y = msg->y;
reply->time = msg->time; reply->time = msg->time;
reply->info = msg->info;
if (flags & PM_REMOVE) if (flags & PM_REMOVE)
{ {
@ -712,10 +705,7 @@ static int get_quit_message( struct msg_queue *queue, unsigned int flags,
reply->msg = WM_QUIT; reply->msg = WM_QUIT;
reply->wparam = queue->exit_code; reply->wparam = queue->exit_code;
reply->lparam = 0; reply->lparam = 0;
reply->x = 0;
reply->y = 0;
reply->time = get_tick_count(); reply->time = get_tick_count();
reply->info = 0;
if (flags & PM_REMOVE) if (flags & PM_REMOVE)
{ {
@ -1243,7 +1233,7 @@ static void release_hardware_message( struct msg_queue *queue, unsigned int hw_i
/* find the window that should receive a given hardware message */ /* 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, static user_handle_t find_hardware_message_window( struct thread_input *input, struct message *msg,
unsigned int *msg_code ) struct hardware_msg_data *data, unsigned int *msg_code )
{ {
user_handle_t win = 0; user_handle_t win = 0;
@ -1262,7 +1252,7 @@ static user_handle_t find_hardware_message_window( struct thread_input *input, s
{ {
if (!(win = msg->win) || !is_window_visible( win )) if (!(win = msg->win) || !is_window_visible( win ))
{ {
if (input) win = window_from_point( input->desktop, msg->x, msg->y ); if (input) win = window_from_point( input->desktop, data->x, data->y );
} }
} }
} }
@ -1270,7 +1260,8 @@ static user_handle_t find_hardware_message_window( struct thread_input *input, s
} }
/* queue a hardware message into a given thread input */ /* queue a hardware message into a given thread input */
static void queue_hardware_message( struct msg_queue *queue, struct message *msg ) static void queue_hardware_message( struct msg_queue *queue, struct message *msg,
struct hardware_msg_data *data )
{ {
user_handle_t win; user_handle_t win;
struct thread *thread; struct thread *thread;
@ -1278,7 +1269,7 @@ static void queue_hardware_message( struct msg_queue *queue, struct message *msg
unsigned int msg_code; unsigned int msg_code;
last_input_time = get_tick_count(); last_input_time = get_tick_count();
win = find_hardware_message_window( input, msg, &msg_code ); win = find_hardware_message_window( input, msg, data, &msg_code );
if (!win || !(thread = get_window_thread(win))) if (!win || !(thread = get_window_thread(win)))
{ {
if (input) update_input_key_state( input, msg ); if (input) update_input_key_state( input, msg );
@ -1364,8 +1355,10 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user
while (ptr) while (ptr)
{ {
struct message *msg = LIST_ENTRY( ptr, struct message, entry ); struct message *msg = LIST_ENTRY( ptr, struct message, entry );
struct hardware_msg_data *data = msg->data;
ptr = list_next( &input->msg_list, ptr ); ptr = list_next( &input->msg_list, ptr );
win = find_hardware_message_window( input, msg, &msg_code ); win = find_hardware_message_window( input, msg, data, &msg_code );
if (!win || !(win_thread = get_window_thread( win ))) if (!win || !(win_thread = get_window_thread( win )))
{ {
/* no window at all, remove it */ /* no window at all, remove it */
@ -1408,11 +1401,10 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user
reply->msg = msg_code; reply->msg = msg_code;
reply->wparam = msg->wparam; reply->wparam = msg->wparam;
reply->lparam = msg->lparam; reply->lparam = msg->lparam;
reply->x = msg->x;
reply->y = msg->y;
reply->time = msg->time; reply->time = msg->time;
reply->info = msg->info;
reply->hw_id = msg->unique_id; data->hw_id = msg->unique_id;
set_reply_data( msg->data, msg->data_size );
return 1; return 1;
} }
/* nothing found, clear the hardware queue bits */ /* nothing found, clear the hardware queue bits */
@ -1495,9 +1487,6 @@ void post_message( user_handle_t win, unsigned int message, lparam_t wparam, lpa
msg->wparam = wparam; msg->wparam = wparam;
msg->lparam = lparam; msg->lparam = lparam;
msg->time = get_tick_count(); msg->time = get_tick_count();
msg->x = 0;
msg->y = 0;
msg->info = 0;
msg->result = NULL; msg->result = NULL;
msg->data = NULL; msg->data = NULL;
msg->data_size = 0; msg->data_size = 0;
@ -1527,9 +1516,6 @@ void post_win_event( struct thread *thread, unsigned int event,
msg->wparam = object_id; msg->wparam = object_id;
msg->lparam = child_id; msg->lparam = child_id;
msg->time = get_tick_count(); msg->time = get_tick_count();
msg->x = 0;
msg->y = 0;
msg->info = 0;
msg->result = NULL; msg->result = NULL;
if ((data = malloc( sizeof(*data) + module_size ))) if ((data = malloc( sizeof(*data) + module_size )))
@ -1670,9 +1656,6 @@ DECL_HANDLER(send_message)
msg->wparam = req->wparam; msg->wparam = req->wparam;
msg->lparam = req->lparam; msg->lparam = req->lparam;
msg->time = get_tick_count(); msg->time = get_tick_count();
msg->x = 0;
msg->y = 0;
msg->info = 0;
msg->result = NULL; msg->result = NULL;
msg->data = NULL; msg->data = NULL;
msg->data_size = get_req_data_size(); msg->data_size = get_req_data_size();
@ -1721,6 +1704,7 @@ DECL_HANDLER(send_hardware_message)
struct message *msg; struct message *msg;
struct msg_queue *recv_queue = NULL; struct msg_queue *recv_queue = NULL;
struct thread *thread = NULL; struct thread *thread = NULL;
struct hardware_msg_data *data;
if (req->id) if (req->id)
{ {
@ -1734,6 +1718,15 @@ DECL_HANDLER(send_hardware_message)
return; return;
} }
if (!(data = mem_alloc( sizeof(*data) )))
{
release_object( thread );
return;
}
data->x = req->x;
data->y = req->y;
data->info = req->info;
if ((msg = mem_alloc( sizeof(*msg) ))) if ((msg = mem_alloc( sizeof(*msg) )))
{ {
msg->type = MSG_HARDWARE; msg->type = MSG_HARDWARE;
@ -1742,14 +1735,13 @@ DECL_HANDLER(send_hardware_message)
msg->wparam = req->wparam; msg->wparam = req->wparam;
msg->lparam = req->lparam; msg->lparam = req->lparam;
msg->time = req->time; msg->time = req->time;
msg->x = req->x;
msg->y = req->y;
msg->info = req->info;
msg->result = NULL; msg->result = NULL;
msg->data = NULL; msg->data = data;
msg->data_size = 0; msg->data_size = sizeof(*data);
queue_hardware_message( recv_queue, msg ); queue_hardware_message( recv_queue, msg, data );
} }
else free( data );
if (thread) release_object( thread ); if (thread) release_object( thread );
} }
@ -1824,10 +1816,7 @@ DECL_HANDLER(get_message)
reply->msg = WM_PAINT; reply->msg = WM_PAINT;
reply->wparam = 0; reply->wparam = 0;
reply->lparam = 0; reply->lparam = 0;
reply->x = 0;
reply->y = 0;
reply->time = get_tick_count(); reply->time = get_tick_count();
reply->info = 0;
return; return;
} }
@ -1841,10 +1830,7 @@ DECL_HANDLER(get_message)
reply->msg = timer->msg; reply->msg = timer->msg;
reply->wparam = timer->id; reply->wparam = timer->id;
reply->lparam = timer->lparam; reply->lparam = timer->lparam;
reply->x = 0;
reply->y = 0;
reply->time = get_tick_count(); reply->time = get_tick_count();
reply->info = 0;
return; return;
} }

View File

@ -2385,15 +2385,11 @@ static void dump_get_message_request( const struct get_message_request *req )
static void dump_get_message_reply( const struct get_message_reply *req ) static void dump_get_message_reply( const struct get_message_reply *req )
{ {
fprintf( stderr, " win=%08x,", req->win ); fprintf( stderr, " win=%08x,", req->win );
fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " msg=%08x,", req->msg ); fprintf( stderr, " msg=%08x,", req->msg );
fprintf( stderr, " wparam=%lx,", req->wparam ); fprintf( stderr, " wparam=%lx,", req->wparam );
fprintf( stderr, " lparam=%lx,", req->lparam ); fprintf( stderr, " lparam=%lx,", req->lparam );
fprintf( stderr, " info=%lx,", req->info ); fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " x=%d,", req->x );
fprintf( stderr, " y=%d,", req->y );
fprintf( stderr, " time=%08x,", req->time ); fprintf( stderr, " time=%08x,", req->time );
fprintf( stderr, " hw_id=%08x,", req->hw_id );
fprintf( stderr, " active_hooks=%08x,", req->active_hooks ); fprintf( stderr, " active_hooks=%08x,", req->active_hooks );
fprintf( stderr, " total=%u,", req->total ); fprintf( stderr, " total=%u,", req->total );
fprintf( stderr, " data=" ); fprintf( stderr, " data=" );