--- ev-view.c.orig	2005-02-28 23:04:21.000000000 -0800
+++ ev-view.c	2005-03-18 14:04:45.051943408 -0800
@@ -50,6 +50,11 @@
   TARGET_TEXT_BUFFER_CONTENTS
 };
 
+enum {
+	EV_SCROLL_PAGE_FORWARD,
+	EV_SCROLL_PAGE_BACKWARD
+};
+
 static const GtkTargetEntry targets[] = {
 	{ "STRING", 0, TARGET_STRING },
 	{ "TEXT",   0, TARGET_TEXT },
@@ -876,6 +881,60 @@
 }
 
 static void
+ev_view_jump (EvView *view, 
+	      GtkScrollType scroll)
+{
+	GtkAdjustment *adjustment;
+	double value, increment;
+	gboolean first_page = FALSE;
+	gboolean last_page = FALSE;
+
+	/* Assign values for increment and vertical adjustment */
+	adjustment = view->vadjustment;
+	increment = adjustment->page_size * 0.75;
+	value = adjustment->value;
+
+	/* Assign boolean for first and last page */
+	if (ev_view_get_page (view) == 1)
+		first_page = TRUE;
+	if (ev_view_get_page (view) == ev_document_get_n_pages (view->document))
+		last_page = TRUE;
+				
+	switch (scroll) {
+		case EV_SCROLL_PAGE_BACKWARD:
+			/* Do not jump backwards if at the first page */
+			if (value == (adjustment->lower) && first_page) {
+				/* Do nothing */
+			/* At the top of a page, assign the upper bound limit of previous page */
+			} else if (value == (adjustment->lower) && ev_view_get_page (view) != 1) {
+				value = adjustment->upper - adjustment->page_size;
+				ev_view_set_page (view, ev_view_get_page (view) - 1);
+			/* Jump to the top */
+			} else {
+				value = MAX (value - increment, adjustment->lower);
+			}		    
+			break;
+		case EV_SCROLL_PAGE_FORWARD:
+			/* Do not jump forward if at the last page */
+			if (value == (adjustment->upper - adjustment->page_size) && last_page) {
+				/* Do nothing */
+			/* At the bottom of a page, assign the lower bound limit of next page */
+			} else if (value == (adjustment->upper - adjustment->page_size) && !last_page) {
+				value = 0;
+				ev_view_set_page (view, ev_view_get_page (view) + 1);
+			/* Jump to the bottom */
+			} else {
+				value = MIN (value + increment, adjustment->upper - adjustment->page_size);
+			}		    
+			break;
+		default:
+			break;
+	}
+		 
+	gtk_adjustment_set_value (adjustment, value);		
+}
+
+static void
 ev_view_scroll_view (EvView *view,
 		     GtkScrollType scroll,
 		     gboolean horizontal)
@@ -884,6 +943,8 @@
 		ev_view_set_page (view, ev_view_get_page (view) - 1);
 	} else if (scroll == GTK_SCROLL_PAGE_FORWARD) {
 		ev_view_set_page (view, ev_view_get_page (view) + 1);
+	} else if (scroll == EV_SCROLL_PAGE_BACKWARD || scroll == EV_SCROLL_PAGE_FORWARD) {
+		ev_view_jump (view, scroll);	    
 	} else {
 		GtkAdjustment *adjustment;
 		double value;
@@ -1025,6 +1086,9 @@
 
 	add_scroll_binding (binding_set, GDK_Page_Up,   GTK_SCROLL_PAGE_BACKWARD, FALSE);
 	add_scroll_binding (binding_set, GDK_Page_Down, GTK_SCROLL_PAGE_FORWARD,  FALSE);
+
+	add_scroll_binding (binding_set, GDK_space, EV_SCROLL_PAGE_FORWARD, FALSE);
+	add_scroll_binding (binding_set, GDK_BackSpace, EV_SCROLL_PAGE_BACKWARD, FALSE);
 }
 
 static void
