[eog] bgo#659830 - Arrow keys should always navigate, never scroll



commit 9fe57cb979e328d9cbe4f9219630c3bd386fe854
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Aug 29 18:13:22 2012 -0500

    bgo#659830 - Arrow keys should always navigate, never scroll
    
    We use plain arrow keys to navigate the image list, regardless of whether the image is
    zoomed or whether it has the focus.  We use Alt+arrows to scroll the image.
    
    This is to make it easier to browse an image collection while at the same time zooming
    on images from time to time.
    
    Signed-off-by: Federico Mena Quintero <federico gnome org>

 src/eog-scroll-view.c |   70 ++++++++++++++++++++---------------
 src/eog-window.c      |   98 ++++++++++++++++---------------------------------
 2 files changed, 72 insertions(+), 96 deletions(-)
---
diff --git a/src/eog-scroll-view.c b/src/eog-scroll-view.c
index 91a3f36..85b14f0 100644
--- a/src/eog-scroll-view.c
+++ b/src/eog-scroll-view.c
@@ -1405,6 +1405,7 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
 	double zoom;
 	gboolean do_scroll;
 	int xofs, yofs;
+	GdkModifierType modifiers;
 
 	view = EOG_SCROLL_VIEW (data);
 	priv = view->priv;
@@ -1416,56 +1417,65 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
 
 	gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation);
 
-	/* EogScrollView doesn't handle/have any Alt+Key combos */
-	if (event->state & GDK_MOD1_MASK) {
-		return FALSE;
-	}
+	modifiers = gtk_accelerator_get_default_mod_mask ();
 
 	switch (event->keyval) {
 	case GDK_KEY_Up:
-		do_scroll = TRUE;
-		xofs = 0;
-		yofs = -SCROLL_STEP_SIZE;
+		if ((event->state & modifiers) == GDK_MOD1_MASK) {
+			do_scroll = TRUE;
+			xofs = 0;
+			yofs = -SCROLL_STEP_SIZE;
+		}
 		break;
 
 	case GDK_KEY_Page_Up:
-		do_scroll = TRUE;
-		if (event->state & GDK_CONTROL_MASK) {
-			xofs = -(allocation.width * 3) / 4;
-			yofs = 0;
-		} else {
-			xofs = 0;
-			yofs = -(allocation.height * 3) / 4;
+		if ((event->state & GDK_MOD1_MASK) != 0) {
+			do_scroll = TRUE;
+			if (event->state & GDK_CONTROL_MASK) {
+				xofs = -(allocation.width * 3) / 4;
+				yofs = 0;
+			} else {
+				xofs = 0;
+				yofs = -(allocation.height * 3) / 4;
+			}
 		}
 		break;
 
 	case GDK_KEY_Down:
-		do_scroll = TRUE;
-		xofs = 0;
-		yofs = SCROLL_STEP_SIZE;
+		if ((event->state & modifiers) == GDK_MOD1_MASK) {
+			do_scroll = TRUE;
+			xofs = 0;
+			yofs = SCROLL_STEP_SIZE;
+		}
 		break;
 
 	case GDK_KEY_Page_Down:
-		do_scroll = TRUE;
-		if (event->state & GDK_CONTROL_MASK) {
-			xofs = (allocation.width * 3) / 4;
-			yofs = 0;
-		} else {
-			xofs = 0;
-			yofs = (allocation.height * 3) / 4;
+		if ((event->state & GDK_MOD1_MASK) != 0) {
+			do_scroll = TRUE;
+			if (event->state & GDK_CONTROL_MASK) {
+				xofs = (allocation.width * 3) / 4;
+				yofs = 0;
+			} else {
+				xofs = 0;
+				yofs = (allocation.height * 3) / 4;
+			}
 		}
 		break;
 
 	case GDK_KEY_Left:
-		do_scroll = TRUE;
-		xofs = -SCROLL_STEP_SIZE;
-		yofs = 0;
+		if ((event->state & modifiers) == GDK_MOD1_MASK) {
+			do_scroll = TRUE;
+			xofs = -SCROLL_STEP_SIZE;
+			yofs = 0;
+		}
 		break;
 
 	case GDK_KEY_Right:
-		do_scroll = TRUE;
-		xofs = SCROLL_STEP_SIZE;
-		yofs = 0;
+		if ((event->state & modifiers) == GDK_MOD1_MASK) {
+			do_scroll = TRUE;
+			xofs = SCROLL_STEP_SIZE;
+			yofs = 0;
+		}
 		break;
 
 	case GDK_KEY_plus:
diff --git a/src/eog-window.c b/src/eog-window.c
index a3a1e34..947c85d 100644
--- a/src/eog-window.c
+++ b/src/eog-window.c
@@ -4939,91 +4939,57 @@ eog_window_key_press (GtkWidget *widget, GdkEventKey *event)
 		}
 		break;
 	case GDK_KEY_Left:
-		if ((event->state & modifiers) == GDK_MOD1_MASK) {
-			/* Alt+Left moves to previous image */
+	case GDK_KEY_Up:
+		if ((event->state & modifiers) == 0) {
+			/* Left and Up move to previous image */
 			if (is_rtl) { /* move to next in RTL mode */
 				eog_window_cmd_go_next (NULL, EOG_WINDOW (widget));
 			} else {
 				eog_window_cmd_go_prev (NULL, EOG_WINDOW (widget));
 			}
 			result = TRUE;
-			break;
-		} /* else fall-trough is intended */
-	case GDK_KEY_Up:
-		if (eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
-			/* break to let scrollview handle the key */
-			break;
-		}
-		if (gtk_container_get_focus_child (tbcontainer) != NULL)
-			break;
-		if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
-			if (is_rtl && event->keyval == GDK_KEY_Left) {
-				/* handle RTL fall-through,
-				 * need to behave like GDK_Down then */
-				eog_window_cmd_go_next (NULL,
-							EOG_WINDOW (widget));
-			} else {
-				eog_window_cmd_go_prev (NULL,
-							EOG_WINDOW (widget));
-			}
-			result = TRUE;
-			break;
 		}
+		break;
 	case GDK_KEY_Right:
-		if ((event->state & modifiers) == GDK_MOD1_MASK) {
-			/* Alt+Right moves to next image */
+	case GDK_KEY_Down:
+		if ((event->state & modifiers) == 0) {
+			/* Right and Down move to next image */
 			if (is_rtl) { /* move to previous in RTL mode */
 				eog_window_cmd_go_prev (NULL, EOG_WINDOW (widget));
 			} else {
 				eog_window_cmd_go_next (NULL, EOG_WINDOW (widget));
 			}
 			result = TRUE;
-			break;
-		} /* else fall-trough is intended */
-	case GDK_KEY_Down:
-		if (eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
-			/* break to let scrollview handle the key */
-			break;
-		}
-		if (gtk_container_get_focus_child (tbcontainer) != NULL)
-			break;
-		if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
-			if (is_rtl && event->keyval == GDK_KEY_Right) {
-				/* handle RTL fall-through,
-				 * need to behave like GDK_Up then */
-				eog_window_cmd_go_prev (NULL,
-							EOG_WINDOW (widget));
-			} else {
-				eog_window_cmd_go_next (NULL,
-							EOG_WINDOW (widget));
-			}
-			result = TRUE;
-			break;
 		}
+		break;
 	case GDK_KEY_Page_Up:
-		if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
-			if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
-				/* If the iconview is not visible skip to the
-				 * previous image manually as it won't handle
-				 * the keypress then. */
-				eog_window_cmd_go_prev (NULL,
-							EOG_WINDOW (widget));
-				result = TRUE;
-			} else
-				handle_selection = TRUE;
+		if ((event->state & modifiers) == 0) {
+			if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
+				if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
+					/* If the iconview is not visible skip to the
+					 * previous image manually as it won't handle
+					 * the keypress then. */
+					eog_window_cmd_go_prev (NULL,
+								EOG_WINDOW (widget));
+					result = TRUE;
+				} else
+					handle_selection = TRUE;
+			}
 		}
 		break;
 	case GDK_KEY_Page_Down:
-		if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
-			if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
-				/* If the iconview is not visible skip to the
-				 * next image manually as it won't handle
-				 * the keypress then. */
-				eog_window_cmd_go_next (NULL,
-							EOG_WINDOW (widget));
-				result = TRUE;
-			} else
-				handle_selection = TRUE;
+		if ((event->state & modifiers) == 0) {
+			if (!eog_scroll_view_scrollbars_visible (EOG_SCROLL_VIEW (EOG_WINDOW (widget)->priv->view))) {
+				if (!gtk_widget_get_visible (EOG_WINDOW (widget)->priv->nav)) {
+					/* If the iconview is not visible skip to the
+					 * next image manually as it won't handle
+					 * the keypress then. */
+					eog_window_cmd_go_next (NULL,
+								EOG_WINDOW (widget));
+					result = TRUE;
+				} else
+					handle_selection = TRUE;
+			}
 		}
 		break;
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]