static void gtk_gesture_long_press_begin (GtkGesture *gesture, GdkEventSequence *sequence) { GtkGestureLongPressPrivate *priv; const GdkEvent *event; GtkWidget *widget; gint delay; priv = gtk_gesture_long_press_get_instance_private (GTK_GESTURE_LONG_PRESS (gesture)); sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); event = gtk_gesture_get_last_event (gesture, sequence); if (!event || (event->type != GDK_BUTTON_PRESS && event->type != GDK_TOUCH_BEGIN)) return; widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); g_object_get (gtk_widget_get_settings (widget), "gtk-long-press-time", &delay, NULL); delay = (gint)(priv->delay_factor * delay); gtk_gesture_get_point (gesture, sequence, &priv->initial_x, &priv->initial_y); priv->timeout_id = gdk_threads_add_timeout (delay, _gtk_gesture_long_press_timeout, gesture); }
static void gtk_gesture_multi_press_begin (GtkGesture *gesture, GdkEventSequence *sequence) { GtkGestureMultiPress *multi_press; GtkGestureMultiPressPrivate *priv; guint n_presses, button = 1; GdkEventSequence *current; const GdkEvent *event; GdkDevice *device; gdouble x, y; if (!gtk_gesture_handles_sequence (gesture, sequence)) return; multi_press = GTK_GESTURE_MULTI_PRESS (gesture); priv = gtk_gesture_multi_press_get_instance_private (multi_press); event = gtk_gesture_get_last_event (gesture, sequence); current = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); device = gdk_event_get_source_device (event); if (event->type == GDK_BUTTON_PRESS) button = event->button.button; else if (event->type == GDK_TOUCH_BEGIN) button = 1; else return; /* Reset the gesture if the button number changes mid-recognition */ if (priv->n_presses > 0 && priv->current_button != button) _gtk_gesture_multi_press_stop (multi_press); /* Reset also if the device changed */ if (priv->current_device && priv->current_device != device) _gtk_gesture_multi_press_stop (multi_press); priv->current_device = device; priv->current_button = button; _gtk_gesture_multi_press_update_timeout (multi_press); gtk_gesture_get_point (gesture, current, &x, &y); if (!_gtk_gesture_multi_press_check_within_threshold (multi_press, x, y)) _gtk_gesture_multi_press_stop (multi_press); /* Increment later the real counter, just if the gesture is * reset on the pressed handler */ n_presses = priv->n_release = priv->n_presses + 1; g_signal_emit (gesture, signals[PRESSED], 0, n_presses, x, y); if (priv->n_presses == 0) { priv->initial_press_x = x; priv->initial_press_y = y; } priv->n_presses++; }
void GestureController::DragGesture::end(DragGesture* dragGesture, GdkEventSequence* sequence, GtkGesture* gesture) { dragGesture->m_longPressTimeout.cancel(); if (!dragGesture->m_inDrag) { dragGesture->handleTap(gtk_gesture_get_last_event(gesture, sequence)); gtk_gesture_set_state(gesture, GTK_EVENT_SEQUENCE_DENIED); } else if (!gtk_gesture_handles_sequence(gesture, sequence)) gtk_gesture_set_state(gesture, GTK_EVENT_SEQUENCE_DENIED); }
void GestureController::DragGesture::update(DragGesture* dragGesture, double x, double y, GtkGesture* gesture) { GdkEventSequence* sequence = gtk_gesture_single_get_current_sequence(GTK_GESTURE_SINGLE(gesture)); gtk_gesture_set_sequence_state(gesture, sequence, GTK_EVENT_SEQUENCE_CLAIMED); GtkWidget* widget = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture)); if (!dragGesture->m_inDrag && gtk_drag_check_threshold(widget, dragGesture->m_start.x(), dragGesture->m_start.y(), dragGesture->m_start.x() + x, dragGesture->m_start.y() + y)) { dragGesture->m_inDrag = true; dragGesture->m_longPressTimeout.cancel(); } if (dragGesture->m_inDrag) dragGesture->handleDrag(gtk_gesture_get_last_event(gesture, sequence), x, y); dragGesture->m_offset.set(x, y); }
static void gstyle_color_widget_drag_gesture_update (GtkGestureDrag *gesture, gdouble offset_x, gdouble offset_y, GstyleColorWidget *self) { GdkDragContext *context; GdkEventSequence *sequence; const GdkEvent *event; gdouble start_x, start_y; GtkAllocation allocation; GstylePaletteWidgetDndLockFlags dnd_lock; GtkWidget *container; GdkDragAction drag_action; gint button; g_assert (GTK_IS_GESTURE (gesture)); g_assert (GSTYLE_IS_COLOR_WIDGET (self)); dnd_lock = get_palette_widget_dnd_lock (self); if ((dnd_lock & GSTYLE_PALETTE_WIDGET_DND_LOCK_FLAGS_DRAG) != 0) return; button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); if (!gtk_drag_check_threshold (GTK_WIDGET (self), 0, 0, offset_x, offset_y) || button != GDK_BUTTON_PRIMARY) return; gtk_widget_get_allocation (GTK_WIDGET (self), &allocation); self->dnd_color_widget = gstyle_color_widget_copy (self); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) gstyle_color_widget_set_color (self->dnd_color_widget, self->filtered_color); self->dnd_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_size_request (self->dnd_window, allocation.width, allocation.height); gtk_window_set_screen (GTK_WINDOW (self->dnd_window), gtk_widget_get_screen (GTK_WIDGET (self))); gtk_container_add (GTK_CONTAINER (self->dnd_window), GTK_WIDGET (self->dnd_color_widget)); gtk_widget_show_all (self->dnd_window); gtk_widget_set_opacity (self->dnd_window, GSTYLE_COLOR_WIDGET_DRAG_ICON_OPACITY); sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); gtk_gesture_drag_get_start_point (GTK_GESTURE_DRAG (gesture), &start_x, &start_y); event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); container = gtk_widget_get_ancestor (GTK_WIDGET (self), GSTYLE_TYPE_PALETTE_WIDGET); if (container != NULL && GSTYLE_IS_PALETTE_WIDGET (container)) drag_action = (GDK_ACTION_MOVE | GDK_ACTION_COPY); else drag_action = GDK_ACTION_COPY; context = gtk_drag_begin_with_coordinates (GTK_WIDGET (self), self->target_list, drag_action, button, (GdkEvent*)event, start_x, start_y); gtk_drag_set_icon_widget (context, self->dnd_window, 0, 0); }