hand tool from 
https://mail.gnome.org/archives/evince-list/2009-June/msg00027.html
by Stephen Sugden <glurgle gmail com>

Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: http://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- evince-3.4.0.orig/shell/ev-window.c
+++ evince-3.4.0/shell/ev-window.c
@@ -4640,6 +4640,18 @@ ev_window_cmd_view_reload (GtkAction *ac
 }
 
 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));
@@ -5965,6 +5977,9 @@ static const GtkToggleActionEntry toggle
         { "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) },
 	{ "ViewInvertedColors", EV_STOCK_INVERTED_COLORS, N_("_Inverted Colors"), "<control>I",
 	  N_("Show page contents with the colors inverted"),
 	  G_CALLBACK (ev_window_cmd_view_inverted_colors) },
--- evince-3.4.0.orig/libview/ev-view.h
+++ evince-3.4.0/libview/ev-view.h
@@ -121,6 +121,9 @@ void           ev_view_begin_add_annotat
 					      EvAnnotationType annot_type);
 void           ev_view_cancel_add_annotation (EvView          *view);
 
+void	       ev_view_pan_start   (EvView *view);
+void           ev_view_pan_stop    (EvView *view);
+
 G_END_DECLS
 
 #endif /* __EV_VIEW_H__ */
--- evince-3.4.0.orig/libview/ev-view.c
+++ evince-3.4.0/libview/ev-view.c
@@ -3768,7 +3768,12 @@ ev_view_button_press_event (GtkWidget
 	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;
@@ -5115,6 +5120,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;
@@ -5372,6 +5378,33 @@ ev_view_autoscroll_start (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_autoscroll_stop (EvView *view)
 {
--- evince-3.4.0.orig/libview/ev-view-private.h
+++ evince-3.4.0/libview/ev-view-private.h
@@ -173,6 +173,9 @@ struct _EvView {
 	/* Information for middle clicking and dragging around. */
 	DragInfo drag_info;
 	
+	/* Pan mode state */
+	gboolean panmode;
+
 	/* Autoscrolling */
 	AutoScrollInfo scroll_info;
 
--- evince-3.4.0.orig/data/evince-ui.xml
+++ evince-3.4.0/data/evince-ui.xml
@@ -87,6 +87,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"/>
--- evince-3.4.0.orig/data/evince-toolbar.xml
+++ evince-3.4.0/data/evince-toolbar.xml
@@ -11,6 +11,7 @@
     <toolitem name="ViewInvertedColors"/>
     <toolitem name="ViewReload"/>
     <toolitem name="ViewAutoscroll"/>
+		<toolitem name="ViewPan"/>
     <toolitem name="ViewSidebar"/>
     <toolitem name="ViewZoom"/>
     <toolitem name="ViewZoomIn"/>
@@ -25,7 +26,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"/>
