clutter: Handle accessible focus state change on Actor side

That is where it belongs anyways and would handle some missing branches
where we wouldn't update the focus state.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4089>
This commit is contained in:
Bilal Elmoussaoui 2024-12-13 12:28:45 +01:00 committed by Marge Bot
parent 9d72f658af
commit 04218ac2b5
2 changed files with 8 additions and 32 deletions

View File

@ -1539,7 +1539,6 @@ maybe_unset_key_focus (ClutterActor *self)
return; return;
clutter_stage_set_key_focus (CLUTTER_STAGE (stage), NULL); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), NULL);
clutter_actor_remove_accessible_state (self, ATK_STATE_FOCUSED);
} }
static void static void
@ -12991,10 +12990,7 @@ clutter_actor_grab_key_focus (ClutterActor *self)
stage = _clutter_actor_get_stage_internal (self); stage = _clutter_actor_get_stage_internal (self);
if (stage != NULL) if (stage != NULL)
{
clutter_stage_set_key_focus (CLUTTER_STAGE (stage), self); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), self);
clutter_actor_add_accessible_state (self, ATK_STATE_FOCUSED);
}
} }
#ifdef HAVE_FONTS #ifdef HAVE_FONTS
@ -13528,6 +13524,13 @@ _clutter_actor_set_has_key_focus (ClutterActor *self,
if (CLUTTER_ACTOR_IN_DESTRUCTION (self)) if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
return; return;
if (has_key_focus)
clutter_actor_add_accessible_state (self,
ATK_STATE_FOCUSED);
else
clutter_actor_remove_accessible_state (self,
ATK_STATE_FOCUSED);
if (has_key_focus) if (has_key_focus)
g_signal_emit (self, actor_signals[KEY_FOCUS_IN], 0); g_signal_emit (self, actor_signals[KEY_FOCUS_IN], 0);
else else

View File

@ -643,24 +643,12 @@ clutter_stage_emit_key_focus_event (ClutterStage *stage,
gboolean focus_in) gboolean focus_in)
{ {
ClutterStagePrivate *priv = clutter_stage_get_instance_private (stage); ClutterStagePrivate *priv = clutter_stage_get_instance_private (stage);
AtkObject *old_accessible, *new_accessible = NULL;
if (priv->key_focused_actor == NULL) if (priv->key_focused_actor == NULL)
return; return;
old_accessible = clutter_actor_get_accessible (priv->key_focused_actor);
new_accessible = clutter_actor_get_accessible (CLUTTER_ACTOR (stage));
_clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), focus_in); _clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), focus_in);
if (old_accessible)
atk_object_notify_state_change (old_accessible,
ATK_STATE_FOCUSED,
!focus_in);
if (new_accessible)
atk_object_notify_state_change (new_accessible,
ATK_STATE_FOCUSED,
focus_in);
g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_KEY_FOCUS]); g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_KEY_FOCUS]);
} }
@ -2114,7 +2102,6 @@ clutter_stage_set_key_focus (ClutterStage *stage,
ClutterActor *actor) ClutterActor *actor)
{ {
ClutterStagePrivate *priv; ClutterStagePrivate *priv;
AtkObject *old_accessible, *new_accessible = NULL;
g_return_if_fail (CLUTTER_IS_STAGE (stage)); g_return_if_fail (CLUTTER_IS_STAGE (stage));
g_return_if_fail (actor == NULL || CLUTTER_IS_ACTOR (actor)); g_return_if_fail (actor == NULL || CLUTTER_IS_ACTOR (actor));
@ -2136,7 +2123,6 @@ clutter_stage_set_key_focus (ClutterStage *stage,
ClutterActor *old_focused_actor; ClutterActor *old_focused_actor;
old_focused_actor = priv->key_focused_actor; old_focused_actor = priv->key_focused_actor;
old_accessible = clutter_actor_get_accessible (old_focused_actor);
/* set key_focused_actor to NULL before emitting the signal or someone /* set key_focused_actor to NULL before emitting the signal or someone
* might hide the previously focused actor in the signal handler * might hide the previously focused actor in the signal handler
@ -2147,7 +2133,6 @@ clutter_stage_set_key_focus (ClutterStage *stage,
} }
else else
{ {
old_accessible = clutter_actor_get_accessible (CLUTTER_ACTOR (stage));
_clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), FALSE); _clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), FALSE);
} }
/* Note, if someone changes key focus in focus-out signal handler we'd be /* Note, if someone changes key focus in focus-out signal handler we'd be
@ -2169,26 +2154,14 @@ clutter_stage_set_key_focus (ClutterStage *stage,
{ {
if (actor != NULL) if (actor != NULL)
{ {
new_accessible = clutter_actor_get_accessible (actor);
_clutter_actor_set_has_key_focus (actor, TRUE); _clutter_actor_set_has_key_focus (actor, TRUE);
} }
else else
{ {
new_accessible = clutter_actor_get_accessible (CLUTTER_ACTOR (stage));
_clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), TRUE); _clutter_actor_set_has_key_focus (CLUTTER_ACTOR (stage), TRUE);
} }
} }
if (old_accessible)
atk_object_notify_state_change (old_accessible,
ATK_STATE_FOCUSED,
FALSE);
if (new_accessible)
atk_object_notify_state_change (new_accessible,
ATK_STATE_FOCUSED,
TRUE);
g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_KEY_FOCUS]); g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_KEY_FOCUS]);
} }