mirror of
https://github.com/brl/mutter.git
synced 2025-03-03 11:58:09 +00:00
state: automatically remove unused states
When there is no further keys with a state as the target state, remove the state (and all transitions that used this state as a target)
This commit is contained in:
parent
140f76abf4
commit
6d1f697bc4
@ -276,22 +276,27 @@ clutter_state_remove_key_internal (ClutterState *this,
|
|||||||
if (target_state)
|
if (target_state)
|
||||||
{
|
{
|
||||||
GList *k;
|
GList *k;
|
||||||
|
again:
|
||||||
for (k = target_state->keys; k != NULL; k = k?k->next:NULL)
|
for (k = target_state->keys; k != NULL; k = k->next)
|
||||||
{
|
{
|
||||||
ClutterStateKey *key = k->data;
|
ClutterStateKey *key = k->data;
|
||||||
|
|
||||||
if ((object == NULL || (object == key->object)) &&
|
if ( (object == NULL || (object == key->object))
|
||||||
(source_state == NULL ||
|
&& (source_state == NULL || (source_state == key->source_state))
|
||||||
(source_state == key->source_state)) &&
|
&& (property_name == NULL || ((property_name == key->property_name))))
|
||||||
(property_name == NULL ||
|
|
||||||
((property_name == key->property_name))))
|
|
||||||
{
|
{
|
||||||
k = target_state->keys =
|
target_state->keys = g_list_remove (target_state->keys, key);
|
||||||
g_list_remove (target_state->keys, key);
|
|
||||||
|
if (target_state->keys == NULL)
|
||||||
|
{
|
||||||
|
/* no more keys, so remove this state */
|
||||||
|
clutter_state_remove_key (this, s->data, NULL, NULL, NULL);
|
||||||
|
g_hash_table_remove (this->priv->states, s->data);
|
||||||
|
}
|
||||||
|
|
||||||
key->is_inert = is_inert;
|
key->is_inert = is_inert;
|
||||||
clutter_state_key_free (key);
|
clutter_state_key_free (key);
|
||||||
|
goto again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -911,7 +916,6 @@ GList *
|
|||||||
clutter_state_get_states (ClutterState *state)
|
clutter_state_get_states (ClutterState *state)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL);
|
g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL);
|
||||||
|
|
||||||
return g_hash_table_get_keys (state->priv->states);
|
return g_hash_table_get_keys (state->priv->states);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,5 +60,27 @@ test_state_base (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
|
|||||||
g_list_free (keys);
|
g_list_free (keys);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
clutter_state_set (CLUTTER_STATE (state), "base", "clicked", state, "state", CLUTTER_LINEAR, "foo", NULL);
|
||||||
|
|
||||||
|
keys = clutter_state_get_keys (CLUTTER_STATE (state), "base", "clicked",
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
|
g_assert (keys != NULL);
|
||||||
|
g_assert_cmpint (g_list_length (keys), ==, 2);
|
||||||
|
g_list_free (keys);
|
||||||
|
|
||||||
|
keys = clutter_state_get_keys (CLUTTER_STATE (state), NULL, NULL,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
|
states = clutter_state_get_states (CLUTTER_STATE (state));
|
||||||
|
g_assert_cmpint (g_list_length (states), ==, 2);
|
||||||
|
g_list_free (states);
|
||||||
|
|
||||||
|
clutter_state_remove_key (CLUTTER_STATE (state), NULL, "clicked", NULL, NULL);
|
||||||
|
states = clutter_state_get_states (CLUTTER_STATE (state));
|
||||||
|
g_assert_cmpint (g_list_length (states), ==, 1);
|
||||||
|
g_list_free (states);
|
||||||
|
|
||||||
g_object_unref (script);
|
g_object_unref (script);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user