click-action: add touch event support

Allow for touch events to trigger the "clicked" event on
ClickAction without introducing API changes.

https://bugzilla.gnome.org/show_bug.cgi?id=683936
This commit is contained in:
Emanuele Aina 2012-09-13 11:20:00 +02:00
parent d616fd628b
commit e6fcdb0644

View File

@ -116,6 +116,8 @@ struct _ClutterClickActionPrivate
gint drag_threshold; gint drag_threshold;
guint press_button; guint press_button;
gint press_device_id;
ClutterEventSequence *press_sequence;
ClutterModifierType modifier_state; ClutterModifierType modifier_state;
gfloat press_x; gfloat press_x;
gfloat press_y; gfloat press_y;
@ -277,14 +279,17 @@ on_event (ClutterActor *actor,
ClutterClickAction *action) ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv = action->priv; ClutterClickActionPrivate *priv = action->priv;
gboolean has_button = TRUE;
if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action))) if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action)))
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
switch (clutter_event_type (event)) switch (clutter_event_type (event))
{ {
case CLUTTER_TOUCH_BEGIN:
has_button = FALSE;
case CLUTTER_BUTTON_PRESS: case CLUTTER_BUTTON_PRESS:
if (clutter_event_get_click_count (event) != 1) if (has_button && clutter_event_get_click_count (event) != 1)
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
if (priv->is_held) if (priv->is_held)
@ -293,7 +298,9 @@ on_event (ClutterActor *actor,
if (!clutter_actor_contains (actor, clutter_event_get_source (event))) if (!clutter_actor_contains (actor, clutter_event_get_source (event)))
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
priv->press_button = clutter_event_get_button (event); priv->press_button = has_button ? clutter_event_get_button (event) : 0;
priv->press_device_id = clutter_event_get_device_id (event);
priv->press_sequence = clutter_event_get_event_sequence (event);
priv->modifier_state = clutter_event_get_state (event); priv->modifier_state = clutter_event_get_state (event);
clutter_event_get_coords (event, &priv->press_x, &priv->press_y); clutter_event_get_coords (event, &priv->press_x, &priv->press_y);
@ -344,17 +351,22 @@ on_captured_event (ClutterActor *stage,
ClutterClickActionPrivate *priv = action->priv; ClutterClickActionPrivate *priv = action->priv;
ClutterActor *actor; ClutterActor *actor;
ClutterModifierType modifier_state; ClutterModifierType modifier_state;
gboolean has_button = TRUE;
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action));
switch (clutter_event_type (event)) switch (clutter_event_type (event))
{ {
case CLUTTER_TOUCH_END:
has_button = FALSE;
case CLUTTER_BUTTON_RELEASE: case CLUTTER_BUTTON_RELEASE:
if (!priv->is_held) if (!priv->is_held)
return CLUTTER_EVENT_STOP; return CLUTTER_EVENT_STOP;
if (clutter_event_get_button (event) != priv->press_button || if ((has_button && clutter_event_get_button (event) != priv->press_button) ||
clutter_event_get_click_count (event) != 1) (has_button && clutter_event_get_click_count (event) != 1) ||
clutter_event_get_device_id (event) != priv->press_device_id ||
clutter_event_get_event_sequence (event) != priv->press_sequence)
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
click_action_set_held (action, FALSE); click_action_set_held (action, FALSE);
@ -397,6 +409,7 @@ on_captured_event (ClutterActor *stage,
break; break;
case CLUTTER_MOTION: case CLUTTER_MOTION:
case CLUTTER_TOUCH_UPDATE:
{ {
gfloat motion_x, motion_y; gfloat motion_x, motion_y;
gfloat delta_x, delta_y; gfloat delta_x, delta_y;