]> gitweb.factorcode.org Git - factor.git/commitdiff
ui.backend.gtk: add simple input method support (GtkIMContextSimple)
authorAnton Gorenko <ex.rzrjck@gmail.com>
Fri, 11 Jun 2010 13:43:11 +0000 (19:43 +0600)
committerAnton Gorenko <ex.rzrjck@gmail.com>
Fri, 11 Jun 2010 13:43:11 +0000 (19:43 +0600)
basis/ui/backend/gtk/gtk.factor

index 9acae5e7a5a929b0a3701ba6da4e33f05afee619..3a2835c1b1289c170f37c7d031e4f5403e7fb431 100644 (file)
@@ -156,37 +156,24 @@ CONSTANT: action-key-codes
         [ scroll-direction ] [ event-loc ] bi
     ] dip window send-scroll t ;
 
-: key-sym ( event -- sym action? )
-    keyval>> dup action-key-codes at
-    [ t ] [ gdk_keyval_to_unicode 1string f ] ?if ;
+: key-sym ( event -- sym/f action? )
+    keyval>> dup action-key-codes at [ t ]
+    [ gdk_keyval_to_unicode [ f ] [ 1string ] if-zero f ] ?if ;
 
-: key-event>gesture ( event -- modifiers sym action? )
+: key-event>gesture ( event -- mods sym/f action? )
+    GdkEventKey memory>struct
     [ event-modifiers ] [ key-sym ] bi ;
 
-: valid-input? ( string gesture -- ? )
-    over empty? [ 2drop f ] [
-        mods>> { f { S+ } } member? [
-            [ { [ 127 = not ] [ CHAR: \s >= ] } 1&& ] all?
-        ] [
-            [ { [ 127 = not ] [ CHAR: \s >= ] [ alpha? not ] } 1&& ] all?
-        ] if
-    ] if ;
-
-:: on-key-press ( sender event user-data -- result )
-    sender window :> world
-    event GdkEventKey memory>struct :> ev
-    ev key-event>gesture <key-down> :> gesture
-    gesture world propagate-key-gesture
-    ev keyval>> gdk_keyval_to_unicode 1string dup
-    gesture valid-input?
-    [ world user-input ] [ drop ] if
-    t ;
+: send-key-gesture ( win gesture -- )
+    swap window propagate-key-gesture ;
+   
+: on-key-press ( sender event user-data -- result )
+    drop key-event>gesture over
+    [ <key-down> send-key-gesture ] [ 3drop drop ] if t ;
 
 : on-key-release ( sender event user-data -- result )
-    drop swap [
-        GdkEventKey memory>struct
-        key-event>gesture <key-up>
-    ] dip window propagate-key-gesture t ;
+    drop key-event>gesture over
+    [ <key-up> send-key-gesture ] [ 3drop drop ] if t ;
 
 : on-focus-in ( sender event user-data -- result )
     2drop window focus-world t ;
@@ -289,8 +276,11 @@ M: gtk-ui-backend (with-ui)
         ] with-destructors
     ] ui-running ;
 
+: connect-signal-with-data ( object signal-name callback data -- )
+    [ utf8 string>alien ] 2dip f 0 g_signal_connect_data drop ;
+
 : connect-signal ( object signal-name callback -- )
-    [ utf8 string>alien ] dip f f 0 g_signal_connect_data drop ;
+    f connect-signal-with-data ;
 
 :: connect-signals ( win -- )
     win events-mask [ enum>number ] [ bitor ] map-reduce
@@ -323,6 +313,34 @@ M: gtk-ui-backend (with-ui)
     win "delete-event" [ on-delete yield ]
     GtkWidget:delete-event connect-signal ;
 
+: on-key-event-for-im ( sender event user-data -- result )
+    swap gtk_im_context_filter_keypress 2drop f ;
+
+: on-focus-out-for-im ( sender event user-data -- result )
+    2nip gtk_im_context_reset f ;
+
+: on-destroy-for-im ( sender user-data -- result )
+    nip g_object_unref f ;
+
+: on-im-commit ( sender str user_data -- )
+    [ drop ] [ utf8 alien>string ] [ window ] tri* user-input ;
+
+:: configure-im ( win -- )
+    gtk_im_context_simple_new :> im
+    im win gtk_im_context_set_client_window
+    
+    im "commit" [ on-im-commit yield ]
+    GtkIMContext:commit win connect-signal-with-data
+
+    win "key-press-event" [ on-key-event-for-im ]
+    GtkWidget:key-press-event im connect-signal-with-data
+    win "key-release-event" [ on-key-event-for-im ]
+    GtkWidget:key-release-event im connect-signal-with-data
+    win "focus-out-event" [ on-focus-out-for-im ]
+    GtkWidget:focus-out-event im connect-signal-with-data
+    win "destroy" [ on-destroy-for-im ]
+    GtkObject:destroy im connect-signal-with-data ;
+
 CONSTANT: window-controls>decor-flags
     H{
         { close-button 0 }
@@ -366,7 +384,7 @@ CONSTANT: window-controls>func-flags
         f t GDK_GL_RGBA_TYPE enum>number gtk_widget_set_gl_capability
     ] with-world-pixel-format ;
 
-: auto-position ( window loc -- )
+: auto-position ( win loc -- )
     dup { 0 0 } = [
         drop dup window topmost-window =
         GTK_WIN_POS_CENTER GTK_WIN_POS_NONE ?
@@ -383,6 +401,8 @@ M:: gtk-ui-backend (open-window) ( world -- )
     [ dim>> first2 gtk_window_set_default_size ] 2bi
     
     world setup-gl drop
+
+    win configure-im
     
     win connect-signals