From: Joe Groff Date: Sat, 27 Aug 2011 21:07:18 +0000 (-0700) Subject: Merge remote-tracking branch 'Blei/gtk-image-loader' X-Git-Tag: 0.97~4241^2~1 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=9040ee37e0a7df8e1e6df67137dba6f8b38a94b1 Merge remote-tracking branch 'Blei/gtk-image-loader' Conflicts: basis/alien/enums/enums-tests.factor basis/alien/enums/enums.factor basis/alien/parser/parser.factor basis/gdk/pixbuf/ffi/ffi.factor basis/glib/ffi/ffi.factor basis/tools/deploy/shaker/shaker.factor basis/ui/backend/gtk/gtk.factor basis/windows/nt/nt.factor --- 9040ee37e0a7df8e1e6df67137dba6f8b38a94b1 diff --cc basis/gdk/pixbuf/ffi/ffi.factor index 113cf8d0c8,38959c9004..2a4f64f042 --- a/basis/gdk/pixbuf/ffi/ffi.factor +++ b/basis/gdk/pixbuf/ffi/ffi.factor @@@ -1,15 -1,11 +1,15 @@@ -! Copyright (C) 2009 Anton Gorenko. +! Copyright (C) 2010 Anton Gorenko. ! See http://factorcode.org/license.txt for BSD license. - USING: alien alien.libraries alien.syntax combinators - gobject-introspection kernel system vocabs.loader ; + USING: alien alien.data alien.libraries alien.syntax + combinators gio.ffi glib.ffi gmodule.ffi gobject-introspection + gobject.ffi kernel libc sequences system ; + EXCLUDE: alien.c-types => pointer ; IN: gdk.pixbuf.ffi - << +"gio.ffi" require - >> + +LIBRARY: gdk.pixbuf + << "gdk.pixbuf" { { [ os winnt? ] [ "libgdk_pixbuf-2.0-0.dll" cdecl add-library ] } diff --cc basis/glib/ffi/ffi.factor index 860d34bb8d,22b40f47ad..5eefe08cd0 --- a/basis/glib/ffi/ffi.factor +++ b/basis/glib/ffi/ffi.factor @@@ -1,12 -1,11 +1,13 @@@ -! Copyright (C) 2009 Anton Gorenko. +! Copyright (C) 2010 Anton Gorenko. ! See http://factorcode.org/license.txt for BSD license. - USING: alien alien.destructors alien.libraries alien.syntax - combinators kernel gobject-introspection - gobject-introspection.standard-types system ; + USING: accessors alien alien.c-types alien.destructors + alien.libraries alien.strings alien.syntax combinators -gobject-introspection io.encodings.utf8 kernel system -vocabs.parser words ; ++gobject-introspection gobject-introspection.standard-types ++io.encodings.utf8 kernel system vocabs.parser words ; IN: glib.ffi +LIBRARY: glib + << "glib" { { [ os winnt? ] [ "libglib-2.0-0.dll" cdecl add-library ] } @@@ -15,21 -14,62 +16,76 @@@ } cond >> - IMPLEMENT-STRUCTS: GPollFD GSource GSourceFuncs ; ++ + TYPEDEF: char gchar + TYPEDEF: uchar guchar + TYPEDEF: short gshort + TYPEDEF: ushort gushort + TYPEDEF: long glong + TYPEDEF: ulong gulong + TYPEDEF: int gint + TYPEDEF: uint guint + + << + int c-type clone + [ >c-bool ] >>unboxer-quot + [ c-bool> ] >>boxer-quot + object >>boxed-class + "gboolean" current-vocab create typedef + >> + + TYPEDEF: char gint8 + TYPEDEF: uchar guint8 + TYPEDEF: short gint16 + TYPEDEF: ushort guint16 + TYPEDEF: int gint32 + TYPEDEF: uint guint32 + TYPEDEF: longlong gint64 + TYPEDEF: ulonglong guint64 + + TYPEDEF: float gfloat + TYPEDEF: double gdouble + + TYPEDEF: long ssize_t + TYPEDEF: long time_t + TYPEDEF: size_t gsize + TYPEDEF: ssize_t gssize + TYPEDEF: size_t GType + + TYPEDEF: void* gpointer + TYPEDEF: void* gconstpointer + + TYPEDEF: guint8 GDateDay + TYPEDEF: guint16 GDateYear + TYPEDEF: gint GPid + TYPEDEF: guint32 GQuark + TYPEDEF: gint32 GTime + TYPEDEF: glong gintptr + TYPEDEF: gint64 goffset + TYPEDEF: gulong guintptr + TYPEDEF: guint32 gunichar + TYPEDEF: guint16 gunichar2 + + TYPEDEF: gpointer pointer + + REPLACE-C-TYPE: long\sdouble double + REPLACE-C-TYPE: any gpointer + + IMPLEMENT-STRUCTS: GError GPollFD GSource GSourceFuncs ; +CONSTANT: G_MININT8 HEX: -80 +CONSTANT: G_MAXINT8 HEX: 7f +CONSTANT: G_MAXUINT8 HEX: ff +CONSTANT: G_MININT16 HEX: -8000 +CONSTANT: G_MAXINT16 HEX: 7fff +CONSTANT: G_MAXUINT16 HEX: ffff +CONSTANT: G_MININT32 HEX: -80000000 +CONSTANT: G_MAXINT32 HEX: 7fffffff +CONSTANT: G_MAXUINT32 HEX: ffffffff +CONSTANT: G_MININT64 HEX: -8000000000000000 +CONSTANT: G_MAXINT64 HEX: 7fffffffffffffff +CONSTANT: G_MAXUINT64 HEX: ffffffffffffffff + GIR: vocab:glib/GLib-2.0.gir DESTRUCTOR: g_source_unref diff --cc basis/tools/deploy/shaker/shaker.factor index 2329b06b13,e74bfda3ce..dca9345cd1 --- a/basis/tools/deploy/shaker/shaker.factor +++ b/basis/tools/deploy/shaker/shaker.factor @@@ -93,13 -93,13 +93,20 @@@ IN: tools.deploy.shake run-file ] when ; +: strip-gobject ( -- ) + "gobject-introspection.types" vocab [ + "Stripping GObject type info" show + "vocab:tools/deploy/shaker/strip-gobject.factor" + run-file + ] when ; + + : strip-gtk-icon ( -- ) + "ui.backend.gtk" vocab [ + "Stripping GTK icon loading code" show + "vocab:tools/deploy/shaker/strip-gtk-icon.factor" + run-file + ] when ; + : strip-specialized-arrays ( -- ) strip-dictionary? "specialized-arrays" vocab and [ "Stripping specialized arrays" show @@@ -541,7 -541,7 +548,8 @@@ SYMBOL: deploy-voca strip-destructors strip-call strip-cocoa + strip-gobject + strip-gtk-icon strip-debugger strip-ui-error-hook strip-specialized-arrays diff --cc basis/ui/backend/gtk/gtk.factor index fba30fc15a,c5b1ff9eeb..db316120c4 --- a/basis/ui/backend/gtk/gtk.factor +++ b/basis/ui/backend/gtk/gtk.factor @@@ -2,15 -2,16 +2,19 @@@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien.accessors alien.c-types alien.data alien.strings arrays assocs classes.struct command-line -destructors gdk.ffi gdk.gl.ffi gdk.pixbuf.ffi glib.ffi +continuations destructors environment gdk.ffi gdk.gl.ffi - glib.ffi gobject-introspection.standard-types gobject.ffi - gtk.ffi gtk.gl.ffi io.encodings.utf8 kernel libc literals locals - math math.bitwise math.order math.vectors namespaces sequences - strings system threads ui ui.backend ui.backend.gtk.input-methods - ui.backend.gtk.io ui.clipboards ui.event-loop ui.gadgets - ui.gadgets.private ui.gadgets.worlds ui.gestures - ui.pixel-formats ui.pixel-formats.private ui.private - vocabs.loader combinators prettyprint io ; ++gdk.pixbuf.ffi glib.ffi ++gobject-introspection.standard-types + gobject.ffi gtk.ffi gtk.gl.ffi io.backend + io.backend.unix.multiplexers io.encodings.binary + io.encodings.utf8 io.files io.thread kernel libc literals + locals math math.bitwise math.order math.vectors namespaces -sequences strings system threads ui ui.backend ui.clipboards ++sequences strings system threads ui ui.backend ui.backend.gtk.input-methods ++ui.backend.gtk.io ui.clipboards + ui.commands ui.event-loop ui.gadgets ui.gadgets.editors + ui.gadgets.menus ui.gadgets.private ui.gadgets.worlds + ui.gestures ui.pixel-formats ui.pixel-formats.private -ui.private ; ++ui.private vocabs.loader combinators io ; IN: ui.backend.gtk SINGLETON: gtk-ui-backend @@@ -207,14 -177,137 +211,25 @@@ CONSTANT: action-key-code drop swap [ key-event>gesture ] [ window ] bi* propagate-key-gesture t ; -: on-focus-in ( sender event user-data -- result ) +: on-focus-in ( win event user-data -- ? ) 2drop window focus-world t ; -: on-focus-out ( sender event user-data -- result ) +: on-focus-out ( win event user-data -- ? ) 2drop window unfocus-world t ; -: on-expose ( sender event user-data -- result ) - 2drop window relayout t ; - -: on-configure ( sender event user-data -- result ) - drop [ window ] dip GdkEventConfigure memory>struct - [ event-loc >>window-loc ] [ event-dim >>dim ] bi - relayout-1 f ; - -: on-delete ( sender event user-data -- result ) - 2drop window ungraft t ; - -: init-clipboard ( -- ) - selection "PRIMARY" - clipboard "CLIPBOARD" - [ - utf8 string>alien gdk_atom_intern_static_string - gtk_clipboard_get swap set-global - ] 2bi@ ; - -: io-source-prepare ( source timeout -- result ) - 2drop f ; - -: io-source-check ( source -- result ) - poll_fds>> 0 g_slist_nth_data GPollFD memory>struct - revents>> 0 = not ; - -: io-source-dispatch ( source callback user_data -- result ) - 3drop - 0 mx get wait-for-events - yield t ; - -CONSTANT: poll-fd-events - flags{ - G_IO_IN - G_IO_OUT - G_IO_PRI - G_IO_ERR - G_IO_HUP - G_IO_NVAL - } - -: create-poll-fd ( -- poll-fd ) - GPollFD malloc-struct &free - mx get fd>> >>fd - poll-fd-events >>events ; - -HOOK: init-io-event-source io-backend ( -- ) - -M: f init-io-event-source ; -M: c-io-backend init-io-event-source ; - -M: object init-io-event-source - GSourceFuncs malloc-struct &free - [ io-source-prepare ] GSourceFuncsPrepareFunc >>prepare - [ io-source-check ] GSourceFuncsCheckFunc >>check - [ io-source-dispatch ] GSourceFuncsDispatchFunc >>dispatch - 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 ; - + ! This word gets replaced when deploying. See 'Vocabulary icons' + ! in the docs and tools.deploy.shaker.gtk-icon + : get-icon-data ( -- byte-array ) + "resource:misc/icons/Factor_48x48.png" binary file-contents ; + + : load-icon ( -- ) + get-icon-data [ + data>GInputStream &g_object_unref + GInputStream>GdkPixbuf gtk_window_set_default_icon + ] with-destructors ; + -M: gtk-ui-backend (with-ui) - [ - f f gtk_init - f f gtk_gl_init - load-icon - init-clipboard - start-ui - stop-io-thread - [ - init-io-event-source - init-timeout - gtk_main - ] with-destructors - ] ui-running ; - -: connect-signal-with-data ( object signal-name callback data -- ) - [ utf8 string>alien ] 2dip g_signal_connect drop ; - -: connect-signal ( object signal-name callback -- ) - f connect-signal-with-data ; - -:: connect-signals ( win -- ) +:: connect-user-input-signals ( win -- ) win events-mask gtk_widget_add_events - - win "expose-event" [ on-expose yield ] - GtkWidget:expose-event connect-signal - win "configure-event" [ on-configure yield ] - GtkWidget:configure-event connect-signal win "motion-notify-event" [ on-motion yield ] GtkWidget:motion-notify-event connect-signal win "leave-notify-event" [ on-leave yield ] @@@ -488,27 -574,21 +503,28 @@@ M: gtk-ui-backend bee gdk_beep ; M:: gtk-ui-backend system-alert ( caption text -- ) - f GTK_DIALOG_MODAL GTK_MESSAGE_WARNING GTK_BUTTONS_OK - caption utf8 string>alien f gtk_message_dialog_new - [ text utf8 string>alien f gtk_message_dialog_format_secondary_text ] - [ gtk_dialog_run drop ] - [ gtk_widget_destroy ] tri ; - -M: gtk-clipboard clipboard-contents [ - handle>> gtk_clipboard_wait_for_text - [ &g_free utf8 alien>string ] [ f ] if* + f GTK_DIALOG_MODAL GTK_MESSAGE_WARNING GTK_BUTTONS_OK + caption utf8 string>alien f + gtk_message_dialog_new >k_widget_destroy + [ + text utf8 string>alien f + gtk_message_dialog_format_secondary_text + ] [ gtk_dialog_run drop ] bi ] with-destructors ; -M: gtk-clipboard set-clipboard-contents - swap [ handle>> ] [ utf8 string>alien ] bi* - -1 gtk_clipboard_set_text ; +M: gtk-ui-backend (with-ui) + [ + 0 gint f void* gtk_init + 0 gint f void* gtk_gl_init ++ load-icon + init-clipboard + start-ui + [ + [ [ gtk_main ] with-timer ] with-event-loop + ] with-destructors + ] ui-running ; + gtk-ui-backend ui-backend set-global