Index: data/evince-toolbar.xml
===================================================================
RCS file: /cvs/gnome/evince/data/evince-toolbar.xml,v
retrieving revision 1.3
diff -u -3 -p -r1.3 evince-toolbar.xml
--- data/evince-toolbar.xml	10 May 2005 17:18:46 -0000	1.3
+++ data/evince-toolbar.xml	14 Feb 2006 21:09:02 -0000
@@ -17,6 +17,7 @@
     <toolitem name="GoFirstPage"/>
     <toolitem name="GoLastPage"/>
     <toolitem name="ViewReload"/>
+    <toolitem name="HandMode"/>
 </available>
 <toolbar name="DefaultToolBar">
     <toolitem name="GoPreviousPage"/>
Index: shell/ev-view.c
===================================================================
RCS file: /cvs/gnome/evince/shell/ev-view.c,v
retrieving revision 1.188
diff -u -3 -p -r1.188 ev-view.c
--- shell/ev-view.c	7 Feb 2006 20:09:23 -0000	1.188
+++ shell/ev-view.c	14 Feb 2006 21:09:02 -0000
@@ -1677,41 +1677,41 @@ ev_view_button_press_event (GtkWidget   
 	view->pressed_button = event->button;
 	view->selection_info.in_drag = FALSE;
 	
-	switch (event->button) {
-	        case 1:
-			if (view->selection_info.selections) {
-				if (location_in_selected_text (view,
-							       event->x + view->scroll_x,
-							       event->y + view->scroll_y)) {
-					view->selection_info.in_drag = TRUE;
-				} else {
-					clear_selection (view);
-				}
-				
-				gtk_widget_queue_draw (widget);
+	if ((event->button == 1 && view->selection_mode == EV_VIEW_SELECTION_TEXT) ||
+	    (event->button == 2 && view->selection_mode == EV_VIEW_SELECTION_NONE)) {
+		if (view->selection_info.selections) {
+			if (location_in_selected_text (view,
+						       event->x + view->scroll_x,
+						       event->y + view->scroll_y)) {
+				view->selection_info.in_drag = TRUE;
+			} else {
+				clear_selection (view);
 			}
-
-			view->selection_info.start.x = event->x + view->scroll_x;
-			view->selection_info.start.y = event->y + view->scroll_y;
 			
-			return TRUE;
-		case 2:
-			/* use root coordinates as reference point because
-			 * scrolling changes window relative coordinates */
-			view->drag_info.start.x = event->x_root;
-			view->drag_info.start.y = event->y_root;
-			view->drag_info.hadj = gtk_adjustment_get_value (view->hadjustment);
-			view->drag_info.vadj = gtk_adjustment_get_value (view->vadjustment);
+			gtk_widget_queue_draw (widget);
+		}
 
-			ev_view_set_cursor (view, EV_VIEW_CURSOR_DRAG);
+		view->selection_info.start.x = event->x + view->scroll_x;
+		view->selection_info.start.y = event->y + view->scroll_y;
+		
+		return TRUE;
+	} else if ((event->button == 1 && view->selection_mode == EV_VIEW_SELECTION_NONE) ||
+		   (event->button == 2 && view->selection_mode == EV_VIEW_SELECTION_TEXT)) {
+		/* use root coordinates as reference point because
+		 * scrolling changes window relative coordinates */
+		view->drag_info.start.x = event->x_root;
+		view->drag_info.start.y = event->y_root;
+		view->drag_info.hadj = gtk_adjustment_get_value (view->hadjustment);
+		view->drag_info.vadj = gtk_adjustment_get_value (view->vadjustment);
 
-			return TRUE;
-		case 3:
-			link = ev_view_get_link_at_location (view, event->x, event->y);
-			g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, link);
-			return TRUE;
+		ev_view_set_cursor (view, EV_VIEW_CURSOR_DRAG);
+
+		return TRUE;
+	} else if (event->button == 3) {
+		link = ev_view_get_link_at_location (view, event->x, event->y);
+		g_signal_emit (view, signals[SIGNAL_POPUP_MENU], 0, link);
+		return TRUE;
 	}
-	
 	return FALSE;
 }
 
@@ -1741,6 +1741,7 @@ selection_update_idle_cb (EvView *view)
 {
 	compute_selections (view, &view->selection_info.start, &view->motion);
 	view->selection_update_id = 0;
+
 	return FALSE;
 }
 
@@ -1823,8 +1824,9 @@ ev_view_motion_notify_event (GtkWidget  
 	/* For the Evince 0.4.x release, we limit selection to un-rotated
 	 * documents only.
 	 */
-	if (view->pressed_button == 1 && view->rotation == 0) {
-
+	if (view->rotation == 0 && 
+	    ((view->pressed_button == 1 && view->selection_mode == EV_VIEW_SELECTION_TEXT) ||
+	     (view->pressed_button == 2 && view->selection_mode == EV_VIEW_SELECTION_NONE))) {
 		/* Schedule timeout to scroll during selection and additionally 
 		 * scroll once to allow arbitrary speed. */
 		if (!view->selection_scroll_id)
@@ -1845,7 +1847,8 @@ ev_view_motion_notify_event (GtkWidget  
 			view->selection_update_id = g_idle_add ((GSourceFunc)selection_update_idle_cb, view);
 
 		return TRUE;
-	} else if (view->pressed_button == 2) {
+	} else if ((view->pressed_button == 1 && view->selection_mode == EV_VIEW_SELECTION_NONE) ||
+		   (view->pressed_button == 2 && view->selection_mode == EV_VIEW_SELECTION_TEXT)) {
 		if (!view->drag_info.in_drag) {
 			gboolean start;
 
@@ -1900,7 +1903,8 @@ ev_view_button_release_event (GtkWidget 
 	EvView *view = EV_VIEW (widget);
 	EvLink *link;
 
-	if (view->pressed_button == 2) {
+	if ((view->pressed_button == 1 && view->selection_mode == EV_VIEW_SELECTION_NONE) ||
+	    (view->pressed_button == 2 && view->selection_mode == EV_VIEW_SELECTION_TEXT)) {
 		ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
 	}
 
@@ -2918,6 +2922,27 @@ ev_view_get_sizing_mode (EvView *view)
 	return view->sizing_mode;
 }
 
+void
+ev_view_set_selection_mode (EvView              *view,
+			    EvViewSelectionMode  selection_mode)
+{
+	g_return_if_fail (EV_IS_VIEW (view));
+
+	if (view->selection_mode == selection_mode)
+		return;
+
+	view->selection_mode = selection_mode;
+}
+
+EvViewSelectionMode
+ev_view_get_selection_mode (EvView *view)
+{
+	g_return_val_if_fail (EV_IS_VIEW (view), EV_VIEW_SELECTION_TEXT);
+
+	return view->selection_mode;
+}
+		
+
 gboolean
 ev_view_can_zoom_in (EvView *view)
 {
@@ -3529,7 +3554,7 @@ compute_new_selection_text (EvView   *vi
 	gint width, height;
 	int start_page, end_page;
 
-	g_assert (view->selection_mode == EV_VIEW_SELECTION_TEXT);
+	/*g_assert (view->selection_mode == EV_VIEW_SELECTION_TEXT);*/
 
 	n_pages = ev_page_cache_get_n_pages (view->page_cache);
 
Index: shell/ev-view.h
===================================================================
RCS file: /cvs/gnome/evince/shell/ev-view.h,v
retrieving revision 1.46
diff -u -3 -p -r1.46 ev-view.h
--- shell/ev-view.h	7 Feb 2006 20:09:23 -0000	1.46
+++ shell/ev-view.h	14 Feb 2006 21:09:02 -0000
@@ -46,6 +46,7 @@ typedef enum {
 } EvSizingMode;
 
 typedef enum {
+	EV_VIEW_SELECTION_NONE,
 	EV_VIEW_SELECTION_TEXT,
 	EV_VIEW_SELECTION_RECTANGLE,
 } EvViewSelectionMode;
@@ -88,6 +89,9 @@ void     	ev_view_set_sizing_mode	  (EvV
 					   EvSizingMode    mode);
 EvSizingMode	ev_view_get_sizing_mode	  (EvView         *view);
 
+void			ev_view_set_selection_mode (EvView              *view,
+						    EvViewSelectionMode mode);
+EvViewSelectionMode	ev_view_get_selection_mode (EvView		*view);
 
 /* Page size */
 gboolean	ev_view_can_zoom_in       (EvView         *view);
Index: shell/ev-window.c
===================================================================
RCS file: /cvs/gnome/evince/shell/ev-window.c,v
retrieving revision 1.259
diff -u -3 -p -r1.259 ev-window.c
--- shell/ev-window.c	10 Feb 2006 04:36:12 -0000	1.259
+++ shell/ev-window.c	14 Feb 2006 21:09:03 -0000
@@ -205,6 +205,8 @@ static void	ev_window_cmd_view_best_fit 
 							 EvWindow 	  *ev_window);
 static void	ev_window_cmd_view_page_width 		(GtkAction 	  *action, 
 							 EvWindow 	  *ev_window);
+static void	ev_window_cmd_view_hand_mode 		(GtkAction 	  *action, 
+							 EvWindow 	  *ev_window);
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
@@ -543,6 +545,14 @@ ev_window_cmd_view_page_width (GtkAction
 	update_action_sensitivity (ev_window);
 }
 
+static void
+ev_window_cmd_hand_mode (GtkAction *action, EvWindow *ev_window)
+{
+	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+		ev_view_set_selection_mode (EV_VIEW (ev_window->priv->view), EV_VIEW_SELECTION_NONE);
+	else
+		ev_view_set_selection_mode (EV_VIEW (ev_window->priv->view), EV_VIEW_SELECTION_TEXT);
+}
 
 void
 ev_window_open_page_label (EvWindow   *ev_window, 
@@ -2933,6 +2949,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) },
+        { "HandMode", GTK_STOCK_SELECT_COLOR, N_("Hand Mode"), NULL,
+          N_("Use mouse left button do scroll the document"),
+          G_CALLBACK (ev_window_cmd_hand_mode) },
 };
 
 /* Popups specific items */
