! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax cairo.ffi
+USING: alien.syntax alien.libraries cairo.ffi
+combinators kernel system
gir glib gobject gio gmodule gdk.pixbuf glib.ffi ;
+EXCLUDE: alien.c-types => pointer ;
+
+<<
+"gdk" {
+ { [ os winnt? ] [ "libgdk-win32-2.0-0.dll" "cdecl" add-library ] }
+ { [ os macosx? ] [ drop ] }
+ { [ os unix? ] [ "libgdk-x11-2.0.so" "cdecl" add-library ] }
+} cond
+>>
IN: gdk.ffi
TYPEDEF: guint32 GdkNativeWindow
TYPEDEF: guint32 GdkWChar
+IMPLEMENT-STRUCTS: GdkEventAny GdkEventKey GdkEventButton
+GdkEventScroll GdkEventMotion GdkEventExpose GdkEventVisibility
+GdkEventCrossing GdkEventFocus GdkEventConfigure GdkEventProperty
+GdkEventSelection GdkEventDND GdkEventProximity GdkEventClient
+GdkEventNoExpose GdkEventWindowState GdkEventSetting
+GdkEventOwnerChange GdkEventGrabBroken ;
+
IN-GIR: gdk vocab:gdk/Gdk-2.0.gir
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
USING: gir glib gobject gio gmodule ;
+EXCLUDE: alien.c-types => pointer ;
IN-GIR: gdk.pixbuf vocab:gdk/pixbuf/GdkPixbuf-2.0.gir
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
USING: gir glib gobject ;
+EXCLUDE: alien.c-types => pointer ;
IN-GIR: gio vocab:gio/Gio-2.0.gir
SYMBOL: aliases
aliases [ H{ } ] initialize
+SYMBOL: implement-structs
+
: get-lib-alias ( lib -- alias )
lib-aliases get-global at ;
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien alien.c-types alien.parser assocs combinators
-combinators.short-circuit effects fry generalizations
+USING: accessors alien alien.c-types alien.enums alien.parser arrays assocs classes.parser
+classes.struct combinators combinators.short-circuit compiler.units effects definitions fry generalizations
gir.common gir.types kernel locals math math.parser namespaces
parser prettyprint quotations sequences vocabs.parser words
words.constant ;
: signal-ffi-effect ( signal -- effect )
[ parameters>> [ name>> ] map ]
[ return>> type>> none-type? { } { "result" } ? ] bi
- <effect> dup . ;
+ <effect> ;
:: define-ffi-signal ( signal class -- word ) ! сделать попонятнее
- signal dup .
+ signal
[
name>> class c-type>> swap ":" glue create-in
[ void* swap typedef ] keep dup
} case ;
: define-ffi-enum ( enum -- word )
+ [ c-type>> (CREATE-C-TYPE) dup ]
[
members>> [
[ c-identifier>> create-in ]
- [ value>> ] bi define-constant
- ] each
- ] [ c-type>> create-in [ int swap typedef ] keep ] bi ;
+ [ value>> ] bi 2array
+ ] map
+ ] bi int swap define-enum ;
: define-ffi-enums ( enums -- )
[ define-ffi-enum ] define-each ;
: define-ffi-bitfields ( bitfields -- )
[ define-ffi-enum ] define-each ;
+: fields>struct-slots ( fields -- slots )
+ [
+ [ name>> ] [ c-type>> string>c-type ]
+ [ drop { } ] tri <struct-slot-spec>
+ ] map ;
+
+! Сделать для всех типов создание DEFER:
+: define-ffi-record-defer ( record -- word )
+ c-type>> create-in void* swap [ typedef ] keep ;
+
+: define-ffi-records-defer ( records -- )
+ [ define-ffi-record-defer ] define-each ;
+
: define-ffi-record ( record -- word )
- [ disguised?>> void* void ? ]
- [ c-type>> create-in ] bi [ typedef ] keep ;
+ dup ffi>> forget
+ dup {
+ [ fields>> empty? not ]
+ [ c-type>> implement-structs get-global member? ]
+ } 1&&
+ [
+ dup .
+ [ c-type>> create-class-in dup ]
+ [ fields>> fields>struct-slots ] bi define-struct-class
+ ] [
+ [ disguised?>> void* void ? ]
+ [ c-type>> create-in ] bi [ typedef ] keep
+ ] if ;
: define-ffi-records ( records -- )
[ define-ffi-record ] define-each ;
: prepare-vocab ( repository -- )
includes>> lib-aliases get '[ _ at ] map sift
[ ffi-vocab "." glue ] map
- { "alien.c-types" } append
+ ! { "alien.c-types" } append
[ dup using-vocab? [ drop ] [ use-vocab ] if ] each ;
: define-ffi-namespace ( namespace -- )
[ consts>> define-ffi-consts ]
[ enums>> define-ffi-enums ]
[ bitfields>> define-ffi-bitfields ]
- [ records>> define-ffi-records ]
+
+ [ records>> define-ffi-records-defer ]
+
[ unions>> define-ffi-unions ]
[ interfaces>> define-ffi-interfaces ]
[ classes>> define-ffi-classes ]
[ callbacks>> define-ffi-callbacks ]
+ [ records>> define-ffi-records ]
+
[ records>> define-ffi-records-content ]
[ classes>> define-ffi-classes-content ]
[ interfaces>> define-ffi-interfaces-content ]
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs combinators gir.common gir.ffi gir.loader
-kernel lexer locals namespaces sequences vocabs.parser xml ;
+kernel lexer locals namespaces prettyprint sequences vocabs.parser xml ;
IN: gir
: with-child-vocab ( name quot -- )
:: define-gir-vocab ( vocab-name file-name -- )
file-name file>xml xml>repository
+ implement-structs get-global .
vocab-name [ set-current-vocab ] [ current-lib set ] bi
{
[
lib-aliases get set-at
]
[ ffi-vocab [ define-ffi-repository ] with-child-vocab ]
- } cleave ;
+ } cleave
+ f implement-structs set-global ;
SYNTAX: IN-GIR: scan scan define-gir-vocab ;
+
+SYNTAX: IMPLEMENT-STRUCTS:
+ ";" parse-tokens implement-structs set-global ;
}
{ "type" [ node>type f swap ] }
{ "varargs" [ drop f f ] }
+ { "callback" [ drop f "any" f type boa ] }
} case ;
: load-parameter ( param xml -- param )
[ "member" tags-named [ xml>member ] map >>members ]
} cleave ;
+: xml>field ( xml -- field )
+ [ field new ] dip {
+ [ "name" attr >>name ]
+ [ "writable" attr "1" = >>writable? ]
+ ! Для некоторых field есть callback в качестве типа, решить, как лучше сделать
+ [
+ first-child-tag dup name>> main>> "callback" =
+ [ drop "gpointer" ] [ "type" attr ] if
+ >>c-type
+ ]
+ [
+ first-child-tag xml>type
+ [ [ >>array-info ] [ >>type ] bi* ] [ 2drop f ] if*
+ ]
+ } cleave ;
+
: xml>record ( xml -- record )
[ record new ] dip {
[ load-type ]
[ "disguised" attr "1" = >>disguised? ]
+ [ "field" tags-named [ xml>field ] map >>fields ]
[ "constructor" load-functions >>constructors ]
[ "function" load-functions >>functions ]
[
TUPLE: type-node < node
type c-type type-name get-type ffi ;
+TUPLE: field < typed
+ writable? length? array-info ;
+
TUPLE: record < type-node
- constructors methods functions disguised? ;
+ fields constructors methods functions disguised? ;
TUPLE: union < type-node ;
TYPEDEF: guint16 gunichar2
! Разобраться, почему в .gir есть такие типы
-TYPEDEF: void any
+TYPEDEF: gpointer pointer
+TYPEDEF: gpointer any
IN-GIR: glib vocab:glib/GLib-2.0.gir
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax alien.c-types alien.destructors
+USING: alien.syntax alien.destructors
alien.libraries combinators kernel literals math system
gir glib glib.ffi ;
+EXCLUDE: alien.c-types => pointer ;
IN: gobject.ffi
USING: alien.syntax alien.libraries combinators
kernel system
gir glib glib.ffi gobject gmodule ;
+EXCLUDE: alien.c-types => pointer ;
<<
"gst" {
! See http://factorcode.org/license.txt for BSD license.
USING: alien.syntax alien.libraries combinators kernel system
gir glib gobject gio gmodule gdk.pixbuf gdk gdk.gl gtk gtk.ffi ;
+EXCLUDE: alien.c-types => pointer ;
<<
"gtk.gl" {
USING: alien.syntax alien.libraries cairo.ffi combinators
kernel system
gir glib glib.ffi gobject gio gmodule gdk.pixbuf gdk atk ;
+EXCLUDE: alien.c-types => pointer ;
<<
"gtk" {
! Copyright (C) 2009 Anton Gorenko.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.syntax alien.c-types alien.destructors
+USING: accessors alien alien.syntax alien.c-types alien.destructors
alien.strings alien.libraries arrays classes.struct combinators
destructors fonts init kernel math math.rectangles memoize
io.encodings.utf8 system
[ 200 200 gtk_window_set_default_size ]
[ GTK_WIN_POS_CENTER gtk_window_set_position ] tri
- window 1 gtk_container_set_reallocate_redraws
+ ! window 1 gtk_container_set_reallocate_redraws
GDK_GL_MODE_RGBA GDK_GL_MODE_DOUBLE bitor
gdk_gl_config_new_by_mode :> gl-config
- gtk_drawing_area_new :> drawing-area
- drawing-area 200 200 gtk_widget_set_size_request
+ window gl-config f 1 GDK_GL_RGBA_TYPE
+ gtk_widget_set_gl_capability drop
- drawing-area gl-config f 1 GDK_GL_RGBA_TYPE
- gtk_widget_set_gl_capability .
-
- drawing-area "configure-event" utf8 string>alien
+ window "configure-event" utf8 string>alien
[ on-configure ] GtkWidget:configure-event
f f 0 g_signal_connect_data drop
- drawing-area "expose-event" utf8 string>alien
+ window "expose-event" utf8 string>alien
[ on-expose ] GtkWidget:expose-event
- f f 0 g_signal_connect_data drop
-
- window drawing-area gtk_container_add
+ f f 0 g_signal_connect_data drop
window ;