From aebf139dc7de2d29dfe7f96a2431ddde2a672943 Mon Sep 17 00:00:00 2001 From: Josh Tynjala Date: Tue, 6 Jun 2023 10:53:45 -0700 Subject: [PATCH] Fix window show/hide on desktop being incorrectly considered the same as app going into and out of the background/suspend on mobile The app's Timers should still continue when a window is hidden. Especially since an app could have multiple windows, with some being shown and some being hidden. If only one were hidden, the other shown windows would clearly behave in a broken manner because the one hidden window would cause all app timers, even those associated with other windows, to be paused. Introduces new WINDOW_SHOW AND WINDOW_HIDE events from C++ to Haxe, and new onShow and onHide events on Haxe Window. Followup to 0918ee2381b3faf7167d510383e5d97747ee017c --- project/include/ui/WindowEvent.h | 2 ++ project/src/backend/sdl/SDLApplication.cpp | 18 ++---------------- .../backend/native/NativeApplication.hx | 8 ++++++++ src/lime/ui/Window.hx | 2 ++ 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/project/include/ui/WindowEvent.h b/project/include/ui/WindowEvent.h index 373960ef3..8980e62de 100644 --- a/project/include/ui/WindowEvent.h +++ b/project/include/ui/WindowEvent.h @@ -25,6 +25,8 @@ namespace lime { WINDOW_MOVE, WINDOW_RESIZE, WINDOW_RESTORE, + WINDOW_SHOW, + WINDOW_HIDE }; diff --git a/project/src/backend/sdl/SDLApplication.cpp b/project/src/backend/sdl/SDLApplication.cpp index 7e6014ffa..d7f751e2b 100644 --- a/project/src/backend/sdl/SDLApplication.cpp +++ b/project/src/backend/sdl/SDLApplication.cpp @@ -764,14 +764,9 @@ namespace lime { switch (event->window.event) { - case SDL_WINDOWEVENT_SHOWN: windowEvent.type = WINDOW_ACTIVATE; break; + case SDL_WINDOWEVENT_SHOWN: windowEvent.type = WINDOW_SHOW; break; case SDL_WINDOWEVENT_CLOSE: windowEvent.type = WINDOW_CLOSE; break; - case SDL_WINDOWEVENT_HIDDEN: - - inBackground = true; - windowEvent.type = WINDOW_DEACTIVATE; - break; - + case SDL_WINDOWEVENT_HIDDEN: windowEvent.type = WINDOW_HIDE; break; case SDL_WINDOWEVENT_ENTER: windowEvent.type = WINDOW_ENTER; break; case SDL_WINDOWEVENT_FOCUS_GAINED: windowEvent.type = WINDOW_FOCUS_IN; break; case SDL_WINDOWEVENT_FOCUS_LOST: windowEvent.type = WINDOW_FOCUS_OUT; break; @@ -801,15 +796,6 @@ namespace lime { windowEvent.windowID = event->window.windowID; WindowEvent::Dispatch (&windowEvent); - switch (event->window.event) { - - case SDL_WINDOWEVENT_SHOWN: - - inBackground = false; - break; - - } - } } diff --git a/src/lime/_internal/backend/native/NativeApplication.hx b/src/lime/_internal/backend/native/NativeApplication.hx index 549873fc3..3f4fa50f5 100644 --- a/src/lime/_internal/backend/native/NativeApplication.hx +++ b/src/lime/_internal/backend/native/NativeApplication.hx @@ -561,6 +561,12 @@ class NativeApplication window.__fullscreen = false; window.__minimized = false; window.onRestore.dispatch(); + + case WINDOW_SHOW: + window.onShow.dispatch(); + + case WINDOW_HIDE: + window.onHide.dispatch(); } } } @@ -967,4 +973,6 @@ class NativeApplication var WINDOW_MOVE = 10; var WINDOW_RESIZE = 11; var WINDOW_RESTORE = 12; + var WINDOW_SHOW = 13; + var WINDOW_HIDE = 14; } diff --git a/src/lime/ui/Window.hx b/src/lime/ui/Window.hx index 1cdc8dd73..3f6f7a10d 100644 --- a/src/lime/ui/Window.hx +++ b/src/lime/ui/Window.hx @@ -62,6 +62,7 @@ class Window public var onFocusIn(default, null) = new EventVoid>(); public var onFocusOut(default, null) = new EventVoid>(); public var onFullscreen(default, null) = new EventVoid>(); + public var onHide(default, null) = new EventVoid>(); public var onKeyDown(default, null) = new EventKeyModifier->Void>(); public var onKeyUp(default, null) = new EventKeyModifier->Void>(); public var onLeave(default, null) = new EventVoid>(); @@ -78,6 +79,7 @@ class Window public var onRenderContextRestored(default, null) = new EventVoid>(); public var onResize(default, null) = new EventInt->Void>(); public var onRestore(default, null) = new EventVoid>(); + public var onShow(default, null) = new EventVoid>(); public var onTextEdit(default, null) = new EventInt->Int->Void>(); public var onTextInput(default, null) = new EventVoid>(); public var parameters:Dynamic;