     GSource heap-size g_source_new &g_source_unref
     [ create-poll-fd g_source_add_poll ]
     [ f g_source_attach drop ] bi ;
+
+SYMBOL: next-timeout
+
+: set-timeout*-value ( alien value -- )
+    swap 0 set-alien-signed-4 ; inline
+
+: timeout-prepare ( source timeout* -- result )
+    nip next-timeout get-global nano-count [-]
+    [ 1,000,000 /i set-timeout*-value ] keep 0 = ;
+
+: timeout-check ( source -- result )
+    drop next-timeout get-global nano-count [-] 0 = ;
+
+: timeout-dispatch ( source callback user_data -- result )
+    3drop sleep-time [ 1,000,000,000 ] unless* nano-count +
+    next-timeout set-global
+    yield t ;
+
+: init-timeout ( -- )
+    GSourceFuncs malloc-struct &free
+        [ timeout-prepare ] GSourceFuncsPrepareFunc >>prepare
+        [ timeout-check ] GSourceFuncsCheckFunc >>check
+        [ timeout-dispatch ] GSourceFuncsDispatchFunc >>dispatch
+    GSource heap-size g_source_new &g_source_unref
+    f g_source_attach drop
+    nano-count next-timeout set-global ;
 
 M: gtk-ui-backend (with-ui)
     [

    win events-mask [ enum>number ] [ bitor ] map-reduce
    gtk_widget_add_events
    
    win "expose-event" [ on-expose ]
    GtkWidget:expose-event connect-signal
    win "configure-event" [ on-configure ]
    GtkWidget:configure-event connect-signal
    win "motion-notify-event" [ on-motion ]
    GtkWidget:motion-notify-event connect-signal
    win "leave-notify-event" [ on-leave ]
    GtkWidget:leave-notify-event connect-signal
    win "enter-notify-event" [ on-enter ]
    GtkWidget:enter-notify-event connect-signal
    win "button-press-event" [ on-button-press ]
    GtkWidget:button-press-event connect-signal
    win "button-release-event" [ on-button-release ]
    GtkWidget:button-release-event connect-signal
    win "scroll-event" [ on-scroll ]
    GtkWidget:scroll-event connect-signal
    win "key-press-event" [ on-key-press ]
    GtkWidget:key-press-event connect-signal
    win "key-release-event" [ on-key-release ]
    GtkWidget:key-release-event connect-signal
    win "focus-in-event" [ on-focus-in ]
    GtkWidget:focus-in-event connect-signal
    win "focus-out-event" [ on-focus-out ]
    GtkWidget:focus-out-event connect-signal
    win "delete-event" [ on-delete ]
    GtkWidget:delete-event connect-signal ;

CONSTANT: window-controls>decor-flags

! Copyright (C) 2010 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.accessors alien.c-types alien.data
alien.enums alien.strings arrays ascii assocs classes.struct
combinators.short-circuit command-line destructors
io.backend.unix.multiplexers io.encodings.utf8 io.thread kernel
libc literals locals math math.bitwise math.order namespaces
sequences strings system threads ui ui.backend ui.clipboards
ui.event-loop ui.gadgets ui.gadgets.private ui.gadgets.worlds
ui.gestures ui.pixel-formats ui.pixel-formats.private ui.private
glib.ffi gobject.ffi gtk.ffi gdk.ffi gdk.gl.ffi gtk.gl.ffi ;
IN: ui.backend.gtk

