cally: fix state set leak
cally_actor_action_do_action leaks a state set object in the case where the actor is defunct, insensitive, or hidden. This commit plugs the leak. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1225
This commit is contained in:
parent
3bc15ade04
commit
79e5ec57d2
@ -767,10 +767,11 @@ static gboolean
|
|||||||
cally_actor_action_do_action (AtkAction *action,
|
cally_actor_action_do_action (AtkAction *action,
|
||||||
gint index)
|
gint index)
|
||||||
{
|
{
|
||||||
CallyActor *cally_actor = NULL;
|
CallyActor *cally_actor = NULL;
|
||||||
AtkStateSet *set = NULL;
|
AtkStateSet *set = NULL;
|
||||||
CallyActorPrivate *priv = NULL;
|
CallyActorPrivate *priv = NULL;
|
||||||
CallyActorActionInfo *info = NULL;
|
CallyActorActionInfo *info = NULL;
|
||||||
|
gboolean did_action = FALSE;
|
||||||
|
|
||||||
cally_actor = CALLY_ACTOR (action);
|
cally_actor = CALLY_ACTOR (action);
|
||||||
priv = cally_actor->priv;
|
priv = cally_actor->priv;
|
||||||
@ -778,21 +779,19 @@ cally_actor_action_do_action (AtkAction *action,
|
|||||||
set = atk_object_ref_state_set (ATK_OBJECT (cally_actor));
|
set = atk_object_ref_state_set (ATK_OBJECT (cally_actor));
|
||||||
|
|
||||||
if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
|
if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
if (!atk_state_set_contains_state (set, ATK_STATE_SENSITIVE) ||
|
if (!atk_state_set_contains_state (set, ATK_STATE_SENSITIVE) ||
|
||||||
!atk_state_set_contains_state (set, ATK_STATE_SHOWING))
|
!atk_state_set_contains_state (set, ATK_STATE_SHOWING))
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
g_object_unref (set);
|
|
||||||
|
|
||||||
info = _cally_actor_get_action_info (cally_actor, index);
|
info = _cally_actor_get_action_info (cally_actor, index);
|
||||||
|
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
if (info->do_action_func == NULL)
|
if (info->do_action_func == NULL)
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
if (!priv->action_queue)
|
if (!priv->action_queue)
|
||||||
priv->action_queue = g_queue_new ();
|
priv->action_queue = g_queue_new ();
|
||||||
@ -802,7 +801,12 @@ cally_actor_action_do_action (AtkAction *action,
|
|||||||
if (!priv->action_idle_handler)
|
if (!priv->action_idle_handler)
|
||||||
priv->action_idle_handler = g_idle_add (idle_do_action, cally_actor);
|
priv->action_idle_handler = g_idle_add (idle_do_action, cally_actor);
|
||||||
|
|
||||||
return TRUE;
|
did_action = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
g_clear_object (&set);
|
||||||
|
|
||||||
|
return did_action;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Loading…
Reference in New Issue
Block a user