Moved mouse capture handling into the server.

diff --git a/server/protocol.def b/server/protocol.def
index 6e72e97..3837f39 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1955,3 +1955,14 @@
 @REPLY
     user_handle_t  previous;      /* handle to the previous active window */
 @END
+
+/* Set the current thread capture window */
+@REQ(set_capture_window)
+    user_handle_t  handle;        /* handle to the capture window */
+    unsigned int   flags;         /* capture flags (see below) */
+@REPLY
+    user_handle_t  previous;      /* handle to the previous capture window */
+    user_handle_t  full_handle;   /* full 32-bit handle of new capture window */
+@END
+#define CAPTURE_MENU     0x01  /* capture is for a menu */
+#define CAPTURE_MOVESIZE 0x02  /* capture is for moving/resizing */
diff --git a/server/queue.c b/server/queue.c
index 5d51e62..5332dcf 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1369,3 +1369,22 @@
         else set_error( STATUS_INVALID_HANDLE );
     }
 }
+
+
+/* set the current thread capture window */
+DECL_HANDLER(set_capture_window)
+{
+    struct msg_queue *queue = get_current_queue();
+
+    reply->previous = reply->full_handle = 0;
+    if (queue && check_queue_input_window( queue, req->handle ))
+    {
+        struct thread_input *input = queue->input;
+
+        reply->previous = input->capture;
+        input->capture = get_user_full_handle( req->handle );
+        input->menu_owner = (req->flags & CAPTURE_MENU) ? input->capture : 0;
+        input->move_size = (req->flags & CAPTURE_MOVESIZE) ? input->capture : 0;
+        reply->full_handle = input->capture;
+    }
+}
diff --git a/server/request.h b/server/request.h
index a6076d7..63aea54 100644
--- a/server/request.h
+++ b/server/request.h
@@ -264,6 +264,7 @@
 DECL_HANDLER(set_foreground_window);
 DECL_HANDLER(set_focus_window);
 DECL_HANDLER(set_active_window);
+DECL_HANDLER(set_capture_window);
 
 #ifdef WANT_REQUEST_HANDLERS
 
@@ -431,6 +432,7 @@
     (req_handler)req_set_foreground_window,
     (req_handler)req_set_focus_window,
     (req_handler)req_set_active_window,
+    (req_handler)req_set_capture_window,
 };
 #endif  /* WANT_REQUEST_HANDLERS */
 
diff --git a/server/trace.c b/server/trace.c
index e680e58..9487057 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2233,6 +2233,18 @@
     fprintf( stderr, " previous=%08x", req->previous );
 }
 
+static void dump_set_capture_window_request( const struct set_capture_window_request *req )
+{
+    fprintf( stderr, " handle=%08x,", req->handle );
+    fprintf( stderr, " flags=%08x", req->flags );
+}
+
+static void dump_set_capture_window_reply( const struct set_capture_window_reply *req )
+{
+    fprintf( stderr, " previous=%08x,", req->previous );
+    fprintf( stderr, " full_handle=%08x", req->full_handle );
+}
+
 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_new_process_request,
     (dump_func)dump_get_new_process_info_request,
@@ -2395,6 +2407,7 @@
     (dump_func)dump_set_foreground_window_request,
     (dump_func)dump_set_focus_window_request,
     (dump_func)dump_set_active_window_request,
+    (dump_func)dump_set_capture_window_request,
 };
 
 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -2559,6 +2572,7 @@
     (dump_func)dump_set_foreground_window_reply,
     (dump_func)dump_set_focus_window_reply,
     (dump_func)dump_set_active_window_reply,
+    (dump_func)dump_set_capture_window_reply,
 };
 
 static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -2723,6 +2737,7 @@
     "set_foreground_window",
     "set_focus_window",
     "set_active_window",
+    "set_capture_window",
 };
 
 /* ### make_requests end ### */