From ce3d34f108361996b519e1b626169fba38ec19f2 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?=E2=80=9CStephen?= <“grncdr@uvic.ca”>
Date: Sat, 13 Jun 2009 23:03:59 -0700
Subject: [PATCH] Added "Pan mode" to enable pan scrolling with button 1 on tablets

---
 data/evince-toolbar.xml   |    3 ++-
 data/evince-ui.xml        |    1 +
 libview/ev-view-private.h |    3 +++
 libview/ev-view.c         |   35 ++++++++++++++++++++++++++++++++++-
 libview/ev-view.h         |    3 +++
 shell/ev-window.c         |   15 +++++++++++++++
 6 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/data/evince-toolbar.xml b/data/evince-toolbar.xml
index 6922a9f..3af3f58 100644
--- a/data/evince-toolbar.xml
+++ b/data/evince-toolbar.xml
@@ -8,6 +8,7 @@
     <toolitem name="ViewDual"/>
     <toolitem name="ViewReload"/>
     <toolitem name="ViewAutoscroll"/>
+		<toolitem name="ViewPan"/>
     <toolitem name="ViewSidebar"/>
     <toolitem name="ViewZoom"/>
     <toolitem name="ViewZoomIn"/>
@@ -22,7 +23,7 @@
     <toolitem name="GoLastPage"/>
     <toolitem name="EditRotateLeft"/>
     <toolitem name="EditRotateRight"/>
-    <toolitem name="EditSelectAll"/>
+   <toolitem name="EditSelectAll"/>
     <toolitem name="EditFind"/>
     <toolitem name="PageSelector"/>
     <toolitem name="Navigation"/>
diff --git a/data/evince-ui.xml b/data/evince-ui.xml
index 7ac4edb..347502e 100644
--- a/data/evince-ui.xml
+++ b/data/evince-ui.xml
@@ -71,6 +71,7 @@
     <menuitem name="GoNextPage" action="GoNextPage"/>
     <menuitem name="ViewReload" action="ViewReload"/>
     <menuitem name="ViewAutoscroll" action="ViewAutoscroll"/>
+    <menuitem name="ViewPan" action="ViewPan"/>
     <separator/>
     <menuitem name="EditCopy" action="EditCopy"/>
     <menuitem name="EditSelectAllPopup" action="EditSelectAll"/>
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index 4bec7bd..f8a2307 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -177,6 +177,9 @@ struct _EvView {
 	/* Information for middle clicking and dragging around. */
 	DragInfo drag_info;
 	
+	/* Pan mode state */
+	gboolean panmode;
+
 	/* Autoscrolling */
 	AutoScrollInfo scroll_info;
 
diff --git a/libview/ev-view.c b/libview/ev-view.c
index f69b7b0..eaa42af 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -3070,7 +3070,12 @@ ev_view_button_press_event (GtkWidget      *widget,
 	if (view->scroll_info.autoscrolling)
 		return TRUE;
 	
-	switch (event->button) {
+ 	if (view->panmode) {
+ 		if (event->button == 1) view->pressed_button = 2;
+ 		if (event->button == 2) view->pressed_button = 1;
+ 	}
+
+	switch (view->pressed_button) {
 	        case 1: {
 			EvImage *image;
 			EvAnnotation *annot;
@@ -4542,6 +4547,7 @@ ev_view_init (EvView *view)
 	view->cursor = EV_VIEW_CURSOR_NORMAL;
 	view->drag_info.in_drag = FALSE;
 	view->scroll_info.autoscrolling = FALSE;
+	view->panmode = FALSE;
 	view->selection_info.selections = NULL;
 	view->selection_info.in_selection = FALSE;
 	view->selection_info.in_drag = FALSE;
@@ -4854,6 +4860,33 @@ ev_view_autoscroll_stop (EvView *view)
 	ev_view_handle_cursor_over_xy (view, x, y);
 }
 
+/* Begin panning mode */
+void
+ev_view_pan_start (EvView *view)
+{
+	g_return_if_fail (EV_IS_VIEW (view));
+
+	if (view->panmode)
+		return;
+
+	if (view->scroll_info.autoscrolling) 
+		ev_view_autoscroll_stop(view);
+	
+	view->panmode = TRUE;
+}
+
+/* End panning mode */
+void
+ev_view_pan_stop (EvView *view)
+{
+	g_return_if_fail (EV_IS_VIEW (view));
+
+	if (!view->panmode)
+		return;
+
+	view->panmode = FALSE;
+}
+
 void
 ev_view_set_document (EvView     *view,
 		      EvDocument *document)
diff --git a/libview/ev-view.h b/libview/ev-view.h
index 2ff3aef..100b441 100644
--- a/libview/ev-view.h
+++ b/libview/ev-view.h
@@ -136,6 +136,9 @@ gchar*         ev_view_page_label_from_dest (EvView *view, EvLinkDest *dest);
 void	       ev_view_autoscroll_start   (EvView *view);
 void           ev_view_autoscroll_stop    (EvView *view);
 
+void	       ev_view_pan_start   (EvView *view);
+void           ev_view_pan_stop    (EvView *view);
+
 G_END_DECLS
 
 #endif /* __EV_VIEW_H__ */
diff --git a/shell/ev-window.c b/shell/ev-window.c
index d822181..9147c8f 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -3880,6 +3880,18 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window)
 }
 
 static void
+ev_window_cmd_view_pan (GtkAction *action, EvWindow *ev_window)
+{
+	gboolean panmode;
+	panmode = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+	if (panmode) {
+		ev_view_pan_start (EV_VIEW (ev_window->priv->view));
+	} else {
+		ev_view_pan_stop (EV_VIEW (ev_window->priv->view));
+	}
+}
+
+static void
 ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window)
 {
 	ev_view_autoscroll_start (EV_VIEW (ev_window->priv->view));
@@ -5071,6 +5083,9 @@ static const GtkToggleActionEntry toggle_entries[] = {
         { "ViewPageWidth", EV_STOCK_ZOOM_WIDTH, N_("Fit Page _Width"), NULL,
           N_("Make the current document fill the window width"),
           G_CALLBACK (ev_window_cmd_view_page_width) },
+        { "ViewPan", GTK_STOCK_MEDIA_PLAY, N_("Pan mode"), NULL, 
+          N_("Make panning the primary click + drag action"),
+          G_CALLBACK (ev_window_cmd_view_pan) },
 };
 
 /* Popups specific items */
-- 
1.6.3.2

