Esempio n. 1
0
static gboolean
_gtk_gesture_multi_press_check_within_threshold (GtkGestureMultiPress *gesture,
        gdouble               x,
        gdouble               y)
{
    GtkGestureMultiPressPrivate *priv;
    guint double_click_distance;
    GtkSettings *settings;
    GtkWidget *widget;

    priv = gtk_gesture_multi_press_get_instance_private (gesture);

    if (priv->n_presses == 0)
        return TRUE;

    widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
    settings = gtk_widget_get_settings (widget);
    g_object_get (settings,
                  "gtk-double-click-distance", &double_click_distance,
                  NULL);

    if (ABS (priv->initial_press_x - x) < double_click_distance &&
            ABS (priv->initial_press_y - y) < double_click_distance)
    {
        if (!priv->rect_is_set ||
                (x >= priv->rect.x && x < priv->rect.x + priv->rect.width &&
                 y >= priv->rect.y && y < priv->rect.y + priv->rect.height))
            return TRUE;
    }

    return FALSE;
}
Esempio n. 2
0
static void
gtk_gesture_long_press_update (GtkGesture       *gesture,
                               GdkEventSequence *sequence)
{
  GtkGestureLongPressPrivate *priv;
  GtkWidget *widget;
  gdouble x, y;

  widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
  priv = gtk_gesture_long_press_get_instance_private (GTK_GESTURE_LONG_PRESS (gesture));
  gtk_gesture_get_point (gesture, sequence, &x, &y);

  if (gtk_drag_check_threshold (widget, priv->initial_x, priv->initial_y, x, y))
    {
      if (priv->timeout_id)
        {
          g_source_remove (priv->timeout_id);
          priv->timeout_id = 0;
          g_signal_emit (gesture, signals[CANCELLED], 0);
        }

      priv->cancelled = TRUE;
      _gtk_gesture_check (gesture);
    }
}
Esempio n. 3
0
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);
}
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);
}
void GestureController::DragGesture::begin(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);
    dragGesture->m_inDrag = false;
    dragGesture->m_start.set(x, y);
    dragGesture->m_offset.set(0, 0);

    GtkWidget* widget = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture));
    unsigned delay;
    g_object_get(gtk_widget_get_settings(widget), "gtk-long-press-time", &delay, nullptr);
    dragGesture->m_longPressTimeout.scheduleAfterDelay("[WebKit] DragGesture long press timeout", [dragGesture]() {
        dragGesture->m_inDrag = true;
    }, std::chrono::milliseconds(delay));
}
Esempio n. 6
0
static void
_gtk_gesture_multi_press_update_timeout (GtkGestureMultiPress *gesture)
{
    GtkGestureMultiPressPrivate *priv;
    guint double_click_time;
    GtkSettings *settings;
    GtkWidget *widget;

    priv = gtk_gesture_multi_press_get_instance_private (gesture);

    if (priv->double_click_timeout_id)
        g_source_remove (priv->double_click_timeout_id);

    widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
    settings = gtk_widget_get_settings (widget);
    g_object_get (settings, "gtk-double-click-time", &double_click_time, NULL);

    priv->double_click_timeout_id =
        gdk_threads_add_timeout (double_click_time,
                                 _double_click_timeout_cb,
                                 gesture);
}