From df7639f1006ae58da6ec197b79ad5aa57b73402d Mon Sep 17 00:00:00 2001 From: Sam Lantinga 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 be5373e2f2..1939bbfc62 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 cb8e573ba5..12d0f5c435 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 3f2e2f5263..db4824e02b 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) { /*