static MxFocusable * mx_stack_accept_focus (MxFocusable *focusable, MxFocusHint hint) { GList *c, *children; MxStackPrivate *priv = MX_STACK (focusable)->priv; ClutterContainer *container = CLUTTER_CONTAINER (focusable); focusable = NULL; switch (hint) { default: case MX_FOCUS_HINT_PRIOR: if (priv->current_focus && (!MX_IS_WIDGET (priv->current_focus) || !mx_widget_get_disabled ((MxWidget *)priv->current_focus))) { focusable = mx_focusable_accept_focus (MX_FOCUSABLE (priv->current_focus), hint); if (focusable) break; } /* This purposefully runs into the next case statement */ case MX_FOCUS_HINT_FIRST: case MX_FOCUS_HINT_LAST: children = clutter_container_get_children (container); if (hint == MX_FOCUS_HINT_LAST) children = g_list_reverse (children); if (children) { c = children; while (c && !focusable) { ClutterActor *child = c->data; c = c->next; if (!MX_IS_FOCUSABLE (child)) continue; if (MX_IS_WIDGET (child) && mx_widget_get_disabled ((MxWidget *)child)) continue; priv->current_focus = child; focusable = mx_focusable_accept_focus (MX_FOCUSABLE (child), hint); } g_list_free (children); } break; } return focusable; }
static gboolean mx_button_leave (ClutterActor *actor, ClutterCrossingEvent *event) { MxButton *button = MX_BUTTON (actor); MxWidget *widget = MX_WIDGET (actor); if (event->source != actor) return FALSE; /* hide the tooltip */ if (mx_widget_get_tooltip_text (widget)) mx_widget_hide_tooltip (widget); /* check if the widget is disabled */ if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; if (button->priv->is_pressed) { //clutter_ungrab_pointer (); mx_widget_long_press_cancel (widget); mx_stylable_style_pseudo_class_remove (MX_STYLABLE (widget), "active"); button->priv->is_pressed = FALSE; } mx_stylable_style_pseudo_class_remove (MX_STYLABLE (widget), "hover"); return FALSE; }
static gboolean mx_toggle_handle_button_release_event (ClutterActor *actor, ClutterButtonEvent *event, MxToggle *toggle) { ClutterActorBox box; if (mx_widget_get_disabled (MX_WIDGET (toggle))) return FALSE; if (toggle->priv->last_move == 0) mx_toggle_set_active (toggle, !toggle->priv->active); else mx_toggle_set_active (toggle, (toggle->priv->last_move > 0.0)); toggle->priv->drag_offset = -1; toggle->priv->last_move = 0; clutter_ungrab_pointer (); /* ensure the hover state is removed if the pointer left the handle * during the grab */ clutter_actor_get_allocation_box (actor, &box); if (!clutter_actor_box_contains (&box, event->x, event->y)) mx_stylable_style_pseudo_class_remove (MX_STYLABLE (actor), "hover"); return TRUE; }
static gboolean on_trough_bg_button_press_event (ClutterActor *actor, ClutterButtonEvent *event, MxSlider *self) { MxSliderPrivate *priv = self->priv; ClutterActor *stage; if (event->button != 1) return FALSE; if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; move_handle (self, event->x, event->y); stage = clutter_actor_get_stage (priv->handle); /* Turn off picking for motion events */ clutter_stage_set_motion_events_enabled (CLUTTER_STAGE (stage), FALSE); priv->capture_handler = g_signal_connect_after (stage, "captured-event", G_CALLBACK (on_handle_capture_event), self); return TRUE; }
static gboolean mx_toggle_button_release_event (ClutterActor *actor, ClutterButtonEvent *event) { MxToggle *toggle = MX_TOGGLE (actor); if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; mx_toggle_set_active (toggle, !toggle->priv->active); return FALSE; }
static gboolean mx_button_button_release (ClutterActor *actor, ClutterButtonEvent *event) { if (mx_widget_get_disabled (MX_WIDGET (actor))) return TRUE; if (event->button == 1) { mx_button_pull (MX_BUTTON (actor)); return TRUE; } return TRUE; }
static gboolean mx_button_enter (ClutterActor *actor, ClutterCrossingEvent *event) { MxWidget *widget = MX_WIDGET (actor); if (event->source != actor) return FALSE; /* check if the widget is disabled */ if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; mx_stylable_style_pseudo_class_add (MX_STYLABLE (widget), "hover"); return FALSE; }
static gboolean mx_toggle_handle_button_press_event (ClutterActor *actor, ClutterButtonEvent *event, MxToggle *toggle) { if (mx_widget_get_disabled (MX_WIDGET (toggle))) return FALSE; clutter_grab_pointer (actor); clutter_actor_transform_stage_point (CLUTTER_ACTOR (toggle), event->x, event->y, &toggle->priv->drag_offset, NULL); return FALSE; }
static gboolean mx_toggle_handle_motion_event (ClutterActor *actor, ClutterMotionEvent *event, MxToggle *toggle) { MxTogglePrivate *priv = toggle->priv; if (mx_widget_get_disabled (MX_WIDGET (toggle))) return FALSE; if (priv->drag_offset > -1) { if (priv->slide_length) { gfloat pos, x; clutter_actor_transform_stage_point (CLUTTER_ACTOR (toggle), event->x, event->y, &x, NULL); if (priv->active) pos = 1 - ((priv->drag_offset - x) / priv->slide_length); else pos = (x - priv->drag_offset) / priv->slide_length; if (pos - priv->position) priv->last_move = (pos - priv->position); priv->position = CLAMP (pos, 0, 1); } else priv->position = 0; clutter_actor_queue_relayout (actor); } return TRUE; }
static gboolean on_handle_button_press_event (ClutterActor *actor, ClutterButtonEvent *event, MxSlider *bar) { MxSliderPrivate *priv = bar->priv; ClutterActor *stage; if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; if (event->button != 1) return FALSE; if (!clutter_actor_transform_stage_point (priv->handle, event->x, event->y, &priv->x_origin, NULL)) return FALSE; g_signal_emit (bar, signals[SLIDE_START], 0); /* Account for the scrollbar-trough-handle nesting. */ priv->x_origin += clutter_actor_get_x (priv->trough); /* Turn off picking for motion events */ stage = clutter_actor_get_stage (priv->trough); clutter_stage_set_motion_events_enabled (CLUTTER_STAGE (stage), FALSE); priv->capture_handler = g_signal_connect_after (stage, "captured-event", G_CALLBACK (on_handle_capture_event), bar); return FALSE; }
static void mx_combo_box_disable_notify_cb (MxWidget *combo) { clutter_actor_set_reactive (CLUTTER_ACTOR (combo), !mx_widget_get_disabled (combo)); }