From e1c3a25034663ccb13cc771671f1298f7306fa99 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 549ed66261..eaed22a008 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 159d6cb30f..afced02c79 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 a1251e807a..d6ff463532 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 9ff04c5208..94ec47c3e7 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 086166d243..50010a23fc 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 d029f46731..49ebbc231e 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 96f84f20f9..ed53fecc26 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 148e2fbb0b..43aad092f7 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -2117,7 +2117,7 @@ take effect properly (e.g. setting the window size, etc.)
}
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 0d51b2243d..773cc461ed 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 320fd3e514..873ea02707 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 65dc0fceb7..96eb67d0c2 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 1e8f3d3181..335326a767 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 c4cdfc358f..d041dd991a 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 4e9764c43e..ad465636d6 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_ */