diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2018-12-03 17:32:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-03 17:32:35 +0100 |
commit | 49573817b86428332292aa249e0e2da1b74018ee (patch) | |
tree | 6f4c4c937c729d1d4e2762c848cdee99211fe181 | |
parent | e6b0327c2c92051a2f31f875273326d8636ca555 (diff) | |
parent | 711bc1c07ee924b4deda04da825941d8a9e4f3c7 (diff) |
Merge pull request #24078 from marcelofg55/win_min_bug
Fix wrong size and position when windows is minimized on Windows
-rw-r--r-- | platform/windows/os_windows.cpp | 38 | ||||
-rw-r--r-- | platform/windows/os_windows.h | 1 |
2 files changed, 31 insertions, 8 deletions
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index bdf459fd83..55d2bb2153 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -727,16 +727,28 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } } break; + case WM_MOVE: { + if (!IsIconic(hWnd)) { + int x = LOWORD(lParam); + int y = HIWORD(lParam); + last_pos = Point2(x, y); + } + } break; + case WM_SIZE: { - int window_w = LOWORD(lParam); - int window_h = HIWORD(lParam); - if (window_w > 0 && window_h > 0 && !preserve_window_size) { - video_mode.width = window_w; - video_mode.height = window_h; - } else { - preserve_window_size = false; - set_window_size(Size2(video_mode.width, video_mode.height)); + // Ignore size when a SIZE_MINIMIZED event is triggered + if (wParam != SIZE_MINIMIZED) { + int window_w = LOWORD(lParam); + int window_h = HIWORD(lParam); + if (window_w > 0 && window_h > 0 && !preserve_window_size) { + video_mode.width = window_w; + video_mode.height = window_h; + } else { + preserve_window_size = false; + set_window_size(Size2(video_mode.width, video_mode.height)); + } } + if (wParam == SIZE_MAXIMIZED) { maximized = true; minimized = false; @@ -1685,6 +1697,10 @@ int OS_Windows::get_screen_dpi(int p_screen) const { Point2 OS_Windows::get_window_position() const { + if (minimized) { + return last_pos; + } + RECT r; GetWindowRect(hWnd, &r); return Point2(r.left, r.top); @@ -1705,9 +1721,15 @@ void OS_Windows::set_window_position(const Point2 &p_position) { ClientToScreen(hWnd, (POINT *)&rect.right); ClipCursor(&rect); } + + last_pos = p_position; } Size2 OS_Windows::get_window_size() const { + if (minimized) { + return Size2(video_mode.width, video_mode.height); + } + RECT r; if (GetClientRect(hWnd, &r)) { // Only area inside of window border return Size2(r.right - r.left, r.bottom - r.top); diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 6aadd6994c..d09ade4daa 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -93,6 +93,7 @@ class OS_Windows : public OS { HDC hDC; // Private GDI Device Context HINSTANCE hInstance; // Holds The Instance Of The Application HWND hWnd; + Point2 last_pos; HBITMAP hBitmap; //DIB section for layered window uint8_t *dib_data; |