mirror of
https://github.com/brl/mutter.git
synced 2024-11-30 03:50:47 -05:00
compositor: Destroy actors when unmanaging
When disposing, actors being destroyed might want to access the disposed compositor; avoid that by destroying them earlier. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2264>
This commit is contained in:
parent
dd14592314
commit
35ac3a096d
@ -450,6 +450,20 @@ meta_compositor_manage (MetaCompositor *compositor)
|
|||||||
g_error ("Compositor failed to manage display: %s", error->message);
|
g_error ("Compositor failed to manage display: %s", error->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_compositor_real_unmanage (MetaCompositor *compositor)
|
||||||
|
{
|
||||||
|
MetaCompositorPrivate *priv =
|
||||||
|
meta_compositor_get_instance_private (compositor);
|
||||||
|
|
||||||
|
g_clear_signal_handler (&priv->top_window_actor_destroy_id,
|
||||||
|
priv->top_window_actor);
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->window_group, clutter_actor_destroy);
|
||||||
|
g_clear_pointer (&priv->top_window_group, clutter_actor_destroy);
|
||||||
|
g_clear_pointer (&priv->feedback_group, clutter_actor_destroy);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_unmanage (MetaCompositor *compositor)
|
meta_compositor_unmanage (MetaCompositor *compositor)
|
||||||
{
|
{
|
||||||
@ -1118,12 +1132,6 @@ meta_compositor_dispose (GObject *object)
|
|||||||
g_clear_signal_handler (&priv->before_paint_handler_id, stage);
|
g_clear_signal_handler (&priv->before_paint_handler_id, stage);
|
||||||
g_clear_signal_handler (&priv->after_paint_handler_id, stage);
|
g_clear_signal_handler (&priv->after_paint_handler_id, stage);
|
||||||
|
|
||||||
g_clear_signal_handler (&priv->top_window_actor_destroy_id,
|
|
||||||
priv->top_window_actor);
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->window_group, clutter_actor_destroy);
|
|
||||||
g_clear_pointer (&priv->top_window_group, clutter_actor_destroy);
|
|
||||||
g_clear_pointer (&priv->feedback_group, clutter_actor_destroy);
|
|
||||||
g_clear_pointer (&priv->windows, g_list_free);
|
g_clear_pointer (&priv->windows, g_list_free);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_compositor_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_compositor_parent_class)->dispose (object);
|
||||||
@ -1139,6 +1147,7 @@ meta_compositor_class_init (MetaCompositorClass *klass)
|
|||||||
object_class->constructed = meta_compositor_constructed;
|
object_class->constructed = meta_compositor_constructed;
|
||||||
object_class->dispose = meta_compositor_dispose;
|
object_class->dispose = meta_compositor_dispose;
|
||||||
|
|
||||||
|
klass->unmanage = meta_compositor_real_unmanage;
|
||||||
klass->remove_window = meta_compositor_real_remove_window;
|
klass->remove_window = meta_compositor_real_remove_window;
|
||||||
klass->before_paint = meta_compositor_real_before_paint;
|
klass->before_paint = meta_compositor_real_before_paint;
|
||||||
klass->after_paint = meta_compositor_real_after_paint;
|
klass->after_paint = meta_compositor_real_after_paint;
|
||||||
|
@ -33,11 +33,6 @@ meta_compositor_server_manage (MetaCompositor *compositor,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_compositor_server_unmanage (MetaCompositor *compositor)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t
|
static int64_t
|
||||||
meta_compositor_server_monotonic_to_high_res_xserver_time (MetaCompositor *compositor,
|
meta_compositor_server_monotonic_to_high_res_xserver_time (MetaCompositor *compositor,
|
||||||
int64_t monotonic_time_us)
|
int64_t monotonic_time_us)
|
||||||
@ -92,7 +87,6 @@ meta_compositor_server_class_init (MetaCompositorServerClass *klass)
|
|||||||
MetaCompositorClass *compositor_class = META_COMPOSITOR_CLASS (klass);
|
MetaCompositorClass *compositor_class = META_COMPOSITOR_CLASS (klass);
|
||||||
|
|
||||||
compositor_class->manage = meta_compositor_server_manage;
|
compositor_class->manage = meta_compositor_server_manage;
|
||||||
compositor_class->unmanage = meta_compositor_server_unmanage;
|
|
||||||
compositor_class->monotonic_to_high_res_xserver_time =
|
compositor_class->monotonic_to_high_res_xserver_time =
|
||||||
meta_compositor_server_monotonic_to_high_res_xserver_time;
|
meta_compositor_server_monotonic_to_high_res_xserver_time;
|
||||||
compositor_class->grab_begin = meta_compositor_server_grab_begin;
|
compositor_class->grab_begin = meta_compositor_server_grab_begin;
|
||||||
|
@ -209,6 +209,7 @@ meta_compositor_x11_unmanage (MetaCompositor *compositor)
|
|||||||
MetaX11Display *x11_display = display->x11_display;
|
MetaX11Display *x11_display = display->x11_display;
|
||||||
Display *xdisplay = x11_display->xdisplay;
|
Display *xdisplay = x11_display->xdisplay;
|
||||||
Window xroot = x11_display->xroot;
|
Window xroot = x11_display->xroot;
|
||||||
|
MetaCompositorClass *parent_class;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the most important part of cleanup - we have to do this before
|
* This is the most important part of cleanup - we have to do this before
|
||||||
@ -216,6 +217,9 @@ meta_compositor_x11_unmanage (MetaCompositor *compositor)
|
|||||||
* able to redirect subwindows
|
* able to redirect subwindows
|
||||||
*/
|
*/
|
||||||
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
|
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
|
||||||
|
|
||||||
|
parent_class = META_COMPOSITOR_CLASS (meta_compositor_x11_parent_class);
|
||||||
|
parent_class->unmanage (compositor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user