[eog/wip/gestures: 3/3] EogWindow: handle pan gestures to switch to next/prev image
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [eog/wip/gestures: 3/3] EogWindow: handle pan gestures to switch to next/prev image
- Date: Tue, 6 May 2014 16:41:43 +0000 (UTC)
commit 7007bae78a2f3cdb0af7c5f8bd7b4a7ebf94b656
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon May 5 21:10:18 2014 +0200
EogWindow: handle pan gestures to switch to next/prev image
This has been implemented in the window where there is a knowledge about
EogThumbView, and image navigation. A GtkGesturePan is set on the
EogScrollView into its own group. If horizontal swipes happen and the
scrollview has no scrollbars, the gesture is consumed to handle "switch
to next/prev image".
src/eog-window.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 72 insertions(+), 0 deletions(-)
---
diff --git a/src/eog-window.c b/src/eog-window.c
index 5c0a12a..361d2cc 100644
--- a/src/eog-window.c
+++ b/src/eog-window.c
@@ -104,6 +104,12 @@ typedef enum {
EOG_WINDOW_STATUS_NORMAL
} EogWindowStatus;
+typedef enum {
+ EOG_PAN_ACTION_NONE,
+ EOG_PAN_ACTION_NEXT,
+ EOG_PAN_ACTION_PREV
+} EogPanAction;
+
enum {
PROP_0,
PROP_GALLERY_POS,
@@ -185,6 +191,9 @@ struct _EogWindowPrivate {
PeasExtensionSet *extensions;
+ GtkGesture *pan_gesture;
+ EogPanAction pan_action;
+
#ifdef HAVE_LCMS
cmsHPROFILE *display_profile;
#endif
@@ -4833,6 +4842,57 @@ eog_window_add_open_editor_action (EogWindow *window)
}
static void
+pan_gesture_pan_cb (GtkGesturePan *gesture,
+ GtkPanDirection direction,
+ gdouble offset,
+ EogWindow *window)
+{
+ EogWindowPrivate *priv;
+
+ priv = window->priv;
+
+ if (eog_scroll_view_scrollbars_visible (priv->view)) {
+ gtk_gesture_set_state (GTK_GESTURE (gesture),
+ GTK_EVENT_SEQUENCE_DENIED);
+ return;
+ }
+
+#define PAN_ACTION_DISTANCE 200
+
+ priv->pan_action = EOG_PAN_ACTION_NONE;
+ gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+
+ if (offset > PAN_ACTION_DISTANCE) {
+ if (direction == GTK_PAN_DIRECTION_LEFT ||
+ gtk_widget_get_direction (GTK_WIDGET (window)) == GTK_TEXT_DIR_RTL)
+ priv->pan_action = EOG_PAN_ACTION_NEXT;
+ else
+ priv->pan_action = EOG_PAN_ACTION_PREV;
+ }
+#undef PAN_ACTION_DISTANCE
+}
+
+static void
+pan_gesture_end_cb (GtkGesture *gesture,
+ GdkEventSequence *sequence,
+ EogWindow *window)
+{
+ EogWindowPrivate *priv;
+
+ if (!gtk_gesture_handles_sequence (gesture, sequence))
+ return;
+
+ priv = window->priv;
+
+ if (priv->pan_action == EOG_PAN_ACTION_PREV)
+ eog_window_cmd_go_prev (NULL, window);
+ else if (priv->pan_action == EOG_PAN_ACTION_NEXT)
+ eog_window_cmd_go_next (NULL, window);
+
+ priv->pan_action = EOG_PAN_ACTION_NONE;
+}
+
+static void
eog_window_construct_ui (EogWindow *window)
{
EogWindowPrivate *priv;
@@ -5032,6 +5092,12 @@ eog_window_construct_ui (EogWindow *window)
priv->overlay = gtk_overlay_new();
priv->view = eog_scroll_view_new ();
+ priv->pan_gesture = gtk_gesture_pan_new (priv->view, GTK_PAN_ORIENTATION_HORIZONTAL);
+ gtk_gesture_attach (priv->pan_gesture, GTK_PHASE_CAPTURE);
+ g_signal_connect (priv->pan_gesture, "pan",
+ G_CALLBACK (pan_gesture_pan_cb), window);
+ g_signal_connect (priv->pan_gesture, "end",
+ G_CALLBACK (pan_gesture_end_cb), window);
gtk_container_add (GTK_CONTAINER(priv->overlay), priv->view);
@@ -5273,6 +5339,12 @@ eog_window_dispose (GObject *object)
priv->fullscreen_popup = NULL;
}
+ if (priv->pan_gesture) {
+ gtk_gesture_detach (priv->pan_gesture);
+ g_object_unref (priv->pan_gesture);
+ priv->pan_gesture = NULL;
+ }
+
slideshow_clear_timeout (window);
eog_window_uninhibit_screensaver (window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]