@@ -5758,6 +5758,17 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
5758
5758
gint result = FALSE;
5759
5759
gboolean handle_selection = FALSE;
5760
5760
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
+ }
5761
5772
5762
5773
modifiers = gtk_accelerator_get_default_mod_mask ();
5763
5774
@@ -5816,24 +5827,34 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
5816
5827
case GDK_KEY_Left :
5817
5828
case GDK_KEY_Up :
5818
5829
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
+ }
5825
5841
result = TRUE;
5826
5842
}
5827
5843
break ;
5828
5844
case GDK_KEY_Right :
5829
5845
case GDK_KEY_Down :
5830
5846
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
+ }
5837
5858
result = TRUE;
5838
5859
}
5839
5860
break ;
@@ -5844,8 +5865,14 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
5844
5865
/* If the iconview is not visible skip to the
5845
5866
* previous image manually as it won't handle
5846
5867
* 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
+
5849
5876
result = TRUE;
5850
5877
} else
5851
5878
handle_selection = TRUE;
@@ -5859,8 +5886,13 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
5859
5886
/* If the iconview is not visible skip to the
5860
5887
* next image manually as it won't handle
5861
5888
* 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
+ }
5864
5896
result = TRUE;
5865
5897
} else
5866
5898
handle_selection = TRUE;
@@ -5869,6 +5901,8 @@ xviewer_window_key_press (GtkWidget *widget, GdkEventKey *event)
5869
5901
break ;
5870
5902
}
5871
5903
5904
+ previous_key = event -> keyval ;
5905
+
5872
5906
/* Update slideshow timeout */
5873
5907
if (result && (XVIEWER_WINDOW (widget )-> priv -> mode == XVIEWER_WINDOW_MODE_SLIDESHOW )) {
5874
5908
slideshow_set_timeout (XVIEWER_WINDOW (widget ));
@@ -6069,6 +6103,7 @@ xviewer_window_class_init (XviewerWindowClass *class)
6069
6103
6070
6104
widget_class -> delete_event = xviewer_window_delete ;
6071
6105
widget_class -> key_press_event = xviewer_window_key_press ;
6106
+ widget_class -> key_release_event = xviewer_window_key_press ;
6072
6107
widget_class -> button_press_event = xviewer_window_button_press ;
6073
6108
widget_class -> drag_data_received = xviewer_window_drag_data_received ;
6074
6109
widget_class -> focus_out_event = xviewer_window_focus_out_event ;
0 commit comments