From b569875bf91dcb510daaef7880c36c70fb8cdb69 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 16 Oct 2018 16:31:46 +0200 Subject: [PATCH] windisplay: fix window size changing when switching undecorated --- panda/src/windisplay/winGraphicsWindow.cxx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index b42ee43992..703aba0149 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -293,13 +293,29 @@ set_properties_now(WindowProperties &properties) { _properties.set_fixed_size(properties.get_fixed_size()); properties.clear_fixed_size(); } + // When switching undecorated mode, Windows will keep the window at the + // current outer size, whereas we want to keep it with the configured + // inner size. Store the current size and origin. + LPoint2i top_left = _properties.get_origin(); + LPoint2i bottom_right = top_left + _properties.get_size(); + DWORD window_style = make_style(_properties); SetWindowLong(_hWnd, GWL_STYLE, window_style); + // Now calculate the proper size and origin with the new window style. + RECT view_rect; + SetRect(&view_rect, top_left[0], top_left[1], + bottom_right[0], bottom_right[1]); + WINDOWINFO wi; + GetWindowInfo(_hWnd, &wi); + AdjustWindowRectEx(&view_rect, wi.dwStyle, FALSE, wi.dwExStyle); + // We need to call this to ensure that the style change takes effect. - SetWindowPos(_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | - SWP_FRAMECHANGED | SWP_NOSENDCHANGING | SWP_SHOWWINDOW); + SetWindowPos(_hWnd, HWND_NOTOPMOST, view_rect.left, view_rect.top, + view_rect.right - view_rect.left, + view_rect.bottom - view_rect.top, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | + SWP_NOSENDCHANGING | SWP_SHOWWINDOW); } if (properties.has_title()) {