static void gtk_switch_pan_gesture_drag_end (GtkGestureDrag *gesture, gdouble x, gdouble y, GtkSwitch *sw) { GtkSwitchPrivate *priv = sw->priv; GdkEventSequence *sequence; GtkAllocation allocation; gboolean active; sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); if (gtk_gesture_get_sequence_state (GTK_GESTURE (gesture), sequence) == GTK_EVENT_SEQUENCE_CLAIMED) { gtk_widget_get_allocation (GTK_WIDGET (sw), &allocation); /* if half the handle passed the middle of the switch, then we * consider it to be on */ active = priv->handle_pos >= 0.5; } else if (!gtk_gesture_handles_sequence (priv->multipress_gesture, sequence)) active = priv->is_active; else return; priv->handle_pos = active ? 1.0 : 0.0; gtk_switch_set_active (sw, active); gtk_widget_queue_allocate (GTK_WIDGET (sw)); }
static gboolean gtk_switch_on_frame_clock_update (GtkWidget *widget, GdkFrameClock *clock, gpointer user_data) { GtkSwitch *sw = GTK_SWITCH (widget); GtkSwitchPrivate *priv = sw->priv; gtk_progress_tracker_advance_frame (&priv->tracker, gdk_frame_clock_get_frame_time (clock)); if (gtk_progress_tracker_get_state (&priv->tracker) != GTK_PROGRESS_STATE_AFTER) { if (priv->is_active) priv->handle_pos = 1.0 - gtk_progress_tracker_get_ease_out_cubic (&priv->tracker, FALSE); else priv->handle_pos = gtk_progress_tracker_get_ease_out_cubic (&priv->tracker, FALSE); } else { gtk_switch_set_active (sw, !priv->is_active); } gtk_widget_queue_allocate (GTK_WIDGET (sw)); return G_SOURCE_CONTINUE; }
static void gtk_switch_pan_gesture_pan (GtkGesturePan *gesture, GtkPanDirection direction, gdouble offset, GtkSwitch *sw) { GtkWidget *widget = GTK_WIDGET (sw); GtkSwitchPrivate *priv = sw->priv; gint width; if (direction == GTK_PAN_DIRECTION_LEFT) offset = -offset; gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); width = gtk_widget_get_allocated_width (widget); if (priv->is_active) offset += width / 2; offset /= width / 2; /* constrain the handle within the trough width */ priv->handle_pos = CLAMP (offset, 0, 1.0); /* we need to redraw the handle */ gtk_widget_queue_allocate (widget); }
static int eel_wrap_table_draw (GtkWidget *widget, cairo_t *cr) { EelWrapTable *wrap_table; GList *iterator; g_assert (EEL_IS_WRAP_TABLE (widget)); g_assert (gtk_widget_get_realized (widget)); wrap_table = EEL_WRAP_TABLE (widget); for (iterator = wrap_table->details->children; iterator; iterator = iterator->next) { g_assert (GTK_IS_WIDGET (iterator->data)); gtk_container_propagate_draw (GTK_CONTAINER (widget), GTK_WIDGET (iterator->data), cr); } /*Redraw the table once and only once to ensure it is displayed */ if (wrap_table->details->drawn == FALSE){ gtk_widget_queue_allocate (GTK_WIDGET(widget)); wrap_table->details->drawn = TRUE; } return FALSE; }
/** * gtk_switch_set_active: * @sw: a #GtkSwitch * @is_active: %TRUE if @sw should be active, and %FALSE otherwise * * Changes the state of @sw to the desired one. * * Since: 3.0 */ void gtk_switch_set_active (GtkSwitch *sw, gboolean is_active) { GtkSwitchPrivate *priv; g_return_if_fail (GTK_IS_SWITCH (sw)); gtk_switch_end_toggle_animation (sw); is_active = !!is_active; priv = sw->priv; if (priv->is_active != is_active) { AtkObject *accessible; gboolean handled; priv->is_active = is_active; if (priv->is_active) priv->handle_pos = 1.0; else priv->handle_pos = 0.0; g_signal_emit (sw, signals[STATE_SET], 0, is_active, &handled); g_object_notify_by_pspec (G_OBJECT (sw), switch_props[PROP_ACTIVE]); accessible = gtk_widget_get_accessible (GTK_WIDGET (sw)); atk_object_notify_state_change (accessible, ATK_STATE_CHECKED, priv->is_active); gtk_widget_queue_allocate (GTK_WIDGET (sw)); } }