A window without a minimize or maximize box can still be programmatically minimized by the Windows API. However, some WMs will refuse to change the state and not allow it to be maximized again, despite it being minimized, due to lacking those functions, thus not sending WM_STATE change notifications when clicking the minimized window on the taskbar.
Heroes of Might and Magic V does this, for example, when losing focus. It minimizes itself. When maximizing it by clicking on the taskbar it won't send a WM_STATE change notification (since it was never changed) and fail to maximize properly, showing a black screen (the game will still think it is minimized).
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/winex11.drv/window.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 4571739..aba6a1a 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -750,6 +750,10 @@ static void set_mwm_hints( struct x11drv_win_data *data, DWORD style, DWORD ex_s if (style & WS_MINIMIZEBOX) mwm_hints.functions |= MWM_FUNC_MINIMIZE; if (style & WS_MAXIMIZEBOX) mwm_hints.functions |= MWM_FUNC_MAXIMIZE; if (style & WS_SYSMENU) mwm_hints.functions |= MWM_FUNC_CLOSE; + + /* The window can be programmatically minimized even without + a minimize box button. Allow the WM to restore it. */ + if (data->iconic) mwm_hints.functions |= MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE; } }
@@ -2487,8 +2491,8 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags } else if ((swp_flags & SWP_STATECHANGED) && (!data->iconic != !(new_style & WS_MINIMIZE))) { - set_wm_hints( data ); data->iconic = (new_style & WS_MINIMIZE) != 0; + set_wm_hints( data ); TRACE( "changing win %p iconic state to %u\n", data->hwnd, data->iconic ); if (data->iconic) XIconifyWindow( data->display, data->whole_window, data->vis.screen );
On 11/12/20 11:36 PM, Gabriel Ivăncescu wrote:
A window without a minimize or maximize box can still be programmatically minimized by the Windows API. However, some WMs will refuse to change the state and not allow it to be maximized again, despite it being minimized, due to lacking those functions, thus not sending WM_STATE change notifications when clicking the minimized window on the taskbar.
Heroes of Might and Magic V does this, for example, when losing focus. It minimizes itself. When maximizing it by clicking on the taskbar it won't send a WM_STATE change notification (since it was never changed) and fail to maximize properly, showing a black screen (the game will still think it is minimized).
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
dlls/winex11.drv/window.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 4571739..aba6a1a 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -750,6 +750,10 @@ static void set_mwm_hints( struct x11drv_win_data *data, DWORD style, DWORD ex_s if (style & WS_MINIMIZEBOX) mwm_hints.functions |= MWM_FUNC_MINIMIZE; if (style & WS_MAXIMIZEBOX) mwm_hints.functions |= MWM_FUNC_MAXIMIZE; if (style & WS_SYSMENU) mwm_hints.functions |= MWM_FUNC_CLOSE;
/* The window can be programmatically minimized even without
a minimize box button. Allow the WM to restore it. */
if (data->iconic) mwm_hints.functions |= MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE;
I think you can use if (style & WS_MINIMIZE) here and not moving set_wm_hints() after data->iconic.
} }
@@ -2487,8 +2491,8 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags } else if ((swp_flags & SWP_STATECHANGED) && (!data->iconic != !(new_style & WS_MINIMIZE))) {
set_wm_hints( data ); data->iconic = (new_style & WS_MINIMIZE) != 0;
set_wm_hints( data ); TRACE( "changing win %p iconic state to %u\n", data->hwnd, data->iconic ); if (data->iconic) XIconifyWindow( data->display, data->whole_window, data->vis.screen );