Browse Source

add love.exposed and love.occluded event callbacks.

Add love.window.isOccluded.

Resolves #2004.
Sasha Szpakowski 10 months ago
parent
commit
b116857102

+ 8 - 2
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;

+ 6 - 0
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,

+ 1 - 0
src/modules/window/Window.h

@@ -187,6 +187,7 @@ public:
 	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;

+ 5 - 0
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;

+ 1 - 0
src/modules/window/sdl/Window.h

@@ -98,6 +98,7 @@ public:
 	bool hasMouseFocus() const override;
 
 	bool isVisible() const override;
+	bool isOccluded() const override;
 
 	void setMouseGrab(bool grab) override;
 	bool isMouseGrabbed() const override;

+ 7 - 0
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 },

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