From ea334cc19855200a15cc3ec9ef11714f30cfd5aa Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Sun, 7 Jun 2026 18:50:41 +0800 Subject: [PATCH 1/6] Don't send SDL_EVENT_WINDOW_EXPOSED(data1=0) when modal on Windows --- src/video/windows/SDL_windowsevents.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index d9b6520a9ab77..ba0bbd81a5679 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -2096,7 +2096,9 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } ValidateRect(hwnd, NULL); - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_EXPOSED, 0, 0); + if (!data->in_modal_loop) { + SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_EXPOSED, 0, 0); + } } } returnCode = 0; From fdf0a7beb578494d21601044578be3cf6918aace Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Tue, 9 Jun 2026 08:32:02 +0800 Subject: [PATCH 2/6] redraw at WM_EXITSIZEMOVE when not draw WM_PAINT in modal loop --- src/video/windows/SDL_windowsevents.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index ba0bbd81a5679..b03284e165e49 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1935,6 +1935,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara --data->in_modal_loop; if (data->in_modal_loop == 0) { KillTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks); + SDL_OnWindowLiveResizeUpdate(data->window); } } break; From 34079d113a31bc4bea868fe1a1ffc9c0b795f24d Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Thu, 11 Jun 2026 07:47:01 +0800 Subject: [PATCH 3/6] avoid resize window during modal loop --- src/video/windows/SDL_windowsevents.c | 5 +---- src/video/windows/SDL_windowswindow.c | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index b03284e165e49..d9b6520a9ab77 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1935,7 +1935,6 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara --data->in_modal_loop; if (data->in_modal_loop == 0) { KillTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks); - SDL_OnWindowLiveResizeUpdate(data->window); } } break; @@ -2097,9 +2096,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } ValidateRect(hwnd, NULL); - if (!data->in_modal_loop) { - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_EXPOSED, 0, 0); - } + SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_EXPOSED, 0, 0); } } returnCode = 0; diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index bf9c394457fab..fb50fa8f6d005 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -934,7 +934,7 @@ bool WIN_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window) void WIN_SetWindowSize(SDL_VideoDevice *_this, SDL_Window *window) { - if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED))) { + if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED)) && !window->internal->in_modal_loop) { WIN_SetWindowPositionInternal(window, window->internal->copybits_flag | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE, SDL_WINDOWRECT_PENDING); } else { // Can't resize the window From 0e307721f6964aac98774d38bad790969499af76 Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Thu, 11 Jun 2026 11:34:35 +0800 Subject: [PATCH 4/6] add in_sizemove_loop flag and not use in_modal_loop for the bug --- src/video/windows/SDL_windowsevents.c | 2 ++ src/video/windows/SDL_windowswindow.c | 2 +- src/video/windows/SDL_windowswindow.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index d9b6520a9ab77..ba2b97cdc8b81 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1884,6 +1884,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_ENTERSIZEMOVE: + data->in_sizemove_loop = true; case WM_ENTERMENULOOP: { if (g_WindowsMessageHook) { @@ -1930,6 +1931,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_EXITSIZEMOVE: + data->in_sizemove_loop = false; case WM_EXITMENULOOP: { --data->in_modal_loop; diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index fb50fa8f6d005..635691c042f22 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -934,7 +934,7 @@ bool WIN_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window) void WIN_SetWindowSize(SDL_VideoDevice *_this, SDL_Window *window) { - if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED)) && !window->internal->in_modal_loop) { + if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED)) && !window->internal->in_sizemove_loop) { WIN_SetWindowPositionInternal(window, window->internal->copybits_flag | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE, SDL_WINDOWRECT_PENDING); } else { // Can't resize the window diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 38d64f48f64e7..6794aad702ea8 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -86,6 +86,7 @@ struct SDL_WindowData bool force_ws_maximizebox; bool disable_move_size_events; bool showing_window; + bool in_sizemove_loop; int in_modal_loop; int last_modal_width; int last_modal_height; From b187010509e17bc17225e4a527547c84814da5d6 Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Sat, 13 Jun 2026 23:56:51 +0800 Subject: [PATCH 5/6] SDL hint WS_EX_NOREDIRECTIONBITMAP --- src/video/windows/SDL_windowsevents.c | 2 -- src/video/windows/SDL_windowswindow.c | 5 ++++- src/video/windows/SDL_windowswindow.h | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index ba2b97cdc8b81..d9b6520a9ab77 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1884,7 +1884,6 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_ENTERSIZEMOVE: - data->in_sizemove_loop = true; case WM_ENTERMENULOOP: { if (g_WindowsMessageHook) { @@ -1931,7 +1930,6 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_EXITSIZEMOVE: - data->in_sizemove_loop = false; case WM_EXITMENULOOP: { --data->in_modal_loop; diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 635691c042f22..726730d0d7761 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -714,6 +714,9 @@ bool WIN_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properties style |= GetWindowStyle(window); styleEx |= GetWindowStyleEx(window); + if (SDL_GetHintBoolean("SDL_VIDEO_WIN_NOREDIRECTIONBITMAP", false)) { + style |= WS_EX_NOREDIRECTIONBITMAP; + } // Figure out what the window area will be WIN_ConstrainPopup(window, false); @@ -934,7 +937,7 @@ bool WIN_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window) void WIN_SetWindowSize(SDL_VideoDevice *_this, SDL_Window *window) { - if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED)) && !window->internal->in_sizemove_loop) { + if (!(window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_MAXIMIZED))) { WIN_SetWindowPositionInternal(window, window->internal->copybits_flag | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE, SDL_WINDOWRECT_PENDING); } else { // Can't resize the window diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h index 6794aad702ea8..38d64f48f64e7 100644 --- a/src/video/windows/SDL_windowswindow.h +++ b/src/video/windows/SDL_windowswindow.h @@ -86,7 +86,6 @@ struct SDL_WindowData bool force_ws_maximizebox; bool disable_move_size_events; bool showing_window; - bool in_sizemove_loop; int in_modal_loop; int last_modal_width; int last_modal_height; From a810bcddc114d350220352aa534ffe59b55960cc Mon Sep 17 00:00:00 2001 From: 7aGiven Date: Tue, 16 Jun 2026 00:00:55 +0800 Subject: [PATCH 6/6] fix mistake style to styleEx --- src/video/windows/SDL_windowswindow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 726730d0d7761..997add70f0d66 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -715,7 +715,7 @@ bool WIN_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properties style |= GetWindowStyle(window); styleEx |= GetWindowStyleEx(window); if (SDL_GetHintBoolean("SDL_VIDEO_WIN_NOREDIRECTIONBITMAP", false)) { - style |= WS_EX_NOREDIRECTIONBITMAP; + styleEx |= WS_EX_NOREDIRECTIONBITMAP; } // Figure out what the window area will be