From 5159d5902f0a6f48b354bc568f086d99c2e64ea0 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Sat, 4 Jan 2014 10:31:30 +0100 Subject: [PATCH] Fix maximization behavior on Windows (Bug#16300). Fix maximization behavior on Windows (Bug#16300). * w32fns.c (w32_fullscreen_rect): Don't handle FULLSCREEN_MAXIMIZED and FULLSCREEN_NONE specially. * w32term.c (w32fullscreen_hook): Use SetWindowPlacement instead of SetWindowPos. Restore last placement also when leaving FULLSCREEN_HEIGHT and FULLSCREEN_WIDTH. Call ShowWindow in all but the FULLSCREEN_BOTH case. --- src/ChangeLog | 10 ++++++++++ src/w32fns.c | 7 ------- src/w32term.c | 23 +++++++++++++++-------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 0a4bd05bc06..2c4c7921147 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2014-01-04 Martin Rudalics + + Fix maximization behavior on Windows (Bug#16300). + * w32fns.c (w32_fullscreen_rect): Don't handle + FULLSCREEN_MAXIMIZED and FULLSCREEN_NONE specially. + * w32term.c (w32fullscreen_hook): Use SetWindowPlacement instead + of SetWindowPos. Restore last placement also when leaving + FULLSCREEN_HEIGHT and FULLSCREEN_WIDTH. Call ShowWindow in all + but the FULLSCREEN_BOTH case. + 2014-01-03 Paul Eggert Port to C89. diff --git a/src/w32fns.c b/src/w32fns.c index 25dad980aa7..03779be036c 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -402,12 +402,6 @@ w32_fullscreen_rect (HWND hwnd, int fsmode, RECT normal, RECT *rect) rect->right = mi.rcMonitor.right; rect->bottom = mi.rcMonitor.bottom; break; - case FULLSCREEN_MAXIMIZED: - rect->left = mi.rcWork.left; - rect->top = mi.rcWork.top; - rect->right = mi.rcWork.right; - rect->bottom = mi.rcWork.bottom; - break; case FULLSCREEN_WIDTH: rect->left = mi.rcWork.left; rect->top = normal.top; @@ -420,7 +414,6 @@ w32_fullscreen_rect (HWND hwnd, int fsmode, RECT normal, RECT *rect) rect->right = normal.right; rect->bottom = mi.rcWork.bottom; break; - case FULLSCREEN_NONE: default: *rect = normal; break; diff --git a/src/w32term.c b/src/w32term.c index 91235507b21..a59d5d6edc0 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5564,18 +5564,22 @@ w32fullscreen_hook (struct frame *f) if (FRAME_PREV_FSMODE (f) == FULLSCREEN_BOTH) { SetWindowLong (hwnd, GWL_STYLE, dwStyle | WS_OVERLAPPEDWINDOW); - SetWindowPos (hwnd, NULL, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } + SetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); + } + else if (FRAME_PREV_FSMODE (f) == FULLSCREEN_HEIGHT + || FRAME_PREV_FSMODE (f) == FULLSCREEN_WIDTH) + SetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f)); - w32_fullscreen_rect (hwnd, f->want_fullscreen, - FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); FRAME_PREV_FSMODE (f) = f->want_fullscreen; - if (f->want_fullscreen == FULLSCREEN_MAXIMIZED) - PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, 0xf030, 0); + + if (f->want_fullscreen == FULLSCREEN_NONE) + ShowWindow (hwnd, SW_SHOWNORMAL); + else if (f->want_fullscreen == FULLSCREEN_MAXIMIZED) + ShowWindow (hwnd, SW_MAXIMIZE); else if (f->want_fullscreen == FULLSCREEN_BOTH) { + w32_fullscreen_rect (hwnd, f->want_fullscreen, + FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); SetWindowLong (hwnd, GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, @@ -5583,6 +5587,9 @@ w32fullscreen_hook (struct frame *f) } else { + ShowWindow (hwnd, SW_SHOWNORMAL); + w32_fullscreen_rect (hwnd, f->want_fullscreen, + FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0); } -- 2.39.2