0

Take Snapped status into account when showing a window as normal

Adjusts HWNDMessageHandler::Show to correctly restore windows that were
in a snapped state prior to being hidden or maximized. From Windows
documentation at
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-iswindowarranged:

> A snapped window (see Snap your windows) is considered to be arranged.
> You should treat arranged as a window state similar to maximized. Arranged,
> maximized, and minimized are mutually exclusive states.

The logic already took into account a window being maximized and
correctly restored it, but if the window was snapped prior to this CL it
would be removed from its snapped state when re-shown. This fixes that.

Bug: 402791065
Change-Id: Ia300a16a5e2f5b4168094a6231b9a503f2ff868a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6330848
Commit-Queue: David Sanders <dsanders11@ucsbalum.com>
Reviewed-by: Robert Liao <robliao@chromium.org>
Reviewed-by: David Sanders <dsanders11@ucsbalum.com>
Cr-Commit-Position: refs/heads/main@{#1432949}
This commit is contained in:
Shelley Vohr
2025-03-14 12:57:50 -07:00
committed by Chromium LUCI CQ
parent ccfe003a4f
commit 83f7707e85

@ -683,7 +683,8 @@ void HWNDMessageHandler::Show(ui::mojom::WindowShowState show_state,
SetWindowPlacement(hwnd(), &placement);
native_show_state = SW_SHOWMAXIMIZED;
} else {
const bool is_maximized = IsMaximized();
const bool is_maximized_or_arranged =
IsMaximized() || IsWindowArranged(hwnd());
// Use SW_SHOW/SW_SHOWNA instead of SW_SHOWNORMAL/SW_SHOWNOACTIVATE so that
// the window is not restored to its original position if it is maximized.
@ -693,7 +694,8 @@ void HWNDMessageHandler::Show(ui::mojom::WindowShowState show_state,
// position, some do not. See crbug.com/1296710
switch (show_state) {
case ui::mojom::WindowShowState::kInactive:
native_show_state = is_maximized ? SW_SHOWNA : SW_SHOWNOACTIVATE;
native_show_state =
is_maximized_or_arranged ? SW_SHOWNA : SW_SHOWNOACTIVATE;
break;
case ui::mojom::WindowShowState::kMaximized:
native_show_state = SW_SHOWMAXIMIZED;
@ -704,9 +706,11 @@ void HWNDMessageHandler::Show(ui::mojom::WindowShowState show_state,
case ui::mojom::WindowShowState::kNormal:
if ((GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_TRANSPARENT) ||
(GetWindowLong(hwnd(), GWL_EXSTYLE) & WS_EX_NOACTIVATE)) {
native_show_state = is_maximized ? SW_SHOWNA : SW_SHOWNOACTIVATE;
native_show_state =
is_maximized_or_arranged ? SW_SHOWNA : SW_SHOWNOACTIVATE;
} else {
native_show_state = is_maximized ? SW_SHOW : SW_SHOWNORMAL;
native_show_state =
is_maximized_or_arranged ? SW_SHOW : SW_SHOWNORMAL;
}
break;
case ui::mojom::WindowShowState::kFullscreen: