diff --git a/clutter/clutter-device-manager.c b/clutter/clutter-device-manager.c index 489aa9b4d..cf0d4fca0 100644 --- a/clutter/clutter-device-manager.c +++ b/clutter/clutter-device-manager.c @@ -422,7 +422,7 @@ _clutter_device_manager_update_devices (ClutterDeviceManager *device_manager) * since the source of the events will always be set to be * the stage */ - if (!_clutter_stage_get_motion_events_enabled (device->stage)) + if (!clutter_stage_get_motion_events_enabled (device->stage)) continue; _clutter_input_device_update (device, TRUE); diff --git a/clutter/clutter-drag-action.c b/clutter/clutter-drag-action.c index 99efa2a31..d58054020 100644 --- a/clutter/clutter-drag-action.c +++ b/clutter/clutter-drag-action.c @@ -164,7 +164,7 @@ emit_drag_begin (ClutterDragAction *action, ClutterDragActionPrivate *priv = action->priv; if (priv->stage != NULL) - _clutter_stage_set_motion_events_enabled (priv->stage, FALSE); + clutter_stage_set_motion_events_enabled (priv->stage, FALSE); g_signal_emit (action, drag_signals[DRAG_BEGIN], 0, actor, @@ -262,8 +262,8 @@ emit_drag_end (ClutterDragAction *action, priv->capture_id = 0; } - _clutter_stage_set_motion_events_enabled (priv->stage, - priv->motion_events_enabled); + clutter_stage_set_motion_events_enabled (priv->stage, + priv->motion_events_enabled); priv->in_drag = FALSE; } @@ -345,7 +345,7 @@ on_button_press (ClutterActor *actor, &priv->transformed_press_y); priv->motion_events_enabled = - _clutter_stage_get_motion_events_enabled (priv->stage); + clutter_stage_get_motion_events_enabled (priv->stage); if (priv->x_drag_threshold == 0 || priv->y_drag_threshold == 0) emit_drag_begin (action, actor, event); diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index fae24241b..972d41d78 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -247,8 +247,8 @@ clutter_redraw (ClutterStage *stage) * clutter_set_motion_events_enabled: * @enable: %TRUE to enable per-actor motion events * - * Sets whether per-actor motion events should be enabled or not (the - * default is to enable them). + * Sets whether per-actor motion events should be enabled or not on + * all #ClutterStages managed by Clutter. * * If @enable is %FALSE the following events will not work: * @@ -259,6 +259,8 @@ clutter_redraw (ClutterStage *stage) * * * Since: 0.6 + * + * Deprecated: 1.8: Use clutter_stage_set_motion_events_enabled() instead. */ void clutter_set_motion_events_enabled (gboolean enable) @@ -283,7 +285,7 @@ clutter_set_motion_events_enabled (gboolean enable) l != NULL; l = l->next) { - _clutter_stage_set_motion_events_enabled (l->data, enable); + clutter_stage_set_motion_events_enabled (l->data, enable); } } @@ -295,6 +297,8 @@ clutter_set_motion_events_enabled (gboolean enable) * Return value: %TRUE if the motion events are enabled * * Since: 0.6 + * + * Deprecated: 1.8: Use clutter_stage_get_motion_events_enabled() instead. */ gboolean clutter_get_motion_events_enabled (void) @@ -2132,7 +2136,7 @@ _clutter_process_event_details (ClutterActor *stage, case CLUTTER_MOTION: /* only the stage gets motion events if they are enabled */ - if (!_clutter_stage_get_motion_events_enabled (CLUTTER_STAGE (stage)) && + if (!clutter_stage_get_motion_events_enabled (CLUTTER_STAGE (stage)) && event->any.source == NULL) { /* Only stage gets motion events */ diff --git a/clutter/clutter-main.h b/clutter/clutter-main.h index 7e7f56c9d..f2d821eb7 100644 --- a/clutter/clutter-main.h +++ b/clutter/clutter-main.h @@ -143,8 +143,10 @@ guint clutter_threads_add_repaint_func (GSourceFunc func, GDestroyNotify notify); void clutter_threads_remove_repaint_func (guint handle_id); +#ifndef CLUTTER_DISABLE_DEPRECATED void clutter_set_motion_events_enabled (gboolean enable); gboolean clutter_get_motion_events_enabled (void); +#endif /* CLUTTER_DISABLE_DEPRECATED */ void clutter_set_default_frame_rate (guint frames_per_sec); guint clutter_get_default_frame_rate (void); @@ -165,7 +167,6 @@ ClutterInputDevice *clutter_get_input_device_for_id (gint id_); void clutter_grab_pointer_for_device (ClutterActor *actor, gint id_); - void clutter_ungrab_pointer_for_device (gint id_); PangoFontMap * clutter_get_font_map (void); diff --git a/clutter/clutter-stage-private.h b/clutter/clutter-stage-private.h index d53849ff0..07ac99d67 100644 --- a/clutter/clutter-stage-private.h +++ b/clutter/clutter-stage-private.h @@ -90,10 +90,6 @@ void _clutter_stage_remove_device (ClutterStage *stage, gboolean _clutter_stage_has_device (ClutterStage *stage, ClutterInputDevice *device); -void _clutter_stage_set_motion_events_enabled (ClutterStage *stage, - gboolean enabled); -gboolean _clutter_stage_get_motion_events_enabled (ClutterStage *stage); - CoglFramebuffer *_clutter_stage_get_active_framebuffer (ClutterStage *stage); gint32 _clutter_stage_acquire_pick_id (ClutterStage *stage, diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index ae04fc740..6c5cf575c 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -3974,23 +3974,69 @@ _clutter_stage_has_device (ClutterStage *stage, return g_hash_table_lookup (priv->devices, device) != NULL; } +/** + * clutter_stage_set_motion_events_enabled: + * @stage: a #ClutterStage + * @enabled: %TRUE to enable the motion events delivery, and %FALSE + * otherwise + * + * Sets whether per-actor motion events (and relative crossing + * events) should be disabled or not. + * + * The default is %TRUE. + * + * If @enable is %FALSE the following events will not be delivered + * to the actors children of @stage. + * + * + * #ClutterActor::motion-event + * #ClutterActor::enter-event + * #ClutterActor::leave-event + * + * + * The events will still be delivered to the #ClutterStage. + * + * The main side effect of this function is that disabling the motion + * events will disable picking to detect the #ClutterActor underneath + * the pointer for each motion event. This is useful, for instance, + * when dragging a #ClutterActor across the @stage: the actor underneath + * the pointer is not going to change, so it's meaningless to perform + * a pick. + * + * Since: 1.8 + */ void -_clutter_stage_set_motion_events_enabled (ClutterStage *stage, - gboolean enabled) +clutter_stage_set_motion_events_enabled (ClutterStage *stage, + gboolean enabled) { - ClutterStagePrivate *priv = stage->priv; + ClutterStagePrivate *priv; + + g_return_if_fail (CLUTTER_IS_STAGE (stage)); + + priv = stage->priv; enabled = !!enabled; if (priv->motion_events_enabled != enabled) - { - priv->motion_events_enabled = enabled; - } + priv->motion_events_enabled = enabled; } +/** + * clutter_stage_get_motion_events_enabled: + * @stage: a #ClutterStage + * + * Retrieves the value set using clutter_stage_set_motion_events_enabled(). + * + * Return value: %TRUE if the per-actor motion event delivery is enabled + * and %FALSE otherwise + * + * Since: 1.8 + */ gboolean -_clutter_stage_get_motion_events_enabled (ClutterStage *stage) +clutter_stage_get_motion_events_enabled (ClutterStage *stage) { + g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); + return stage->priv->motion_events_enabled; } diff --git a/clutter/clutter-stage.h b/clutter/clutter-stage.h index 3098c79f1..54cb918b4 100644 --- a/clutter/clutter-stage.h +++ b/clutter/clutter-stage.h @@ -262,6 +262,11 @@ void clutter_stage_set_accept_focus (ClutterStage *stage, gboolean accept_focus); gboolean clutter_stage_get_accept_focus (ClutterStage *stage); + +void clutter_stage_set_motion_events_enabled (ClutterStage *stage, + gboolean enabled); +gboolean clutter_stage_get_motion_events_enabled (ClutterStage *stage); + /* Commodity macro, for mallum only */ #define clutter_stage_add(stage,actor) G_STMT_START { \ if (CLUTTER_IS_STAGE ((stage)) && CLUTTER_IS_ACTOR ((actor))) \ diff --git a/tests/interactive/test-events.c b/tests/interactive/test-events.c index 0213c71dc..18ba50229 100644 --- a/tests/interactive/test-events.c +++ b/tests/interactive/test-events.c @@ -70,17 +70,20 @@ blue_button_cb (ClutterActor *actor, } static gboolean -red_button_cb (ClutterActor *actor, - ClutterEvent *event, - gpointer data) +red_button_cb (ClutterActor *actor, + ClutterEvent *event, + gpointer data) { + ClutterActor *stage; if (IsMotion) IsMotion = FALSE; else IsMotion = TRUE; - clutter_set_motion_events_enabled (IsMotion); + stage = clutter_actor_get_stage (actor); + clutter_stage_set_motion_events_enabled (CLUTTER_STAGE (stage), + IsMotion); g_print ("*** Per actor motion events %s ***\n", IsMotion ? "enabled" : "disabled"); diff --git a/tests/interactive/test-grab.c b/tests/interactive/test-grab.c index 946cf7216..26ef6a669 100644 --- a/tests/interactive/test-grab.c +++ b/tests/interactive/test-grab.c @@ -107,10 +107,16 @@ green_press_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { - clutter_set_motion_events_enabled (!clutter_get_motion_events_enabled ()); + ClutterActor *stage; + gboolean enabled; + + stage = clutter_actor_get_stage (actor); + enabled = !clutter_stage_get_motion_events_enabled (CLUTTER_STAGE (stage)); + + clutter_stage_set_motion_events_enabled (CLUTTER_STAGE (stage), enabled); g_print ("per actor motion events are now %s\n", - clutter_get_motion_events_enabled () ? "enabled" : "disabled"); + enabled ? "enabled" : "disabled"); return FALSE; }