core: Avoid setting up frames on fullscreen windows

Ensure we preserve the fast zero-copy paths in Xwayland fullscreen
windows, instead of maybe rendering the client surface on top of the
frame surface, and providing the latter to the compositor.

To achieve this, additionally synchronize frame state when
recalculating features (e.g. after fullscreen/unfullscreen), and
account for this new condition when creating or destroying frames.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2797>
This commit is contained in:
Carlos Garnacho 2022-12-16 13:44:48 +01:00
parent 1a210218c9
commit beeeea546b
3 changed files with 17 additions and 7 deletions

View File

@ -45,6 +45,9 @@ meta_window_ensure_frame (MetaWindow *window)
MetaX11Display *x11_display = window->display->x11_display;
unsigned long data[1] = { 1 };
if (window->frame)
return;
meta_x11_error_trap_push (x11_display);
XChangeProperty (x11_display->xdisplay,

View File

@ -851,7 +851,7 @@ client_window_should_be_mapped (MetaWindow *window)
#endif
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
window->decorated && !window->frame)
window->decorated && !window->fullscreen && !window->frame)
return FALSE;
return TRUE;
@ -1705,7 +1705,7 @@ meta_window_should_be_showing (MetaWindow *window)
#endif
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
window->decorated && !window->frame)
window->decorated && !window->fullscreen && !window->frame)
return FALSE;
/* Windows should be showing if they're located on the
@ -5324,6 +5324,15 @@ meta_window_update_struts (MetaWindow *window)
invalidate_work_areas (window);
}
static void
sync_needs_frame (MetaWindow *window)
{
if (window->decorated && !window->fullscreen)
meta_window_ensure_frame (window);
else
meta_window_destroy_frame (window);
}
static void
meta_window_type_changed (MetaWindow *window)
{
@ -5337,10 +5346,7 @@ meta_window_type_changed (MetaWindow *window)
set_net_wm_state (window);
/* Update frame */
if (window->decorated)
meta_window_ensure_frame (window);
else
meta_window_destroy_frame (window);
sync_needs_frame (window);
/* update stacking constraints */
meta_window_update_layer (window);
@ -5611,6 +5617,7 @@ meta_window_recalc_features (MetaWindow *window)
if (window->has_resize_func != old_has_resize_func)
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_RESIZEABLE]);
sync_needs_frame (window);
meta_window_frame_size_changed (window);
}

View File

@ -562,7 +562,7 @@ meta_window_x11_manage (MetaWindow *window)
if (!window->override_redirect)
update_sm_hints (window); /* must come after transient_for */
if (window->decorated)
if (window->decorated && !window->fullscreen)
meta_window_ensure_frame (window);
else
meta_window_x11_initialize_state (window);