From e1c3a25034663ccb13cc771671f1298f7306fa99 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 24 Jul 2021 12:11:27 -0700 Subject: [PATCH] Changed SDL_FlashWindow() so it doesn't take a flash count, and added the hint SDL_HINT_WINDOW_FLASH_COUNT to control behavior on Windows --- include/SDL_hints.h | 9 +++++++++ include/SDL_video.h | 7 ++----- src/dynapi/SDL_dynapi_procs.h | 2 +- src/test/SDL_test_common.c | 9 +++++++++ src/video/SDL_sysvideo.h | 2 +- src/video/SDL_video.c | 4 ++-- src/video/cocoa/SDL_cocoawindow.h | 2 +- src/video/cocoa/SDL_cocoawindow.m | 2 +- src/video/wayland/SDL_waylandwindow.c | 2 +- src/video/wayland/SDL_waylandwindow.h | 2 +- src/video/windows/SDL_windowswindow.c | 15 +++++++++------ src/video/windows/SDL_windowswindow.h | 2 +- src/video/x11/SDL_x11window.c | 2 +- src/video/x11/SDL_x11window.h | 2 +- 14 files changed, 40 insertions(+), 22 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 549ed6626..eaed22a00 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -1440,6 +1440,15 @@ extern "C" { */ #define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" +/** + * \brief Controls the number of times a window flashes with SDL_FlashWindow() + * + * On Windows, if this variable is set, the SDL_FlashWindow() call will flash + * the specified number of times. Otherwise the window will flash until it + * becomes the foreground window. + */ +#define SDL_HINT_WINDOW_FLASH_COUNT "SDL_WINDOW_FLASH_COUNT" + /** * \brief Tell SDL not to name threads on Windows with the 0x406D1388 Exception. * The 0x406D1388 Exception is a trick used to inform Visual Studio of a diff --git a/include/SDL_video.h b/include/SDL_video.h index 159d6cb30..afced02c7 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -1510,14 +1510,11 @@ extern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window, /** * Request a window to demand attention from the user. * - * \param window the window to request the flashing for - * \param flash_count number of times the window gets flashed on systems that - * support flashing the window multiple times, like - * Windows, else it is ignored + * \param window the window to be flashed * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. */ -extern DECLSPEC int SDLCALL SDL_FlashWindow(SDL_Window * window, Uint32 flash_count); +extern DECLSPEC int SDLCALL SDL_FlashWindow(SDL_Window * window); /** * Destroy a window. diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index a1251e807..d6ff46353 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -876,6 +876,6 @@ SDL_DYNAPI_PROC(int,SDL_AndroidShowToast,(const char *a, int b, int c, int d, in SDL_DYNAPI_PROC(int,SDL_GetAudioDeviceSpec,(int a, int b, SDL_AudioSpec *c),(a,b,c),return) SDL_DYNAPI_PROC(void,SDL_TLSCleanup,(void),(),) SDL_DYNAPI_PROC(void,SDL_SetWindowAlwaysOnTop,(SDL_Window *a, SDL_bool b),(a,b),) -SDL_DYNAPI_PROC(int,SDL_FlashWindow,(SDL_Window *a, Uint32 b),(a, b),return) +SDL_DYNAPI_PROC(int,SDL_FlashWindow,(SDL_Window *a),(a),return) SDL_DYNAPI_PROC(int,SDL_GameControllerSendEffect,(SDL_GameController *a, const void *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_JoystickSendEffect,(SDL_Joystick *a, const void *b, int c),(a,b,c),return) diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index 9ff04c520..94ec47c3e 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -1958,6 +1958,15 @@ SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done) SDL_free(text); } break; + case SDLK_f: + if (withControl) { + /* Ctrl-F flash the window */ + SDL_Window *window = SDL_GetWindowFromID(event->key.windowID); + if (window) { + SDL_FlashWindow(window); + } + } + break; case SDLK_g: if (withControl) { /* Ctrl-G toggle mouse grab */ diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 086166d24..50010a23f 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -240,7 +240,7 @@ struct SDL_VideoDevice int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects); void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window); void (*OnWindowEnter) (_THIS, SDL_Window * window); - int (*FlashWindow) (_THIS, SDL_Window * window, Uint32 flash_count); + int (*FlashWindow) (_THIS, SDL_Window * window); /* * * */ /* diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index d029f4673..49ebbc231 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2793,12 +2793,12 @@ SDL_GetGrabbedWindow(void) } int -SDL_FlashWindow(SDL_Window * window, Uint32 flash_count) +SDL_FlashWindow(SDL_Window * window) { CHECK_WINDOW_MAGIC(window, -1); if (_this->FlashWindow) { - return _this->FlashWindow(_this, window, flash_count); + return _this->FlashWindow(_this, window); } return SDL_Unsupported(); diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index 96f84f20f..ed53fecc2 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -151,7 +151,7 @@ extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window); extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info); extern int Cocoa_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); extern void Cocoa_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept); -extern int Cocoa_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count); +extern int Cocoa_FlashWindow(_THIS, SDL_Window * window); #endif /* SDL_cocoawindow_h_ */ diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 148e2fbb0..43aad092f 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -2117,7 +2117,7 @@ Cocoa_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept) } int -Cocoa_FlashWindow(_THIS, SDL_Window *window, Uint32 flash_count) +Cocoa_FlashWindow(_THIS, SDL_Window *window) { @autoreleasepool { /* Note that this is app-wide and not window-specific! */ diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index 0d51b2243..773cc461e 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -920,7 +920,7 @@ Wayland_RaiseWindow(_THIS, SDL_Window *window) } int -Wayland_FlashWindow(_THIS, SDL_Window *window, Uint32 flash_count) +Wayland_FlashWindow(_THIS, SDL_Window *window) { Wayland_activate_window(_this->driverdata, window->driverdata, diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h index 320fd3e51..873ea0270 100644 --- a/src/video/wayland/SDL_waylandwindow.h +++ b/src/video/wayland/SDL_waylandwindow.h @@ -113,7 +113,7 @@ extern void Wayland_SuspendScreenSaver(_THIS); extern SDL_bool Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); -extern int Wayland_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count); +extern int Wayland_FlashWindow(_THIS, SDL_Window * window); extern void Wayland_HandlePendingResize(SDL_Window *window); diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 65dc0fceb..96eb67d0c 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -1064,17 +1064,20 @@ WIN_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept) } int -WIN_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count) +WIN_FlashWindow(_THIS, SDL_Window * window) { - HWND hwnd; FLASHWINFO desc; + const char *hint = SDL_GetHint(SDL_HINT_WINDOW_FLASH_COUNT); - hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; + SDL_zero(desc); desc.cbSize = sizeof(desc); - desc.hwnd = hwnd; + desc.hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; desc.dwFlags = FLASHW_TRAY; - desc.uCount = flash_count; /* flash x times */ - desc.dwTimeout = 0; + if (hint && *hint) { + desc.uCount = SDL_atoi(hint); + } else { + desc.dwFlags |= FLASHW_TIMERNOFG; + } FlashWindowEx(&desc); diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 1e8f3d318..335326a76 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -86,7 +86,7 @@ extern void WIN_OnWindowEnter(_THIS, SDL_Window * window); extern void WIN_UpdateClipCursor(SDL_Window *window); extern int WIN_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); extern void WIN_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept); -extern int WIN_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count); +extern int WIN_FlashWindow(_THIS, SDL_Window * window); #endif /* SDL_windowswindow_h_ */ diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index c4cdfc358..d041dd991 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -1749,7 +1749,7 @@ X11_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept) } int -X11_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count) +X11_FlashWindow(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; diff --git a/src/video/x11/SDL_x11window.h b/src/video/x11/SDL_x11window.h index 4e9764c43..ad465636d 100644 --- a/src/video/x11/SDL_x11window.h +++ b/src/video/x11/SDL_x11window.h @@ -107,7 +107,7 @@ extern SDL_bool X11_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info); extern int X11_SetWindowHitTest(SDL_Window *window, SDL_bool enabled); extern void X11_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept); -extern int X11_FlashWindow(_THIS, SDL_Window * window, Uint32 flash_count); +extern int X11_FlashWindow(_THIS, SDL_Window * window); #endif /* SDL_x11window_h_ */