diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2012-06-24 14:41:35 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2012-06-26 16:12:57 +0100 |
commit | 7550183a087c84cfb2ae4728ac3f136141c075b7 (patch) | |
tree | a5429df117183abc469106dd55cc7b7cfe6191d6 | |
parent | f12c1cc382d0da6ec32550a53f51ff9600d28b1d (diff) | |
download | clutter-wip/action-handle-event.tar.gz |
click-action: Port to ::handle-eventwip/action-handle-event
Use the newly added ClutterAction::handle-event vfunc instead of signal
handlers on the actor.
-rw-r--r-- | clutter/clutter-click-action.c | 183 |
1 files changed, 53 insertions, 130 deletions
diff --git a/clutter/clutter-click-action.c b/clutter/clutter-click-action.c index 169206753..244031b3c 100644 --- a/clutter/clutter-click-action.c +++ b/clutter/clutter-click-action.c @@ -103,12 +103,14 @@ #include "clutter-marshal.h" #include "clutter-private.h" +#define BUTTONS_MASK (CLUTTER_BUTTON1_MASK | \ + CLUTTER_BUTTON2_MASK | \ + CLUTTER_BUTTON3_MASK | \ + CLUTTER_BUTTON4_MASK | \ + CLUTTER_BUTTON5_MASK) + struct _ClutterClickActionPrivate { - ClutterActor *stage; - - guint event_id; - guint capture_id; guint long_press_id; gint long_press_threshold; @@ -150,11 +152,6 @@ static guint click_signals[LAST_SIGNAL] = { 0, }; G_DEFINE_TYPE (ClutterClickAction, clutter_click_action, CLUTTER_TYPE_ACTION); -/* forward declaration */ -static gboolean on_captured_event (ClutterActor *stage, - ClutterEvent *event, - ClutterClickAction *action); - static inline void click_action_set_pressed (ClutterClickAction *action, gboolean is_pressed) @@ -202,12 +199,6 @@ click_action_emit_long_press (gpointer data) CLUTTER_LONG_PRESS_ACTIVATE, &result); - if (priv->capture_id != 0) - { - g_signal_handler_disconnect (priv->stage, priv->capture_id); - priv->capture_id = 0; - } - click_action_set_pressed (action, FALSE); click_action_set_held (action, FALSE); @@ -271,27 +262,47 @@ click_action_cancel_long_press (ClutterClickAction *action) } } -static gboolean -on_event (ClutterActor *actor, - ClutterEvent *event, - ClutterClickAction *action) +static void +clutter_click_action_set_actor (ClutterActorMeta *meta, + ClutterActor *actor) { + ClutterClickAction *action = CLUTTER_CLICK_ACTION (meta); ClutterClickActionPrivate *priv = action->priv; - if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action))) - return CLUTTER_EVENT_PROPAGATE; + if (priv->long_press_id != 0) + { + g_source_remove (priv->long_press_id); + priv->long_press_id = 0; + } + + click_action_set_pressed (action, FALSE); + click_action_set_held (action, FALSE); + + CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor); +} + +static void +clutter_click_action_handle_event (ClutterAction *action, + const ClutterEvent *event) +{ + ClutterClickAction *click_action = CLUTTER_CLICK_ACTION (action); + ClutterClickActionPrivate *priv = click_action->priv; + ClutterModifierType modifier_state; + ClutterActor *actor; + + actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); switch (clutter_event_type (event)) { case CLUTTER_BUTTON_PRESS: if (clutter_event_get_click_count (event) != 1) - return CLUTTER_EVENT_PROPAGATE; + return; if (priv->is_held) - return CLUTTER_EVENT_STOP; + return; if (!clutter_actor_contains (actor, clutter_event_get_source (event))) - return CLUTTER_EVENT_PROPAGATE; + return; priv->press_button = clutter_event_get_button (event); priv->modifier_state = clutter_event_get_state (event); @@ -308,64 +319,30 @@ on_event (ClutterActor *actor, else priv->drag_threshold = priv->long_press_threshold; - if (priv->stage == NULL) - priv->stage = clutter_actor_get_stage (actor); - - priv->capture_id = g_signal_connect_after (priv->stage, "captured-event", - G_CALLBACK (on_captured_event), - action); - - click_action_set_pressed (action, TRUE); - click_action_set_held (action, TRUE); - click_action_query_long_press (action); + click_action_set_pressed (click_action, TRUE); + click_action_set_held (click_action, TRUE); + click_action_query_long_press (click_action); break; case CLUTTER_ENTER: - click_action_set_pressed (action, priv->is_held); + click_action_set_pressed (click_action, priv->is_held); break; case CLUTTER_LEAVE: - click_action_set_pressed (action, priv->is_held); - click_action_cancel_long_press (action); + click_action_set_pressed (click_action, priv->is_held); + click_action_cancel_long_press (click_action); break; - default: - break; - } - - return CLUTTER_EVENT_PROPAGATE; -} - -static gboolean -on_captured_event (ClutterActor *stage, - ClutterEvent *event, - ClutterClickAction *action) -{ - ClutterClickActionPrivate *priv = action->priv; - ClutterActor *actor; - ClutterModifierType modifier_state; - - actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); - - switch (clutter_event_type (event)) - { case CLUTTER_BUTTON_RELEASE: if (!priv->is_held) - return CLUTTER_EVENT_STOP; + return; if (clutter_event_get_button (event) != priv->press_button || clutter_event_get_click_count (event) != 1) - return CLUTTER_EVENT_PROPAGATE; + return; - click_action_set_held (action, FALSE); - click_action_cancel_long_press (action); - - /* disconnect the capture */ - if (priv->capture_id != 0) - { - g_signal_handler_disconnect (priv->stage, priv->capture_id); - priv->capture_id = 0; - } + click_action_set_held (click_action, FALSE); + click_action_cancel_long_press (click_action); if (priv->long_press_id != 0) { @@ -374,16 +351,11 @@ on_captured_event (ClutterActor *stage, } if (!clutter_actor_contains (actor, clutter_event_get_source (event))) - return CLUTTER_EVENT_PROPAGATE; + return; /* exclude any button-mask so that we can compare * the press and release states properly */ - modifier_state = clutter_event_get_state (event) & - ~(CLUTTER_BUTTON1_MASK | - CLUTTER_BUTTON2_MASK | - CLUTTER_BUTTON3_MASK | - CLUTTER_BUTTON4_MASK | - CLUTTER_BUTTON5_MASK); + modifier_state = clutter_event_get_state (event) & ~BUTTONS_MASK; /* if press and release states don't match we * simply ignore modifier keys. i.e. modifier keys @@ -392,7 +364,7 @@ on_captured_event (ClutterActor *stage, if (modifier_state != priv->modifier_state) priv->modifier_state = 0; - click_action_set_pressed (action, FALSE); + click_action_set_pressed (click_action, FALSE); g_signal_emit (action, click_signals[CLICKED], 0, actor); break; @@ -402,7 +374,7 @@ on_captured_event (ClutterActor *stage, gfloat delta_x, delta_y; if (!priv->is_held) - return CLUTTER_EVENT_PROPAGATE; + return; clutter_event_get_coords (event, &motion_x, &motion_y); @@ -411,58 +383,13 @@ on_captured_event (ClutterActor *stage, if (delta_x > priv->drag_threshold || delta_y > priv->drag_threshold) - click_action_cancel_long_press (action); + click_action_cancel_long_press (click_action); } break; default: break; } - - return CLUTTER_EVENT_STOP; -} - -static void -clutter_click_action_set_actor (ClutterActorMeta *meta, - ClutterActor *actor) -{ - ClutterClickAction *action = CLUTTER_CLICK_ACTION (meta); - ClutterClickActionPrivate *priv = action->priv; - - if (priv->event_id != 0) - { - ClutterActor *old_actor = clutter_actor_meta_get_actor (meta); - - if (old_actor != NULL) - g_signal_handler_disconnect (old_actor, priv->event_id); - - priv->event_id = 0; - } - - if (priv->capture_id != 0) - { - if (priv->stage != NULL) - g_signal_handler_disconnect (priv->stage, priv->capture_id); - - priv->capture_id = 0; - priv->stage = NULL; - } - - if (priv->long_press_id != 0) - { - g_source_remove (priv->long_press_id); - priv->long_press_id = 0; - } - - click_action_set_pressed (action, FALSE); - click_action_set_held (action, FALSE); - - if (actor != NULL) - priv->event_id = g_signal_connect (actor, "event", - G_CALLBACK (on_event), - action); - - CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor); } static void @@ -526,9 +453,12 @@ clutter_click_action_class_init (ClutterClickActionClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass); + ClutterActionClass *action_class = CLUTTER_ACTION_CLASS (klass); g_type_class_add_private (klass, sizeof (ClutterClickActionPrivate)); + action_class->handle_event = clutter_click_action_handle_event; + meta_class->set_actor = clutter_click_action_set_actor; gobject_class->set_property = clutter_click_action_set_property; @@ -716,13 +646,6 @@ clutter_click_action_release (ClutterClickAction *action) if (!priv->is_held) return; - /* disconnect the capture */ - if (priv->capture_id != 0) - { - g_signal_handler_disconnect (priv->stage, priv->capture_id); - priv->capture_id = 0; - } - click_action_cancel_long_press (action); click_action_set_held (action, FALSE); click_action_set_pressed (action, FALSE); |