diff -u --recursive --new-file gpdf-vanilla/xpdf/Makefile.am gpdf-tools/xpdf/Makefile.am
--- gpdf-vanilla/xpdf/Makefile.am	2003-08-08 08:44:42.000000000 -0500
+++ gpdf-tools/xpdf/Makefile.am	2003-10-20 00:38:38.000000000 -0500
@@ -134,6 +134,8 @@
 	gpdf-control.cc			\
 	gpdf-control.h			\
 	gpdf-control-private.h		\
+	gpdf-cursors.c			\
+	gpdf-cursors.h			\
 	gpdf-g-switch.h			\
 	gpdf-link-canvas-item.cc	\
 	gpdf-link-canvas-item.h		\
diff -u --recursive --new-file gpdf-vanilla/xpdf/cursors/Makefile.am gpdf-tools/xpdf/cursors/Makefile.am
--- gpdf-vanilla/xpdf/cursors/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/cursors/Makefile.am	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,5 @@
+EXTRA_DIST =			\
+	hand-closed-data.xbm	\
+	hand-closed-mask.xbm	\
+	hand-open-data.xbm	\
+	hand-open-mask.xbm
diff -u --recursive --new-file gpdf-vanilla/xpdf/cursors/hand-closed-data.xbm gpdf-tools/xpdf/cursors/hand-closed-data.xbm
--- gpdf-vanilla/xpdf/cursors/hand-closed-data.xbm	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/cursors/hand-closed-data.xbm	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,9 @@
+/* Made with Gimp */
+#define hand_closed_data_width 20
+#define hand_closed_data_height 20
+static char hand_closed_data_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x3f, 0x00,
+   0x80, 0xff, 0x00, 0x80, 0xff, 0x00, 0xb0, 0xff, 0x00, 0xf0, 0xff, 0x00,
+   0xe0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0x80, 0x3f, 0x00,
+   0x00, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff -u --recursive --new-file gpdf-vanilla/xpdf/cursors/hand-closed-mask.xbm gpdf-tools/xpdf/cursors/hand-closed-mask.xbm
--- gpdf-vanilla/xpdf/cursors/hand-closed-mask.xbm	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/cursors/hand-closed-mask.xbm	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,9 @@
+/* Made with Gimp */
+#define hand_closed_mask_width 20
+#define hand_closed_mask_height 20
+static char hand_closed_mask_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x3f, 0x00, 0xc0, 0xff, 0x00,
+   0xc0, 0xff, 0x01, 0xf0, 0xff, 0x01, 0xf8, 0xff, 0x01, 0xf8, 0xff, 0x01,
+   0xf0, 0xff, 0x01, 0xf0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0x7f, 0x00,
+   0x80, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff -u --recursive --new-file gpdf-vanilla/xpdf/cursors/hand-open-data.xbm gpdf-tools/xpdf/cursors/hand-open-data.xbm
--- gpdf-vanilla/xpdf/cursors/hand-open-data.xbm	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/cursors/hand-open-data.xbm	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,9 @@
+/* Made with Gimp */
+#define hand_open_data_width 20
+#define hand_open_data_height 20
+static char hand_open_data_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x60, 0x36, 0x00, 0x60, 0x36, 0x00, 0xc0, 0x36, 0x01, 0xc0, 0xb6, 0x01,
+   0x80, 0xbf, 0x01, 0x98, 0xff, 0x01, 0xb8, 0xff, 0x00, 0xf0, 0xff, 0x00,
+   0xe0, 0xff, 0x00, 0xe0, 0x7f, 0x00, 0xc0, 0x7f, 0x00, 0x80, 0x3f, 0x00,
+   0x00, 0x3f, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff -u --recursive --new-file gpdf-vanilla/xpdf/cursors/hand-open-mask.xbm gpdf-tools/xpdf/cursors/hand-open-mask.xbm
--- gpdf-vanilla/xpdf/cursors/hand-open-mask.xbm	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/cursors/hand-open-mask.xbm	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,9 @@
+/* Made with Gimp */
+#define hand_open_mask_width 20
+#define hand_open_mask_height 20
+static char hand_open_mask_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x3f, 0x00,
+   0xf0, 0x7f, 0x00, 0xf0, 0x7f, 0x01, 0xe0, 0xff, 0x03, 0xe0, 0xff, 0x03,
+   0xd8, 0xff, 0x03, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x01, 0xf8, 0xff, 0x01,
+   0xf0, 0xff, 0x01, 0xf0, 0xff, 0x00, 0xe0, 0xff, 0x00, 0xc0, 0x7f, 0x00,
+   0x80, 0x7f, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-control-private.h gpdf-tools/xpdf/gpdf-control-private.h
--- gpdf-vanilla/xpdf/gpdf-control-private.h	2003-10-09 01:56:48.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-control-private.h	2003-10-20 00:38:38.000000000 -0500
@@ -48,7 +48,7 @@
 void		gpdf_control_private_set_wait_cursor	(GPdfControl * control);
 
 /* Reset to default cursor for whole component */
-void		gpdf_control_private_reset_cursor	(GPdfControl * control);
+void		gpdf_control_private_unset_wait_cursor	(GPdfControl * control);
 
 /* Get bookmarks view */
 GtkWidget*	gpdf_control_private_get_bookmarks_view	(GPdfControl * control);
@@ -59,6 +59,9 @@
 /* Get annotations view */
 GtkWidget*	gpdf_control_private_get_annots_view	(GPdfControl * control);
 
+/* Get current tool */
+GPdfControlTool  gpdf_control_private_get_current_tool  (GPdfControl * control);
+
 /* Raise an error dialog */
 void		gpdf_control_private_error_dialog 	(GPdfControl * control,
 							 const gchar *header_text,
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-control-ui.xml gpdf-tools/xpdf/gpdf-control-ui.xml
--- gpdf-vanilla/xpdf/gpdf-control-ui.xml	2003-09-25 14:16:45.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-control-ui.xml	2003-10-20 00:38:38.000000000 -0500
@@ -26,6 +26,12 @@
     <cmd name="EditSelectAll"  _label="_Select all"
       _tip="Select all text on the page" accel="*Control*A"/>
 
+    <cmd name="Select" _label="_Select"
+      _tip="Select text on the page"/>
+
+    <cmd name="Scroll" _label="_Scroll"
+      _tip="Scroll viewable portion of page"/>
+
     <cmd name="EditFind"  _label="_Find Text"
       _tip="Find text in document" accel="*Control*F"
       pixtype="stock" pixname="gtk-find"/>
@@ -165,4 +171,11 @@
 
   </dockitem>
 
+  <dockitem name="CurrentTool" look="text" band_num="2" behavior="exclusive">
+
+    <toolitem name="Select" _label="Select" verb=""/>
+    <toolitem name="Scroll" _label="Scroll" verb=""/>
+
+  </dockitem>
+
 </Root>
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-control.cc gpdf-tools/xpdf/gpdf-control.cc
--- gpdf-vanilla/xpdf/gpdf-control.cc	2003-10-09 01:56:48.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-control.cc	2003-10-20 00:38:38.000000000 -0500
@@ -37,6 +37,7 @@
 #include "gpdf-g-switch.h"
 #include "gpdf-persist-stream.h"
 #include "gpdf-persist-file.h"
+#include "gpdf-cursors.h"
 
 #define noPDF_DEBUG
 #ifdef PDF_DEBUG
@@ -66,6 +67,7 @@
 	GtkWidget *gpdf_annots_view;
 	GnomeAppBar *gnome_appbar;
 	GtkProgressBar *progress;
+	GdkCursorType cursor;
 
 	BonoboZoomable *zoomable;
 	gboolean has_zoomable_frame;
@@ -80,6 +82,8 @@
 	GtkWidget *findtext_entry;
 
 	guint idle_id;
+
+	GPdfControlTool current_tool;
 };
 
 /* Components paths */
@@ -315,6 +319,7 @@
 	g_return_if_fail (GPDF_IS_NON_NULL_CONTROL (control));
 	priv = control->priv;
 	
+	priv->cursor = cursor ? cursor->type : (GdkCursorType) -1;
 	parent_window = gtk_widget_get_parent_window (priv->vbox);
 	gdk_window_set_cursor (parent_window, cursor); 
 	gdk_cursor_unref (cursor);
@@ -343,16 +348,20 @@
 
 /* Reset to default cursor for whole component */
 void
-gpdf_control_private_reset_cursor (GPdfControl * control)
+gpdf_control_private_unset_wait_cursor (GPdfControl * control)
 {
 	GPdfControlPrivate *priv;
+	GdkDisplay *display;
+	GdkCursor *cursor;
 	GdkWindow *parent_window;
 
 	g_return_if_fail (GPDF_IS_NON_NULL_CONTROL (control));
 	priv = control->priv;
 
+	display = gtk_widget_get_display (priv->vbox);
+	cursor = priv->cursor != -1 ? gdk_cursor_new_for_display (display, priv->cursor) : NULL;
 	parent_window = gtk_widget_get_parent_window (priv->vbox);
-	gdk_window_set_cursor (parent_window, NULL); 
+	gdk_window_set_cursor (parent_window, cursor); 
 	gdk_flush();		
 }
 
@@ -407,6 +416,12 @@
 	return w;
 }
 
+GPdfControlTool
+gpdf_control_private_get_current_tool (GPdfControl * control)
+{
+	return control->priv->current_tool;
+}
+
 static void
 gpdf_control_private_destroy_dialog (GtkWidget *w, GtkWidget *dlg)
 {
@@ -726,6 +741,36 @@
 		TRUE);
 }
 
+static void gpdf_control_set_current_tool(GPdfControl *control, GPdfControlTool tool, GdkCursor *cursor)
+{
+       GPdfControlPrivate *priv;
+
+       gpdf_control_private_set_cursor(control, cursor);
+       control->priv->current_tool = tool;
+}
+
+static void
+verb_Select_cb (BonoboUIComponent * uic, gpointer user_data,
+                const char *cname)
+{
+       g_return_if_fail(GPDF_IS_NON_NULL_CONTROL(user_data));
+
+       gpdf_control_set_current_tool((GPdfControl *)user_data, GPDF_TOOL_SELECT, NULL);
+}
+
+static void
+verb_Scroll_cb (BonoboUIComponent * uic, gpointer user_data,
+                const char *cname)
+{
+       GdkCursor *cursor;
+       GPdfControlPrivate *priv = ((GPdfControl *)user_data)->priv;
+
+       g_return_if_fail(GPDF_IS_NON_NULL_CONTROL(user_data));
+
+       cursor = cursor_get(priv->vbox, CURSOR_HAND_OPEN);
+       gpdf_control_set_current_tool((GPdfControl *)user_data, GPDF_TOOL_SCROLL, cursor);
+}
+
 
 static void
 verb_GoHistoryPrev_cb (BonoboUIComponent *uic, gpointer user_data,
@@ -1183,6 +1228,9 @@
 	BONOBO_UI_VERB ("Print", 	  verb_Print_cb),
 	BONOBO_UI_VERB ("PrintPreview",	  verb_PrintPreview_cb),
 
+	BONOBO_UI_VERB ("Select",         verb_Select_cb),
+	BONOBO_UI_VERB ("Scroll",         verb_Scroll_cb),
+
 	BONOBO_UI_VERB ("EditSelectAll",  verb_EditSelectAll_cb),
 	BONOBO_UI_VERB ("EditCopy",   	  verb_EditCopy_cb),
 	BONOBO_UI_VERB ("EditFind",   	  verb_EditFind_cb),
@@ -2133,6 +2181,7 @@
 	GObject *object;
 	GPdfControl *control;
 	GPdfControlPrivate *priv;
+	GdkCursor *cursor;
 	guint i;
 
 	object = G_OBJECT_CLASS (parent_class)->constructor (
@@ -2152,8 +2201,11 @@
 				  control->priv->vbox);
 
 	control->priv->title = g_strdup (_("PDF Document"));
+
 	gpdf_control_setup_property_bag (control);
 
+	gpdf_control_set_current_tool(control, GPDF_TOOL_SELECT, NULL);
+
 	return object;
 }
 
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-control.h gpdf-tools/xpdf/gpdf-control.h
--- gpdf-vanilla/xpdf/gpdf-control.h	2003-05-29 06:08:28.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-control.h	2003-10-20 00:38:38.000000000 -0500
@@ -37,6 +37,11 @@
 	BonoboControlClass parent_class;
 };
 
+enum GPdfControlTool {
+	GPDF_TOOL_SCROLL,
+	GPDF_TOOL_SELECT
+};
+
 GType        gpdf_control_get_type  (void);
 
 G_END_DECLS
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-cursors.c gpdf-tools/xpdf/gpdf-cursors.c
--- gpdf-vanilla/xpdf/gpdf-cursors.c	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/gpdf-cursors.c	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,103 @@
+/* Eye of Gnome image viewer - mouse cursors
+ *
+ * Copyright (C) 2000 The Free Software Foundation
+ *
+ * Author: Federico Mena-Quintero <federico@gnu.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "gpdf-cursors.h"
+
+
+
+/* Cursor definitions.  Keep in sync with the CursorType enumeration in
+ * cursors.h.
+ */
+
+#include "cursors/hand-open-data.xbm"
+#include "cursors/hand-open-mask.xbm"
+#include "cursors/hand-closed-data.xbm"
+#include "cursors/hand-closed-mask.xbm"
+
+static struct {
+	char *data;
+	char *mask;
+	int data_width;
+	int data_height;
+	int mask_width;
+	int mask_height;
+	int hot_x, hot_y;
+} cursors[] = {
+	{ hand_open_data_bits, hand_open_mask_bits,
+	  hand_open_data_width, hand_open_data_height,
+	  hand_open_mask_width, hand_open_mask_height,
+	  hand_open_data_width / 2, hand_open_data_height / 2 },
+	{ hand_closed_data_bits, hand_closed_mask_bits,
+	  hand_closed_data_width, hand_closed_data_height,
+	  hand_closed_mask_width, hand_closed_mask_height,
+	  hand_closed_data_width / 2, hand_closed_data_height / 2 },
+	{ NULL, NULL, 0, 0, 0, 0 }
+};
+
+
+
+/**
+ * cursor_get:
+ * @window: Window whose screen and colormap determine the cursor's.
+ * @type: A cursor type.
+ * 
+ * Creates a cursor.
+ * 
+ * Return value: The newly-created cursor.
+ **/
+GdkCursor *
+cursor_get (GtkWidget *window, CursorType type)
+{
+	GdkBitmap *data;
+	GdkBitmap *mask;
+	GdkCursor *cursor;
+	GtkStyle *style;
+
+	g_return_val_if_fail (window != NULL, NULL);
+	g_return_val_if_fail (type >= 0 && type < CURSOR_NUM_CURSORS, NULL);
+
+	g_assert (cursors[type].data_width == cursors[type].mask_width);
+	g_assert (cursors[type].data_height == cursors[type].mask_height);
+
+	data = gdk_bitmap_create_from_data (window->window,
+					    cursors[type].data,
+					    cursors[type].data_width,
+					    cursors[type].data_height);
+	mask = gdk_bitmap_create_from_data (window->window,
+					    cursors[type].mask,
+					    cursors[type].mask_width,
+					    cursors[type].mask_height);
+
+	g_assert (data != NULL && mask != NULL);
+	
+	style = gtk_widget_get_style (window);
+
+	cursor = gdk_cursor_new_from_pixmap (
+		data, mask,
+		&style->white, &style->black,
+		cursors[type].hot_x, cursors[type].hot_y);
+	g_assert (cursor != NULL);
+
+	g_object_unref (data);
+	g_object_unref (mask);
+
+	return cursor;
+}
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-cursors.h gpdf-tools/xpdf/gpdf-cursors.h
--- gpdf-vanilla/xpdf/gpdf-cursors.h	1969-12-31 18:00:00.000000000 -0600
+++ gpdf-tools/xpdf/gpdf-cursors.h	2003-10-20 00:38:38.000000000 -0500
@@ -0,0 +1,43 @@
+/* Eye of Gnome image viewer - mouse cursors
+ *
+ * Copyright (C) 2000 The Free Software Foundation
+ *
+ * Author: Federico Mena-Quintero <federico@gnu.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CURSORS_H
+#define CURSORS_H
+
+#include <gtk/gtkwidget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+	CURSOR_HAND_OPEN,
+	CURSOR_HAND_CLOSED,
+	CURSOR_NUM_CURSORS
+} CursorType;
+
+GdkCursor *cursor_get (GtkWidget *window, CursorType type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-view.cc gpdf-tools/xpdf/gpdf-view.cc
--- gpdf-vanilla/xpdf/gpdf-view.cc	2003-09-29 18:17:20.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-view.cc	2003-10-22 09:02:48.000000000 -0500
@@ -53,6 +53,7 @@
 #include "Link.h"
 #include "gpdf-links-canvas-layer.h"
 #include "gpdf-annots-view.h"
+#include "gpdf-cursors.h"
 
 BEGIN_EXTERN_C
 
@@ -966,7 +967,7 @@
 		
 		if (!app || gnome_vfs_mime_application_launch (app, uris) != GNOME_VFS_OK) {
 
-			/* Fallback: No component or app was found. Use a browser */
+			// Fallback: No component or app was found. Use a browser
 			mime = "text/html";
 			action = gnome_vfs_mime_get_default_action (mime);
 			if (gnome_vfs_mime_action_launch (action, uris) != GNOME_VFS_OK)
@@ -1449,7 +1450,7 @@
 	/* Release title */
 	g_free ((gpointer)title); 
 
-	gpdf_control_private_reset_cursor (priv->parent);
+	gpdf_control_private_unset_wait_cursor (priv->parent);
 	gpdf_control_private_set_fraction (priv->parent, 0.0);
 	gpdf_control_private_pop (priv->parent); 
 }
@@ -1556,7 +1557,7 @@
 			  G_CALLBACK (gpdf_view_link_clicked_cb),
 			  gpdf_view);
 
-	gpdf_control_private_reset_cursor (priv->parent);
+	gpdf_control_private_unset_wait_cursor (priv->parent);
 	return FALSE;
 }
 
@@ -2081,6 +2082,101 @@
 }
 
 static gboolean
+gpdf_view_button_press_select_event (GtkWidget *widget, GdkEventButton *event)
+{
+	GdkCursor *cursor;
+	GPdfViewPrivate *priv;
+	gdouble x, y;
+	gdouble ancx, ancy; 
+	gdouble rx1, ry1, rx2, ry2;
+
+	priv = GPDF_VIEW (widget)->priv;
+
+	x = event->x;
+	y = event->y;
+
+	gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
+		&rx1, &ry1, &rx2, &ry2);
+
+	gnome_canvas_window_to_world (GNOME_CANVAS (widget),
+		x, y, &x, &y);
+			
+	priv->select_anchor_x = MIN (MAX (x, rx1 +PAGE_PAD -1.0), rx2 +PAGE_PAD -1.0);
+	priv->select_anchor_y = MIN (MAX (y, ry1 +PAGE_PAD -1.0), ry2 +PAGE_PAD -1.0);
+									
+	cursor = gdk_cursor_new (GDK_RIGHT_PTR);
+
+	gpdf_view_unselect_region (GPDF_VIEW (widget));
+	gdk_pointer_grab (widget->window, FALSE,
+		(GdkEventMask) (GDK_POINTER_MOTION_MASK | 
+		GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_RELEASE_MASK), 
+		NULL, cursor, event->time);
+	gdk_cursor_unref (cursor);
+
+}
+
+static void
+gpdf_view_button_press_scroll_event (GtkWidget *widget, GdkEventButton *event)
+{
+	GPdfViewPrivate *priv;
+	gdouble x, y;
+	gdouble ancx, ancy; 
+	gdouble rx1, ry1, rx2, ry2;
+	gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
+		&rx1, &ry1, &rx2, &ry2);
+
+	priv = GPDF_VIEW (widget)->priv;
+			
+	x = event->x;
+	y = event->y; 
+	
+	gnome_canvas_window_to_world (GNOME_CANVAS (widget),
+				      x, y, &x, &y);
+
+	ancx = MIN (MAX (x, rx1 +PAGE_PAD -1.0), rx2 +PAGE_PAD -1.0);
+	ancy = MIN (MAX (y, ry1 +PAGE_PAD -1.0), ry2 +PAGE_PAD -1.0); 
+
+	if (gpdf_view_have_region_selected (GPDF_VIEW (widget)) &&
+	    priv->select_x1 < ancx && ancx < priv->select_x2 &&
+	    priv->select_y1 < ancy && ancy < priv->select_y2) {
+
+		priv->dragndroping = TRUE;
+		priv->dragndrop_anchor_x = (gint)ancx; 
+		priv->dragndrop_anchor_y = (gint)ancy; 
+	
+		priv->dragndrop_button = event->button; 
+	
+		gdk_pointer_grab (widget->window, FALSE,
+			  (GdkEventMask)
+			  (GDK_POINTER_MOTION_MASK |
+			   GDK_POINTER_MOTION_HINT_MASK |
+			   GDK_BUTTON_RELEASE_MASK),
+			  NULL, NULL, event->time);
+	} else {
+		GdkCursor *cursor;
+
+		priv->dragging = TRUE;
+	
+		gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
+					 &priv->drag_offset_x,
+					 &priv->drag_offset_y);
+	
+		priv->drag_anchor_x = (gint)(event->x - priv->drag_offset_x);
+		priv->drag_anchor_y = (gint)(event->y - priv->drag_offset_y);
+	
+		cursor = cursor_get(widget, CURSOR_HAND_CLOSED);
+	
+		gdk_pointer_grab (widget->window, FALSE,
+			  (GdkEventMask)
+			  (GDK_POINTER_MOTION_MASK |
+			   GDK_POINTER_MOTION_HINT_MASK |
+			   GDK_BUTTON_RELEASE_MASK),
+			  NULL, cursor, event->time);
+		gdk_cursor_unref (cursor);
+	}
+}
+
+static gboolean
 gpdf_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
 {
 	GPdfViewPrivate *priv;
@@ -2107,86 +2203,18 @@
 	
 	switch (event->button) {
 	      case 1:
-		GdkCursor *cursor;
-		
-		if (event->state & GDK_SHIFT_MASK) {
-			priv->selecting = TRUE; 
-			
-			gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
-							&rx1, &ry1, &rx2, &ry2);
-			
-			x = event->x;
-			y = event->y; 
-			
-			gnome_canvas_window_to_world (GNOME_CANVAS (widget),
-						      x, y, &x, &y); 
-
-			priv->select_anchor_x = MIN (MAX (x, rx1 +PAGE_PAD -1.0), rx2 +PAGE_PAD -1.0); 
-			priv->select_anchor_y = MIN (MAX (y, ry1 +PAGE_PAD -1.0), ry2 +PAGE_PAD -1.0); 
-
-			cursor = gdk_cursor_new (GDK_RIGHT_PTR);
-
-			gpdf_view_unselect_region (GPDF_VIEW (widget)); 
-			gdk_pointer_grab (widget->window, FALSE,
-					  (GdkEventMask)
-					  (GDK_POINTER_MOTION_MASK |
-					   GDK_POINTER_MOTION_HINT_MASK |
-					   GDK_BUTTON_RELEASE_MASK),
-					  NULL, cursor, event->time);
-			gdk_cursor_unref (cursor);
+		switch (gpdf_control_private_get_current_tool (priv->parent)) {
+			case GPDF_TOOL_SCROLL:
+				gpdf_view_button_press_scroll_event (
+					widget, event);
+				break;
+			case GPDF_TOOL_SELECT:
+				priv->selecting = TRUE; 
+				gpdf_view_button_press_select_event (
+					widget, event);
+				break;
 		}
-		else {
-			gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
-							&rx1, &ry1, &rx2, &ry2);
-			
-			x = event->x;
-			y = event->y; 
-			
-			gnome_canvas_window_to_world (GNOME_CANVAS (widget),
-						      x, y, &x, &y);
 
-			ancx = MIN (MAX (x, rx1 +PAGE_PAD -1.0), rx2 +PAGE_PAD -1.0);
-			ancy = MIN (MAX (y, ry1 +PAGE_PAD -1.0), ry2 +PAGE_PAD -1.0); 
-
-			if (gpdf_view_have_region_selected (GPDF_VIEW (widget)) &&
-			    priv->select_x1 < ancx && ancx < priv->select_x2 &&
-			    priv->select_y1 < ancy && ancy < priv->select_y2) {
-
-				priv->dragndroping = TRUE;
-				priv->dragndrop_anchor_x = (gint)ancx; 
-				priv->dragndrop_anchor_y = (gint)ancy; 
-				
-				priv->dragndrop_button = event->button; 
-				
-				gdk_pointer_grab (widget->window, FALSE,
-						  (GdkEventMask)
-						  (GDK_POINTER_MOTION_MASK |
-						   GDK_POINTER_MOTION_HINT_MASK |
-						   GDK_BUTTON_RELEASE_MASK),
-						  NULL, NULL, event->time);
-			}
-			else {
-				priv->dragging = TRUE;
-				
-				gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
-								 &priv->drag_offset_x,
-								 &priv->drag_offset_y);
-				
-				priv->drag_anchor_x = (gint)(event->x - priv->drag_offset_x);
-				priv->drag_anchor_y = (gint)(event->y - priv->drag_offset_y);
-				
-				cursor = gdk_cursor_new (GDK_FLEUR);
-				
-				gdk_pointer_grab (widget->window, FALSE,
-						  (GdkEventMask)
-						  (GDK_POINTER_MOTION_MASK |
-						   GDK_POINTER_MOTION_HINT_MASK |
-						   GDK_BUTTON_RELEASE_MASK),
-						  NULL, cursor, event->time);
-				gdk_cursor_unref (cursor);
-			}
-		}
-		
 		return TRUE;
 
 	      case 2:
@@ -2232,6 +2260,51 @@
 }
 
 static gboolean
+gpdf_view_button_select_release_event (GtkWidget *widget, GdkEventButton *event)
+{
+	GPdfViewPrivate *priv;
+	gdouble x, y;
+	gdouble rx1, ry1, rx2, ry2;
+	gdouble sx1, sy1, sx2, sy2;
+	gint cx, cy;
+
+	priv = GPDF_VIEW (widget)->priv;
+
+	gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
+		&rx1, &ry1, &rx2, &ry2);
+	gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
+		&cx, &cy);
+
+	x = (double)(event->x + cx);
+	y = (double)(event->y + cy);
+
+	gnome_canvas_window_to_world (GNOME_CANVAS (widget),
+		x, y, &x, &y);
+	  
+	if (abs ((int)(priv->select_anchor_x -x)) <= 1 &&
+		(abs ((int)(priv->select_anchor_y -y)) <= 1 )) {
+		sx1 = sy1 = 0.0;
+		  sx2 = sy2 = 0.0;
+	}
+	else {
+		sx1 = MAX (MIN (priv->select_anchor_x, x), rx1 +PAGE_PAD -1.0);
+		sy1 = MAX (MIN (priv->select_anchor_y, y), ry1 +PAGE_PAD -1.0);
+		sx2 = MIN (MAX (priv->select_anchor_x, x), rx2 -PAGE_PAD +1.0);
+		sy2 = MIN (MAX (priv->select_anchor_y, y), ry2 -PAGE_PAD +1.0);
+	}
+
+	gpdf_view_select_region (GPDF_VIEW (widget), sx1, sy1, sx2, sy2, FALSE);
+	gpdf_view_page_selection_show (GPDF_VIEW (widget));
+	gpdf_view_emit_selection_changed (GPDF_VIEW (widget));
+
+	LOG ("gpdf_view_button_release_event: "
+	       "Selection region = [%.2f, %.2f] x [%.2f, %.2f]",
+		sx1, sy1, sx2, sy2);
+
+	gdk_pointer_ungrab (event->time);
+}
+
+static gboolean
 gpdf_view_button_release_event (GtkWidget *widget, GdkEventButton *event)
 {
 	GPdfViewPrivate *priv;
@@ -2244,8 +2317,7 @@
 
 	priv = GPDF_VIEW (widget)->priv;
 
-	if ((!priv->dragging && !priv->selecting && !priv->dragndroping) || 
-	    event->button != 1)
+	if ((!priv->dragging && !priv->selecting && !priv->dragndroping) || event->button != 1)
 		return FALSE;
 
 	if (priv->dragging) {
@@ -2260,42 +2332,8 @@
 		gdk_pointer_ungrab (event->time);
 	}
 	else if (priv->selecting) {
-
 		priv->selecting = FALSE;
-
-		gnome_canvas_get_scroll_region (GNOME_CANVAS (widget),
-						&rx1, &ry1, &rx2, &ry2);
-		gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
-						 &cx, &cy);
-		
-		x = (double)(event->x + cx);
-		y = (double)(event->y + cy);
-
-		gnome_canvas_window_to_world (GNOME_CANVAS (widget),
-					      x, y, &x, &y); 
-		
-		if (abs ((int)(priv->select_anchor_x -x)) <= 1 && 
-		    (abs ((int)(priv->select_anchor_y -y)) <= 1 )) {
-			sx1 = sy1 = 0.0; 
-			sx2 = sy2 = 0.0;
-		}
-		else {
-			sx1 = MAX (MIN (priv->select_anchor_x, x), rx1 +PAGE_PAD -1.0); 
-			sy1 = MAX (MIN (priv->select_anchor_y, y), ry1 +PAGE_PAD -1.0); 
-			sx2 = MIN (MAX (priv->select_anchor_x, x), rx2 -PAGE_PAD +1.0);
-			sy2 = MIN (MAX (priv->select_anchor_y, y), ry2 -PAGE_PAD +1.0);
-		}
-
-		gpdf_view_select_region (GPDF_VIEW (widget), sx1, sy1, sx2, sy2, FALSE);
-		gpdf_view_page_selection_show (GPDF_VIEW (widget)); 
-		gpdf_view_emit_selection_changed (GPDF_VIEW (widget)); 
-
-		LOG ("gpdf_view_button_release_event: "
-		     "Selection region = [%.2f, %.2f] x [%.2f, %.2f]",
-		     sx1, sy1, sx2, sy2); 
-
-		gdk_pointer_ungrab (event->time);
-
+		gpdf_view_button_select_release_event (widget, event);
 	}
 	else if (priv->dragndroping) {
 
@@ -2576,7 +2614,7 @@
 	priv->output_dev->startDoc (pdf_doc->getXRef());
 	gpdf_view_page_background_show (gpdf_view);
 	gpdf_view_goto_page_no_history (gpdf_view, 1);
-	
+
 	g_signal_connect (GTK_LAYOUT (gpdf_view)->hadjustment, "value_changed",
 			  G_CALLBACK (gpdf_view_scroll_adjustments_changed_cb),
 			  gpdf_view); 
@@ -2779,7 +2817,7 @@
 	gfree(u);
 
 	/* Update cursor */
-	gpdf_control_private_reset_cursor (priv->parent); 
+	gpdf_control_private_unset_wait_cursor (priv->parent); 
 }
 
 void
@@ -2797,7 +2835,7 @@
 	
 	priv->pdf_doc->saveAs (filename);
 	
-	gpdf_control_private_reset_cursor (priv->parent);
+	gpdf_control_private_unset_wait_cursor (priv->parent);
 }
 
 void
@@ -2830,7 +2868,7 @@
 	}
 
 	delete textOut; 
-	gpdf_control_private_reset_cursor (priv->parent);
+	gpdf_control_private_unset_wait_cursor (priv->parent);
 	gpdf_control_private_pop (priv->parent); 
 }
 
diff -u --recursive --new-file gpdf-vanilla/xpdf/gpdf-view.h gpdf-tools/xpdf/gpdf-view.h
--- gpdf-vanilla/xpdf/gpdf-view.h	2003-08-30 19:46:21.000000000 -0500
+++ gpdf-tools/xpdf/gpdf-view.h	2003-10-20 00:38:39.000000000 -0500
@@ -24,6 +24,7 @@
 #ifndef GPDF_VIEW_H
 #define GPDF_VIEW_H
 
+#include <aconf.h>
 #include "gpdf-g-switch.h"
 #  include <libgnomecanvas/gnome-canvas.h>
 #  include <bonobo.h>
