diff --git a/docs/README-migration.md b/docs/README-migration.md index ad4c1d38e..39079543b 100644 --- a/docs/README-migration.md +++ b/docs/README-migration.md @@ -124,6 +124,10 @@ The SDL_DISPLAYEVENT_* events have been moved to top level events, and SDL_DISPL The SDL_WINDOWEVENT_* events have been moved to top level events, and SDL_WINDOWEVENT has been removed. In general, handling this change just means checking for the individual events instead of first checking for SDL_WINDOWEVENT and then checking for window events. You can compare the event >= SDL_EVENT_WINDOW_FIRST and <= SDL_EVENT_WINDOW_LAST if you need to see whether it's a window event. +The SDL_EVENT_WINDOW_RESIZED event is always sent, even in response to SDL_SetWindowSize(). + +The SDL_EVENT_WINDOW_SIZE_CHANGED event has been removed, and you can use SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED to detect window backbuffer size changes. + SDL_QUERY, SDL_IGNORE, SDL_ENABLE, and SDL_DISABLE have been removed. You can use the functions SDL_SetEventEnabled() and SDL_EventEnabled() to set and query event processing state. The following symbols have been renamed: diff --git a/include/SDL3/SDL_events.h b/include/SDL3/SDL_events.h index b719417fa..ff5078901 100644 --- a/include/SDL3/SDL_events.h +++ b/include/SDL3/SDL_events.h @@ -98,32 +98,28 @@ typedef enum /* Window events */ /* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */ - SDL_EVENT_SYSWM = 0x201, /**< System specific event */ - SDL_EVENT_WINDOW_SHOWN, /**< Window has been shown */ - SDL_EVENT_WINDOW_HIDDEN, /**< Window has been hidden */ - SDL_EVENT_WINDOW_EXPOSED, /**< Window has been exposed and should be - redrawn */ - SDL_EVENT_WINDOW_MOVED, /**< Window has been moved to data1, data2 - */ - SDL_EVENT_WINDOW_RESIZED, /**< Window has been resized to data1xdata2 */ - SDL_EVENT_WINDOW_SIZE_CHANGED, /**< The window size has changed, either as - a result of an API call or through the - system or user changing the window size. */ - SDL_EVENT_WINDOW_MINIMIZED, /**< Window has been minimized */ - SDL_EVENT_WINDOW_MAXIMIZED, /**< Window has been maximized */ - SDL_EVENT_WINDOW_RESTORED, /**< Window has been restored to normal size - and position */ - SDL_EVENT_WINDOW_MOUSE_ENTER, /**< Window has gained mouse focus */ - SDL_EVENT_WINDOW_MOUSE_LEAVE, /**< Window has lost mouse focus */ - SDL_EVENT_WINDOW_FOCUS_GAINED, /**< Window has gained keyboard focus */ - SDL_EVENT_WINDOW_FOCUS_LOST, /**< Window has lost keyboard focus */ - SDL_EVENT_WINDOW_CLOSE_REQUESTED, /**< The window manager requests that the window be closed */ - SDL_EVENT_WINDOW_TAKE_FOCUS, /**< Window is being offered a focus (should SetWindowInputFocus() on itself or a subwindow, or ignore) */ - SDL_EVENT_WINDOW_HIT_TEST, /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL. */ - SDL_EVENT_WINDOW_ICCPROF_CHANGED,/**< The ICC profile of the window's display has changed. */ - SDL_EVENT_WINDOW_DISPLAY_CHANGED,/**< Window has been moved to display data1. */ + SDL_EVENT_SYSWM = 0x201, /**< System specific event */ + SDL_EVENT_WINDOW_SHOWN, /**< Window has been shown */ + SDL_EVENT_WINDOW_HIDDEN, /**< Window has been hidden */ + SDL_EVENT_WINDOW_EXPOSED, /**< Window has been exposed and should be redrawn */ + SDL_EVENT_WINDOW_MOVED, /**< Window has been moved to data1, data2 */ + SDL_EVENT_WINDOW_RESIZED, /**< Window has been resized to data1xdata2 */ + /* 0x207 was SDL_EVENT_WINDOW_SIZE_CHANGED, reserve the number for sdl2-compat */ + SDL_EVENT_WINDOW_MINIMIZED = 0x208, /**< Window has been minimized */ + SDL_EVENT_WINDOW_MAXIMIZED, /**< Window has been maximized */ + SDL_EVENT_WINDOW_RESTORED, /**< Window has been restored to normal size and position */ + SDL_EVENT_WINDOW_MOUSE_ENTER, /**< Window has gained mouse focus */ + SDL_EVENT_WINDOW_MOUSE_LEAVE, /**< Window has lost mouse focus */ + SDL_EVENT_WINDOW_FOCUS_GAINED, /**< Window has gained keyboard focus */ + SDL_EVENT_WINDOW_FOCUS_LOST, /**< Window has lost keyboard focus */ + SDL_EVENT_WINDOW_CLOSE_REQUESTED, /**< The window manager requests that the window be closed */ + SDL_EVENT_WINDOW_TAKE_FOCUS, /**< Window is being offered a focus (should SetWindowInputFocus() on itself or a subwindow, or ignore) */ + SDL_EVENT_WINDOW_HIT_TEST, /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL */ + SDL_EVENT_WINDOW_ICCPROF_CHANGED, /**< The ICC profile of the window's display has changed */ + SDL_EVENT_WINDOW_DISPLAY_CHANGED, /**< Window has been moved to display data1 */ + SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,/**< The pixel size of the window has changed to data1xdata2 */ SDL_EVENT_WINDOW_FIRST = SDL_EVENT_WINDOW_SHOWN, - SDL_EVENT_WINDOW_LAST = SDL_EVENT_WINDOW_DISPLAY_CHANGED, + SDL_EVENT_WINDOW_LAST = SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, /* Keyboard events */ SDL_EVENT_KEY_DOWN = 0x300, /**< Key pressed */ diff --git a/src/core/winrt/SDL_winrtapp_direct3d.cpp b/src/core/winrt/SDL_winrtapp_direct3d.cpp index 15e21d787..9c450d345 100644 --- a/src/core/winrt/SDL_winrtapp_direct3d.cpp +++ b/src/core/winrt/SDL_winrtapp_direct3d.cpp @@ -237,7 +237,7 @@ void SDL_WinRTApp::OnOrientationChanged(Object ^ sender) SDL_WindowData *data = (SDL_WindowData *)window->driverdata; int w = (int)SDL_floorf(data->coreWindow->Bounds.Width); int h = (int)SDL_floorf(data->coreWindow->Bounds.Height); - SDL_SendWindowEvent(WINRT_GlobalSDLWindow, SDL_EVENT_WINDOW_SIZE_CHANGED, w, h); + SDL_SendWindowEvent(WINRT_GlobalSDLWindow, SDL_EVENT_WINDOW_RESIZED, w, h); } #endif } diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 0584d5e28..74b332599 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -236,7 +236,6 @@ static void SDL_LogEvent(const SDL_Event *event) SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_EXPOSED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_MOVED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_RESIZED); - SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_SIZE_CHANGED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_MINIMIZED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_MAXIMIZED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_RESTORED); @@ -249,6 +248,7 @@ static void SDL_LogEvent(const SDL_Event *event) SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_HIT_TEST); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_ICCPROF_CHANGED); SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_DISPLAY_CHANGED); + SDL_WINDOWEVENT_CASE(SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED); #undef SDL_WINDOWEVENT_CASE SDL_EVENT_CASE(SDL_EVENT_SYSWM) diff --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index d6adace54..d50e75e96 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -25,36 +25,12 @@ #include "SDL_events_c.h" #include "SDL_mouse_c.h" -typedef struct RemovePendingSizeChangedAndResizedEvents_Data -{ - const SDL_Event *new_event; - SDL_bool saw_resized; -} RemovePendingSizeChangedAndResizedEvents_Data; -static int SDLCALL RemovePendingSizeChangedAndResizedEvents(void *_userdata, SDL_Event *event) -{ - RemovePendingSizeChangedAndResizedEvents_Data *userdata = (RemovePendingSizeChangedAndResizedEvents_Data *)_userdata; - const SDL_Event *new_event = userdata->new_event; - - if ((event->type == SDL_EVENT_WINDOW_SIZE_CHANGED || - event->type == SDL_EVENT_WINDOW_RESIZED) && - event->window.windowID == new_event->window.windowID) { - - if (event->type == SDL_EVENT_WINDOW_RESIZED) { - userdata->saw_resized = SDL_TRUE; - } - - /* We're about to post a new size event, drop the old one */ - return 0; - } - return 1; -} - -static int SDLCALL RemovePendingMoveEvents(void *userdata, SDL_Event *event) +static int SDLCALL RemoveSupercededWindowEvents(void *userdata, SDL_Event *event) { SDL_Event *new_event = (SDL_Event *)userdata; - if (event->type == SDL_EVENT_WINDOW_MOVED && + if (event->type == new_event->type && event->window.windowID == new_event->window.windowID) { /* We're about to post a new move event, drop the old one */ return 0; @@ -62,18 +38,6 @@ static int SDLCALL RemovePendingMoveEvents(void *userdata, SDL_Event *event) return 1; } -static int SDLCALL RemovePendingExposedEvents(void *userdata, SDL_Event *event) -{ - SDL_Event *new_event = (SDL_Event *)userdata; - - if (event->type == SDL_EVENT_WINDOW_EXPOSED && - event->window.windowID == new_event->window.windowID) { - /* We're about to post a new exposed event, drop the old one */ - return 0; - } - return 1; -} - int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data1, int data2) { @@ -119,12 +83,21 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, window->windowed.h = data2; } if (data1 == window->w && data2 == window->h) { + SDL_CheckWindowPixelSizeChanged(window); return 0; } 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) { + return 0; + } + 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) { return 0; @@ -176,7 +149,10 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, SDL_OnWindowFocusLost(window); break; case SDL_EVENT_WINDOW_DISPLAY_CHANGED: - SDL_assert(data1 == window->display_index); + if (data1 < 0 || data1 == window->display_index) { + return 0; + } + window->display_index = data1; SDL_OnWindowDisplayChanged(window); break; default: @@ -193,26 +169,12 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, event.window.data2 = data2; event.window.windowID = window->id; - /* Fixes queue overflow with resize events that aren't processed */ - if (windowevent == SDL_EVENT_WINDOW_SIZE_CHANGED) { - /* !!! FIXME: in SDL3, let's make RESIZED/SIZE_CHANGED into one event with a flag to distinguish between them, and remove all this tapdancing. */ - RemovePendingSizeChangedAndResizedEvents_Data userdata; - userdata.new_event = &event; - userdata.saw_resized = SDL_FALSE; - SDL_FilterEvents(RemovePendingSizeChangedAndResizedEvents, &userdata); - if (userdata.saw_resized) { /* if there was a pending resize, make sure one at the new dimensions remains. */ - event.type = SDL_EVENT_WINDOW_RESIZED; - if (SDL_PushEvent(&event) <= 0) { - return 0; /* oh well. */ - } - event.type = SDL_EVENT_WINDOW_SIZE_CHANGED; /* then push the actual event next. */ - } - } - if (windowevent == SDL_EVENT_WINDOW_MOVED) { - SDL_FilterEvents(RemovePendingMoveEvents, &event); - } - if (windowevent == SDL_EVENT_WINDOW_EXPOSED) { - SDL_FilterEvents(RemovePendingExposedEvents, &event); + /* Fixes queue overflow with move/resize events that aren't processed */ + if (windowevent == SDL_EVENT_WINDOW_MOVED || + windowevent == SDL_EVENT_WINDOW_RESIZED || + windowevent == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED || + windowevent == SDL_EVENT_WINDOW_EXPOSED) { + SDL_FilterEvents(RemoveSupercededWindowEvents, &event); } posted = (SDL_PushEvent(&event) > 0); } diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index b53f23b09..c891f20f2 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -683,8 +683,8 @@ static int SDLCALL SDL_RendererEventWatch(void *userdata, SDL_Event *event) * window display changes as well! If the new display has a new DPI, * we need to update the viewport for the new window/drawable ratio. */ - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED || - event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_RESIZED || + event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { /* Make sure we're operating on the default render target */ SDL_Texture *saved_target = SDL_GetRenderTarget(renderer); if (saved_target) { diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 5d5ee4ed2..d5f7a71ff 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -331,7 +331,7 @@ static void D3D_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event { D3D_RenderData *data = (D3D_RenderData *)renderer->driverdata; - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { data->updateSize = SDL_TRUE; } } diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 275440e56..2e1121b96 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -1028,7 +1028,7 @@ void D3D11_Trim(SDL_Renderer *renderer) static void D3D11_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event) { - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { D3D11_UpdateForWindowSizeChange(renderer); } } diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 581dbae98..b681a7051 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -1376,7 +1376,7 @@ static HRESULT D3D12_UpdateForWindowSizeChange(SDL_Renderer *renderer) static void D3D12_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event) { - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { D3D12_UpdateForWindowSizeChange(renderer); } } diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 2dd36ac61..1b14ea34a 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -324,7 +324,7 @@ static void GL_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event) * changed behind our backs. x/y changes might seem weird but viewport * resets have been observed on macOS at minimum! */ - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED || + if (event->type == SDL_EVENT_WINDOW_RESIZED || event->type == SDL_EVENT_WINDOW_MOVED) { GL_RenderData *data = (GL_RenderData *)renderer->driverdata; data->drawstate.viewport_dirty = SDL_TRUE; diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index f65c2e5f5..fe9ad247f 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -69,7 +69,7 @@ static void SW_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event) { SW_RenderData *data = (SW_RenderData *)renderer->driverdata; - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { data->surface = NULL; data->window = NULL; } diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index 4b988f041..8a56e3d7a 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -1452,10 +1452,6 @@ static void SDLTest_PrintEvent(SDL_Event *event) SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " resized to %" SDL_PRIs32 "x%" SDL_PRIs32, event->window.windowID, event->window.data1, event->window.data2); break; - case SDL_EVENT_WINDOW_SIZE_CHANGED: - SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " changed size to %" SDL_PRIs32 "x%" SDL_PRIs32, - event->window.windowID, event->window.data1, event->window.data2); - break; case SDL_EVENT_WINDOW_MINIMIZED: SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " minimized", event->window.windowID); break; @@ -1495,6 +1491,10 @@ static void SDLTest_PrintEvent(SDL_Event *event) case SDL_EVENT_WINDOW_DISPLAY_CHANGED: SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " display changed to %" SDL_PRIs32 "", event->window.windowID, event->window.data1); break; + case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " changed pixel size to %" SDL_PRIs32 "x%" SDL_PRIs32, + event->window.windowID, event->window.data1, event->window.data2); + break; case SDL_EVENT_KEY_DOWN: SDL_Log("SDL EVENT: Keyboard: key pressed in window %" SDL_PRIu32 ": scancode 0x%08X = %s, keycode 0x%08" SDL_PRIX32 " = %s", event->key.windowID, diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index b76b6faef..cb8e573ba 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -76,6 +76,7 @@ struct SDL_Window int w, h; int min_w, min_h; int max_w, max_h; + int last_pixel_w, last_pixel_h; Uint32 flags; Uint32 last_fullscreen_flags; Uint32 display_index; @@ -498,6 +499,8 @@ extern void SDL_OnWindowShown(SDL_Window *window); extern void SDL_OnWindowHidden(SDL_Window *window); extern void SDL_OnWindowMoved(SDL_Window *window); 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_OnWindowRestored(SDL_Window *window); extern void SDL_OnWindowEnter(SDL_Window *window); diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 3dc6ca9d8..d23f0a668 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2311,7 +2311,6 @@ void SDL_SetWindowAlwaysOnTop(SDL_Window *window, SDL_bool on_top) } else { window->flags &= ~SDL_WINDOW_ALWAYS_ON_TOP; } - _this->SetWindowAlwaysOnTop(_this, window, (SDL_bool)want); } } @@ -2353,17 +2352,9 @@ void SDL_SetWindowSize(SDL_Window *window, int w, int h) SDL_UpdateFullscreenMode(window, SDL_TRUE); } } else { - int old_w = window->w; - int old_h = window->h; - window->w = w; - window->h = h; if (_this->SetWindowSize) { _this->SetWindowSize(_this, window); } - if (window->w != old_w || window->h != old_h) { - /* We didn't get a SDL_EVENT_WINDOW_RESIZED event (by design) */ - SDL_OnWindowResized(window); - } } } @@ -3006,20 +2997,33 @@ void SDL_OnWindowHidden(SDL_Window *window) SDL_UpdateFullscreenMode(window, SDL_FALSE); } +void SDL_CheckWindowDisplayChanged(SDL_Window *window) +{ + int display_index; + + if (window->is_destroying) { + return; + } + + display_index = SDL_GetWindowDisplayIndex(window); + SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_DISPLAY_CHANGED, display_index, 0); +} + void SDL_OnWindowDisplayChanged(SDL_Window *window) { if ((window->flags & SDL_WINDOW_FULLSCREEN_MASK) != 0) { - SDL_Rect rect; - if (SDL_WINDOW_FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_EXCLUSIVE) != 0) { window->last_fullscreen_flags = 0; if (SDL_UpdateFullscreenMode(window, SDL_TRUE) != 0) { /* Something went wrong and the window is no longer fullscreen. */ - window->flags &= ~SDL_WINDOW_FULLSCREEN_MASK; - return; + window->flags &= ~SDL_WINDOW_FULLSCREEN_EXCLUSIVE; } } + } + + if ((window->flags & SDL_WINDOW_FULLSCREEN_MASK) != 0) { + SDL_Rect rect; /* * If mode switching is being emulated, the display bounds don't necessarily reflect the @@ -3044,31 +3048,32 @@ void SDL_OnWindowDisplayChanged(SDL_Window *window) } } } -} -void SDL_OnWindowResized(SDL_Window *window) -{ - int display_index = SDL_GetWindowDisplayIndex(window); - window->surface_valid = SDL_FALSE; - - if (!window->is_destroying) { - SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_SIZE_CHANGED, window->w, window->h); - - if (display_index != window->display_index && display_index != -1) { - window->display_index = display_index; - SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_DISPLAY_CHANGED, window->display_index, 0); - } - } + SDL_CheckWindowPixelSizeChanged(window); } void SDL_OnWindowMoved(SDL_Window *window) { - int display_index = SDL_GetWindowDisplayIndex(window); + SDL_CheckWindowDisplayChanged(window); +} - if (!window->is_destroying && display_index != window->display_index && display_index != -1) { - window->display_index = display_index; - SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_DISPLAY_CHANGED, window->display_index, 0); - } +void SDL_OnWindowResized(SDL_Window *window) +{ + SDL_CheckWindowDisplayChanged(window); + SDL_CheckWindowPixelSizeChanged(window); +} + +void SDL_CheckWindowPixelSizeChanged(SDL_Window *window) +{ + int pixel_w = 0, pixel_h = 0; + + SDL_GetWindowSizeInPixels(window, &pixel_w, &pixel_h); + SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, pixel_w, pixel_h); +} + +void SDL_OnWindowPixelSizeChanged(SDL_Window *window) +{ + window->surface_valid = SDL_FALSE; } void SDL_OnWindowMinimized(SDL_Window *window) diff --git a/src/video/cocoa/SDL_cocoametalview.m b/src/video/cocoa/SDL_cocoametalview.m index eb4d5920d..841d6eb37 100644 --- a/src/video/cocoa/SDL_cocoametalview.m +++ b/src/video/cocoa/SDL_cocoametalview.m @@ -41,7 +41,7 @@ static int SDLCALL SDL_MetalViewEventWatch(void *userdata, SDL_Event *event) * events don't always happen in the same frame (for example when a * resizable window exits a fullscreen Space via the user pressing the OS * exit-space button). */ - if (event->type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { @autoreleasepool { SDL_cocoametalview *view = (__bridge SDL_cocoametalview *)userdata; if (view.sdlWindowID == event->window.windowID) { diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 0bdaf9b6b..8eac1acb8 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1652,16 +1652,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) /* Update the cached DPI value for this window */ data->scaling_dpi = newDPI; - /* Send a SDL_EVENT_WINDOW_SIZE_CHANGED saying that the client size (in dpi-scaled points) is unchanged. - Renderers need to get this to know that the framebuffer size changed. - - We clear the window size to force the event to be delivered, but what we really - want for SDL3 is a new event to notify that the DPI changed and then watch for - that in the renderer directly. - */ - data->window->w = 0; - data->window->h = 0; - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_SIZE_CHANGED, data->window->w, data->window->h); + SDL_CheckWindowPixelSizeChanged(data->window); } #ifdef HIGHDPI_DEBUG @@ -1725,9 +1716,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) /* Update the cached DPI value for this window */ data->scaling_dpi = newDPI; - /* Send a SDL_EVENT_WINDOW_SIZE_CHANGED saying that the client size (in dpi-scaled points) is unchanged. - Renderers need to get this to know that the framebuffer size changed. */ - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_SIZE_CHANGED, data->window->w, data->window->h); + SDL_CheckWindowPixelSizeChanged(data->window); } return 0; diff --git a/test/testdrawchessboard.c b/test/testdrawchessboard.c index a0aa0444e..daf078645 100644 --- a/test/testdrawchessboard.c +++ b/test/testdrawchessboard.c @@ -62,8 +62,8 @@ void loop() SDL_Event e; while (SDL_PollEvent(&e)) { - /* Re-create when window has been resized */ - if (e.type == SDL_EVENT_WINDOW_SIZE_CHANGED) { + /* Re-create when window surface has been resized */ + if (e.type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { SDL_DestroyRenderer(renderer);