core: Don't unmap XWayland windows without buffers on visibility update

18be74ed was changing meta_window_should_be_showing_on_workspace() to
only show XWayland windows when they have buffers to prevent starting
transitions with a seemingly black window.

This however did not just delay the transition, but when called in
meta_window_update_visibility() could result in the X11 window getting
unmapped again if the call happens before there is a buffer. Then,
depending on the client, the window would either remain hidden or if the
client tries to map the window again, this would repeat the process,
triggering the closing transition every time.

This commit instead just hides the XWayland window from the compositor
but keeps the corresponding X11 window mapped while it does not have a
buffer yet.

Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/2611
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2965
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2820
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2867
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3194>
This commit is contained in:
Sebastian Keller 2023-08-19 18:40:56 +02:00 committed by Marge Bot
parent d10533cc1c
commit 133931e3a3

View File

@ -1688,8 +1688,11 @@ gboolean
meta_window_should_be_showing_on_workspace (MetaWindow *window,
MetaWorkspace *workspace)
{
if (!window_has_buffer (window))
#ifdef HAVE_WAYLAND
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND &&
!window_has_buffer (window))
return FALSE;
#endif
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
window->decorated && !window->frame)
@ -2217,7 +2220,7 @@ meta_window_show (MetaWindow *window)
set_wm_state (window);
}
if (!window->visible_to_compositor)
if (!window->visible_to_compositor && window_has_buffer (window))
{
MetaCompEffect effect = META_COMP_EFFECT_NONE;