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>
This commit is contained in:
Federico Mena Quintero 2012-08-29 18:13:22 -05:00
parent 32cc946446
commit 9fe57cb979
2 changed files with 72 additions and 96 deletions

View file

@ -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,19 +1417,19 @@ 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:
if ((event->state & modifiers) == GDK_MOD1_MASK) {
do_scroll = TRUE;
xofs = 0;
yofs = -SCROLL_STEP_SIZE;
}
break;
case GDK_KEY_Page_Up:
if ((event->state & GDK_MOD1_MASK) != 0) {
do_scroll = TRUE;
if (event->state & GDK_CONTROL_MASK) {
xofs = -(allocation.width * 3) / 4;
@ -1437,15 +1438,19 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
xofs = 0;
yofs = -(allocation.height * 3) / 4;
}
}
break;
case GDK_KEY_Down:
if ((event->state & modifiers) == GDK_MOD1_MASK) {
do_scroll = TRUE;
xofs = 0;
yofs = SCROLL_STEP_SIZE;
}
break;
case GDK_KEY_Page_Down:
if ((event->state & GDK_MOD1_MASK) != 0) {
do_scroll = TRUE;
if (event->state & GDK_CONTROL_MASK) {
xofs = (allocation.width * 3) / 4;
@ -1454,18 +1459,23 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
xofs = 0;
yofs = (allocation.height * 3) / 4;
}
}
break;
case GDK_KEY_Left:
if ((event->state & modifiers) == GDK_MOD1_MASK) {
do_scroll = TRUE;
xofs = -SCROLL_STEP_SIZE;
yofs = 0;
}
break;
case GDK_KEY_Right:
if ((event->state & modifiers) == GDK_MOD1_MASK) {
do_scroll = TRUE;
xofs = SCROLL_STEP_SIZE;
yofs = 0;
}
break;
case GDK_KEY_plus:

View file

@ -4939,68 +4939,31 @@ 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;
}
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;
}
case GDK_KEY_Page_Up:
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
@ -5012,8 +4975,10 @@ eog_window_key_press (GtkWidget *widget, GdkEventKey *event)
} else
handle_selection = TRUE;
}
}
break;
case GDK_KEY_Page_Down:
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
@ -5025,6 +4990,7 @@ eog_window_key_press (GtkWidget *widget, GdkEventKey *event)
} else
handle_selection = TRUE;
}
}
break;
}