Index: libeog/eog-scroll-view.c
===================================================================
RCS file: /cvs/gnome/eog/libeog/eog-scroll-view.c,v
retrieving revision 1.26
diff -u -r1.26 eog-scroll-view.c
--- libeog/eog-scroll-view.c	18 Nov 2005 05:00:23 -0000	1.26
+++ libeog/eog-scroll-view.c	29 Nov 2005 22:18:37 -0000
@@ -1051,24 +1051,12 @@
 		yofs = -SCROLL_STEP_SIZE;
 		break;
 
-	case GDK_Page_Up:
-		do_scroll = TRUE;
-		xofs = 0;
-		yofs = -SCROLL_STEP_SIZE * 4;
-		break;
-
 	case GDK_Down:
 		do_scroll = TRUE;
 		xofs = 0;
 		yofs = SCROLL_STEP_SIZE;
 		break;
 
-	case GDK_Page_Down:
-		do_scroll = TRUE;
-		xofs = 0;
-		yofs = SCROLL_STEP_SIZE * 4;
-		break;
-
 	case GDK_Left:
 		do_scroll = TRUE;
 		xofs = -SCROLL_STEP_SIZE;
@@ -1800,6 +1788,15 @@
 	*height = gdk_pixbuf_get_height (priv->pixbuf);
 }
 
+gboolean 
+eog_scroll_view_scrollbars_visible (EogScrollView *view)
+{
+	if (!GTK_WIDGET_VISIBLE (GTK_WIDGET (view->priv->hbar)) && 
+	    !GTK_WIDGET_VISIBLE (GTK_WIDGET (view->priv->vbar)))
+		return FALSE;
+
+	return TRUE;
+}
 
 /*===================================
     object creation/freeing
Index: libeog/eog-scroll-view.h
===================================================================
RCS file: /cvs/gnome/eog/libeog/eog-scroll-view.h,v
retrieving revision 1.3
diff -u -r1.3 eog-scroll-view.h
--- libeog/eog-scroll-view.h	25 Jun 2005 02:12:03 -0000	1.3
+++ libeog/eog-scroll-view.h	29 Nov 2005 22:18:37 -0000
@@ -46,6 +46,7 @@
 void     eog_scroll_view_set_antialiasing (EogScrollView *view, gboolean state);
 void     eog_scroll_view_set_transparency (EogScrollView *view, TransparencyStyle style, GdkColor *color);
 void     eog_scroll_view_get_image_size   (EogScrollView *view, int *width, int *height, gboolean scaled);
+gboolean eog_scroll_view_scrollbars_visible (EogScrollView *view);
 
 /* zoom api */
 void     eog_scroll_view_zoom_in          (EogScrollView *view, gboolean smooth);
Index: shell/eog-gtk-ui.xml
===================================================================
RCS file: /cvs/gnome/eog/shell/eog-gtk-ui.xml,v
retrieving revision 1.12
diff -u -r1.12 eog-gtk-ui.xml
--- shell/eog-gtk-ui.xml	13 Nov 2005 18:25:09 -0000	1.12
+++ shell/eog-gtk-ui.xml	29 Nov 2005 22:18:37 -0000
@@ -70,5 +70,12 @@
   <accelerator name="ControlEqualAccel" action="ControlEqual"/>
   <accelerator name="ControlKPAddAccel" action="ControlKpAdd"/>
   <accelerator name="ControlKPSubAccel" action="ControlKpSub"/>
+  <accelerator name="PageDownAccel" action="PageDown"/>
+  <accelerator name="PageUpAccel" action="PageUp"/>
   <accelerator name="SpaceBarAccel" action="SpaceBar"/>
+  <accelerator name="ShiftSpaceBarAccel" action="ShiftSpaceBar"/>
+  <accelerator name="ReturnAccel" action="Return"/>
+  <accelerator name="ShiftReturnAccel" action="ShiftReturn"/>
+  <accelerator name="EndAccel" action="End"/>
+  <accelerator name="HomeAccel" action="Home"/>
 </ui>
Index: shell/eog-window.c
===================================================================
RCS file: /cvs/gnome/eog/shell/eog-window.c,v
retrieving revision 1.175
diff -u -r1.175 eog-window.c
--- shell/eog-window.c	18 Nov 2005 05:00:24 -0000	1.175
+++ shell/eog-window.c	29 Nov 2005 22:18:39 -0000
@@ -686,27 +686,41 @@
 }
 
 static void
-verb_Go_cb (GtkAction *action, gpointer data)
+verb_GoNext_cb (GtkAction *action, gpointer data)
 {
-	EogWindowPrivate *priv;
-	gchar *action_name = (gchar *) gtk_action_get_name (action);
+	g_return_if_fail (EOG_IS_WINDOW (data));
+
+	eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(data)->priv->wraplist), 
+				     EOG_WRAP_LIST_SELECT_RIGHT);
+}
 
+static void
+verb_GoPrev_cb (GtkAction *action, gpointer data)
+{
 	g_return_if_fail (EOG_IS_WINDOW (data));
 
-	priv = EOG_WINDOW (data)->priv;
+	eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(data)->priv->wraplist), 
+				     EOG_WRAP_LIST_SELECT_LEFT);
+}
 
-	if (g_ascii_strcasecmp (action_name, "GoNext") == 0 ||
-	    g_ascii_strcasecmp (action_name, "SpaceBar") == 0) {
-		eog_wrap_list_select_single (EOG_WRAP_LIST (priv->wraplist), EOG_WRAP_LIST_SELECT_RIGHT);
-	} else if (g_ascii_strcasecmp (action_name, "GoPrevious") == 0) {
-		eog_wrap_list_select_single (EOG_WRAP_LIST (priv->wraplist), EOG_WRAP_LIST_SELECT_LEFT);
-	} else if (g_ascii_strcasecmp (action_name, "GoFirst") == 0) {
-		eog_wrap_list_select_single (EOG_WRAP_LIST (priv->wraplist), EOG_WRAP_LIST_SELECT_FIRST);
-	} else if (g_ascii_strcasecmp (action_name, "GoLast") == 0) {
-		eog_wrap_list_select_single (EOG_WRAP_LIST (priv->wraplist), EOG_WRAP_LIST_SELECT_LAST);
-	}
+static void
+verb_GoFirst_cb (GtkAction *action, gpointer data)
+{
+	g_return_if_fail (EOG_IS_WINDOW (data));
+
+	eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(data)->priv->wraplist), 
+				     EOG_WRAP_LIST_SELECT_FIRST);
 }
-	
+
+static void
+verb_GoLast_cb (GtkAction *action, gpointer data)
+{
+	g_return_if_fail (EOG_IS_WINDOW (data));
+
+	eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(data)->priv->wraplist), 
+				     EOG_WRAP_LIST_SELECT_LAST);
+}
+
 static void
 slideshow_hide_cb (GtkWidget *widget, gpointer data)
 {
@@ -2463,20 +2477,31 @@
 	if (GTK_WIDGET_CLASS (parent_class)->key_press_event)
 		result = (* GTK_WIDGET_CLASS (parent_class)->key_press_event) (widget, event);
 
-	if (result)
-		return result;
-
 	switch (event->keyval) {
 	case GDK_Q:
 	case GDK_q:
 		eog_window_close (EOG_WINDOW (widget));
+		result = TRUE;
+		break;
+	case GDK_Up:
+	case GDK_Left:
+		if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->scroll_view))) {
+			eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(widget)->priv->wraplist), 
+						     EOG_WRAP_LIST_SELECT_LEFT);
+		}
+		result = TRUE;
+		break;
+	case GDK_Down:
+	case GDK_Right:
+		if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->scroll_view))) {
+			eog_wrap_list_select_single (EOG_WRAP_LIST (EOG_WINDOW(widget)->priv->wraplist), 
+						     EOG_WRAP_LIST_SELECT_RIGHT);
+		}
+		result = TRUE;
 		break;
-
-	default:
-		return FALSE;
 	}
 
-	return TRUE;
+	return result;
 }
 
 /* Returns whether a window has an image loaded in it */
@@ -3238,7 +3263,17 @@
   { "ControlEqual", GTK_STOCK_ZOOM_IN, N_("_Zoom In"), "<control>equal", NULL, G_CALLBACK (verb_ZoomIn_cb) },
   { "ControlKpAdd", GTK_STOCK_ZOOM_IN, N_("_Zoom In"), "<control>KP_Add",NULL, G_CALLBACK (verb_ZoomIn_cb) },
   { "ControlKpSub", GTK_STOCK_ZOOM_OUT, N_("Zoom _Out"), "<control>KP_Subtract", NULL, G_CALLBACK (verb_ZoomOut_cb) },
-  { "SpaceBar",     GTK_STOCK_ZOOM_OUT, N_("_Next Image"), "space", NULL, G_CALLBACK (verb_Go_cb) },
+
+  { "PageDown", NULL, N_("_Next Image"), "Page_Down", NULL, G_CALLBACK (verb_GoNext_cb) },
+  { "SpaceBar", NULL, N_("_Next Image"), "space", NULL, G_CALLBACK (verb_GoNext_cb) },
+  { "Return", NULL, N_("_Next Image"), "Return", NULL, G_CALLBACK (verb_GoNext_cb) },
+
+  { "PageUp", NULL, N_("_Previous Image"), "Page_Up", NULL, G_CALLBACK (verb_GoPrev_cb) },
+  { "ShiftSpaceBar", NULL, N_("_Previous Image"), "<shift>space", NULL, G_CALLBACK (verb_GoPrev_cb) },
+  { "ShiftReturn", NULL, N_("_Previous Image"), "<shift>Return", NULL, G_CALLBACK (verb_GoPrev_cb) },
+
+  { "Home", NULL, N_("_First Image"), "Home", NULL, G_CALLBACK (verb_GoFirst_cb) },
+  { "End", NULL, N_("_Last Image"), "End", NULL, G_CALLBACK (verb_GoLast_cb) },
 };
 
 static const GtkToggleActionEntry toggle_entries_image[] = {
@@ -3246,10 +3281,10 @@
 };
 
 static const GtkActionEntry action_entries_collection[] = {
-  { "GoPrevious", GTK_STOCK_GO_BACK, N_("_Previous Image"), "<control>Page_Up", NULL, G_CALLBACK (verb_Go_cb) },
-  { "GoNext", GTK_STOCK_GO_FORWARD, N_("_Next Image"), "<control>Page_Down", NULL, G_CALLBACK (verb_Go_cb) },
-  { "GoFirst", GTK_STOCK_GOTO_FIRST, N_("_First Image"), "<control>Home", NULL, G_CALLBACK (verb_Go_cb) },
-  { "GoLast", GTK_STOCK_GOTO_LAST, N_("_Last Image"), "<control>End", NULL, G_CALLBACK (verb_Go_cb) },
+  { "GoPrevious", GTK_STOCK_GO_BACK, N_("_Previous Image"), "<control>Page_Up", NULL, G_CALLBACK (verb_GoPrev_cb) },
+  { "GoNext", GTK_STOCK_GO_FORWARD, N_("_Next Image"), "<control>Page_Down", NULL, G_CALLBACK (verb_GoNext_cb) },
+  { "GoFirst", GTK_STOCK_GOTO_FIRST, N_("_First Image"), "<control>Home", NULL, G_CALLBACK (verb_GoFirst_cb) },
+  { "GoLast", GTK_STOCK_GOTO_LAST, N_("_Last Image"), "<control>End", NULL, G_CALLBACK (verb_GoLast_cb) },
 };
 
 typedef struct {
