Jelajahi Sumber

Only allow modal draws (live-resize callbacks) inside love.event.pump.

Fixes #2186.
Sasha Szpakowski 2 bulan lalu
induk
melakukan
273daf3c0f
2 mengubah file dengan 25 tambahan dan 19 penghapusan
  1. 23 19
      src/modules/event/sdl/Event.cpp
  2. 2 0
      src/modules/event/sdl/Event.h

+ 23 - 19
src/modules/event/sdl/Event.cpp

@@ -98,14 +98,14 @@ static bool SDLCALL watchAppEvents(void *udata, SDL_Event *event)
 		}
 		}
 		break;
 		break;
 	case SDL_EVENT_WINDOW_EXPOSED:
 	case SDL_EVENT_WINDOW_EXPOSED:
-		if (eventModule != nullptr && SDL_IsMainThread())
+		if (eventModule != nullptr && SDL_IsMainThread() && eventModule->allowModalDraws())
 			eventModule->modalDraw();
 			eventModule->modalDraw();
 		break;
 		break;
 	default:
 	default:
 		break;
 		break;
 	}
 	}
 
 
-	return 1;
+	return true;
 }
 }
 
 
 Event::Event()
 Event::Event()
@@ -143,31 +143,30 @@ void Event::pump(float waitTimeout)
 		else if (waitTimeout > 0.0f)
 		else if (waitTimeout > 0.0f)
 			waitTimeoutMS = (int)std::min<int64>(LOVE_INT32_MAX, 1000LL * waitTimeout);
 			waitTimeoutMS = (int)std::min<int64>(LOVE_INT32_MAX, 1000LL * waitTimeout);
 
 
+		// Wait for the first event, if requested. WaitEvent also calls PumpEvents.
+		SDL_Event e = {};
+		insideEventPump = true;
+		bool success = false;
 		try
 		try
 		{
 		{
-			// Wait for the first event, if requested.
-			SDL_Event e;
-			insideEventPump = true;
-			if (SDL_WaitEventTimeout(&e, waitTimeoutMS))
-			{
-				insideEventPump = false;
-				StrongRef<Message> msg(convert(e), Acquire::NORETAIN);
-				if (msg)
-					push(msg);
-
-				// Fetch any extra events that came in during WaitEvent.
-				shouldPoll = true;
-			}
-			else
-			{
-				insideEventPump = false;
-			}
+			success = SDL_WaitEventTimeout(&e, waitTimeoutMS);
 		}
 		}
 		catch (std::exception &)
 		catch (std::exception &)
 		{
 		{
 			insideEventPump = false;
 			insideEventPump = false;
 			throw;
 			throw;
 		}
 		}
+		insideEventPump = false;
+
+		if (success)
+		{
+			StrongRef<Message> msg(convert(e), Acquire::NORETAIN);
+			if (msg)
+				push(msg);
+
+			// Fetch any extra events that came in during WaitEvent.
+			shouldPoll = true;
+		}
 	}
 	}
 
 
 	if (shouldPoll)
 	if (shouldPoll)
@@ -208,6 +207,11 @@ void Event::clear()
 	love::event::Event::clear();
 	love::event::Event::clear();
 }
 }
 
 
+bool Event::allowModalDraws() const
+{
+	return insideEventPump;
+}
+
 void Event::exceptionIfInRenderPass(const char *name)
 void Event::exceptionIfInRenderPass(const char *name)
 {
 {
 	// Some core OS graphics functionality (e.g. swap buffers on some platforms)
 	// Some core OS graphics functionality (e.g. swap buffers on some platforms)

+ 2 - 0
src/modules/event/sdl/Event.h

@@ -62,6 +62,8 @@ public:
 	 */
 	 */
 	void clear() override;
 	void clear() override;
 
 
+	bool allowModalDraws() const;
+
 private:
 private:
 
 
 	void exceptionIfInRenderPass(const char *name);
 	void exceptionIfInRenderPass(const char *name);