[eog/wip/gestures] WIP: zoom/pinch gesture
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [eog/wip/gestures] WIP: zoom/pinch gesture
- Date: Fri, 28 Mar 2014 22:53:33 +0000 (UTC)
commit 3f9e489558488b9cb413a2c048108fb4180605a6
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Mar 27 18:27:41 2014 +0100
WIP: zoom/pinch gesture
To be mixed together with the "gestures" GTK+ branch
src/eog-scroll-view.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 83 insertions(+), 2 deletions(-)
---
diff --git a/src/eog-scroll-view.c b/src/eog-scroll-view.c
index 66bd6d3..4a764d3 100644
--- a/src/eog-scroll-view.c
+++ b/src/eog-scroll-view.c
@@ -160,6 +160,9 @@ struct _EogScrollViewPrivate {
GdkRGBA *override_bg_color;
cairo_surface_t *background_surface;
+
+ GtkGesture *zoom_gesture;
+ gdouble initial_zoom;
};
static void scroll_by (EogScrollView *view, int xofs, int yofs);
@@ -1180,8 +1183,10 @@ scroll_to (EogScrollView *view, int x, int y, gboolean change_adjustments)
#endif
/* Scroll the window area and process exposure synchronously. */
- gdk_window_scroll (window, -xofs, -yofs);
- gdk_window_process_updates (window, TRUE);
+ if (!gtk_gesture_is_recognized (priv->zoom_gesture)) {
+ gdk_window_scroll (window, -xofs, -yofs);
+ gdk_window_process_updates (window, TRUE);
+ }
out:
if (!change_adjustments)
@@ -1325,6 +1330,13 @@ set_zoom (EogScrollView *view, double zoom,
/* set new values */
priv->xofs = xofs; /* (img_width * x_rel * zoom) - anchorx; */
priv->yofs = yofs; /* (img_height * y_rel * zoom) - anchory; */
+
+ if (priv->dragging) {
+ priv->drag_anchor_x = anchorx;
+ priv->drag_anchor_y = anchory;
+ priv->drag_ofs_x = priv->xofs;
+ priv->drag_ofs_y = priv->yofs;
+ }
#if 0
g_print ("xofs: %i yofs: %i\n", priv->xofs, priv->yofs);
#endif
@@ -1689,6 +1701,9 @@ eog_scroll_view_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer
view = EOG_SCROLL_VIEW (data);
priv = view->priv;
+ if (gtk_gesture_is_recognized (priv->zoom_gesture))
+ return TRUE;
+
if (!priv->dragging)
return FALSE;
@@ -1900,6 +1915,59 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
return TRUE;
}
+static void
+zoom_gesture_begin_cb (GtkGestureZoom *gesture,
+ GdkEventSequence *sequence,
+ EogScrollView *view)
+{
+ gdouble center_x, center_y;
+ EogScrollViewPrivate *priv;
+
+ priv = view->priv;
+
+ /* Displace dragging point to gesture center */
+ gtk_gesture_get_bounding_box_center (gesture, ¢er_x, ¢er_y);
+ priv->drag_anchor_x = center_x;
+ priv->drag_anchor_y = center_y;
+ priv->drag_ofs_x = priv->xofs;
+ priv->drag_ofs_y = priv->yofs;
+ priv->dragging = TRUE;
+ priv->initial_zoom = priv->zoom;
+
+ gtk_widget_set_gesture_state (GTK_WIDGET (view), GTK_GESTURE (gesture),
+ GTK_EVENT_SEQUENCE_CLAIMED);
+}
+
+static void
+zoom_gesture_update_cb (GtkGestureZoom *gesture,
+ GdkEventSequence *sequence,
+ EogScrollView *view)
+{
+ gdouble center_x, center_y, scale;
+ EogScrollViewPrivate *priv;
+
+ if (!gtk_gesture_zoom_get_scale_delta (gesture, &scale))
+ return;
+
+ priv = view->priv;
+ gtk_gesture_get_bounding_box_center (gesture, ¢er_x, ¢er_y);
+
+ drag_to (view, center_x, center_y);
+ set_zoom (view, priv->initial_zoom * scale, TRUE,
+ center_x, center_y);
+}
+
+static void
+zoom_gesture_end_cb (GtkGestureZoom *gesture,
+ GdkEventSequence *sequence,
+ EogScrollView *view)
+{
+ EogScrollViewPrivate *priv;
+
+ priv = view->priv;
+ priv->dragging = FALSE;
+ eog_scroll_view_set_cursor (view, EOG_SCROLL_VIEW_CURSOR_NORMAL);
+}
/*==================================
@@ -2486,6 +2554,7 @@ eog_scroll_view_init (EogScrollView *view)
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
+ | GDK_TOUCH_MASK
| GDK_SCROLL_MASK
| GDK_KEY_PRESS_MASK);
g_signal_connect (G_OBJECT (priv->display), "configure_event",
@@ -2552,6 +2621,18 @@ eog_scroll_view_init (EogScrollView *view)
"antialiasing-out", G_SETTINGS_BIND_GET);
g_object_unref (settings);
+
+ priv->zoom_gesture = gtk_gesture_zoom_new (GTK_WIDGET (view));
+ g_signal_connect (priv->zoom_gesture, "begin",
+ G_CALLBACK (zoom_gesture_begin_cb), view);
+ g_signal_connect (priv->zoom_gesture, "update",
+ G_CALLBACK (zoom_gesture_update_cb), view);
+ g_signal_connect (priv->zoom_gesture, "end",
+ G_CALLBACK (zoom_gesture_end_cb), view);
+ g_signal_connect (priv->zoom_gesture, "cancel",
+ G_CALLBACK (zoom_gesture_end_cb), view);
+ gtk_widget_add_gesture (GTK_WIDGET (view), priv->zoom_gesture,
+ GTK_PHASE_CAPTURE);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]