1
0
Эх сурвалжийг харах

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

Sam Lantinga 3 жил өмнө
parent
commit
e1c3a25034

+ 9 - 0
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

+ 2 - 5
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.

+ 1 - 1
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)

+ 9 - 0
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 */

+ 1 - 1
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);
 
     /* * * */
     /*

+ 2 - 2
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();

+ 1 - 1
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_ */
 

+ 1 - 1
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! */

+ 1 - 1
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,

+ 1 - 1
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);
 

+ 9 - 6
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);
 

+ 1 - 1
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_ */
 

+ 1 - 1
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;

+ 1 - 1
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_ */