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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 549ed66..eaed22a 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1441,6 +1441,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
* thread's name, but it tends to cause problems with other debuggers,
diff --git a/include/SDL_video.h b/include/SDL_video.h
index 159d6cb..afced02 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 a1251e8..d6ff463 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 9ff04c5..94ec47c 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 086166d..50010a2 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 d029f46..49ebbc2 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 96f84f2..ed53fec 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 148e2fb..43aad09 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 0d51b22..773cc46 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 320fd3e..873ea02 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 65dc0fc..96eb67d 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 1e8f3d3..335326a 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 c4cdfc3..d041dd9 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 4e9764c..ad46563 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_ */