/* each time the timeline animating the label completes, swap the direction */ static void timeline_completed (ClutterTimeline *timeline, gpointer user_data) { clutter_timeline_set_direction (timeline, !clutter_timeline_get_direction (timeline)); clutter_timeline_start (timeline); }
static void reverse_timeline (ClutterTimeline *timeline, gpointer data) { ClutterTimelineDirection direction = clutter_timeline_get_direction (timeline); if (direction == CLUTTER_TIMELINE_FORWARD) clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_BACKWARD); else clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_FORWARD); clutter_timeline_start (timeline); }
static void reverse_timeline (ClutterTimeline *timeline) { ClutterTimelineDirection dir = clutter_timeline_get_direction (timeline); if (dir == CLUTTER_TIMELINE_FORWARD) dir = CLUTTER_TIMELINE_BACKWARD; else dir = CLUTTER_TIMELINE_FORWARD; clutter_timeline_set_direction (timeline, dir); }
static void timeline_completed (ClutterTimeline *timeline) { ClutterTimelineDirection direction; direction = clutter_timeline_get_direction (timeline); if (direction == CLUTTER_TIMELINE_FORWARD) direction = CLUTTER_TIMELINE_BACKWARD; else direction = CLUTTER_TIMELINE_FORWARD; clutter_timeline_set_direction (timeline, direction); }
/** * clutter_timeline_clone: * @timeline: #ClutterTimeline to duplicate. * * Create a new #ClutterTimeline instance which has property values * matching that of supplied timeline. The cloned timeline will not * be started and will not be positioned to the current position of * @timeline: you will have to start it with clutter_timeline_start(). * * Return Value: a new #ClutterTimeline, cloned from @timeline * * Since: 0.4 */ ClutterTimeline * clutter_timeline_clone (ClutterTimeline *timeline) { ClutterTimeline *copy; g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL); copy = g_object_new (CLUTTER_TYPE_TIMELINE, "duration", clutter_timeline_get_duration (timeline), "loop", clutter_timeline_get_loop (timeline), "delay", clutter_timeline_get_delay (timeline), "direction", clutter_timeline_get_direction (timeline), NULL); return copy; }
static void mex_tile_timeline_completed_cb (ClutterTimeline *timeline, MexTile *tile) { ClutterTimelineDirection direction = clutter_timeline_get_direction (timeline); /* Reversing the direction and rewinding will make sure that on * completion, progress stays at 0.0 or 1.0, depending on the * direction of the timeline. */ clutter_timeline_set_direction (timeline, (direction == CLUTTER_TIMELINE_FORWARD) ? CLUTTER_TIMELINE_BACKWARD : CLUTTER_TIMELINE_FORWARD); clutter_timeline_rewind (timeline); mex_tile_important_new_frame_cb (timeline, 0, tile); }
static void mex_content_box_timeline_completed (ClutterTimeline *timeline, MexContentBox *box) { MexContentBoxPrivate *priv = box->priv; priv->extras_visible = (clutter_timeline_get_direction (timeline) == CLUTTER_TIMELINE_FORWARD); if (!priv->extras_visible) { /* box is now "closed" */ mx_stylable_set_style_class (MX_STYLABLE (box), ""); g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_OPEN]); } if (!priv->is_open) mex_content_view_set_content (MEX_CONTENT_VIEW (priv->action_list), NULL); }
static void interpolation_completed_cb (ClutterTimeline *timeline, MxAdjustment *adjustment) { MxAdjustmentPrivate *priv = adjustment->priv; if (priv->elastic && priv->clamp_value) { if (clutter_timeline_get_direction (priv->interpolation) == CLUTTER_TIMELINE_FORWARD) { clutter_timeline_set_direction (priv->interpolation, CLUTTER_TIMELINE_BACKWARD); clutter_timeline_set_duration (priv->interpolation, 250); clutter_timeline_rewind (priv->interpolation); if (priv->new_position < priv->lower) { priv->old_position = priv->lower; clutter_timeline_start (priv->interpolation); } else if (priv->new_position > (priv->upper - priv->page_size)) { priv->old_position = priv->upper - priv->page_size; clutter_timeline_start (priv->interpolation); } } else { stop_interpolation (adjustment); mx_adjustment_set_value (adjustment, priv->old_position); } } else { stop_interpolation (adjustment); mx_adjustment_set_value (adjustment, priv->new_position); } g_signal_emit (adjustment, signals[INTERPOLATION_COMPLETED], 0); }
static gboolean mouse_moved(CurrentCallView *self) { g_return_val_if_fail(IS_CURRENT_CALL_VIEW(self), FALSE); auto priv = CURRENT_CALL_VIEW_GET_PRIVATE(self); priv->time_last_mouse_motion = g_get_monotonic_time(); // since the mouse moved, make sure the controls are shown if (clutter_timeline_get_direction(CLUTTER_TIMELINE(priv->fade_info)) == CLUTTER_TIMELINE_FORWARD) { clutter_timeline_set_direction(CLUTTER_TIMELINE(priv->fade_info), CLUTTER_TIMELINE_BACKWARD); clutter_timeline_set_direction(CLUTTER_TIMELINE(priv->fade_controls), CLUTTER_TIMELINE_BACKWARD); if (!clutter_timeline_is_playing(CLUTTER_TIMELINE(priv->fade_info))) { clutter_timeline_rewind(CLUTTER_TIMELINE(priv->fade_info)); clutter_timeline_rewind(CLUTTER_TIMELINE(priv->fade_controls)); clutter_timeline_start(CLUTTER_TIMELINE(priv->fade_info)); clutter_timeline_start(CLUTTER_TIMELINE(priv->fade_controls)); } } return FALSE; // propogate event }
static gboolean timeout_check_last_motion_event(CurrentCallView *self) { g_return_val_if_fail(IS_CURRENT_CALL_VIEW(self), G_SOURCE_REMOVE); auto priv = CURRENT_CALL_VIEW_GET_PRIVATE(self); auto current_time = g_get_monotonic_time(); if (current_time - priv->time_last_mouse_motion >= CONTROLS_FADE_TIMEOUT) { // timeout has passed, hide the controls if (clutter_timeline_get_direction(CLUTTER_TIMELINE(priv->fade_info)) == CLUTTER_TIMELINE_BACKWARD) { clutter_timeline_set_direction(CLUTTER_TIMELINE(priv->fade_info), CLUTTER_TIMELINE_FORWARD); clutter_timeline_set_direction(CLUTTER_TIMELINE(priv->fade_controls), CLUTTER_TIMELINE_FORWARD); if (!clutter_timeline_is_playing(CLUTTER_TIMELINE(priv->fade_info))) { clutter_timeline_rewind(CLUTTER_TIMELINE(priv->fade_info)); clutter_timeline_rewind(CLUTTER_TIMELINE(priv->fade_controls)); clutter_timeline_start(CLUTTER_TIMELINE(priv->fade_info)); clutter_timeline_start(CLUTTER_TIMELINE(priv->fade_controls)); } } } return G_SOURCE_CONTINUE; }
void st_theme_node_transition_update (StThemeNodeTransition *transition, StThemeNode *new_node) { StThemeNodeTransitionPrivate *priv = transition->priv; StThemeNode *old_node; ClutterTimelineDirection direction; g_return_if_fail (ST_IS_THEME_NODE_TRANSITION (transition)); g_return_if_fail (ST_IS_THEME_NODE (new_node)); direction = clutter_timeline_get_direction (priv->timeline); old_node = (direction == CLUTTER_TIMELINE_FORWARD) ? priv->old_theme_node : priv->new_theme_node; /* If the update is the reversal of the current transition, * we reverse the timeline. * Otherwise, we should initiate a new transition from the * current state to the new one; this is hard to do if the * transition is in an intermediate state, so we just cancel * the ongoing transition in that case. * Note that reversing a timeline before any time elapsed * results in the timeline's time position being set to the * full duration - this is not what we want, so we cancel the * transition as well in that case. */ if (st_theme_node_equal (new_node, old_node)) { if (clutter_timeline_get_elapsed_time (priv->timeline) > 0) { if (direction == CLUTTER_TIMELINE_FORWARD) clutter_timeline_set_direction (priv->timeline, CLUTTER_TIMELINE_BACKWARD); else clutter_timeline_set_direction (priv->timeline, CLUTTER_TIMELINE_FORWARD); } else { clutter_timeline_stop (priv->timeline); g_signal_emit (transition, signals[COMPLETED], 0); } } else { if (clutter_timeline_get_elapsed_time (priv->timeline) > 0) { clutter_timeline_stop (priv->timeline); g_signal_emit (transition, signals[COMPLETED], 0); } else { guint new_duration = st_theme_node_get_transition_duration (new_node); clutter_timeline_set_duration (priv->timeline, new_duration); /* If the change doesn't affect painting, we don't need to redraw, * but we still need to replace the node so that we properly share * caching with the painting that happens after the transition finishes. */ if (!st_theme_node_paint_equal (priv->new_theme_node, new_node)) priv->needs_setup = TRUE; g_object_unref (priv->new_theme_node); priv->new_theme_node = g_object_ref (new_node); } } }