From: Rémi Bernon <rbernon(a)codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59075 --- server/queue.c | 30 ++++++++++++++---------------- server/user.h | 2 +- server/window.c | 11 ++++++++--- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/server/queue.c b/server/queue.c index 25f605a3e66..6e818691139 100644 --- a/server/queue.c +++ b/server/queue.c @@ -3816,37 +3816,35 @@ DECL_HANDLER(set_foreground_window) { struct thread *thread = NULL; struct desktop *desktop; - struct thread_input *input; struct msg_queue *queue = get_current_queue(); + int is_desktop = 0; if (!queue || !(desktop = get_thread_desktop( current, 0 ))) return; - if (!(input = desktop->foreground_input)) reply->previous = 0; - else reply->previous = input->shared->active; + if (!(thread = make_window_foreground( desktop, req->handle, &is_desktop )) || + !thread->queue || !thread->queue->input) + { + set_win32_error( ERROR_INVALID_WINDOW_HANDLE ); + goto done; + } if (!req->internal) { if (!current->process->set_foreground) current->process->set_foreground = 1; - else if (!is_current_process_foreground( desktop ) && queue->input && input && queue->input->user_time < input->user_time) + else if (!is_current_process_foreground( desktop ) && queue->input && desktop->foreground_input && + queue->input->user_time < desktop->foreground_input->user_time) { set_error( STATUS_ACCESS_DENIED ); - release_object( desktop ); - return; + goto done; } } + reply->previous = desktop->foreground_input ? desktop->foreground_input->shared->active : 0; reply->send_msg_old = (reply->previous && desktop->foreground_input != queue->input); - reply->send_msg_new = FALSE; - - if (is_valid_foreground_window( req->handle ) && (thread = get_window_thread( req->handle )) && - (input = thread->queue->input) && input->desktop == desktop) - { - int is_desktop = thread->process == get_top_window_owner( desktop ); - set_foreground_input( desktop, req->internal || !is_desktop ? input : NULL ); - reply->send_msg_new = (desktop->foreground_input != queue->input); - } - else set_win32_error( ERROR_INVALID_WINDOW_HANDLE ); + set_foreground_input( desktop, req->internal || !is_desktop ? thread->queue->input : NULL ); + reply->send_msg_new = (desktop->foreground_input != queue->input); +done: if (thread) release_object( thread ); release_object( desktop ); } diff --git a/server/user.h b/server/user.h index 79ec7ba7682..bbc1ac676e7 100644 --- a/server/user.h +++ b/server/user.h @@ -174,7 +174,7 @@ extern void post_desktop_message( struct desktop *desktop, unsigned int message, extern void free_window_handle( struct window *win ); extern void destroy_thread_windows( struct thread *thread ); extern int is_child_window( user_handle_t parent, user_handle_t child ); -extern int is_valid_foreground_window( user_handle_t window ); +extern struct thread *make_window_foreground( struct desktop *desktop, user_handle_t window, int *is_desktop ); extern int is_window_visible( user_handle_t window ); extern int is_window_transparent( user_handle_t window ); extern int make_window_active( user_handle_t window ); diff --git a/server/window.c b/server/window.c index d9a2689ae5a..ad5279f205d 100644 --- a/server/window.c +++ b/server/window.c @@ -786,11 +786,16 @@ int is_child_window( user_handle_t parent, user_handle_t child ) return 0; } -/* check if window can be set as foreground window */ -int is_valid_foreground_window( user_handle_t window ) +/* return the window thread if window can be set as foreground window */ +struct thread *make_window_foreground( struct desktop *desktop, user_handle_t window, int *is_desktop ) { struct window *win = get_user_object( window, NTUSER_OBJ_WINDOW ); - return win && (win->style & (WS_POPUP|WS_CHILD)) != WS_CHILD; + + if (!win || !win->thread || win->desktop != desktop) return NULL; + if ((win->style & (WS_POPUP | WS_CHILD)) == WS_CHILD) return NULL; + *is_desktop = win == win->desktop->top_window; + + return (struct thread *)grab_object( win->thread ); } /* make a window active if possible */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9668