diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index aa87e3eea..c50baac25 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -164,6 +164,8 @@ enum PROP_PERSPECTIVE, PROP_TITLE, PROP_KEY_FOCUS, + PROP_IS_GRABBED, + PROP_LAST }; @@ -1226,6 +1228,10 @@ clutter_stage_get_property (GObject *gobject, g_value_set_object (value, priv->key_focused_actor); break; + case PROP_IS_GRABBED: + g_value_set_boolean (value, !!priv->topmost_grab); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -1412,6 +1418,17 @@ clutter_stage_class_init (ClutterStageClass *klass) CLUTTER_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); + /** + * ClutterStage:is-grabbed: + * + * %TRUE if there is currently an active grab on the stage. + */ + obj_props[PROP_IS_GRABBED] = + g_param_spec_boolean ("is-grabbed", NULL, NULL, + FALSE, + CLUTTER_PARAM_READABLE | + G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); /** @@ -3898,6 +3915,7 @@ clutter_stage_grab_full (ClutterStage *stage, { ClutterStagePrivate *priv; ClutterGrab *grab; + gboolean was_grabbed; g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL); g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); @@ -3924,6 +3942,8 @@ clutter_stage_grab_full (ClutterStage *stage, grab->prev = NULL; grab->next = priv->topmost_grab; + was_grabbed = !!priv->topmost_grab; + if (priv->topmost_grab) priv->topmost_grab->prev = grab; @@ -3945,6 +3965,9 @@ clutter_stage_grab_full (ClutterStage *stage, clutter_actor_attach_grab (actor, grab); clutter_stage_notify_grab (stage, grab, grab->next); + if (was_grabbed != !!priv->topmost_grab) + g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_IS_GRABBED]); + return grab; } @@ -3991,6 +4014,7 @@ clutter_stage_unlink_grab (ClutterStage *stage, { ClutterStagePrivate *priv = stage->priv; ClutterGrab *prev, *next; + gboolean was_grabbed; /* This grab is already detached */ if (!grab->prev && !grab->next && priv->topmost_grab != grab) @@ -4004,6 +4028,8 @@ clutter_stage_unlink_grab (ClutterStage *stage, if (next) next->prev = prev; + was_grabbed = !!priv->topmost_grab; + if (priv->topmost_grab == grab) { /* This is the active grab */ @@ -4026,6 +4052,9 @@ clutter_stage_unlink_grab (ClutterStage *stage, priv->grab_state = CLUTTER_GRAB_STATE_NONE; } + if (was_grabbed != !!priv->topmost_grab) + g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_IS_GRABBED]); + if (G_UNLIKELY (clutter_debug_flags & CLUTTER_DEBUG_GRABS)) { unsigned int n_grabs = 0;