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 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index f70e74296cd..22743541bf2 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1507,7 +1507,7 @@ static void window_set_managed( struct x11drv_win_data *data, BOOL new_managed )
if (!data->whole_window) return; /* no window, nothing to update */ if (old_managed == new_managed) return; /* states are the same, nothing to update */ - if (!new_managed) + if (!new_managed && (data->pending_state.wm_state != WithdrawnState || data->wm_state_serial)) { ERR( "Changing window to unmanaged is not supported\n" ); return; @@ -2137,7 +2137,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, FALSE ); + data->managed = managed_mode; mask = get_window_attributes( data, &attr ) | CWOverrideRedirect; attr.override_redirect = !data->managed;
@@ -2155,6 +2155,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 breaks if it's later unset */ + window_set_managed( data, is_window_managed( data->hwnd, SWP_NOACTIVATE, FALSE ) ); x11drv_xinput2_enable( data->display, data->whole_window ); set_initial_wm_hints( data->display, data->whole_window ); set_wm_hints( data );