From 87186a893c406d94b9349b23576875fa1179489e Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 18 May 2023 09:21:29 -0700 Subject: [PATCH] Integrate 8067023 and 8067041 to SDL3: Change 8067023 by mikela: Add SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED to SDL_RaiseWindow - When set to false, this allows SDL_RaiseWindow to bring a chosen window to the top of the stack but not force input focus to it Change 8067041 by mikela: Rename SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN to SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN --- include/SDL3/SDL_hints.h | 18 +++++++++++++++--- src/video/windows/SDL_windowswindow.c | 14 +++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h index 09830b563c..739a250e40 100644 --- a/include/SDL3/SDL_hints.h +++ b/include/SDL3/SDL_hints.h @@ -441,6 +441,18 @@ extern "C" { */ #define SDL_HINT_FORCE_RAISEWINDOW "SDL_HINT_FORCE_RAISEWINDOW" +/** +* \brief A variable controlling whether the window is activated when the SDL_RaiseWindow function is called +* +* This variable can be set to the following values: +* "0" - The window is not activated when the SDL_RaiseWindow function is called +* "1" - The window is activated when the SDL_RaiseWindow function is called +* +* By default SDL will activate the window when the SDL_RaiseWindow function is called. +* At present this is only available for MS Windows. +*/ +#define SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED "SDL_WINDOW_ACTIVATE_WHEN_RAISED" + /** * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. * @@ -2025,12 +2037,12 @@ extern "C" { * \brief A variable controlling whether the window is activated when the SDL_ShowWindow function is called * * This variable can be set to the following values: -* "0" - The window is activated when the SDL_ShowWindow function is called -* "1" - The window is not activated when the SDL_ShowWindow function is called +* "0" - The window is not activated when the SDL_ShowWindow function is called +* "1" - The window is activated when the SDL_ShowWindow function is called * * By default SDL will activate the window when the SDL_ShowWindow function is called */ -#define SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN "SDL_WINDOW_NO_ACTIVATION_WHEN_SHOWN" +#define SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN "SDL_WINDOW_ACTIVATE_WHEN_SHOWN" /** \brief Allows back-button-press events on Windows Phone to be marked as handled * diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 985a82cf5d..d688811034 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -840,13 +840,15 @@ void WIN_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) HWND hwnd; int nCmdShow; + SDL_bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, SDL_TRUE); + if (window->parent) { /* Update our position in case our parent moved while we were hidden */ WIN_SetWindowPosition(_this, window); } hwnd = window->driverdata->hwnd; - nCmdShow = SDL_GetHintBoolean(SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN, SDL_FALSE) ? SW_SHOWNA : SW_SHOW; + nCmdShow = bActivate ? SW_SHOW : SW_SHOWNA; style = GetWindowLong(hwnd, GWL_EXSTYLE); if (style & WS_EX_NOACTIVATE) { nCmdShow = SW_SHOWNOACTIVATE; @@ -892,12 +894,14 @@ void WIN_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window) * for "security" reasons. Apparently, the following song-and-dance gets * around their objections. */ SDL_bool bForce = SDL_GetHintBoolean(SDL_HINT_FORCE_RAISEWINDOW, SDL_FALSE); + SDL_bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED, SDL_TRUE); HWND hCurWnd = NULL; DWORD dwMyID = 0u; DWORD dwCurID = 0u; - HWND hwnd = window->driverdata->hwnd; + SDL_WindowData *data = window->driverdata; + HWND hwnd = data->hwnd; if (bForce) { hCurWnd = GetForegroundWindow(); dwMyID = GetCurrentThreadId(); @@ -909,7 +913,11 @@ void WIN_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window) SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } } - SetForegroundWindow(hwnd); + if (bActivate) { + SetForegroundWindow(hwnd); + } else { + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, data->copybits_flag | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOACTIVATE); + } if (bForce) { AttachThreadInput(dwCurID, dwMyID, FALSE); SetFocus(hwnd);