diff --git a/clutter/clutter/clutter-accessibility.c b/clutter/clutter/clutter-accessibility.c index 8b803b2d75150ef86d70d66bb30e1f351be76ed1..8727d7e1db98dcdb9b22ab113c3d69be9dc91b4c 100644 --- a/clutter/clutter/clutter-accessibility.c +++ b/clutter/clutter/clutter-accessibility.c @@ -230,6 +230,8 @@ check_key_visibility (ClutterStage *stage) ClutterActor *focus; focus = clutter_stage_get_key_focus (stage); + if (focus == NULL) + focus = CLUTTER_ACTOR (stage); accessible = clutter_actor_get_accessible (focus); g_return_val_if_fail (accessible != NULL, 0); diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index fa6d8a5157ca2e0406bf90d17cb169c60f000def..074f5fe4d6b7b1e65482fa5a25f28a67f2888605 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -2110,7 +2110,11 @@ clutter_stage_set_key_focus (ClutterStage *stage, /* normalize the key focus. NULL == stage */ if (actor == CLUTTER_ACTOR (stage)) - actor = NULL; + { + g_warning ("Stage key focus was set to stage itself, " + "unsetting focus instead"); + actor = NULL; + } /* avoid emitting signals and notifications if we're setting the same * actor as the key focus @@ -2171,7 +2175,7 @@ clutter_stage_set_key_focus (ClutterStage *stage, * * Retrieves the actor that is currently under key focus. * - * Return value: (transfer none): the actor with key focus, or the stage + * Return value: (transfer none) (nullable): the actor with key focus */ ClutterActor * clutter_stage_get_key_focus (ClutterStage *stage) @@ -2181,10 +2185,7 @@ clutter_stage_get_key_focus (ClutterStage *stage) g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL); priv = clutter_stage_get_instance_private (stage); - if (priv->key_focused_actor) - return priv->key_focused_actor; - - return CLUTTER_ACTOR (stage); + return priv->key_focused_actor; } /*** Perspective boxed type ******/ @@ -4178,10 +4179,13 @@ clutter_stage_get_event_actor (ClutterStage *stage, { ClutterInputDevice *device; ClutterEventSequence *sequence; + ClutterStagePrivate *priv; g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL); g_return_val_if_fail (event != NULL, NULL); + priv = clutter_stage_get_instance_private (stage); + switch (clutter_event_type (event)) { case CLUTTER_KEY_PRESS: @@ -4193,7 +4197,8 @@ clutter_stage_get_event_actor (ClutterStage *stage, case CLUTTER_IM_COMMIT: case CLUTTER_IM_DELETE: case CLUTTER_IM_PREEDIT: - return clutter_stage_get_key_focus (stage); + return priv->key_focused_actor ? + priv->key_focused_actor : CLUTTER_ACTOR (stage); case CLUTTER_MOTION: case CLUTTER_ENTER: case CLUTTER_LEAVE: diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c index f3823e3c7cbe14046ca514fe82561e3e684ec2d9..ac436e8f6dd50e9fd30999c792b61f325c5d78d6 100644 --- a/src/backends/meta-stage.c +++ b/src/backends/meta-stage.c @@ -307,12 +307,6 @@ key_focus_actor_changed (ClutterStage *stage, { ClutterActor *key_focus = clutter_stage_get_key_focus (stage); - /* If there's no explicit key focus, clutter_stage_get_key_focus() - * returns the stage. - */ - if (key_focus == CLUTTER_ACTOR (stage)) - key_focus = NULL; - clutter_stage_set_active (stage, key_focus != NULL); } diff --git a/src/core/events.c b/src/core/events.c index ba2dca734e0599eb3cfa4321527f3abab17c25bc..9bf4a0001f395b629ce8c2396e638fae16a5d1fd 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -77,7 +77,7 @@ stage_has_key_focus (MetaDisplay *display) { ClutterStage *stage = stage_from_display (display); - return clutter_stage_get_key_focus (stage) == CLUTTER_ACTOR (stage); + return clutter_stage_get_key_focus (stage) == NULL; } static gboolean diff --git a/src/tests/clutter/interactive/test-events.c b/src/tests/clutter/interactive/test-events.c index 752d423c04583f8ba5ce354ce1bff7b264e1149b..c17dd84115e025c32bcbc158208054a976095e50 100644 --- a/src/tests/clutter/interactive/test-events.c +++ b/src/tests/clutter/interactive/test-events.c @@ -206,6 +206,8 @@ input_cb (ClutterActor *actor, event_type == CLUTTER_KEY_RELEASE) { source_actor = clutter_stage_get_key_focus (CLUTTER_STAGE (stage)); + if (source_actor == NULL) + source_actor = stage; } else { diff --git a/src/tests/meta-test-shell.c b/src/tests/meta-test-shell.c index b06cf1f269e775577d8f596871a0d0617d4260b5..83a169652f5f8ad7ed9035ddaeb2b8e7a35d5917 100644 --- a/src/tests/meta-test-shell.c +++ b/src/tests/meta-test-shell.c @@ -326,7 +326,7 @@ on_overlay_key (MetaDisplay *display, { test_shell->overview.grab = clutter_stage_grab (stage, CLUTTER_ACTOR (stage)); test_shell->overview.prev_focus = clutter_stage_get_key_focus (stage); - clutter_stage_set_key_focus (stage, CLUTTER_ACTOR (stage)); + clutter_stage_set_key_focus (stage, NULL); } else { diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 7f3499ea6e0ad04138d04db78df402790942e8ec..0b372e3dfa043d74c3a6e1b46a8228687a27d957 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -1301,7 +1301,7 @@ stage_has_focus_actor (MetaX11Display *x11_display) key_focus = clutter_stage_get_key_focus (stage); - return key_focus != CLUTTER_ACTOR (stage); + return key_focus != NULL; } static void