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 ### */