@@ -128,6 +128,15 @@ struct _Imageui {
128128 gint64 last_frame_time ;
129129
130130 gboolean should_animate ;
131+
132+ /* We need to detect ctrl-click and shift-click for region create and
133+ * resize.
134+ *
135+ * Windows doesn't seem to support device polling, so we record ctrl and
136+ * shift state here in the keyboard handler.
137+ */
138+ guint modifiers ;
139+
131140};
132141
133142G_DEFINE_TYPE (Imageui , imageui , GTK_TYPE_WIDGET );
@@ -820,6 +829,16 @@ imageui_key_pressed(GtkEventControllerKey *self,
820829 handled = FALSE;
821830
822831 switch (keyval ) {
832+ case GDK_KEY_Control_L :
833+ case GDK_KEY_Control_R :
834+ imageui -> modifiers |= GDK_CONTROL_MASK ;
835+ break ;
836+
837+ case GDK_KEY_Shift_L :
838+ case GDK_KEY_Shift_R :
839+ imageui -> modifiers |= GDK_SHIFT_MASK ;
840+ break ;
841+
823842 case GDK_KEY_plus :
824843 imageui_magin (imageui );
825844 handled = TRUE;
@@ -940,6 +959,16 @@ imageui_key_released(GtkEventControllerKey *self,
940959 handled = FALSE;
941960
942961 switch (keyval ) {
962+ case GDK_KEY_Control_L :
963+ case GDK_KEY_Control_R :
964+ imageui -> modifiers &= ~GDK_CONTROL_MASK ;
965+ break ;
966+
967+ case GDK_KEY_Shift_L :
968+ case GDK_KEY_Shift_R :
969+ imageui -> modifiers &= ~GDK_SHIFT_MASK ;
970+ break ;
971+
943972 case GDK_KEY_i :
944973 case GDK_KEY_o :
945974 imageui -> zoom_rate = 1.0 ;
@@ -977,7 +1006,6 @@ imageui_drag_begin(GtkEventControllerMotion *self,
9771006{
9781007 Imageui * imageui = IMAGEUI (user_data );
9791008
980- guint modifiers ;
9811009 Regionview * regionview ;
9821010
9831011#ifdef DEBUG_VERBOSE
@@ -987,7 +1015,6 @@ imageui_drag_begin(GtkEventControllerMotion *self,
9871015
9881016 switch (imageui -> state ) {
9891017 case IMAGEUI_WAIT :
990- modifiers = get_modifiers (GTK_EVENT_CONTROLLER (self ));
9911018 regionview = imageui_find_regionview (imageui , start_x , start_y );
9921019
9931020 if (regionview ) {
@@ -997,7 +1024,7 @@ imageui_drag_begin(GtkEventControllerMotion *self,
9971024 g_object_ref (regionview );
9981025 regionview -> start_area = regionview -> our_area ;
9991026 }
1000- else if (modifiers & GDK_CONTROL_MASK ) {
1027+ else if (imageui -> modifiers & GDK_CONTROL_MASK ) {
10011028 imageui -> state = IMAGEUI_CREATE ;
10021029 double left ;
10031030 double top ;
@@ -1039,7 +1066,6 @@ imageui_drag_update(GtkEventControllerMotion *self,
10391066{
10401067 Imageui * imageui = IMAGEUI (user_data );
10411068 double zoom = imageui_get_zoom (imageui );
1042- guint modifiers = get_modifiers (GTK_EVENT_CONTROLLER (self ));
10431069
10441070#ifdef DEBUG_VERBOSE
10451071 printf ("imageui_drag_update: offset_x = %g, offset_y = %g\n" ,
@@ -1054,7 +1080,7 @@ imageui_drag_update(GtkEventControllerMotion *self,
10541080 break ;
10551081
10561082 case IMAGEUI_SELECT :
1057- regionview_resize (imageui -> grabbed , modifiers ,
1083+ regionview_resize (imageui -> grabbed , imageui -> modifiers ,
10581084 imageui -> tilesource -> display_width ,
10591085 imageui -> tilesource -> display_height ,
10601086 offset_x / zoom ,
@@ -1065,7 +1091,7 @@ imageui_drag_update(GtkEventControllerMotion *self,
10651091 break ;
10661092
10671093 case IMAGEUI_CREATE :
1068- regionview_resize (imageui -> floating , modifiers ,
1094+ regionview_resize (imageui -> floating , imageui -> modifiers ,
10691095 imageui -> tilesource -> display_width ,
10701096 imageui -> tilesource -> display_height ,
10711097 offset_x / zoom ,
0 commit comments