[PATCH 0/5] MR7370: winex11: Pass fullscreen flag to is_window_managed.
Instead of checking for monitor rect. Similar purpose as https://gitlab.winehq.org/wine/wine/-/merge_requests/7362 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winex11.drv/window.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 7ae1d8ef66a..6278fa651e7 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2878,11 +2878,11 @@ BOOL X11DRV_WindowPosChanging( HWND hwnd, UINT swp_flags, BOOL shaped, const str /* check if we need to switch the window to managed */ if (!data->managed && data->whole_window && is_window_managed( hwnd, swp_flags, &rects->window )) { + UINT wm_state = data->desired_state.wm_state; TRACE( "making win %p/%lx managed\n", hwnd, data->whole_window ); - release_win_data( data ); - unmap_window( hwnd ); - if (!(data = get_win_data( hwnd ))) return FALSE; /* use default surface */ + window_set_wm_state( data, WithdrawnState ); data->managed = TRUE; + window_set_wm_state( data, wm_state ); } ret = !!data->whole_window; /* use default surface if we don't have a window */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winex11.drv/window.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 6278fa651e7..3b7132dd53d 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2875,16 +2875,6 @@ BOOL X11DRV_WindowPosChanging( HWND hwnd, UINT swp_flags, BOOL shaped, const str if (!data && !(data = X11DRV_create_win_data( hwnd, rects ))) return FALSE; /* use default surface */ data->shaped = shaped; - /* check if we need to switch the window to managed */ - if (!data->managed && data->whole_window && is_window_managed( hwnd, swp_flags, &rects->window )) - { - UINT wm_state = data->desired_state.wm_state; - TRACE( "making win %p/%lx managed\n", hwnd, data->whole_window ); - window_set_wm_state( data, WithdrawnState ); - data->managed = TRUE; - window_set_wm_state( data, wm_state ); - } - ret = !!data->whole_window; /* use default surface if we don't have a window */ release_win_data( data ); @@ -2958,6 +2948,16 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, HWND owner_hint, UIN if (!(data = get_win_data( hwnd ))) return; + /* check if we need to switch the window to managed */ + if (!data->managed && data->whole_window && is_window_managed( hwnd, swp_flags, &new_rects->window )) + { + UINT wm_state = data->desired_state.wm_state; + TRACE( "making win %p/%lx managed\n", hwnd, data->whole_window ); + window_set_wm_state( data, WithdrawnState ); + data->managed = TRUE; + window_set_wm_state( data, wm_state ); + } + old_style = new_style & ~(WS_VISIBLE | WS_MINIMIZE | WS_MAXIMIZE); if (data->desired_state.wm_state != WithdrawnState) old_style |= WS_VISIBLE; if (data->desired_state.wm_state == IconicState) old_style |= WS_MINIMIZE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winex11.drv/window.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 3b7132dd53d..ffe1710b734 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2110,12 +2110,6 @@ static void create_whole_window( struct x11drv_win_data *data ) HRGN win_rgn; POINT pos; - if (!data->managed && is_window_managed( data->hwnd, SWP_NOACTIVATE, &data->rects.window )) - { - TRACE( "making win %p/%lx managed\n", data->hwnd, data->whole_window ); - data->managed = TRUE; - } - if ((win_rgn = NtGdiCreateRectRgn( 0, 0, 0, 0 )) && NtUserGetWindowRgnEx( data->hwnd, win_rgn, 0 ) == ERROR) { @@ -2127,6 +2121,7 @@ static void create_whole_window( struct x11drv_win_data *data ) if (data->vis.visualid != default_visual.visualid) data->whole_colormap = XCreateColormap( data->display, root_window, data->vis.visual, AllocNone ); + data->managed = is_window_managed( data->hwnd, SWP_NOACTIVATE, &data->rects.window ); mask = get_window_attributes( data, &attr ); if (!(cx = data->rects.visible.right - data->rects.visible.left)) cx = 1; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
From: Rémi Bernon <rbernon(a)codeweavers.com> Instead of checking for monitor rect. --- dlls/winex11.drv/window.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index ffe1710b734..a5cf126206f 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -376,7 +376,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd ) * * Check if a given window should be managed */ -static BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rect ) +static BOOL is_window_managed( HWND hwnd, UINT swp_flags, BOOL fullscreen ) { DWORD style, ex_style; @@ -394,18 +394,10 @@ static BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rec if (style & WS_THICKFRAME) return TRUE; if (style & WS_POPUP) { - HMONITOR hmon; - MONITORINFO mi; - /* popup with sysmenu == caption are managed */ if (style & WS_SYSMENU) return TRUE; /* full-screen popup windows are managed */ - hmon = NtUserMonitorFromWindow( hwnd, MONITOR_DEFAULTTOPRIMARY ); - mi.cbSize = sizeof( mi ); - NtUserGetMonitorInfo( hmon, &mi ); - if (window_rect->left <= mi.rcWork.left && window_rect->right >= mi.rcWork.right && - window_rect->top <= mi.rcWork.top && window_rect->bottom >= mi.rcWork.bottom) - return TRUE; + if (fullscreen) return TRUE; } /* application windows are managed */ ex_style = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ); @@ -2121,7 +2113,7 @@ static void create_whole_window( struct x11drv_win_data *data ) if (data->vis.visualid != default_visual.visualid) data->whole_colormap = XCreateColormap( data->display, root_window, data->vis.visual, AllocNone ); - data->managed = is_window_managed( data->hwnd, SWP_NOACTIVATE, &data->rects.window ); + data->managed = is_window_managed( data->hwnd, SWP_NOACTIVATE, data->is_fullscreen ); mask = get_window_attributes( data, &attr ); if (!(cx = data->rects.visible.right - data->rects.visible.left)) cx = 1; @@ -2944,7 +2936,7 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, HWND owner_hint, UIN if (!(data = get_win_data( hwnd ))) return; /* check if we need to switch the window to managed */ - if (!data->managed && data->whole_window && is_window_managed( hwnd, swp_flags, &new_rects->window )) + if (!data->managed && data->whole_window && is_window_managed( hwnd, swp_flags, fullscreen )) { UINT wm_state = data->desired_state.wm_state; TRACE( "making win %p/%lx managed\n", hwnd, data->whole_window ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winewayland.drv/window.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index 67718936b53..e80bebdc042 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -362,7 +362,7 @@ static inline HWND get_active_window(void) * * Check if a given window should be managed */ -static BOOL is_window_managed(HWND hwnd, UINT swp_flags, const RECT *window_rect) +static BOOL is_window_managed(HWND hwnd, UINT swp_flags, BOOL fullscreen) { DWORD style, ex_style; @@ -378,18 +378,10 @@ static BOOL is_window_managed(HWND hwnd, UINT swp_flags, const RECT *window_rect if (style & WS_THICKFRAME) return TRUE; if (style & WS_POPUP) { - HMONITOR hmon; - MONITORINFO mi; - /* popup with sysmenu == caption are managed */ if (style & WS_SYSMENU) return TRUE; /* full-screen popup windows are managed */ - hmon = NtUserMonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY); - mi.cbSize = sizeof(mi); - NtUserGetMonitorInfo(hmon, &mi); - if (window_rect->left <= mi.rcWork.left && window_rect->right >= mi.rcWork.right && - window_rect->top <= mi.rcWork.top && window_rect->bottom >= mi.rcWork.bottom) - return TRUE; + if (fullscreen) return TRUE; } /* application windows are managed */ ex_style = NtUserGetWindowLongW(hwnd, GWL_EXSTYLE); @@ -448,7 +440,7 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UIN /* Get the managed state with win_data unlocked, as is_window_managed * may need to query win_data information about other HWNDs and thus * acquire the lock itself internally. */ - if (!(managed = is_window_managed(hwnd, swp_flags, &new_rects->window)) && surface) toplevel = owner_hint; + if (!(managed = is_window_managed(hwnd, swp_flags, fullscreen)) && surface) toplevel = owner_hint; if (!(data = wayland_win_data_get(hwnd))) return; toplevel_data = toplevel && toplevel != hwnd ? wayland_win_data_get_nolock(toplevel) : NULL; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7370
Actually, although this is a pre-existing issue, we probably need to wait for the WithdrawnState to be requested. Otherwise any other state change request will override it and it might be skipped although we need it for the override-redirect change. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/7370#note_95172
participants (1)
-
Rémi Bernon