Skip to content

Commit b18cbd1

Browse files
Handle repeated prev and next keys (#164)
* Handle repeated prev and next keys (fixes issue 160)
1 parent d5ae534 commit b18cbd1

File tree

1 file changed

+51
-16
lines changed

1 file changed

+51
-16
lines changed

src/xviewer-window.c

+51-16
Original file line numberDiff line numberDiff line change
@@ -5758,6 +5758,17 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
57585758
gint result = FALSE;
57595759
gboolean handle_selection = FALSE;
57605760
GdkModifierType modifiers;
5761+
static uint previous_key = GDK_KEY_VoidSymbol;
5762+
static uint last_key_time = 0;
5763+
#define IMAGE_CHANGE_DELAY 250 /* delay in milliseconds between
5764+
actioning next/prev image
5765+
keypresses - to allow each image
5766+
to be seen */
5767+
if (event->type == GDK_KEY_RELEASE) {
5768+
previous_key = GDK_KEY_VoidSymbol; /* allow rapid single presses of the
5769+
next/prev image keys to work */
5770+
return TRUE;
5771+
}
57615772

57625773
modifiers = gtk_accelerator_get_default_mod_mask ();
57635774

@@ -5816,24 +5827,34 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
58165827
case GDK_KEY_Left:
58175828
case GDK_KEY_Up:
58185829
if ((event->state & modifiers) == 0) {
5819-
/* Left and Up move to previous image */
5820-
if (is_rtl) { /* move to next in RTL mode */
5821-
xviewer_window_cmd_go_next (NULL, XVIEWER_WINDOW (widget));
5822-
} else {
5823-
xviewer_window_cmd_go_prev (NULL, XVIEWER_WINDOW (widget));
5824-
}
5830+
if ((previous_key != event->keyval) ||
5831+
(event->time - last_key_time >= IMAGE_CHANGE_DELAY) ||
5832+
(event->time < last_key_time)) { /* allow for roll-over */
5833+
/* Left and Up move to previous image */
5834+
if (is_rtl) { /* move to next in RTL mode */
5835+
xviewer_window_cmd_go_next (NULL, XVIEWER_WINDOW (widget));
5836+
} else {
5837+
xviewer_window_cmd_go_prev (NULL, XVIEWER_WINDOW (widget));
5838+
}
5839+
last_key_time = event->time;
5840+
}
58255841
result = TRUE;
58265842
}
58275843
break;
58285844
case GDK_KEY_Right:
58295845
case GDK_KEY_Down:
58305846
if ((event->state & modifiers) == 0) {
5831-
/* Right and Down move to next image */
5832-
if (is_rtl) { /* move to previous in RTL mode */
5833-
xviewer_window_cmd_go_prev (NULL, XVIEWER_WINDOW (widget));
5834-
} else {
5835-
xviewer_window_cmd_go_next (NULL, XVIEWER_WINDOW (widget));
5836-
}
5847+
if ((previous_key != event->keyval) ||
5848+
(event->time - last_key_time >= IMAGE_CHANGE_DELAY) ||
5849+
(event->time < last_key_time)) { /* allow for roll-over */
5850+
/* Right and Down move to next image */
5851+
if (is_rtl) { /* move to previous in RTL mode */
5852+
xviewer_window_cmd_go_prev (NULL, XVIEWER_WINDOW (widget));
5853+
} else {
5854+
xviewer_window_cmd_go_next (NULL, XVIEWER_WINDOW (widget));
5855+
}
5856+
last_key_time = event->time;
5857+
}
58375858
result = TRUE;
58385859
}
58395860
break;
@@ -5844,8 +5865,14 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
58445865
/* If the iconview is not visible skip to the
58455866
* previous image manually as it won't handle
58465867
* the keypress then. */
5847-
xviewer_window_cmd_go_prev (NULL,
5848-
XVIEWER_WINDOW (widget));
5868+
if ((previous_key != event->keyval) ||
5869+
(event->time - last_key_time >= IMAGE_CHANGE_DELAY) ||
5870+
(event->time < last_key_time)) { /* allow for roll-over */
5871+
xviewer_window_cmd_go_prev (NULL,
5872+
XVIEWER_WINDOW (widget));
5873+
last_key_time = event->time;
5874+
}
5875+
58495876
result = TRUE;
58505877
} else
58515878
handle_selection = TRUE;
@@ -5859,8 +5886,13 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
58595886
/* If the iconview is not visible skip to the
58605887
* next image manually as it won't handle
58615888
* the keypress then. */
5862-
xviewer_window_cmd_go_next (NULL,
5863-
XVIEWER_WINDOW (widget));
5889+
if ((previous_key != event->keyval) ||
5890+
(event->time - last_key_time >= IMAGE_CHANGE_DELAY) ||
5891+
(event->time < last_key_time)) { /* allow for roll-over */
5892+
xviewer_window_cmd_go_next (NULL,
5893+
XVIEWER_WINDOW (widget));
5894+
last_key_time = event->time;
5895+
}
58645896
result = TRUE;
58655897
} else
58665898
handle_selection = TRUE;
@@ -5869,6 +5901,8 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
58695901
break;
58705902
}
58715903

5904+
previous_key = event->keyval;
5905+
58725906
/* Update slideshow timeout */
58735907
if (result && (XVIEWER_WINDOW (widget)->priv->mode == XVIEWER_WINDOW_MODE_SLIDESHOW)) {
58745908
slideshow_set_timeout (XVIEWER_WINDOW (widget));
@@ -6069,6 +6103,7 @@ xviewer_window_class_init (XviewerWindowClass *class)
60696103

60706104
widget_class->delete_event = xviewer_window_delete;
60716105
widget_class->key_press_event = xviewer_window_key_press;
6106+
widget_class->key_release_event = xviewer_window_key_press;
60726107
widget_class->button_press_event = xviewer_window_button_press;
60736108
widget_class->drag_data_received = xviewer_window_drag_data_received;
60746109
widget_class->focus_out_event = xviewer_window_focus_out_event;

0 commit comments

Comments
 (0)