static gboolean st_button_leave (ClutterActor *actor, ClutterCrossingEvent *event) { StButton *button = ST_BUTTON (actor); gboolean ret; ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->leave_event (actor, event); if (button->priv->grabbed) { if (st_widget_get_hover (ST_WIDGET (button))) st_button_press (button, button->priv->grabbed); else st_button_release (button, button->priv->grabbed, 0); } return ret; }
static gboolean st_button_enter (ClutterActor *actor, ClutterCrossingEvent *event) { StButton *button = ST_BUTTON (actor); StButtonPrivate *priv = st_button_get_instance_private (button); gboolean ret; ret = CLUTTER_ACTOR_CLASS (st_button_parent_class)->enter_event (actor, event); if (priv->grabbed) { if (st_widget_get_hover (ST_WIDGET (button))) st_button_press (button, priv->device, priv->grabbed, NULL); else st_button_release (button, priv->device, priv->grabbed, 0, NULL); } return ret; }
static gboolean st_button_button_release (ClutterActor *actor, ClutterButtonEvent *event) { StButton *button = ST_BUTTON (actor); StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button); if (button->priv->button_mask & mask) { gboolean is_click; is_click = button->priv->grabbed && st_widget_get_hover (ST_WIDGET (button)); st_button_release (button, mask, is_click ? event->button : 0); button->priv->grabbed &= ~mask; if (button->priv->grabbed == 0) clutter_ungrab_pointer (); return TRUE; } return FALSE; }