--- ev-view.c.orig	2005-02-27 09:27:49.908179734 -0800
+++ ev-view.c	2005-02-27 09:26:56.344963000 -0800
@@ -50,6 +50,11 @@
   TARGET_TEXT_BUFFER_CONTENTS
 };
 
+enum {
+	GTK_SCROLL_JUMP_FORWARD,
+	GTK_SCROLL_JUMP_BACKWARD
+};
+
 static const GtkTargetEntry targets[] = {
 	{ "STRING", 0, TARGET_STRING },
 	{ "TEXT",   0, TARGET_TEXT },
@@ -884,6 +889,57 @@
 		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 == GTK_SCROLL_JUMP_BACKWARD || scroll == GTK_SCROLL_JUMP_FORWARD) {
+		GtkAdjustment *adjustment;
+		GtkWidget *widget = GTK_WIDGET (view);
+
+		double value;
+		double increment;
+
+		/* Assign increment value */
+		adjustment = view->vadjustment;
+		increment = widget->allocation.height * 0.5;
+
+		value = adjustment->value;
+
+		switch (scroll) {
+			case GTK_SCROLL_JUMP_BACKWARD:
+				/* Do not jump backwards if at the first page */
+				if (value == (adjustment->lower) && ev_view_get_page (view) == 1) {
+					/* 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);
+				/* The last jump in the page should be to the top */
+			        } else if ((value - increment) < adjustment->lower) {
+					value = adjustment->lower;
+				} else {
+					value -= increment;
+				}		    
+				break;
+			case GTK_SCROLL_JUMP_FORWARD:
+				/* Do not jump forward if at the last page */
+				if (value == (adjustment->upper - adjustment->page_size) && ev_view_get_page (view) == ev_document_get_n_pages (view->document)) {
+					/* Do nothing */
+					;
+				/* At the bottom of a page, assign the lower bound limit of next page */
+				} else if (value == (adjustment->upper - adjustment->page_size) && ev_view_get_page (view) != ev_document_get_n_pages (view->document)) {
+					value = 0;
+					ev_view_set_page (view, ev_view_get_page (view) + 1);
+				/* The last jump in the page should be to the bottom */
+			        } else if ((value + increment) > (adjustment->upper - adjustment->page_size)) {
+					value = adjustment->upper - adjustment->page_size;
+				} else {
+					value += increment;
+				}		    
+				break;
+			default:
+				break;
+		}
+
+		gtk_adjustment_set_value (adjustment, value);
 	} else {
 		GtkAdjustment *adjustment;
 		double value;
@@ -1025,6 +1081,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, GTK_SCROLL_JUMP_FORWARD, FALSE);
+	add_scroll_binding (binding_set, GDK_BackSpace, GTK_SCROLL_JUMP_BACKWARD, FALSE);
 }
 
 static void
