Fixed another case where a mouse message could get assigned to a
different thread input.

diff --git a/server/queue.c b/server/queue.c
index ac7efca..e0fef71 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1245,11 +1245,11 @@
     while (ptr)
     {
         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 );
         if (!win || !(win_thread = get_window_thread( win )))
         {
             /* no window at all, remove it */
-            ptr = list_next( &input->msg_list, ptr );
             update_input_key_state( input, msg );
             list_remove( &msg->entry );
             free_message( msg );
@@ -1257,11 +1257,20 @@
         }
         if (win_thread != thread)
         {
-            /* wake the other thread */
-            set_queue_bits( win_thread->queue, get_hardware_msg_bit(msg) );
+            if (win_thread->queue->input == input)
+            {
+                /* wake the other thread */
+                set_queue_bits( win_thread->queue, get_hardware_msg_bit(msg) );
+                got_one = 1;
+            }
+            else
+            {
+                /* for another thread input, drop it */
+                update_input_key_state( input, msg );
+                list_remove( &msg->entry );
+                free_message( msg );
+            }
             release_object( win_thread );
-            got_one = 1;
-            ptr = list_next( &input->msg_list, ptr );
             continue;
         }
         release_object( win_thread );
@@ -1271,7 +1280,6 @@
         if (got_one || !check_hw_message_filter( win, msg_code, filter_win, first, last ))
         {
             clear_bits &= ~get_hardware_msg_bit( msg );
-            ptr = list_next( &input->msg_list, ptr );
             continue;
         }
         /* now we can return it */