From: Rémi Bernon rbernon@codeweavers.com
This confuses mutter and it manifests with spurious IconicState WM_STATE change when it decides to try managing the window, but it also makes it randomly lose focus or even fail to map the window back on screen.
Adding the flag after the window has been created fixes the issue. --- dlls/winex11.drv/window.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 7ae1d8ef66a..e8692fd69b6 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 = managed_mode; mask = get_window_attributes( data, &attr );
if (!(cx = data->rects.visible.right - data->rects.visible.left)) cx = 1; @@ -2143,6 +2138,8 @@ static void create_whole_window( struct x11drv_win_data *data ) data->pending_state.rect = data->current_state.rect; data->desired_state.rect = data->current_state.rect;
+ /* Set override-redirect attribute only after window creation, Mutter gets confused otherwise */ + data->managed = is_window_managed( data->hwnd, SWP_NOACTIVATE, &data->rects.window ); x11drv_xinput2_enable( data->display, data->whole_window ); set_initial_wm_hints( data->display, data->whole_window ); set_wm_hints( data );