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:
parent
1a210218c9
commit
beeeea546b
@ -45,6 +45,9 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
MetaX11Display *x11_display = window->display->x11_display;
|
MetaX11Display *x11_display = window->display->x11_display;
|
||||||
unsigned long data[1] = { 1 };
|
unsigned long data[1] = { 1 };
|
||||||
|
|
||||||
|
if (window->frame)
|
||||||
|
return;
|
||||||
|
|
||||||
meta_x11_error_trap_push (x11_display);
|
meta_x11_error_trap_push (x11_display);
|
||||||
|
|
||||||
XChangeProperty (x11_display->xdisplay,
|
XChangeProperty (x11_display->xdisplay,
|
||||||
|
@ -851,7 +851,7 @@ client_window_should_be_mapped (MetaWindow *window)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
|
||||||
window->decorated && !window->frame)
|
window->decorated && !window->fullscreen && !window->frame)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1705,7 +1705,7 @@ meta_window_should_be_showing (MetaWindow *window)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
|
||||||
window->decorated && !window->frame)
|
window->decorated && !window->fullscreen && !window->frame)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Windows should be showing if they're located on the
|
/* Windows should be showing if they're located on the
|
||||||
@ -5324,6 +5324,15 @@ meta_window_update_struts (MetaWindow *window)
|
|||||||
invalidate_work_areas (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
|
static void
|
||||||
meta_window_type_changed (MetaWindow *window)
|
meta_window_type_changed (MetaWindow *window)
|
||||||
{
|
{
|
||||||
@ -5337,10 +5346,7 @@ meta_window_type_changed (MetaWindow *window)
|
|||||||
set_net_wm_state (window);
|
set_net_wm_state (window);
|
||||||
|
|
||||||
/* Update frame */
|
/* Update frame */
|
||||||
if (window->decorated)
|
sync_needs_frame (window);
|
||||||
meta_window_ensure_frame (window);
|
|
||||||
else
|
|
||||||
meta_window_destroy_frame (window);
|
|
||||||
|
|
||||||
/* update stacking constraints */
|
/* update stacking constraints */
|
||||||
meta_window_update_layer (window);
|
meta_window_update_layer (window);
|
||||||
@ -5611,6 +5617,7 @@ meta_window_recalc_features (MetaWindow *window)
|
|||||||
if (window->has_resize_func != old_has_resize_func)
|
if (window->has_resize_func != old_has_resize_func)
|
||||||
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_RESIZEABLE]);
|
g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_RESIZEABLE]);
|
||||||
|
|
||||||
|
sync_needs_frame (window);
|
||||||
meta_window_frame_size_changed (window);
|
meta_window_frame_size_changed (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,7 +562,7 @@ meta_window_x11_manage (MetaWindow *window)
|
|||||||
if (!window->override_redirect)
|
if (!window->override_redirect)
|
||||||
update_sm_hints (window); /* must come after transient_for */
|
update_sm_hints (window); /* must come after transient_for */
|
||||||
|
|
||||||
if (window->decorated)
|
if (window->decorated && !window->fullscreen)
|
||||||
meta_window_ensure_frame (window);
|
meta_window_ensure_frame (window);
|
||||||
else
|
else
|
||||||
meta_window_x11_initialize_state (window);
|
meta_window_x11_initialize_state (window);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user