Fixed another case where a mouse message could get assigned to a

different thread input.
This commit is contained in:
Alexandre Julliard 2005-05-14 11:08:05 +00:00
parent 12f0b41d13
commit 55d449e476
1 changed files with 14 additions and 6 deletions

View File

@ -1245,23 +1245,32 @@ static int get_hardware_message( struct thread *thread, int hw_id, user_handle_t
while (ptr) while (ptr)
{ {
struct message *msg = LIST_ENTRY( ptr, struct message, entry ); struct message *msg = LIST_ENTRY( ptr, struct message, entry );
ptr = list_next( &input->msg_list, ptr );
win = find_hardware_message_window( input, msg, &msg_code ); win = find_hardware_message_window( input, msg, &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 */
ptr = list_next( &input->msg_list, ptr );
update_input_key_state( input, msg ); update_input_key_state( input, msg );
list_remove( &msg->entry ); list_remove( &msg->entry );
free_message( msg ); free_message( msg );
continue; continue;
} }
if (win_thread != thread) if (win_thread != thread)
{
if (win_thread->queue->input == input)
{ {
/* wake the other thread */ /* wake the other thread */
set_queue_bits( win_thread->queue, get_hardware_msg_bit(msg) ); set_queue_bits( win_thread->queue, get_hardware_msg_bit(msg) );
release_object( win_thread );
got_one = 1; got_one = 1;
ptr = list_next( &input->msg_list, ptr ); }
else
{
/* for another thread input, drop it */
update_input_key_state( input, msg );
list_remove( &msg->entry );
free_message( msg );
}
release_object( win_thread );
continue; continue;
} }
release_object( win_thread ); release_object( win_thread );
@ -1271,7 +1280,6 @@ static int get_hardware_message( struct thread *thread, int hw_id, user_handle_t
if (got_one || !check_hw_message_filter( win, msg_code, filter_win, first, last )) if (got_one || !check_hw_message_filter( win, msg_code, filter_win, first, last ))
{ {
clear_bits &= ~get_hardware_msg_bit( msg ); clear_bits &= ~get_hardware_msg_bit( msg );
ptr = list_next( &input->msg_list, ptr );
continue; continue;
} }
/* now we can return it */ /* now we can return it */