From b116857102a94daaaba35829d5bf3093f4faab02 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Sat, 19 Oct 2024 13:41:34 -0300 Subject: [PATCH] add love.exposed and love.occluded event callbacks. Add love.window.isOccluded. Resolves #2004. --- src/modules/event/sdl/Event.cpp | 10 ++++++++-- src/modules/love/callbacks.lua | 6 ++++++ src/modules/window/Window.h | 1 + src/modules/window/sdl/Window.cpp | 5 +++++ src/modules/window/sdl/Window.h | 1 + src/modules/window/wrap_Window.cpp | 7 +++++++ testing/tests/window.lua | 8 +++++++- 7 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/modules/event/sdl/Event.cpp b/src/modules/event/sdl/Event.cpp index 9afcf0bda..869c10670 100644 --- a/src/modules/event/sdl/Event.cpp +++ b/src/modules/event/sdl/Event.cpp @@ -360,9 +360,7 @@ Message *Event::convert(const SDL_Event &e) case SDL_EVENT_GAMEPAD_BUTTON_DOWN: case SDL_EVENT_GAMEPAD_BUTTON_UP: case SDL_EVENT_GAMEPAD_AXIS_MOTION: -#if defined(LOVE_ENABLE_SENSOR) case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: -#endif msg = convertJoystickEvent(e); break; case SDL_EVENT_WINDOW_FOCUS_GAINED: @@ -375,6 +373,8 @@ Message *Event::convert(const SDL_Event &e) case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: case SDL_EVENT_WINDOW_MINIMIZED: case SDL_EVENT_WINDOW_RESTORED: + case SDL_EVENT_WINDOW_EXPOSED: + case SDL_EVENT_WINDOW_OCCLUDED: msg = convertWindowEvent(e); break; case SDL_EVENT_DISPLAY_ORIENTATION: @@ -680,6 +680,12 @@ Message *Event::convertWindowEvent(const SDL_Event &e) vargs.emplace_back(event == SDL_EVENT_WINDOW_SHOWN || event == SDL_EVENT_WINDOW_RESTORED); msg = new Message("visible", vargs); break; + case SDL_EVENT_WINDOW_EXPOSED: + msg = new Message("exposed"); + break; + case SDL_EVENT_WINDOW_OCCLUDED: + msg = new Message("occluded"); + break; case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: { double width = e.window.data1; diff --git a/src/modules/love/callbacks.lua b/src/modules/love/callbacks.lua index 98d7afad5..cc5197378 100644 --- a/src/modules/love/callbacks.lua +++ b/src/modules/love/callbacks.lua @@ -100,6 +100,12 @@ function love.createhandlers() visible = function (v) if love.visible then return love.visible(v) end end, + exposed = function () + if love.exposed then return love.exposed() end + end, + occluded = function () + if love.occluded then return love.occluded() end + end, quit = function () return end, diff --git a/src/modules/window/Window.h b/src/modules/window/Window.h index cae80beab..4c4f159a7 100644 --- a/src/modules/window/Window.h +++ b/src/modules/window/Window.h @@ -187,6 +187,7 @@ class Window : public Module virtual bool hasMouseFocus() const = 0; virtual bool isVisible() const = 0; + virtual bool isOccluded() const = 0; virtual void setMouseGrab(bool grab) = 0; virtual bool isMouseGrabbed() const = 0; diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index 890be0bca..749d89878 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/src/modules/window/sdl/Window.cpp @@ -1298,6 +1298,11 @@ bool Window::isVisible() const return window && (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN | SDL_WINDOW_MINIMIZED)) == 0; } +bool Window::isOccluded() const +{ + return window && (SDL_GetWindowFlags(window) & SDL_WINDOW_OCCLUDED) != 0; +} + void Window::setMouseGrab(bool grab) { mouseGrabbed = grab; diff --git a/src/modules/window/sdl/Window.h b/src/modules/window/sdl/Window.h index e8caa1dfe..adb804667 100644 --- a/src/modules/window/sdl/Window.h +++ b/src/modules/window/sdl/Window.h @@ -98,6 +98,7 @@ class Window final : public love::window::Window bool hasMouseFocus() const override; bool isVisible() const override; + bool isOccluded() const override; void setMouseGrab(bool grab) override; bool isMouseGrabbed() const override; diff --git a/src/modules/window/wrap_Window.cpp b/src/modules/window/wrap_Window.cpp index 19efd9991..a1777689a 100644 --- a/src/modules/window/wrap_Window.cpp +++ b/src/modules/window/wrap_Window.cpp @@ -486,6 +486,12 @@ int w_isVisible(lua_State *L) return 1; } +int w_isOccluded(lua_State *L) +{ + luax_pushboolean(L, instance()->isOccluded()); + return 1; +} + int w_getDPIScale(lua_State *L) { lua_pushnumber(L, instance()->getDPIScale()); @@ -683,6 +689,7 @@ static const luaL_Reg functions[] = { "hasFocus", w_hasFocus }, { "hasMouseFocus", w_hasMouseFocus }, { "isVisible", w_isVisible }, + { "isOccluded", w_isOccluded }, { "getDPIScale", w_getDPIScale }, { "getNativeDPIScale", w_getNativeDPIScale }, { "toPixels", w_toPixels }, diff --git a/testing/tests/window.lua b/testing/tests/window.lua index 01aac2f61..c163611c6 100644 --- a/testing/tests/window.lua +++ b/testing/tests/window.lua @@ -198,6 +198,13 @@ love.test.window.isMinimized = function(test) end +-- love.window.isOccluded +love.test.window.isOccluded = function(test) + love.window.focus() + test:assertFalse(love.window.isOccluded(), 'check window not occluded') +end + + -- love.window.isOpen love.test.window.isOpen = function(test) -- check open initially @@ -210,7 +217,6 @@ end love.test.window.isVisible = function(test) -- check visible initially test:assertTrue(love.window.isVisible(), 'check window visible') - -- we check closing in test.window.close end