st-bin: Disallow st_bin_set_child with already-parented children
Not checking for this would result in `clutter_actor_add_child` failing, but StBin keeping a copy in `priv->child`. So later on, `st_bin_remove` would never be called on it and this assertion would fail and crash the whole shell: ``` static void st_bin_destroy (ClutterActor *actor) { StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (actor)); if (priv->child) clutter_actor_destroy (priv->child); g_assert (priv->child == NULL); ``` By disallowing spurious `st_bin_set_child` calls we now prevent StBin from entering such a corrupt state and the above assertion won't fail anymore. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1507>
This commit is contained in:
parent
ee0f250662
commit
244c266c9f
@ -358,6 +358,19 @@ st_bin_set_child (StBin *bin,
|
||||
if (priv->child == child)
|
||||
return;
|
||||
|
||||
if (child)
|
||||
{
|
||||
ClutterActor *parent = clutter_actor_get_parent (child);
|
||||
|
||||
if (parent)
|
||||
{
|
||||
g_warning ("%s: The provided 'child' actor %p already has a "
|
||||
"(different) parent %p and can't be made a child of %p.",
|
||||
G_STRFUNC, child, parent, bin);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (priv->child)
|
||||
clutter_actor_remove_child (CLUTTER_ACTOR (bin), priv->child);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user