From df7639f1006ae58da6ec197b79ad5aa57b73402d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 28 Jan 2023 15:27:20 -0800
Subject: [PATCH] Call SDL_OnWindow* handlers after the event has been
delivered
This guarantees that events which trigger other events will happen in dependency order, instead of being reversed.
---
src/events/SDL_windowevents.c | 56 +++++++++++++++++++++++++++--------
src/video/SDL_sysvideo.h | 1 +
src/video/SDL_video.c | 4 +++
3 files changed, 49 insertions(+), 12 deletions(-)
diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c
index be5373e2f2f8..1939bbfc62e0 100644
--- a/src/events/SDL_windowevents.c
+++ b/src/events/SDL_windowevents.c
@@ -55,14 +55,12 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
return 0;
}
window->flags &= ~(SDL_WINDOW_HIDDEN | SDL_WINDOW_MINIMIZED);
- SDL_OnWindowShown(window);
break;
case SDL_EVENT_WINDOW_HIDDEN:
if (window->flags & SDL_WINDOW_HIDDEN) {
return 0;
}
window->flags |= SDL_WINDOW_HIDDEN;
- SDL_OnWindowHidden(window);
break;
case SDL_EVENT_WINDOW_MOVED:
if (SDL_WINDOWPOS_ISUNDEFINED(data1) ||
@@ -78,7 +76,6 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
}
window->x = data1;
window->y = data2;
- SDL_OnWindowMoved(window);
break;
case SDL_EVENT_WINDOW_RESIZED:
if ((window->flags & SDL_WINDOW_FULLSCREEN_MASK) == 0) {
@@ -91,7 +88,6 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
}
window->w = data1;
window->h = data2;
- SDL_OnWindowResized(window);
break;
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
if (data1 == window->last_pixel_w && data2 == window->last_pixel_h) {
@@ -99,7 +95,6 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
}
window->last_pixel_w = data1;
window->last_pixel_h = data2;
- SDL_OnWindowPixelSizeChanged(window);
break;
case SDL_EVENT_WINDOW_MINIMIZED:
if (window->flags & SDL_WINDOW_MINIMIZED) {
@@ -107,7 +102,6 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
}
window->flags &= ~SDL_WINDOW_MAXIMIZED;
window->flags |= SDL_WINDOW_MINIMIZED;
- SDL_OnWindowMinimized(window);
break;
case SDL_EVENT_WINDOW_MAXIMIZED:
if (window->flags & SDL_WINDOW_MAXIMIZED) {
@@ -121,42 +115,36 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
return 0;
}
window->flags &= ~(SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED);
- SDL_OnWindowRestored(window);
break;
case SDL_EVENT_WINDOW_MOUSE_ENTER:
if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
return 0;
}
window->flags |= SDL_WINDOW_MOUSE_FOCUS;
- SDL_OnWindowEnter(window);
break;
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
return 0;
}
window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
- SDL_OnWindowLeave(window);
break;
case SDL_EVENT_WINDOW_FOCUS_GAINED:
if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
return 0;
}
window->flags |= SDL_WINDOW_INPUT_FOCUS;
- SDL_OnWindowFocusGained(window);
break;
case SDL_EVENT_WINDOW_FOCUS_LOST:
if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
return 0;
}
window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
- SDL_OnWindowFocusLost(window);
break;
case SDL_EVENT_WINDOW_DISPLAY_CHANGED:
if (data1 < 0 || data1 == window->display_index) {
return 0;
}
window->display_index = data1;
- SDL_OnWindowDisplayChanged(window);
break;
default:
break;
@@ -182,6 +170,50 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
posted = (SDL_PushEvent(&event) > 0);
}
+ switch (windowevent) {
+ case SDL_EVENT_WINDOW_SHOWN:
+ SDL_OnWindowShown(window);
+ break;
+ case SDL_EVENT_WINDOW_HIDDEN:
+ SDL_OnWindowHidden(window);
+ break;
+ case SDL_EVENT_WINDOW_MOVED:
+ SDL_OnWindowMoved(window);
+ break;
+ case SDL_EVENT_WINDOW_RESIZED:
+ SDL_OnWindowResized(window);
+ break;
+ case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
+ SDL_OnWindowPixelSizeChanged(window);
+ break;
+ case SDL_EVENT_WINDOW_MINIMIZED:
+ SDL_OnWindowMinimized(window);
+ break;
+ case SDL_EVENT_WINDOW_MAXIMIZED:
+ SDL_OnWindowMaximized(window);
+ break;
+ case SDL_EVENT_WINDOW_RESTORED:
+ SDL_OnWindowRestored(window);
+ break;
+ case SDL_EVENT_WINDOW_MOUSE_ENTER:
+ SDL_OnWindowEnter(window);
+ break;
+ case SDL_EVENT_WINDOW_MOUSE_LEAVE:
+ SDL_OnWindowLeave(window);
+ break;
+ case SDL_EVENT_WINDOW_FOCUS_GAINED:
+ SDL_OnWindowFocusGained(window);
+ break;
+ case SDL_EVENT_WINDOW_FOCUS_LOST:
+ SDL_OnWindowFocusLost(window);
+ break;
+ case SDL_EVENT_WINDOW_DISPLAY_CHANGED:
+ SDL_OnWindowDisplayChanged(window);
+ break;
+ default:
+ break;
+ }
+
if (windowevent == SDL_EVENT_WINDOW_CLOSE_REQUESTED) {
if (!window->prev && !window->next) {
if (SDL_GetHintBoolean(SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE, SDL_TRUE)) {
diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h
index cb8e573ba57a..12d0f5c43573 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -502,6 +502,7 @@ extern void SDL_OnWindowResized(SDL_Window *window);
extern void SDL_CheckWindowPixelSizeChanged(SDL_Window *window);
extern void SDL_OnWindowPixelSizeChanged(SDL_Window *window);
extern void SDL_OnWindowMinimized(SDL_Window *window);
+extern void SDL_OnWindowMaximized(SDL_Window *window);
extern void SDL_OnWindowRestored(SDL_Window *window);
extern void SDL_OnWindowEnter(SDL_Window *window);
extern void SDL_OnWindowLeave(SDL_Window *window);
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 3f2e2f526332..db4824e02bda 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -3079,6 +3079,10 @@ void SDL_OnWindowMinimized(SDL_Window *window)
}
}
+void SDL_OnWindowMaximized(SDL_Window *window)
+{
+}
+
void SDL_OnWindowRestored(SDL_Window *window)
{
/*