diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 5252ceadd24..a924fe3e50e 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -1636,7 +1636,11 @@ HWND WINAPI GetDesktopWindow(void) SERVER_START_REQ( get_desktop_window ) { req->force = 0; - if (!wine_server_call( req )) thread_info->top_window = reply->handle; + if (!wine_server_call( req )) + { + thread_info->top_window = reply->top_window; + thread_info->msg_window = reply->msg_window; + } } SERVER_END_REQ; @@ -1675,7 +1679,11 @@ HWND WINAPI GetDesktopWindow(void) SERVER_START_REQ( get_desktop_window ) { req->force = 1; - if (!wine_server_call( req )) thread_info->top_window = reply->handle; + if (!wine_server_call( req )) + { + thread_info->top_window = reply->top_window; + thread_info->msg_window = reply->msg_window; + } } SERVER_END_REQ; } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 810464c24b2..5f5565a2910 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2796,7 +2796,8 @@ struct get_desktop_window_request struct get_desktop_window_reply { struct reply_header __header; - user_handle_t handle; + user_handle_t top_window; + user_handle_t msg_window; }; @@ -4996,6 +4997,6 @@ union generic_reply struct add_fd_completion_reply add_fd_completion_reply; }; -#define SERVER_PROTOCOL_VERSION 339 +#define SERVER_PROTOCOL_VERSION 340 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 01d94d2ce0c..034bb1a6756 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2061,7 +2061,8 @@ enum message_type @REQ(get_desktop_window) int force; /* force creation if it doesn't exist */ @REPLY - user_handle_t handle; /* handle to the desktop window */ + user_handle_t top_window; /* handle to the desktop window */ + user_handle_t msg_window; /* handle to the top-level HWND_MESSAGE parent */ @END diff --git a/server/trace.c b/server/trace.c index bbae5242174..777255c623f 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2575,7 +2575,8 @@ static void dump_get_desktop_window_request( const struct get_desktop_window_req static void dump_get_desktop_window_reply( const struct get_desktop_window_reply *req ) { - fprintf( stderr, " handle=%p", req->handle ); + fprintf( stderr, " top_window=%p,", req->top_window ); + fprintf( stderr, " msg_window=%p", req->msg_window ); } static void dump_set_window_owner_request( const struct set_window_owner_request *req ) diff --git a/server/window.c b/server/window.c index cae560339a4..53ea59fa4a1 100644 --- a/server/window.c +++ b/server/window.c @@ -549,21 +549,13 @@ void destroy_thread_windows( struct thread *thread ) } /* get the desktop window */ -static struct window *get_desktop_window( struct thread *thread, int create ) +static struct window *get_desktop_window( struct thread *thread ) { struct window *top_window; struct desktop *desktop = get_thread_desktop( thread, 0 ); if (!desktop) return NULL; - - if (!(top_window = desktop->top_window) && create) - { - if ((top_window = create_window( NULL, NULL, DESKTOP_ATOM, 0 ))) - { - detach_window_thread( top_window ); - top_window->style = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; - } - } + top_window = desktop->top_window; release_object( desktop ); return top_window; } @@ -786,7 +778,7 @@ static struct window *find_child_to_repaint( struct window *parent, struct threa /* find a window that needs to receive a WM_PAINT; also clear its internal paint flag */ user_handle_t find_window_to_repaint( user_handle_t parent, struct thread *thread ) { - struct window *ptr, *win, *top_window = get_desktop_window( thread, 0 ); + struct window *ptr, *win, *top_window = get_desktop_window( thread ); if (!top_window) return 0; @@ -1794,9 +1786,34 @@ DECL_HANDLER(destroy_window) /* retrieve the desktop window for the current thread */ DECL_HANDLER(get_desktop_window) { - struct window *win = get_desktop_window( current, req->force ); + struct desktop *desktop = get_thread_desktop( current, 0 ); - if (win) reply->handle = win->handle; + if (!desktop) return; + + if (!desktop->top_window && req->force) /* create it */ + { + if ((desktop->top_window = create_window( NULL, NULL, DESKTOP_ATOM, 0 ))) + { + detach_window_thread( desktop->top_window ); + desktop->top_window->style = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + } + } + + if (!desktop->msg_window && req->force) /* create it */ + { + static const WCHAR messageW[] = {'M','e','s','s','a','g','e'}; + static const struct unicode_str name = { messageW, sizeof(messageW) }; + atom_t atom = add_global_atom( NULL, &name ); + if (atom && (desktop->msg_window = create_window( NULL, NULL, atom, 0 ))) + { + detach_window_thread( desktop->msg_window ); + desktop->msg_window->style = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + } + } + + reply->top_window = desktop->top_window ? desktop->top_window->handle : 0; + reply->msg_window = desktop->msg_window ? desktop->msg_window->handle : 0; + release_object( desktop ); }