--- /dev/null
+USING: alien.syntax classes.struct gdk.ffi tools.test ui.backend.gtk
+ui.gestures ;
+IN: ui.backend.gtk.tests
+
+: gdk-key-release-event ( -- event )
+ S{ GdkEventKey
+ { type 9 }
+ { window ALIEN: 1672900 }
+ { send_event 0 }
+ { time 1332590199 }
+ { state 17 }
+ { keyval 72 }
+ { length 1 }
+ { string ALIEN: 1b25c80 }
+ { hardware_keycode 43 }
+ { group 0 }
+ { is_modifier 0 }
+ } ;
+
+: gdk-key-press-event ( -- event )
+ S{ GdkEventKey
+ { type 8 }
+ { window ALIEN: 16727e0 }
+ { send_event 0 }
+ { time 1332864912 }
+ { state 16 }
+ { keyval 65471 }
+ { length 0 }
+ { string ALIEN: 19c9700 }
+ { hardware_keycode 68 }
+ { group 0 }
+ { is_modifier 0 }
+ } ;
+
+{
+ T{ key-down f f "F2" }
+ T{ key-up f f "H" }
+} [
+ gdk-key-press-event key-event>gesture
+ gdk-key-release-event key-event>gesture
+] unit-test
keyval>> dup action-key-codes at [ t ]
[ gdk_keyval_to_unicode [ f ] [ 1string ] if-zero f ] ?if ;
-: key-event>gesture ( event -- mods sym/f action? )
- [ event-modifiers ] [ key-sym ] bi ;
+: key-event>gesture ( event -- key-gesture )
+ [ event-modifiers ] [ key-sym ] [
+ type>> GDK_KEY_PRESS = [ <key-down> ] [ <key-up> ] if
+ ] tri ;
-: on-key-press ( win event user-data -- ? )
- drop swap [ key-event>gesture <key-down> ] [ window ] bi*
- propagate-key-gesture t ;
-
-: on-key-release ( win event user-data -- ? )
- drop swap [ key-event>gesture <key-up> ] [ window ] bi*
- propagate-key-gesture t ;
+: on-key-press/release ( win event user-data -- ? )
+ drop swap [ key-event>gesture ] [ window ] bi* propagate-key-gesture t ;
: on-focus-in ( win event user-data -- ? )
2drop window focus-world t ;
] when* ;
:: connect-user-input-signals ( win -- )
- win events-mask gtk_widget_add_events
win "motion-notify-event" [ on-motion yield ]
GtkWidget:motion-notify-event connect-signal
win "leave-notify-event" [ on-leave yield ]
GtkWidget:button-release-event connect-signal
win "scroll-event" [ on-scroll yield ]
GtkWidget:scroll-event connect-signal
- win "key-press-event" [ on-key-press yield ]
+ win "key-press-event" [ on-key-press/release yield ]
GtkWidget:key-press-event connect-signal
- win "key-release-event" [ on-key-release yield ]
+ win "key-release-event" [ on-key-press/release yield ]
GtkWidget:key-release-event connect-signal
win "focus-in-event" [ on-focus-in yield ]
GtkWidget:focus-in-event connect-signal