GNOME Toolkit Interface, as released 2009-03-18.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Fri, 15 May 2009 07:09:40 +0000 (00:09 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Thu, 8 Jul 2010 15:33:41 +0000 (08:33 -0700)
* doc/Makefile.in:

Include gtk in SUBDIRS.

* doc/configure.ac:

Include gtk/Makefile.

* doc/gtk/Makefile.in:

Build the Users' Manual for the GTK.

* doc/gtk/gtk.texinfo:

The Users' Manual for the GTK.

* doc/index.html:

Include mit-scheme-gtk/index.html.

* src/Clean.sh:

Clean up new symlinks config.sub and config.guess, used by
AZ_CANONICAL_HOST in configure.ac.

* src/Makefile.in:

Added new file category "FFIS".  Include gtk in FFIS.

`make generate' in FFIS before compiling their Scheme source, so
they can C-include later -- much later.

`make build' in FFIS after dumping the new bands, so the FFIS are
compiled with the shims installed in lib/lib/.  The new bands are
not strictly necessary, but they complete lib/lib/, so the
commandline in FFI Makefiles can be this simple:
`../microcode/scheme --library ../lib'.

Added similar commands to the all-liarc target, though I have yet
to build a lairc-based system.

Install conses.png in lib/ for the scm-layout-demo.

* src/README.txt:

Describe gtk as part of the core.

* src/Setup.sh:

Include gtk in INSTALLED_SUBDIRS.  Include rcs in OTHER_SUBDIRS,
so `make tags' does not fail.

Symlink to microcode/config.sub and config.guess, so configure.ac
can share with microcode/configure.ac.  Create lib/lib/prgtkio.so
and lib/gtk symlinks too.

* src/configure.ac:

Include AC_CANONICAL_HOST and related C compilation variables,
esp. SHIM_CFLAGS and SHIM_LDFLAGS, shared with
microcode/configure.ac via microcode/achost.ac.  Echo the
create-makefiles.sh commandline.  Generate gtk/Makefile.  Added
gtk to liarc BUNDLEs.

* src/etc/create-makefiles.sh:

Include gtk in BUNDLES.

* src/etc/optiondb.scm:

Define loadable option GTK.

* src/etc/std-makefile-prefix:

Added C compilation variables, esp. COMPILE_SHIM and LINK_SHIM.

* src/gtk/Clean.sh:

Clean up after building the shim.

* src/gtk/Includes/: cairo-xlib.cdecl, cairo.cdecl,
  gdk-pixbuf-core.cdecl, gdk-pixbuf-loader.cdecl,
  gdk-pixbuf.cdecl, gdk.cdecl, gdkcolor.cdecl, gdkcursor.cdecl,
  gdkdrawable.cdecl, gdkevents.cdecl, gdkfont.cdecl, gdkgc.cdecl,
  gdkkeys.cdecl, gdkkeysyms.cdecl, gdkrgb.cdecl, gdktypes.cdecl,
  gdkwindow.cdecl, genums.cdecl, gerror.cdecl, glib.cdecl,
  gobject.cdecl, gparam.cdecl, gparamspecs.cdecl, gquark.cdecl,
  gsignal.cdecl, gtk.cdecl, gtkadjustment.cdecl, gtkbox.cdecl,
  gtkenums.cdecl, gtkobject.cdecl, gtkstyle.cdecl,
  gtktypeutils.cdecl, gtkvbox.cdecl, gtkwidget.cdecl, gtype.cdecl,
  gtypes.cdecl, gvalue.cdecl, gvaluetypes.cdecl,
  pango-context.cdecl, pango-font.cdecl, pango-layout.cdecl,
  pango-types.cdecl, pango.cdecl, pangocairo.cdecl:

C declarations corresponding to SOME of
/usr/include/g{lib,tk}-2.0/**/*.h.

* src/gtk/Makefile-fragment:

Generate the gtk shim, and build Scheme code that uses it.  Keep
the ScmWidget methods in a .c.stay file so it does not get cleaned
up by `Clean.sh maintainer-clean' nor `Clean.sh c-clean'.  Create
conses.png from conses.png.uu because I cannot distribute a binary
in a patchfile.

* src/gtk/Tags.sh:

Include auxiliary ScmWidget code, and NOT gtk-const.scm.

* src/gtk/compile.scm:

Build the GTK system.  Expects the shim to be available in ../lib.

* src/gtk/conses.png.uu:

Because I cannot distribute a binary in a patchfile.

* src/gtk/: demo.scm, gtk-ev.scm, hello.scm, pango-cairo.scm:

Peripheral hacks.

* src/gtk/: gobject.scm, gtk-object.scm, gtk.pkg, gtk.scm, load.scm,
  main.scm, scm-layout.scm, scm-widget.scm:

The core of the GTK system.

* src/gtk/gtk.cdecl:

The C types and externs needed in the GTK shim.

* src/gtk/gtk-shim.h:

C declarations for gtk-shim.c, gtk-const.c and scmwidget.c.  Includes
the ScmWidget and ScmWidgetClass struct declarations.

* src/gtk/scmwidget.c.stay:

ScmWidget methods.  The ".stay" suffix keeps this code from being
"cleaned up" by `Clean.sh maintainer-clean' or `Clean.sh c-clean'.

* src/gtk/thread.scm:

The Scheme thread that "runs" the toolkit.

* src/microcode/configure.ac, src/microcode/achost.ac:

Moved the AC_CANONICAL_HOST code from microcode/configure.ac to
microcode/achost.ac, so it can be shared with configure.ac.

Implement a --with-gtk argument.

* src/microcode/makegen/: Makefile.in.in, files-optional.scm:

Added new module prgtkio.so.

* src/microcode/makegen/makeinit.sh:

Use --batch-mode and `mit-scheme' instead of `scheme'.

* src/microcode/osio.h, microcode/prosio.c:

Changed the declarations of OS_select_registry_entry and
arg_select_registry so they can be used in the new prgtkio module.

* src/microcode/prgtkio.c:

The prgtkio module.  New primitives that arrange to run Scheme in an
idle task of a GMainLoop.

* src/microcode/utabmd.sh:

Use --batch-mode and `mit-scheme'.  Echo the commandline.

* src/microcode/uxio.c:

Added an OS_select_registry_entry function that extracts a file
descriptor and a mode from an indexed registry entry, for prgtkio.

* src/runtime/Makefile-fragment:

Install runtime-*.pkd so lusers can cref imports.

* src/runtime/thread.scm:

Added some tracing, conditioned on a tracing? binding.

89 files changed:
doc/Makefile.in
doc/configure.ac
doc/gtk/Makefile.in [new file with mode: 0644]
doc/gtk/gtk.texinfo [new file with mode: 0644]
doc/index.html
src/Clean.sh
src/Makefile.in
src/README.txt
src/Setup.sh
src/configure.ac
src/etc/create-makefiles.sh
src/etc/make-in-subdirs.sh
src/etc/optiondb.scm
src/etc/std-makefile-prefix
src/gtk/Clean.sh [new file with mode: 0755]
src/gtk/Includes/cairo-xlib.cdecl [new file with mode: 0644]
src/gtk/Includes/cairo.cdecl [new file with mode: 0644]
src/gtk/Includes/gdk-pixbuf-core.cdecl [new file with mode: 0644]
src/gtk/Includes/gdk-pixbuf-loader.cdecl [new file with mode: 0644]
src/gtk/Includes/gdk-pixbuf.cdecl [new file with mode: 0644]
src/gtk/Includes/gdk.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkcolor.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkcursor.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkdrawable.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkevents.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkfont.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkgc.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkkeys.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkkeysyms.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkrgb.cdecl [new file with mode: 0644]
src/gtk/Includes/gdktypes.cdecl [new file with mode: 0644]
src/gtk/Includes/gdkwindow.cdecl [new file with mode: 0644]
src/gtk/Includes/genums.cdecl [new file with mode: 0644]
src/gtk/Includes/gerror.cdecl [new file with mode: 0644]
src/gtk/Includes/glib.cdecl [new file with mode: 0644]
src/gtk/Includes/gobject.cdecl [new file with mode: 0644]
src/gtk/Includes/gparam.cdecl [new file with mode: 0644]
src/gtk/Includes/gparamspecs.cdecl [new file with mode: 0644]
src/gtk/Includes/gquark.cdecl [new file with mode: 0644]
src/gtk/Includes/gsignal.cdecl [new file with mode: 0644]
src/gtk/Includes/gtk.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkadjustment.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkbox.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkenums.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkobject.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkstyle.cdecl [new file with mode: 0644]
src/gtk/Includes/gtktypeutils.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkvbox.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkwidget.cdecl [new file with mode: 0644]
src/gtk/Includes/gtype.cdecl [new file with mode: 0644]
src/gtk/Includes/gtypes.cdecl [new file with mode: 0644]
src/gtk/Includes/gvalue.cdecl [new file with mode: 0644]
src/gtk/Includes/gvaluetypes.cdecl [new file with mode: 0644]
src/gtk/Includes/pango-context.cdecl [new file with mode: 0644]
src/gtk/Includes/pango-font.cdecl [new file with mode: 0644]
src/gtk/Includes/pango-layout.cdecl [new file with mode: 0644]
src/gtk/Includes/pango-types.cdecl [new file with mode: 0644]
src/gtk/Includes/pango.cdecl [new file with mode: 0644]
src/gtk/Includes/pangocairo.cdecl [new file with mode: 0644]
src/gtk/Makefile-fragment [new file with mode: 0644]
src/gtk/Tags.sh [new file with mode: 0755]
src/gtk/compile.scm [new file with mode: 0644]
src/gtk/conses.png.uu [new file with mode: 0644]
src/gtk/demo.scm [new file with mode: 0644]
src/gtk/gobject.scm [new file with mode: 0644]
src/gtk/gtk-ev.scm [new file with mode: 0644]
src/gtk/gtk-object.scm [new file with mode: 0644]
src/gtk/gtk-shim.h [new file with mode: 0644]
src/gtk/gtk.cdecl [new file with mode: 0644]
src/gtk/gtk.pkg [new file with mode: 0644]
src/gtk/gtk.scm [new file with mode: 0644]
src/gtk/hello.scm [new file with mode: 0644]
src/gtk/load.scm [new file with mode: 0644]
src/gtk/main.scm [new file with mode: 0644]
src/gtk/pango-cairo.scm [new file with mode: 0644]
src/gtk/scm-layout.scm [new file with mode: 0644]
src/gtk/scm-widget.scm [new file with mode: 0644]
src/gtk/scmwidget.c.stay [new file with mode: 0644]
src/gtk/thread.scm [new file with mode: 0644]
src/microcode/achost.ac [new file with mode: 0644]
src/microcode/configure.ac
src/microcode/makegen/Makefile.in.in
src/microcode/makegen/files-optional.scm
src/microcode/osio.h
src/microcode/prgtkio.c [new file with mode: 0644]
src/microcode/prosio.c
src/microcode/uxio.c
src/runtime/Makefile-fragment
src/runtime/thread.scm

index 8441f68c853e482f9908deea4f97d72e3ab74ad2..0a17ee5207d8cfb7a456915f710e24ce87d674ae 100644 (file)
@@ -65,7 +65,7 @@ pdfdir = @pdfdir@
 psdir = @psdir@
 INST_TARGETS = @INST_TARGETS@
 
-SUBDIRS = ffi imail ref-manual sos user-manual
+SUBDIRS = ffi gtk imail ref-manual sos user-manual
 DISTCLEAN_FILES = Makefile make-common config.log config.status
 
 all:
index 723035520ad9e5446ab99dadecee50a5e8aa0ed2..b90a721c2879204d2a656b46f63755effe95946d 100644 (file)
@@ -82,6 +82,7 @@ AC_CONFIG_FILES([
        Makefile
        make-common
        ffi/Makefile
+       gtk/Makefile
        imail/Makefile
        ref-manual/Makefile
        sos/Makefile
diff --git a/doc/gtk/Makefile.in b/doc/gtk/Makefile.in
new file mode 100644 (file)
index 0000000..934f693
--- /dev/null
@@ -0,0 +1,12 @@
+# $Id: $
+# doc/gtk/Makefile.in
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+SOURCES = gtk.texinfo
+TARGET_ROOT = mit-scheme-gtk
+
+include $(top_srcdir)/make-common
diff --git a/doc/gtk/gtk.texinfo b/doc/gtk/gtk.texinfo
new file mode 100644 (file)
index 0000000..b9bb979
--- /dev/null
@@ -0,0 +1,764 @@
+\input texinfo @c -*-Texinfo-*-
+@comment $Id: $
+@comment %**start of header
+@setfilename mit-scheme-gtk
+@settitle Gtk Users' Manual
+@comment %**end of header
+
+@copying
+The users' manual for a Gtk interface for MIT/GNU Scheme.
+
+Copyright @copyright{} 2008, 2009  Matthew Birkholz
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Programming Languages
+@direntry
+* Gtk Users': (mit-scheme-gtk).                MIT/GNU Scheme GNOME toolkit
+@end direntry
+
+@titlepage
+@title The Gtk Users' Manual
+@subtitle for Schemely access to the GNOME toolkit
+@subtitle for MIT/GNU Scheme version 7.7.90+
+@author by Matt Birkholz (@email{birkholz@@alum.mit.edu})
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top Gtk Users' Manual
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction:: Emphasizing how @emph{little} of GNOME is wrapped.
+* Hello World:: Not your primitive ``Hello, world!'' example.
+* Gtk-Event-Viewer:: A simple Scheme widget.  GtkEv translated into Scheme/FFI.
+* Scm-Layout:: A Scheme canvas widget.
+* GNU Free Documentation License::  
+@end menu
+
+
+@node Introduction, Hello World, Top, Top
+@chapter Introduction
+
+The Gtk system is a collection of Scheme data types and procedures
+that provide a simple, Schemely interface to the GNOME toolkit(s).
+Toolkit objects are represented in Scheme by instances of the
+@code{<gobject>} class.  Toolkit functions are wrapped by Scheme
+procedures that translate to and from Scheme data types.
+
+When the Gtk system loads it starts a toolkit main loop with Scheme
+attached as an custom idle task.  The main loop then re-starts Scheme,
+which creates a thread to ``run'' the toolkit (actually, return to
+it).  Thus Scheme threads multitask with the toolkit.  Scheme runs as
+an idle task in the toolkit, and the toolkit runs in a Scheme thread.
+A program using the Gtk system does not call @code{gtk_init} nor
+@code{gtk_main}.  It need only create toolkit objects and attach
+signal handlers to them.  The hello program is a simple example.
+(@xref{Hello World}.)
+
+Very little of the GNOME toolkit API has been wrapped, and there is no
+intention to wrap everything.  The @file{gtk.so} (the shared object
+shim) is intended to stay small and focused, and @emph{not} include
+every convenience function fancied by a C programmer.  It does not
+wrap nor intern nor register a gc cleanup for every GObject pointer
+accessed by Scheme.  To see what is available, refer to the
+@file{gtk.pkg} description.
+
+It is likely the user will want to extend this system with additional
+wrappings.  The existing wrappers are the best examples of
+what needs to be done.  They are written in Scheme/FFI --- Scheme
+extended with the accompanying FFI.
+@ifnothtml
+@xref{Top,, Introduction, mit-scheme-ffi, FFI Users' Manual}.
+@end ifnothtml
+@ifhtml
+See the @uref{../FFI/mit-scheme-ffi.html,, FFI Users' Manual}.
+@end ifhtml
+
+@unnumberedsec Procedures
+
+The procedure wrappers are often trivial convenience functions that do
+type checking and conversion, and hide the details of the C API.  For
+example, a GtkLabel's text is retrieved in two steps: a toolkit
+function returns an alien address, and the C string at that address is
+copied into the heap.
+
+@smallexample
+  (let ((retval (make-alien '|gchar|)))
+    (C-call "gtk_label_get_text" retval (gobject-alien label))
+    (c-peek-cstring retval))
+@result{} "!dlrow ,olleH"
+@end smallexample
+
+The @code{gtk-label-get-text} wrapper procedure hides these details.
+
+@smallexample
+  (gtk-label-get-text label)
+@result{} "!dlrow ,olleH"
+@end smallexample
+
+Using such wrappings, the primitive ``Hello, world!'' example in the
+FFI system
+@ifnothtml
+(@pxref{Top,, Hello World, mit-scheme-ffi, FFI Users' Manual})
+@end ifnothtml
+@ifhtml
+(@uref{mit-scheme-ffi.html#Hello%20World,, here})
+@end ifhtml
+can be re-written in a more pleasantly Scheme-like way
+@ifnothtml
+(@pxref{Hello World}).
+@end ifnothtml
+@ifhtml
+(@uref{#Hello%20World,, here}).
+@end ifhtml
+
+Note that the @code{C-call} syntax above cannot be expanded without
+first @code{C-include}ing a declaration of @code{gtk_label_get_text}
+--- something like the following.
+
+@smallexample
+  (extern (* (const gchar)) gtk_label_get_text (label (* GtkLabel)))
+@end smallexample
+
+@unnumberedsec GObjects
+
+In the example call to @code{gtk-label-get-text} above, a Scheme
+object represents the GtkLabel.  It is a
+@code{<gtk-label>} instance, whose class is a specialization of the
+abstract @code{<gtk-object>} class.  Here is the class hierarchy
+for @code{<gtk-button>}, a GtkContainer widget.
+
+@table @code
+
+@item <gtk-button>
+Wraps a GtkButton widget.
+
+@item <gtk-container>
+Adds a list of ``children'' to be implicitly destroyed along with
+their parent.
+
+@item <gtk-widget>
+Adds a ``parent'' slot.
+
+@item <gtk-object>
+Adds a ``destroyed?'' flag and the generic function
+@code{gtk-object-destroy} in support of the GtkObject notion of
+``destruction''.
+
+@item <gobject>
+Instances of this class have two slots.  ``Alien'' is the address of
+the toolkit GObject.  ``Signals'' is an alist of signal handlers to be
+disconnected when the gobject is finalized.
+
+@end table
+
+@unnumberedsec GObject Properties
+
+The @code{gobject-get-property} and @code{gobject-set-properties}
+procedures are an attempt to use Glib's introspection facilities to
+automatically determine the type of a property's value and construct
+an appropriate reflection of its value in Scheme.  They have not been
+tested @emph{at all}.
+
+@unnumberedsec Scheme Widgets
+
+A Scheme widget is a @code{GtkWidget} that calls back to Scheme to
+implement many of its methods.  It is represented in Scheme by a
+@code{<scm-widget>}.  As with other gtk-widgets, its signal
+and method callbacks are tracked and de-registered when it is
+destroyed (finalized).  It is represented in the toolkit by a
+@code{ScmWidget}, a direct subtype of @code{GtkWidget} (not a
+@code{GtkContainer}, yet), which functions mainly as a big bag of
+widget method callback hooks.  The hooks are set via calls to
+procedures like @code{set-scm-widget-expose!}.  @code{<Gtk-Event-Viewer>}
+(@pxref{Gtk-Event-Viewer}) is a simple example --- a straightforward
+translation of Havoc Pennington's GtkEv (from
+@uref{http://developer.gnome.org/doc/GGAD/,, GGAD}).
+
+@code{<Scm-Layout>} (@pxref{Scm-Layout}) is a more sophisticated
+Scheme widget that displays a view of a Scheme canvas.
+
+@unnumberedsec The @code{(gtk)} Package
+
+All of the Gtk system's public bindings are in the @code{(gtk)}
+package --- not exported to the global environment.  It is assumed
+that modules mucking about with the toolkit will be loaded in a
+@code{(gtk)} subpackage where they will define Gtk-specific
+procedures, such as methods for generics imported from a more abstract
+interface package.
+
+@unnumberedsec Debugging
+
+The Scheme machine is currently built with some debugging facilities,
+including a time slice counter.  To see the counter, evaluate the
+following expression:
+
+@smallexample
+  (gtk-time-slice-window! #t)
+  (gtk-time-slice-window! #f)
+  (gtk-time-slice-window?)
+@end smallexample
+
+The second and third expressions take down the small window, and
+programmatically tell you whether one is active, respectively.
+The window shows a running count of the number of times the toolkit has
+yielded to Scheme (or vice versa), and the channels currently being
+polled by Scheme.  This counter can be slowed or stopped by evaluating
+the first or second expression below.
+
+@smallexample
+  (set-thread-timer-interval! 1000)
+  (set-thread-timer-interval! #f)
+@end smallexample
+
+
+@node Hello World, Gtk-Event-Viewer, Introduction, Top
+@chapter Hello World
+
+To run the example ``Hello, World!'' program, enter the following
+command lines in the @file{src/gtk} directory of the source
+distribution.
+
+@smallexample
+  mit-scheme
+  (load-option 'Gtk)
+  (ge '(gtk))
+  (load "hello")
+  (hello)
+@end smallexample
+
+Here is the code.
+
+@verbatiminclude ../../src/gtk/hello.scm
+
+
+@node Gtk-Event-Viewer, Scm-Layout, Hello World, Top
+@chapter Gtk-Event-Viewer
+
+The Gtk system includes a simple Scheme widget, a translation of Havoc
+Pennington's GtkEv (from @uref{http://developer.gnome.org/doc/GGAD/,
+GGAD}.  The widget demonstrates callouts running within callbacks
+running within callouts.  For example, while calling out to
+@code{gdk_window_show_all}, the toolkit calls the Scheme widget's
+realize method, which calls out again to @code{gdk_window_new}.
+
+Enter these 3 lines to create this widget.
+
+@smallexample
+  mit-scheme
+  (load-option 'GTK)
+  (gtk-event-viewer)
+@end smallexample
+
+The code can be found in @file{gtk-ev.scm}.
+
+
+@node Scm-Layout, GNU Free Documentation License, Gtk-Event-Viewer, Top
+@chapter Scm-Layout
+
+The Gtk system provides a canvas abstraction --- a logical space in
+which items like text or boxes are drawn.  This is a logical device
+canvas; all positions and dimensions are in integral pixels.  The
+items are Scheme objects, and are ``drawn'' or ``undrawn'' by adding
+or removing them from a @code{<drawing>}.  Each @code{<drawn-item>}
+has a position on the canvas and a position in the drawing's display
+list.  That latter determines the order in which the drawn item is
+(re)drawn.  An item can be drawn in all views or conditionally, such
+that it only appears in specific views.
+
+A view of a drawing is displayed by a @code{<scm-layout>} widget.
+Multiple widgets can display different views of a shared drawing.
+A @code{<scm-layout>} widget is more of a GtkDrawingArea with
+scrollbar support than a full-blown GtkLayout at the moment, mainly
+because ScmWidget is not a GtkContainer.
+
+Animation (editing) is supported through the standard Gtk mechanism.
+Each change to a drawing ``invalidates'' areas of affected widgets.
+The toolkit batches up the damaged areas, repairing them via the
+expose event handlers.
+
+There are just a few specializations of @code{<drawn-item>} so far:
+@code{<text-item>}, @code{<box-item>}, @code{<hline-item>},
+@code{<vline-item>} and @code{<image-item>}.
+
+A demo of two @code{<scm-layout>} widgets displaying one canvas is
+provided.  The canvas contains text, horizontal and vertical lines,
+and an image.  It also contains animated boxes that blink and follow
+the mouse.  Enter these 3 lines to create this widget.
+
+@smallexample
+  mit-scheme
+  (load-option 'Gtk)
+  (scm-layout-demo)
+@end smallexample
+
+The code can be found in @file{demo.scm}.
+
+
+@node GNU Free Documentation License, , Scm-Layout, Top
+@appendix GNU Free Documentation License
+
+@center Version 1.2, November 2002
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warrany Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+@end enumerate
+
+@page
+@appendixsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@bye
index a66f9d5bcc50599b5caadadc17a89dfb5de12287..67ca0f7d8339528704edfd20e750d635ef2efe91 100644 (file)
@@ -16,6 +16,7 @@ The following MIT/GNU Scheme manuals are available here:
 <li><a href="mit-scheme-sos/index.html">SOS Reference Manual</a></li>
 <li><a href="mit-scheme-imail/index.html">IMAIL User's Manual</a></li>
 <li><a href="mit-scheme-ffi/index.html">FFI User's Manual</a></li>
+<li><a href="mit-scheme-gtk/index.html">GTK User's Manual</a></li>
 </ul>
 
 </body>
index a9fe1d4dea761b497f11230f250252959ab38258..2f301e1d76bc0c6a76b8de68ad9224f42ec4348c 100755 (executable)
@@ -74,6 +74,7 @@ fi
 
 if [ ${MAINTAINER} = yes ]; then
     maybe_rm autom4te.cache configure lib stamp_* boot-root makefiles_created
+    maybe_rm config.sub config.guess
 fi
 
 for SUBDIR in ${SUBDIRS}; do
index 52d736c63b6bc7e2a184d343104d6c84dd60965b..2d87298274a3247500734f6ebd8eaa1d4c09ce1d 100644 (file)
@@ -61,7 +61,8 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/microcode/mkinstalldirs
 # **** END BOILERPLATE ****
 
 LIARC_BOOT_BUNDLES = compiler cref sf star-parser
-LIARC_BUNDLES = $(LIARC_BOOT_BUNDLES) edwin ffi imail sos ssp xml
+LIARC_BUNDLES = $(LIARC_BOOT_BUNDLES) edwin ffi imail sos ssp xml $(FFIS)
+FFIS = gtk
 
 SUBDIRS = $(INSTALLED_SUBDIRS) 6001 compiler rcs win32 xdoc
 INSTALLED_SUBDIRS = microcode runtime $(LIARC_BUNDLES)
@@ -74,14 +75,18 @@ EDDIR = $(AUXDIR)/edwin
 all: @ALL_TARGET@
 
 all-native: compile-microcode
+       etc/make-in-subdirs.sh generate $(FFIS)
        @$(top_srcdir)/etc/compile.sh "$(MIT_SCHEME_EXE)" \
                                        --compiler --batch-mode
        $(MAKE) build-bands
+       etc/make-in-subdirs.sh build $(FFIS)
 
 all-svm: microcode/svm1-defns.h
+       etc/make-in-subdirs.sh generate $(FFIS)
        $(MAKE) compile-microcode
        @$(top_srcdir)/etc/compile-svm.sh "$(MIT_SCHEME_EXE)"
        $(MAKE) build-bands
+       etc/make-in-subdirs.sh build $(FFIS)
 
 microcode/svm1-defns.h: compiler/machines/svm/svm1-defns.h
        if cmp compiler/machines/svm/svm1-defns.h microcode/svm1-defns.h; \
@@ -98,8 +103,11 @@ compiler/machines/svm/svm1-defns.h: \
                </dev/null )
 
 all-liarc:
-       @$(top_srcdir)/etc/c-compile.sh "$(MIT_SCHEME_EXE)" --compiler
+       etc/make-in-subdirs.sh generate $(FFIS)
+       @$(top_srcdir)/etc/c-compile.sh "$(MIT_SCHEME_EXE)" \
+                                               --compiler --batch-mode
        $(MAKE) compile-liarc-bundles build-bands
+       etc/make-in-subdirs.sh build $(FFIS)
 
 macosx-app: stamp_macosx-app
 
@@ -196,6 +204,7 @@ install-auxdir-top:
        $(mkinstalldirs) $(DESTDIR)$(AUXDIR)
        $(INSTALL_DATA) $(top_srcdir)/etc/optiondb.scm $(DESTDIR)$(AUXDIR)/.
        $(INSTALL_DATA) lib/*.com $(DESTDIR)$(AUXDIR)/.
+       $(INSTALL_DATA) lib/*.png $(DESTDIR)$(AUXDIR)/.
 
 .PHONY: all all-native all-liarc all-svm macosx-app
 .PHONY: compile-microcode build-bands
index 8b435a876326f59fa0abd24233db8ab3fd612f66..1ee221a5589ad90eff57390065a7d37a06e9e682 100644 (file)
@@ -34,6 +34,9 @@ The core subsystem consists of these directories:
 * "ffi" provides syntax for calling foreign (C) functions and
   manipulating alien (C) data.
 
+* "gtk" uses the FFI to provide a nice interface to GNOME.  Features a
+  Scheme canvas widget.
+
 The compiler subsystem consists of these three directories:
 
 * "sf" contains a program that translates Scheme source code to an
index 8145f2cc1c01568d73cbed5f2d36a6bdec1988d8..7313538b224fb90560b7d19f398199785e9bacd7 100755 (executable)
@@ -62,7 +62,7 @@ fi
 
 . etc/functions.sh
 
-INSTALLED_SUBDIRS="cref edwin ffi imail sf sos ssp star-parser xml"
+INSTALLED_SUBDIRS="cref edwin ffi gtk imail sf sos ssp star-parser xml"
 OTHER_SUBDIRS="6001 compiler rcs runtime win32 xdoc microcode"
 
 # lib
@@ -74,6 +74,10 @@ maybe_link lib/optiondb.scm ../etc/optiondb.scm
 maybe_link lib/runtime ../runtime
 maybe_link lib/mit-scheme.h ../microcode/pruxffi.h
 maybe_link lib/ffi ../ffi
+maybe_link lib/lib/prgtkio.so ../../microcode/prgtkio.so
+maybe_link lib/gtk ../gtk
+maybe_link config.sub microcode/config.sub
+maybe_link config.guess microcode/config.guess
 
 for SUBDIR in ${INSTALLED_SUBDIRS} ${OTHER_SUBDIRS}; do
     echo "setting up ${SUBDIR}"
index 1f6bb9ee9435bc4d9ce4d023a5c85b1e5a7873f8..340922a7f4e21c32cd29440312153a310cf8d13e 100644 (file)
@@ -106,10 +106,22 @@ then
     INSTALL="${INSTALL} --preserve-timestamps"
 fi
 
+echo etc/create-makefiles.sh "${MIT_SCHEME_EXE}" "${mit_scheme_native_code}"
 etc/create-makefiles.sh "${MIT_SCHEME_EXE}" "${mit_scheme_native_code}"
 compiler/configure "${mit_scheme_native_code}"
 
 AC_CONFIG_SUBDIRS([microcode])
+
+m4_include(microcode/achost.ac)
+
+AC_SUBST([CCLD])
+AC_SUBST([DEFS])
+AC_SUBST([CFLAGS])
+AC_SUBST([CPPFLAGS])
+AC_SUBST([LDFLAGS])
+AC_SUBST([SHIM_CFLAGS])
+AC_SUBST([SHIM_LDFLAGS])
+
 AC_CONFIG_FILES([
 Makefile
 6001/Makefile
@@ -117,6 +129,7 @@ compiler/Makefile
 cref/Makefile
 edwin/Makefile
 ffi/Makefile
+gtk/Makefile
 imail/Makefile
 runtime/Makefile
 sf/Makefile
@@ -137,8 +150,8 @@ if test x"${mit_scheme_native_code}" = xc; then
     for BN in star-parser; do
         (cd lib; rm -f ${BN}; ${LN_S} ../${BN} .)
     done
-    for BUNDLE in 6001 compiler cref edwin ffi imail sf sos ssp star-parser \
-           xdoc xml; do
+    for BUNDLE in 6001 compiler cref edwin ffi gtk imail sf sos ssp \
+           star-parser xdoc xml; do
        SO=${BUNDLE}.so
        (cd lib/lib; rm -f ${SO}; ${LN_S} ../../${BUNDLE}/${SO} .)
     done
index 9e7dcda3dfbbeb1fa4f623496e0e0e167798be73..af9c060fb3b50be9e260c6e3d288d031c8de4203 100755 (executable)
@@ -47,7 +47,7 @@ run_cmd rm -f compiler/machine compiler/compiler.pkg
 run_cmd ln -s machines/"${MDIR}" compiler/machine
 run_cmd ln -s machine/compiler.pkg compiler/.
 
-BUNDLES="6001 compiler cref edwin ffi imail sf sos ssp star-parser xdoc xml"
+BUNDLES="6001 compiler cref edwin ffi gtk imail sf sos ssp star-parser xdoc xml"
 
 run_cmd ${HOST_SCHEME_EXE} --batch-mode --heap 4000 <<EOF
 (begin
index 2b0337b5d6ceb7ca38bfe4b640631dac61e43303..63470df6004ae13cc2613b9e29dabbcac4e32ced 100755 (executable)
@@ -29,5 +29,5 @@ set -e
 TARGET=${1}
 shift
 for SUBDIR in "${@}"; do
-    run_cmd_in_dir "${SUBDIR}" make "${TARGET}"
+    run_cmd_in_dir "${SUBDIR}" make "${TARGET}" || exit $?
 done
index 314201244b3338463582bd47905ca2b7060ba775..e4687ff5a8c52f14afddb0ce75a6a7756717433c 100644 (file)
@@ -95,6 +95,9 @@ USA.
 (define-load-option 'FFI
   (guarded-system-loader '(ffi) "ffi"))
 
+(define-load-option 'GTK
+  (guarded-system-loader '(gtk) "gtk"))
+
 (define-load-option 'IMAIL
   (guarded-system-loader '(edwin imail) "imail"))
 
index 595502390c8ebec7d420b58ef898b058477e026d..43e78da11b7471ed02830c02a9c7ef2de2105be1 100644 (file)
@@ -66,6 +66,22 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/microcode/mkinstalldirs
 
 # **** END BOILERPLATE ****
 
+CC = @CC@
+CCLD = @CCLD@
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@ -I../lib
+LDFLAGS = @LDFLAGS@
+
+COMPILE = $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CCLD) $(LDFLAGS) -o $@
+
+SHIM_CFLAGS = @SHIM_CFLAGS@
+SHIM_LDFLAGS = @SHIM_LDFLAGS@
+COMPILE_SHIM = $(COMPILE) $(SHIM_CFLAGS)
+LINK_SHIM = $(LINK) $(SHIM_LDFLAGS)
+
 AUXDIR = @AUXDIR@
 
 all:
diff --git a/src/gtk/Clean.sh b/src/gtk/Clean.sh
new file mode 100755 (executable)
index 0000000..9bdc393
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# $Id: $
+
+set -e
+
+if [ ${#} -ne 1 ]; then
+    echo "usage: ${0} <command>"
+    exit 1
+fi
+
+../etc/Clean.sh "${1}"
+. ../etc/functions.sh
+
+maybe_rm gtk-shim.c gtk-const* gtk-types*
+maybe_rm conses.png ../lib/conses.png
+maybe_rm ../lib/lib/gtk-* ../lib/lib/prgtkio.so
+# And, just because the maintainer- and c-clean targets nail this one anyway:
+maybe_rm scmwidget.c
diff --git a/src/gtk/Includes/cairo-xlib.cdecl b/src/gtk/Includes/cairo-xlib.cdecl
new file mode 100644 (file)
index 0000000..95372be
--- /dev/null
@@ -0,0 +1,40 @@
+#| -*-Scheme-*-
+
+cairo/cairo-xlib.h (v1.4) |#
+
+(include "cairo")
+
+(extern (* cairo_surface_t) cairo_xlib_surface_create
+       (dpy (* Display))
+       (drawable Drawable)
+       (visual (* Visual))
+       (width int) (height int))
+
+;(extern (* cairo_surface_t) cairo_xlib_surface_create_for_bitmap
+;      (dpy (* Display))
+;      (bitmap Pixmap)
+;      (screen (* Screen))
+;      (width int) (height int))
+
+(extern void cairo_xlib_surface_set_size
+       (surface (* cairo_surface_t))
+       (width int) (height int))
+
+;(extern void cairo_xlib_surface_set_drawable
+;      (surface (* cairo_surface_t))
+;      (drawable Drawable)
+;      (width int) (height int))
+
+;(extern (* Display) cairo_xlib_surface_get_display(surface(* cairo_surface_t)))
+
+;(extern Drawable cairo_xlib_surface_get_drawable (surface (* cairo_surface_t)))
+
+;(extern (* Screen) cairo_xlib_surface_get_screen (surface (* cairo_surface_t)))
+
+;(extern (* Visual) cairo_xlib_surface_get_visual (surface (* cairo_surface_t)))
+
+;(extern int cairo_xlib_surface_get_depth (surface (* cairo_surface_t)))
+
+;(extern int cairo_xlib_surface_get_width (surface (* cairo_surface_t)))
+
+;(extern int cairo_xlib_surface_get_height (surface (* cairo_surface_t)))
diff --git a/src/gtk/Includes/cairo.cdecl b/src/gtk/Includes/cairo.cdecl
new file mode 100644 (file)
index 0000000..2944ccf
--- /dev/null
@@ -0,0 +1,1010 @@
+#| -*-Scheme-*-
+
+cairo/cairo.h (v1.4) |#
+
+;(include "cairo-features")
+;(include "cairo-deprecated")
+
+;(extern int cairo_version)
+;(extern (const (* char)) cairo_version_string)
+;(typedef cairo_bool_t int)
+;(typedef cairo_t (struct _cairo))
+;(typedef cairo_surface_t (struct _cairo_surface))
+
+;(typedef cairo_matrix_t
+;  (struct _cairo_matrix
+;    (xx double)
+;    (yx double)
+;    (xy double)
+;    (yy double)
+;    (x0 double)
+;    (y0 double)))
+
+;(typedef cairo_pattern_t (struct _cairo_pattern))
+
+;(typedef cairo_destroy_func_t (* (function void (data (* void)))))
+;(typedef cairo_user_data_key_t (struct _cairo_user_data_key (unused int)))
+
+(typedef cairo_status_t
+  (enum _cairo_status
+    (CAIRO_STATUS_SUCCESS)
+    (CAIRO_STATUS_NO_MEMORY)
+    (CAIRO_STATUS_INVALID_RESTORE)
+    (CAIRO_STATUS_INVALID_POP_GROUP)
+    (CAIRO_STATUS_NO_CURRENT_POINT)
+    (CAIRO_STATUS_INVALID_MATRIX)
+    (CAIRO_STATUS_INVALID_STATUS)
+    (CAIRO_STATUS_NULL_POINTER)
+    (CAIRO_STATUS_INVALID_STRING)
+    (CAIRO_STATUS_INVALID_PATH_DATA)
+    (CAIRO_STATUS_READ_ERROR)
+    (CAIRO_STATUS_WRITE_ERROR)
+    (CAIRO_STATUS_SURFACE_FINISHED)
+    (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)
+    (CAIRO_STATUS_PATTERN_TYPE_MISMATCH)
+    (CAIRO_STATUS_INVALID_CONTENT)
+    (CAIRO_STATUS_INVALID_FORMAT)
+    (CAIRO_STATUS_INVALID_VISUAL)
+    (CAIRO_STATUS_FILE_NOT_FOUND)
+    (CAIRO_STATUS_INVALID_DASH)
+    (CAIRO_STATUS_INVALID_DSC_COMMENT)
+    (CAIRO_STATUS_INVALID_INDEX)
+    (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE)))
+
+;(typedef cairo_content_t
+;  (enum _cairo_content
+;    (CAIRO_CONTENT_COLOR)
+;    (CAIRO_CONTENT_ALPHA)
+;    (CAIRO_CONTENT_COLOR_ALPHA)))
+
+;typedef cairo_status_t (*cairo_write_func_t)
+; (void *closure, const unsigned char *data, unsigned int length);
+
+;typedef cairo_status_t (*cairo_read_func_t)
+; (void *closure, unsigned char        *data, unsigned int length);
+\f
+
+;;; Functions for manipulating state objects
+
+(extern (* cairo_t) cairo_create (target (* cairo_surface_t)))
+
+;(extern (* cairo_t) cairo_reference (cr (* cairo_t)))
+
+(extern void cairo_destroy (cr (* cairo_t)))
+
+;(extern (unsigned int) cairo_get_reference_count (cr (* cairo_t)))
+
+;(extern (* void) cairo_get_user_data
+;      (cr (* cairo_t))
+;      (key (const (* cairo_user_data_key_t))))
+
+;(extern cairo_status_t cairo_set_user_data
+;      (cr (* cairo_t))
+;      (key (const (* cairo_user_data_key_t)))
+;      (user_date (* void))
+;        (destroy cairo_destroy_func_t))
+
+(extern void cairo_save (cr (* cairo_t)))
+
+(extern void cairo_restore (cr (* cairo_t)))
+
+;(extern void cairo_push_group (cr (* cairo_t)))
+
+;(extern void cairo_push_group_with_content
+;      (cr      (* cairo_t))
+;      (content cairo_content_t))
+
+;(extern (* cairo_pattern_t) cairo_pop_group (cr (* cairo_t)))
+
+;(extern void cairo_pop_group_to_source (cr (* cairo_t)))
+\f
+
+;;; Modify state
+
+;(typedef cairo_operator_t
+;  (enum _cairo_operator
+;    (CAIRO_OPERATOR_CLEAR)
+;
+;    (CAIRO_OPERATOR_SOURCE)
+;    (CAIRO_OPERATOR_OVER)
+;    (CAIRO_OPERATOR_IN)
+;    (CAIRO_OPERATOR_OUT)
+;    (CAIRO_OPERATOR_ATOP)
+;
+;    (CAIRO_OPERATOR_DEST)
+;    (CAIRO_OPERATOR_DEST_OVER)
+;    (CAIRO_OPERATOR_DEST_IN)
+;    (CAIRO_OPERATOR_DEST_OUT)
+;    (CAIRO_OPERATOR_DEST_ATOP)
+;
+;    (CAIRO_OPERATOR_XOR)
+;    (CAIRO_OPERATOR_ADD)
+;    (CAIRO_OPERATOR_SATURATE)))
+
+;(extern void cairo_set_operator (cr (* cairo_t)) (op cairo_operator_t))
+
+;(extern void cairo_set_source (cr (* cairo_t)) (source (* cairo_pattern_t)))
+
+(extern void cairo_set_source_rgb
+       (cr (* cairo_t)) (red double)(green double)(blue double))
+
+;(extern void cairo_set_source_rgba
+;      (cr (* cairo_t)) (red double)(green double)(blue double)(alpha double))
+
+;(extern void cairo_set_source_surface
+;      (cr (* cairo_t)) (surface (* cairo_surface_t)) (x double) (y double))
+
+;(extern void cairo_set_tolerance (cr (* cairo_t)) (tolerance double))
+
+;(typedef cairo_antialias_t
+;  (enum _cairo_antialias
+;    (CAIRO_ANTIALIAS_DEFAULT)
+;    (CAIRO_ANTIALIAS_NONE)
+;    (CAIRO_ANTIALIAS_GRAY)
+;    (CAIRO_ANTIALIAS_SUBPIXEL)))
+
+;(extern void cairo_set_antialias
+;      (cr (* cairo_t)) (antialias cairo_antialias_t))
+
+;(typedef cairo_fill_rule_t
+;  (enum _cairo_fill_rule
+;    (CAIRO_FILL_RULE_WINDING)
+;    (CAIRO_FILL_RULE_EVEN_ODD)))
+
+;(extern void cairo_set_fill_rule (cr (* cairo_t)) (fill_rule cairo_fill_rule_t))
+
+;(extern void cairo_set_line_width (cr (* cairo_t)) (width double))
+
+;(typedef cairo_line_cap_t
+;  (enum _cairo_line_cap
+;    (CAIRO_LINE_CAP_BUTT)
+;    (CAIRO_LINE_CAP_ROUND)
+;    (CAIRO_LINE_CAP_SQUARE)))
+
+;(extern void cairo_set_line_cap (cr (* cairo_t)) (line_cap cairo_line_cap_t))
+
+;(typedef cairo_line_join_t
+;  (enum _cairo_line_join
+;    (CAIRO_LINE_JOIN_MITER)
+;    (CAIRO_LINE_JOIN_ROUND)
+;    (CAIRO_LINE_JOIN_BEVEL)))
+
+;(extern void cairo_set_line_join (cr (* cairo_t)) (line_join cairo_line_join_t))
+
+;(extern void cairo_set_dash
+;      (cr         (* cairo_t))
+;      (dashes     (const (* double)))
+;      (num_dashes int)
+;      (offset     double))
+
+;(extern void cairo_set_miter_limit (cr (* cairo_t)) (limit double))
+
+(extern void cairo_translate (cr (* cairo_t)) (tx double) (ty double))
+
+;(extern void cairo_scale (cr (* cairo_t)) (sx double) (sy double))
+
+(extern void cairo_rotate (cr (* cairo_t)) (angle double))
+
+;(extern void cairo_transform
+;      (cr (* cairo_t)) (matrix (const (* cairo_matrix_t))))
+
+;(extern void cairo_set_matrix
+;      (cr (* cairo_t)) (matrix (const (* cairo_matrix_t))))
+
+;(extern void cairo_identity_matrix (cr (* cairo_t)))
+
+;(extern void cairo_user_to_device
+;           (cr (* cairo_t)) (x (* double)) (y (* double)))
+
+;(extern void cairo_user_to_device_distance
+;           (cr (* cairo_t)) (dx (* double)) (dy (* double)))
+
+;(extern void cairo_device_to_user
+;           (cr (* cairo_t)) (x (* double)) (x (* double)))
+
+;(extern void cairo_device_to_user_distance
+;           (cr (* cairo_t)) (dx (* double)) (dy (* double)))
+\f
+
+;;; Path creation functions
+
+;(extern void cairo_new_path (cairo_t *cr);
+
+(extern void cairo_move_to (cr (* cairo_t)) (x double) (y double))
+
+;(extern void cairo_new_sub_path (cairo_t *cr);
+
+;(extern void cairo_line_to (cr (* cairo_t)) double x, double y);
+
+;(extern void cairo_curve_to (cr (* cairo_t))
+;              double x1, double y1,
+;              double x2, double y2,
+;              double x3, double y3);
+
+;(extern void cairo_arc (cr (* cairo_t))
+;         double xc, double yc,
+;         double radius,
+;         double angle1, double angle2);
+
+;(extern void cairo_arc_negative (cr (* cairo_t))
+;                  double xc, double yc,
+;                  double radius,
+;                  double angle1, double angle2);
+
+;(extern void cairo_rel_move_to (cr (* cairo_t)) double dx, double dy);
+
+;(extern void cairo_rel_line_to (cr (* cairo_t)) double dx, double dy);
+
+;(extern void cairo_rel_curve_to (cr (* cairo_t))
+;                  double dx1, double dy1,
+;                  double dx2, double dy2,
+;                  double dx3, double dy3);
+
+;(extern void cairo_rectangle (cr (* cairo_t))
+;               double x, double y,
+;               double width, double height);
+
+;(extern void cairo_close_path (cairo_t *cr);
+\f
+
+;;; Painting functions
+
+(extern void cairo_paint (cr (* cairo_t)))
+
+#|
+
+ (extern void cairo_paint_with_alpha (cr (* cairo_t))
+                       double   alpha);
+
+ (extern void cairo_mask (cairo_t         *cr,
+           cairo_pattern_t *pattern);
+
+ (extern void cairo_mask_surface (cairo_t         *cr,
+                   cairo_surface_t *surface,
+                   double           surface_x,
+                   double           surface_y);
+
+ (extern void cairo_stroke (cairo_t *cr);
+
+ (extern void cairo_stroke_preserve (cairo_t *cr);
+
+ (extern void cairo_fill (cairo_t *cr);
+
+ (extern void cairo_fill_preserve (cairo_t *cr);
+
+ (extern void cairo_copy_page (cairo_t *cr);
+
+ (extern void cairo_show_page (cairo_t *cr);
+
+;; Insideness testing
+
+ (extern cairo_bool_t cairo_in_stroke (cr (* cairo_t)) double x, double y);
+
+ (extern cairo_bool_t cairo_in_fill (cr (* cairo_t)) double x, double y);
+
+;; Rectangular extents
+
+ (extern void cairo_stroke_extents (cr (* cairo_t))
+                     double *x1, double *y1,
+                     double *x2, double *y2);
+
+ (extern void cairo_fill_extents (cr (* cairo_t))
+                   double *x1, double *y1,
+                   double *x2, double *y2);
+
+;; Clipping 
+
+ (extern void cairo_reset_clip (cairo_t *cr);
+
+ (extern void cairo_clip (cairo_t *cr);
+
+ (extern void cairo_clip_preserve (cairo_t *cr);
+
+ (extern void cairo_clip_extents (cr (* cairo_t))
+                   double *x1, double *y1,
+                   double *x2, double *y2);
+
+ (typedef struct _cairo_rectangle {
+    double x, y, width, height;
+} cairo_rectangle_t;
+
+typedef struct _cairo_rectangle_list {
+    cairo_status_t     status;
+    cairo_rectangle_t *rectangles;
+    int                num_rectangles;
+} cairo_rectangle_list_t;
+
+ (extern cairo_rectangle_list_t * cairo_copy_clip_rectangle_list (cairo_t *cr);
+
+ (extern void cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list);
+\f
+
+;;; Font/Text functions
+
+typedef struct _cairo_scaled_font cairo_scaled_font_t;
+
+typedef struct _cairo_font_face cairo_font_face_t;
+
+typedef struct {
+  unsigned long        index;
+  double               x;
+  double               y;
+} cairo_glyph_t;
+
+typedef struct {
+    double x_bearing;
+    double y_bearing;
+    double width;
+    double height;
+    double x_advance;
+    double y_advance;
+} cairo_text_extents_t;
+
+typedef struct {
+    double ascent;
+    double descent;
+    double height;
+    double max_x_advance;
+    double max_y_advance;
+} cairo_font_extents_t;
+
+typedef enum _cairo_font_slant {
+  CAIRO_FONT_SLANT_NORMAL,
+  CAIRO_FONT_SLANT_ITALIC,
+  CAIRO_FONT_SLANT_OBLIQUE
+} cairo_font_slant_t;
+
+typedef enum _cairo_font_weight {
+  CAIRO_FONT_WEIGHT_NORMAL,
+  CAIRO_FONT_WEIGHT_BOLD
+} cairo_font_weight_t;
+
+typedef enum _cairo_subpixel_order {
+    CAIRO_SUBPIXEL_ORDER_DEFAULT,
+    CAIRO_SUBPIXEL_ORDER_RGB,
+    CAIRO_SUBPIXEL_ORDER_BGR,
+    CAIRO_SUBPIXEL_ORDER_VRGB,
+    CAIRO_SUBPIXEL_ORDER_VBGR
+} cairo_subpixel_order_t;
+
+typedef enum _cairo_hint_style {
+    CAIRO_HINT_STYLE_DEFAULT,
+    CAIRO_HINT_STYLE_NONE,
+    CAIRO_HINT_STYLE_SLIGHT,
+    CAIRO_HINT_STYLE_MEDIUM,
+    CAIRO_HINT_STYLE_FULL
+} cairo_hint_style_t;
+
+typedef enum _cairo_hint_metrics {
+    CAIRO_HINT_METRICS_DEFAULT,
+    CAIRO_HINT_METRICS_OFF,
+    CAIRO_HINT_METRICS_ON
+} cairo_hint_metrics_t;
+
+typedef struct _cairo_font_options cairo_font_options_t;
+
+ (extern cairo_font_options_t * cairo_font_options_create (void);
+
+ (extern cairo_font_options_t * cairo_font_options_copy (const cairo_font_options_t *original);
+
+ (extern void cairo_font_options_destroy (cairo_font_options_t *options);
+
+ (extern cairo_status_t cairo_font_options_status (cairo_font_options_t *options);
+
+ (extern void cairo_font_options_merge (cairo_font_options_t       *options,
+                         const cairo_font_options_t *other);
+ (extern cairo_bool_t cairo_font_options_equal (const cairo_font_options_t *options,
+                         const cairo_font_options_t *other);
+
+ (extern unsigned long
+cairo_font_options_hash (const cairo_font_options_t *options);
+
+ (extern void
+cairo_font_options_set_antialias (cairo_font_options_t *options,
+                                 cairo_antialias_t     antialias);
+ (extern cairo_antialias_t
+cairo_font_options_get_antialias (const cairo_font_options_t *options);
+
+ (extern void
+cairo_font_options_set_subpixel_order (cairo_font_options_t   *options,
+                                      cairo_subpixel_order_t  subpixel_order);
+ (extern cairo_subpixel_order_t
+cairo_font_options_get_subpixel_order (const cairo_font_options_t *options);
+
+ (extern void
+cairo_font_options_set_hint_style (cairo_font_options_t *options,
+                                  cairo_hint_style_t     hint_style);
+ (extern cairo_hint_style_t
+cairo_font_options_get_hint_style (const cairo_font_options_t *options);
+
+ (extern void
+cairo_font_options_set_hint_metrics (cairo_font_options_t *options,
+                                    cairo_hint_metrics_t  hint_metrics);
+ (extern cairo_hint_metrics_t
+cairo_font_options_get_hint_metrics (const cairo_font_options_t *options);
+
+/* This interface is for dealing with text as text, not caring about the
+   font object inside the the cairo_t. */
+
+ (extern void
+cairo_select_font_face (cairo_t              *cr,
+                       const char           *family,
+                       cairo_font_slant_t   slant,
+                       cairo_font_weight_t  weight);
+
+ (extern void
+cairo_set_font_size (cr (* cairo_t)) double size);
+
+ (extern void
+cairo_set_font_matrix (cairo_t             *cr,
+                      const cairo_matrix_t *matrix);
+
+ (extern void
+cairo_get_font_matrix (cr (* cairo_t))
+                      cairo_matrix_t *matrix);
+
+ (extern void
+cairo_set_font_options (cairo_t                    *cr,
+                       const cairo_font_options_t *options);
+
+ (extern void
+cairo_get_font_options (cairo_t              *cr,
+                       cairo_font_options_t *options);
+
+ (extern void
+cairo_set_font_face (cr (* cairo_t)) cairo_font_face_t *font_face);
+
+ (extern cairo_font_face_t *
+cairo_get_font_face (cairo_t *cr);
+
+ (extern void
+cairo_set_scaled_font (cairo_t                   *cr,
+                      const cairo_scaled_font_t *scaled_font);
+
+ (extern cairo_scaled_font_t *
+cairo_get_scaled_font (cairo_t *cr);
+
+ (extern void
+cairo_show_text (cr (* cairo_t)) const char *utf8);
+
+ (extern void
+cairo_show_glyphs (cr (* cairo_t)) const cairo_glyph_t *glyphs, int num_glyphs);
+
+ (extern void
+cairo_text_path  (cr (* cairo_t)) const char *utf8);
+
+ (extern void
+cairo_glyph_path (cr (* cairo_t)) const cairo_glyph_t *glyphs, int num_glyphs);
+
+ (extern void
+cairo_text_extents (cairo_t              *cr,
+                   const char           *utf8,
+                   cairo_text_extents_t *extents);
+
+ (extern void
+cairo_glyph_extents (cairo_t               *cr,
+                    const cairo_glyph_t   *glyphs,
+                    int                   num_glyphs,
+                    cairo_text_extents_t  *extents);
+
+ (extern void
+cairo_font_extents (cairo_t              *cr,
+                   cairo_font_extents_t *extents);
+
+/* Generic identifier for a font style */
+
+ (extern cairo_font_face_t *
+cairo_font_face_reference (cairo_font_face_t *font_face);
+
+ (extern void
+cairo_font_face_destroy (cairo_font_face_t *font_face);
+
+ (extern unsigned int
+cairo_font_face_get_reference_count (cairo_font_face_t *font_face);
+
+ (extern cairo_status_t
+cairo_font_face_status (cairo_font_face_t *font_face);
+
+typedef enum _cairo_font_type {
+    CAIRO_FONT_TYPE_TOY,
+    CAIRO_FONT_TYPE_FT,
+    CAIRO_FONT_TYPE_WIN32,
+    CAIRO_FONT_TYPE_ATSUI
+} cairo_font_type_t;
+
+ (extern cairo_font_type_t
+cairo_font_face_get_type (cairo_font_face_t *font_face);
+
+ (extern void *
+cairo_font_face_get_user_data (cairo_font_face_t          *font_face,
+                              const cairo_user_data_key_t *key);
+
+ (extern cairo_status_t
+cairo_font_face_set_user_data (cairo_font_face_t          *font_face,
+                              const cairo_user_data_key_t *key,
+                              void                        *user_data,
+                              cairo_destroy_func_t         destroy);
+
+/* Portable interface to general font features. */
+
+ (extern cairo_scaled_font_t *
+cairo_scaled_font_create (cairo_font_face_t          *font_face,
+                         const cairo_matrix_t       *font_matrix,
+                         const cairo_matrix_t       *ctm,
+                         const cairo_font_options_t *options);
+
+ (extern cairo_scaled_font_t *
+cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font);
+
+ (extern void
+cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font);
+
+ (extern unsigned int
+cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font);
+
+ (extern cairo_status_t
+cairo_scaled_font_status (cairo_scaled_font_t *scaled_font);
+
+ (extern cairo_font_type_t
+cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font);
+
+ (extern void *
+cairo_scaled_font_get_user_data (cairo_scaled_font_t         *scaled_font,
+                                const cairo_user_data_key_t *key);
+
+ (extern cairo_status_t
+cairo_scaled_font_set_user_data (cairo_scaled_font_t         *scaled_font,
+                                const cairo_user_data_key_t *key,
+                                void                        *user_data,
+                                cairo_destroy_func_t         destroy);
+
+ (extern void
+cairo_scaled_font_extents (cairo_scaled_font_t  *scaled_font,
+                          cairo_font_extents_t *extents);
+
+ (extern void
+cairo_scaled_font_text_extents (cairo_scaled_font_t  *scaled_font,
+                               const char           *utf8,
+                               cairo_text_extents_t *extents);
+
+ (extern void
+cairo_scaled_font_glyph_extents (cairo_scaled_font_t   *scaled_font,
+                                const cairo_glyph_t   *glyphs,
+                                int                   num_glyphs,
+                                cairo_text_extents_t  *extents);
+
+ (extern cairo_font_face_t *
+cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font);
+
+ (extern void
+cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font,
+                                  cairo_matrix_t       *font_matrix);
+
+ (extern void
+cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font,
+                          cairo_matrix_t       *ctm);
+
+ (extern void
+cairo_scaled_font_get_font_options (cairo_scaled_font_t                *scaled_font,
+                                   cairo_font_options_t        *options);
+\f
+
+;;; Query functions
+
+ (extern cairo_operator_t
+cairo_get_operator (cairo_t *cr);
+
+ (extern cairo_pattern_t *
+cairo_get_source (cairo_t *cr);
+
+ (extern double
+cairo_get_tolerance (cairo_t *cr);
+
+ (extern cairo_antialias_t
+cairo_get_antialias (cairo_t *cr);
+
+ (extern void
+cairo_get_current_point (cr (* cairo_t)) double *x, double *y);
+
+ (extern cairo_fill_rule_t
+cairo_get_fill_rule (cairo_t *cr);
+
+ (extern double
+cairo_get_line_width (cairo_t *cr);
+
+ (extern cairo_line_cap_t
+cairo_get_line_cap (cairo_t *cr);
+
+ (extern cairo_line_join_t
+cairo_get_line_join (cairo_t *cr);
+
+ (extern double
+cairo_get_miter_limit (cairo_t *cr);
+
+ (extern int
+cairo_get_dash_count (cairo_t *cr);
+
+ (extern void
+cairo_get_dash (cr (* cairo_t)) double *dashes, double *offset);
+
+ (extern void
+cairo_get_matrix (cr (* cairo_t)) cairo_matrix_t *matrix);
+
+ (extern cairo_surface_t *
+cairo_get_target (cairo_t *cr);
+
+ (extern cairo_surface_t *
+cairo_get_group_target (cairo_t *cr);
+
+typedef enum _cairo_path_data_type {
+    CAIRO_PATH_MOVE_TO,
+    CAIRO_PATH_LINE_TO,
+    CAIRO_PATH_CURVE_TO,
+    CAIRO_PATH_CLOSE_PATH
+} cairo_path_data_type_t;
+
+typedef union _cairo_path_data_t cairo_path_data_t;
+union _cairo_path_data_t {
+    struct {
+       cairo_path_data_type_t type;
+       int length;
+    } header;
+    struct {
+       double x, y;
+    } point;
+};
+
+typedef struct cairo_path {
+    cairo_status_t status;
+    cairo_path_data_t *data;
+    int num_data;
+} cairo_path_t;
+
+ (extern cairo_path_t *
+cairo_copy_path (cairo_t *cr);
+
+ (extern cairo_path_t *
+cairo_copy_path_flat (cairo_t *cr);
+
+ (extern void
+cairo_append_path (cairo_t             *cr,
+                  const cairo_path_t   *path);
+
+ (extern void
+cairo_path_destroy (cairo_path_t *path);
+\f
+
+;;; Error status queries
+
+ (extern cairo_status_t
+cairo_status (cairo_t *cr);
+
+ (extern const char *
+cairo_status_to_string (cairo_status_t status);
+
+;;; Surface manipulation
+
+ (extern cairo_surface_t *
+cairo_surface_create_similar (cairo_surface_t  *other,
+                             cairo_content_t   content,
+                             int               width,
+                             int               height);
+
+ (extern cairo_surface_t *
+cairo_surface_reference (cairo_surface_t *surface);
+
+ (extern void
+cairo_surface_finish (cairo_surface_t *surface);
+|#
+(extern void cairo_surface_destroy (surface (* cairo_surface_t)))
+#|
+ (extern unsigned int
+cairo_surface_get_reference_count (cairo_surface_t *surface);
+
+ (extern cairo_status_t
+cairo_surface_status (cairo_surface_t *surface);
+
+typedef enum _cairo_surface_type {
+    CAIRO_SURFACE_TYPE_IMAGE,
+    CAIRO_SURFACE_TYPE_PDF,
+    CAIRO_SURFACE_TYPE_PS,
+    CAIRO_SURFACE_TYPE_XLIB,
+    CAIRO_SURFACE_TYPE_XCB,
+    CAIRO_SURFACE_TYPE_GLITZ,
+    CAIRO_SURFACE_TYPE_QUARTZ,
+    CAIRO_SURFACE_TYPE_WIN32,
+    CAIRO_SURFACE_TYPE_BEOS,
+    CAIRO_SURFACE_TYPE_DIRECTFB,
+    CAIRO_SURFACE_TYPE_SVG,
+    CAIRO_SURFACE_TYPE_OS2
+} cairo_surface_type_t;
+
+ (extern cairo_surface_type_t
+cairo_surface_get_type (cairo_surface_t *surface);
+
+ (extern cairo_content_t
+cairo_surface_get_content (cairo_surface_t *surface);
+
+#if CAIRO_HAS_PNG_FUNCTIONS
+|#
+(extern cairo_status_t cairo_surface_write_to_png
+       (surface (* cairo_surface_t))
+       (filename (const (* char))))
+#|
+ (extern cairo_status_t
+cairo_surface_write_to_png_stream (cairo_surface_t     *surface,
+                                  cairo_write_func_t   write_func,
+                                  void                 *closure);
+
+#endif
+
+ (extern void *
+cairo_surface_get_user_data (cairo_surface_t            *surface,
+                            const cairo_user_data_key_t *key);
+
+ (extern cairo_status_t
+cairo_surface_set_user_data (cairo_surface_t            *surface,
+                            const cairo_user_data_key_t *key,
+                            void                        *user_data,
+                            cairo_destroy_func_t        destroy);
+
+ (extern void
+cairo_surface_get_font_options (cairo_surface_t      *surface,
+                               cairo_font_options_t *options);
+
+ (extern void
+cairo_surface_flush (cairo_surface_t *surface);
+
+ (extern void
+cairo_surface_mark_dirty (cairo_surface_t *surface);
+
+ (extern void
+cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
+                                   int              x,
+                                   int              y,
+                                   int              width,
+                                   int              height);
+
+ (extern void
+cairo_surface_set_device_offset (cairo_surface_t *surface,
+                                double           x_offset,
+                                double           y_offset);
+
+ (extern void
+cairo_surface_get_device_offset (cairo_surface_t *surface,
+                                double          *x_offset,
+                                double          *y_offset);
+
+ (extern void
+cairo_surface_set_fallback_resolution (cairo_surface_t *surface,
+                                      double            x_pixels_per_inch,
+                                      double            y_pixels_per_inch);
+|#
+
+(typedef cairo_format_t
+  (enum _cairo_format
+    (CAIRO_FORMAT_ARGB32)
+    (CAIRO_FORMAT_RGB24)
+    (CAIRO_FORMAT_A8)
+    (CAIRO_FORMAT_A1)
+    ;; Obsolete: CAIRO_FORMAT_RGB16_565 = 4
+    ))
+
+ (extern (* cairo_surface_t)
+       cairo_image_surface_create
+       (format cairo_format_t)
+       (width int)(height int))
+#|
+ (extern cairo_surface_t *
+cairo_image_surface_create_for_data (unsigned char            *data,
+                                    cairo_format_t             format,
+                                    int                        width,
+                                    int                        height,
+                                    int                        stride);
+
+ (extern unsigned char *
+cairo_image_surface_get_data (cairo_surface_t *surface);
+
+ (extern cairo_format_t
+cairo_image_surface_get_format (cairo_surface_t *surface);
+
+ (extern int
+cairo_image_surface_get_width (cairo_surface_t *surface);
+
+ (extern int
+cairo_image_surface_get_height (cairo_surface_t *surface);
+
+ (extern int
+cairo_image_surface_get_stride (cairo_surface_t *surface);
+
+#if CAIRO_HAS_PNG_FUNCTIONS
+
+ (extern cairo_surface_t *
+cairo_image_surface_create_from_png (const char        *filename);
+
+ (extern cairo_surface_t *
+cairo_image_surface_create_from_png_stream (cairo_read_func_t  read_func,
+                                           void                *closure);
+
+#endif
+\f
+
+;;; Pattern creation functions
+
+ (extern cairo_pattern_t *
+cairo_pattern_create_rgb (double red, double green, double blue);
+
+ (extern cairo_pattern_t *
+cairo_pattern_create_rgba (double red, double green, double blue,
+                          double alpha);
+
+ (extern cairo_pattern_t *
+cairo_pattern_create_for_surface (cairo_surface_t *surface);
+
+ (extern cairo_pattern_t *
+cairo_pattern_create_linear (double x0, double y0,
+                            double x1, double y1);
+
+ (extern cairo_pattern_t *
+cairo_pattern_create_radial (double cx0, double cy0, double radius0,
+                            double cx1, double cy1, double radius1);
+
+ (extern cairo_pattern_t *
+cairo_pattern_reference (cairo_pattern_t *pattern);
+
+ (extern void
+cairo_pattern_destroy (cairo_pattern_t *pattern);
+
+ (extern unsigned int
+cairo_pattern_get_reference_count (cairo_pattern_t *pattern);
+
+ (extern cairo_status_t
+cairo_pattern_status (cairo_pattern_t *pattern);
+
+ (extern void *
+cairo_pattern_get_user_data (cairo_pattern_t            *pattern,
+                            const cairo_user_data_key_t *key);
+
+ (extern cairo_status_t
+cairo_pattern_set_user_data (cairo_pattern_t            *pattern,
+                            const cairo_user_data_key_t *key,
+                            void                        *user_data,
+                            cairo_destroy_func_t         destroy);
+
+typedef enum _cairo_pattern_type {
+    CAIRO_PATTERN_TYPE_SOLID,
+    CAIRO_PATTERN_TYPE_SURFACE,
+    CAIRO_PATTERN_TYPE_LINEAR,
+    CAIRO_PATTERN_TYPE_RADIAL
+} cairo_pattern_type_t;
+
+ (extern cairo_pattern_type_t
+cairo_pattern_get_type (cairo_pattern_t *pattern);
+
+ (extern void
+cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern,
+                                 double offset,
+                                 double red, double green, double blue);
+
+ (extern void
+cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern,
+                                  double offset,
+                                  double red, double green, double blue,
+                                  double alpha);
+
+ (extern void
+cairo_pattern_set_matrix (cairo_pattern_t      *pattern,
+                         const cairo_matrix_t *matrix);
+
+ (extern void
+cairo_pattern_get_matrix (cairo_pattern_t *pattern,
+                         cairo_matrix_t  *matrix);
+
+typedef enum _cairo_extend {
+    CAIRO_EXTEND_NONE,
+    CAIRO_EXTEND_REPEAT,
+    CAIRO_EXTEND_REFLECT,
+    CAIRO_EXTEND_PAD
+} cairo_extend_t;
+
+ (extern void
+cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend);
+
+ (extern cairo_extend_t
+cairo_pattern_get_extend (cairo_pattern_t *pattern);
+
+typedef enum _cairo_filter {
+    CAIRO_FILTER_FAST,
+    CAIRO_FILTER_GOOD,
+    CAIRO_FILTER_BEST,
+    CAIRO_FILTER_NEAREST,
+    CAIRO_FILTER_BILINEAR,
+    CAIRO_FILTER_GAUSSIAN
+} cairo_filter_t;
+
+ (extern void
+cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter);
+
+ (extern cairo_filter_t
+cairo_pattern_get_filter (cairo_pattern_t *pattern);
+
+ (extern cairo_status_t
+cairo_pattern_get_rgba (cairo_pattern_t *pattern,
+                       double *red, double *green,
+                       double *blue, double *alpha);
+
+ (extern cairo_status_t
+cairo_pattern_get_surface (cairo_pattern_t *pattern,
+                          cairo_surface_t **surface);
+
+ (extern cairo_status_t
+cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern,
+                                  int index, double *offset,
+                                  double *red, double *green,
+                                  double *blue, double *alpha);
+
+ (extern cairo_status_t
+cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern,
+                                   int *count);
+
+ (extern cairo_status_t
+cairo_pattern_get_linear_points (cairo_pattern_t *pattern,
+                                double *x0, double *y0,
+                                double *x1, double *y1);
+
+ (extern cairo_status_t
+cairo_pattern_get_radial_circles (cairo_pattern_t *pattern,
+                                 double *x0, double *y0, double *r0,
+                                 double *x1, double *y1, double *r1);
+\f
+
+;;; Matrix functions
+
+ (extern void
+cairo_matrix_init (cairo_matrix_t *matrix,
+                  double  xx, double  yx,
+                  double  xy, double  yy,
+                  double  x0, double  y0);
+
+ (extern void
+cairo_matrix_init_identity (cairo_matrix_t *matrix);
+
+ (extern void
+cairo_matrix_init_translate (cairo_matrix_t *matrix,
+                            double tx, double ty);
+
+ (extern void
+cairo_matrix_init_scale (cairo_matrix_t *matrix,
+                        double sx, double sy);
+
+ (extern void
+cairo_matrix_init_rotate (cairo_matrix_t *matrix,
+                         double radians);
+
+ (extern void
+cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty);
+
+ (extern void
+cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy);
+
+ (extern void
+cairo_matrix_rotate (cairo_matrix_t *matrix, double radians);
+
+ (extern cairo_status_t
+cairo_matrix_invert (cairo_matrix_t *matrix);
+
+ (extern void
+cairo_matrix_multiply (cairo_matrix_t      *result,
+                      const cairo_matrix_t *a,
+                      const cairo_matrix_t *b);
+
+ (extern void
+cairo_matrix_transform_distance (const cairo_matrix_t *matrix,
+                                double *dx, double *dy);
+|#
+
+;(extern void cairo_matrix_transform_point
+;      (matrix (const (* cairo_matrix_t)))
+;      (x (* double)) (y (* double)))
+
+;(extern void cairo_debug_reset_static_data)
diff --git a/src/gtk/Includes/gdk-pixbuf-core.cdecl b/src/gtk/Includes/gdk-pixbuf-core.cdecl
new file mode 100644 (file)
index 0000000..2a5d8b6
--- /dev/null
@@ -0,0 +1,12 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk-pixbuf/gdk-pixbuf-core.h |#
+
+(extern int gdk_pixbuf_get_width (pixbuf (* (const GdkPixbuf))))
+
+(extern int gdk_pixbuf_get_height (pixbuf (* (const GdkPixbuf))))
+
+;(extern (* GdkPixbuf)
+;      gdk_pixbuf_new_from_file
+;      (filename (* (const char)))
+;      (error (* (* GError))))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdk-pixbuf-loader.cdecl b/src/gtk/Includes/gdk-pixbuf-loader.cdecl
new file mode 100644 (file)
index 0000000..987c7a2
--- /dev/null
@@ -0,0 +1,54 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk-pixbuf/gdk-pixbuf-loader.h |#
+
+(include "glib")
+;(include "glib-object")
+;(include "gdk-pixbuf-core")
+;(include "gdk-pixbuf/gdk-pixbuf-animation")
+;(include "gdk-pixbuf/gdk-pixbuf-io")
+
+(typedef GdkPixbufLoader (struct _GdkPixbufLoader))
+
+(struct _GdkPixbufLoader
+       (parent_instance GObject)
+       ;; < private >
+       (priv gpointer))
+
+;(typedef GdkPixbufLoaderClass (struct _GdkPixbufLoaderClass))
+
+;(struct _GdkPixbufLoaderClass ...)
+
+(extern (* GdkPixbufLoader) gdk_pixbuf_loader_new)
+
+;(extern (* GdkPixbufLoader) gdk_pixbuf_loader_new_with_type
+;      (image_type (const (* char)))
+;      (error (* (* GError))))
+
+;(extern (* GdkPixbufLoader) gdk_pixbuf_loader_new_with_mime_type
+;      (mime_type (const (* char)))
+;      (error (* (* GError))))
+
+;(extern void gdk_pixbuf_loader_set_size
+;      (loader (* GdkPixbufLoader))
+;      (width int)
+;      (height int))
+
+(extern gboolean gdk_pixbuf_loader_write
+       (loader (* GdkPixbufLoader))
+       (buf (const (* guchar)))
+       (count gsize)
+       (error (* (* GError))))
+
+(extern (* GdkPixbuf) gdk_pixbuf_loader_get_pixbuf
+       (loader (* GdkPixbufLoader)))
+
+;(extern (* GdkPixbufAnimation) gdk_pixbuf_loader_get_animation
+;      (loader (* GdkPixbufLoader)))
+
+(extern gboolean gdk_pixbuf_loader_close
+       (loader (* GdkPixbufLoader))
+       (error (* (* GError))))
+
+;(extern (* GdkPixbufFormat) gdk_pixbuf_loader_get_format
+;      (loader (* GdkPixbufLoader)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdk-pixbuf.cdecl b/src/gtk/Includes/gdk-pixbuf.cdecl
new file mode 100644 (file)
index 0000000..c83c253
--- /dev/null
@@ -0,0 +1,15 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk-pixbuf/gdk-pixbuf.h |#
+
+(include "glib")
+;(include "gdk-pixbuf-features")
+;(include "glib-object")
+
+(include "gdk-pixbuf-core")
+;(include "gdk-pixbuf-transform")
+;(include "gdk-pixbuf-animation")
+;(include "gdk-pixbuf-simple-anim")
+;(include "gdk-pixbuf-io")
+(include "gdk-pixbuf-loader")
+;(include "gdk-pixbuf-enum-types")
\ No newline at end of file
diff --git a/src/gtk/Includes/gdk.cdecl b/src/gtk/Includes/gdk.cdecl
new file mode 100644 (file)
index 0000000..18e1e62
--- /dev/null
@@ -0,0 +1,51 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdk.h |#
+
+(include "gtypes")
+;; gtypes.scm does not seem to be the place for this.
+(include "gtype")
+(include "gquark")
+(include "genums")
+(include "gobject")
+(include "gvalue")
+(include "gvaluetypes")
+(include "gparam")
+(include "gparamspecs")
+(include "gsignal")
+
+;(include "gdkcairo")
+(include "gdkcolor")
+(include "gdkcursor")
+;(include "gdkdisplay")
+;(include "gdkdnd")
+(include "gdkdrawable")
+;(include "gdkenumtypes")
+(include "gdkevents")
+;(include "gdkfont")
+(include "gdkgc")
+;(include "gdkimage")
+;(include "gdkinput")
+(include "gdkkeys")
+;(include "gdkdisplaymanager")
+;(include "gdkpango")
+;(include "gdkpixbuf")
+;(include "gdkpixmap")
+;(include "gdkproperty")
+;(include "gdkregion")
+(include "gdkrgb")
+;(include "gdkscreen")
+;(include "gdkselection")
+;(include "gdkspawn")
+(include "gdktypes")
+;(include "gdkvisual")
+(include "gdkwindow")
+
+(extern gboolean gdk_rectangle_intersect
+       (src1 (* GdkRectangle))
+       (src2 (* GdkRectangle))
+       (dest (* GdkRectangle)))
+(extern void gdk_rectangle_union
+       (src1 (* GdkRectangle))
+       (src2 (* GdkRectangle))
+       (dest (* GdkRectangle)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkcolor.cdecl b/src/gtk/Includes/gdkcolor.cdecl
new file mode 100644 (file)
index 0000000..9535948
--- /dev/null
@@ -0,0 +1,63 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkcolor.h |#
+
+;(include "cairo")
+;(include "gdktypes")
+
+(struct _GdkColor
+       (pixel guint32)
+       (red guint16)
+       (green guint16)
+       (blue guint16))
+
+;(typedef GdkColormapClass (struct _GdkColormapClass))
+
+(struct _GdkColormap
+       (parent_instance GObject)
+       (size gint)
+       (colors (* GdkColor))
+       (visual (* GdkVisual))
+       (windowing_data gpointer))
+
+;(struct _GdkColormapClass
+;      (parent_class GObjectClass))
+;
+;(extern GType gdk_colormap_get_type)
+;
+;(extern (* GdkColormap) gdk_colormap_new
+;      (visual (* GdkVisual)) (allocate gboolean))
+;(extern (* GdkScreen) gdk_colormap_get_screen
+;      (cmap (* GdkColormap)))
+;(extern gint gdk_colormap_alloc_colors
+;      (colormap (* GdkColormap))
+;      (colors (* GdkColor)) (ncolors gint)
+;      (writeable gboolean) (best_match gboolean) (success (* gboolean)))
+;(extern gboolean gdk_colormap_alloc_color
+;      (colormap (* GdkColormap))
+;      (color (* GdkColor))
+;      (writeable gboolean)
+;      (best_match gboolean))
+;(extern void gdk_colormap_free_colors
+;      (colormap (* GdkColormap))
+;      (colors (* GdkColor))
+;      (ncolors gint))
+;(extern void gdk_colormap_query_color
+;      (colormap (* GdkColormap))
+;      (pixel gulong)
+;      (result (* GdkColor)))
+;
+;(extern (* GdkVisual) gdk_colormap_get_visual
+;      (colormap (* GdkColormap)))
+;(extern (* GdkColor) gdk_color_copy
+;      (color (const (* GdkColor))))
+;(extern void gdk_color_free
+;      (color (* GdkColor)))
+;(extern gint gdk_color_parse
+;      (spec (const (* gchar)))
+;      (color (* GdkColor)))
+;(extern guint gdk_color_hash
+;      (colora (const (* GdkColor))))
+;(extern gboolean gdk_color_equal
+;      (colora (const (* GdkColor)))
+;      (colorb (const (* GdkColor))))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkcursor.cdecl b/src/gtk/Includes/gdkcursor.cdecl
new file mode 100644 (file)
index 0000000..ed2f606
--- /dev/null
@@ -0,0 +1,99 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkcursor.h |#
+
+;(include "gdktypes")
+;(include "gdk-pixbuf")
+
+(typedef GdkCursorType
+        (enum
+         (GDK_X_CURSOR)
+         (GDK_ARROW)
+         (GDK_BASED_ARROW_DOWN)
+         (GDK_BASED_ARROW_UP)
+         (GDK_BOAT)
+         (GDK_BOGOSITY)
+         (GDK_BOTTOM_LEFT_CORNER)
+         (GDK_BOTTOM_RIGHT_CORNER)
+         (GDK_BOTTOM_SIDE)
+         (GDK_BOTTOM_TEE)
+         (GDK_BOX_SPIRAL)
+         (GDK_CENTER_PTR)
+         (GDK_CIRCLE)
+         (GDK_CLOCK)
+         (GDK_COFFEE_MUG)
+         (GDK_CROSS)
+         (GDK_CROSS_REVERSE)
+         (GDK_CROSSHAIR)
+         (GDK_DIAMOND_CROSS)
+         (GDK_DOT)
+         (GDK_DOTBOX)
+         (GDK_DOUBLE_ARROW)
+         (GDK_DRAFT_LARGE)
+         (GDK_DRAFT_SMALL)
+         (GDK_DRAPED_BOX)
+         (GDK_EXCHANGE)
+         (GDK_FLEUR)
+         (GDK_GOBBLER)
+         (GDK_GUMBY)
+         (GDK_HAND1)
+         (GDK_HAND2)
+         (GDK_HEART)
+         (GDK_ICON)
+         (GDK_IRON_CROSS)
+         (GDK_LEFT_PTR)
+         (GDK_LEFT_SIDE)
+         (GDK_LEFT_TEE)
+         (GDK_LEFTBUTTON)
+         (GDK_LL_ANGLE)
+         (GDK_LR_ANGLE)
+         (GDK_MAN)
+         (GDK_MIDDLEBUTTON)
+         (GDK_MOUSE)
+         (GDK_PENCIL)
+         (GDK_PIRATE)
+         (GDK_PLUS)
+         (GDK_QUESTION_ARROW)
+         (GDK_RIGHT_PTR)
+         (GDK_RIGHT_SIDE)
+         (GDK_RIGHT_TEE)
+         (GDK_RIGHTBUTTON)
+         (GDK_RTL_LOGO)
+         (GDK_SAILBOAT)
+         (GDK_SB_DOWN_ARROW)
+         (GDK_SB_H_DOUBLE_ARROW)
+         (GDK_SB_LEFT_ARROW)
+         (GDK_SB_RIGHT_ARROW)
+         (GDK_SB_UP_ARROW)
+         (GDK_SB_V_DOUBLE_ARROW)
+         (GDK_SHUTTLE)
+         (GDK_SIZING)
+         (GDK_SPIDER)
+         (GDK_SPRAYCAN)
+         (GDK_STAR)
+         (GDK_TARGET)
+         (GDK_TCROSS)
+         (GDK_TOP_LEFT_ARROW)
+         (GDK_TOP_LEFT_CORNER)
+         (GDK_TOP_RIGHT_CORNER)
+         (GDK_TOP_SIDE)
+         (GDK_TOP_TEE)
+         (GDK_TREK)
+         (GDK_UL_ANGLE)
+         (GDK_UMBRELLA)
+         (GDK_UR_ANGLE)
+         (GDK_WATCH)
+         (GDK_XTERM)
+         (GDK_LAST_CURSOR)
+         (GDK_CURSOR_IS_PIXMAP)))
+
+(struct _GdkCursor
+       (type GdkCursorType)
+       ;; < private >
+       (ref_count guint))
+
+(extern (* GdkCursor) gdk_cursor_new
+       (cursor_type GdkCursorType))
+
+(extern void gdk_cursor_destroy
+       (cursor (* GdkCursor)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkdrawable.cdecl b/src/gtk/Includes/gdkdrawable.cdecl
new file mode 100644 (file)
index 0000000..9cbd6e0
--- /dev/null
@@ -0,0 +1,93 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkdrawable.h |#
+
+;(include "gdktypes")
+;(include "gdkgc")
+;(include "gdkrgb")
+;(include "gdk-pixbuf")
+;(include "cairo")
+
+(typedef GdkDrawableClass (struct _GdkDrawableClass))
+(typedef GdkTrapezoid (struct _GdkTrapezoid))
+
+(struct _GdkDrawable
+       (parent_instance GObject))
+
+(struct _GdkDrawableClass 
+       (parent_class GObjectClass)
+       (create_gc
+        (* (function (* GdkGC)
+                     (drawable (* GdkDrawable))
+                     (values (* GdkGCValues))
+                     (mask GdkGCValuesMask))))
+       (draw_rectangle (* mumble))
+       (draw_arc (* mumble))
+       (draw_polygon (* mumble))
+       (draw_text (* mumble))
+       (draw_text_wc (* mumble))
+       (draw_drawable (* mumble))
+       (draw_points (* mumble))
+       (draw_segments (* mumble))
+       (draw_lines (* mumble))
+       (draw_glyphs (* mumble))
+       (draw_image (* mumble))
+  
+       (get_depth (* mumble))
+       (get_size (* mumble))
+       (set_colormap (* mumble))
+       (get_colormap (* mumble))
+       (get_visual (* mumble))
+       (get_screen (* mumble))
+       (get_image (* mumble))
+       (get_clip_region (* mumble))
+       (get_visible_region (* mumble))
+       (get_composite_drawable (* mumble))
+       (draw_pixbuf (* mumble))
+       (_copy_to_image (* mumble))
+       (draw_glyphs_transformed (* mumble))
+       (draw_trapezoids (* mumble))
+       (ref_cairo_surface (* mumble))
+       (_gdk_reserved4 (* mumble))
+       (_gdk_reserved5 (* mumble))
+       (_gdk_reserved6 (* mumble))
+       (_gdk_reserved7 (* mumble))
+       (_gdk_reserved9 (* mumble))
+       (_gdk_reserved10 (* mumble))
+       (_gdk_reserved11 (* mumble))
+       (_gdk_reserved12 (* mumble))
+       (_gdk_reserved13 (* mumble))
+       (_gdk_reserved14 (* mumble))
+       (_gdk_reserved15 (* mumble))
+       (_gdk_reserved16 (* mumble)))
+
+(struct _GdkTrapezoid
+       (y1 double)
+       (x11 double)
+       (x21 double)
+       (y2 double)
+       (x12 double)
+       (x22 double))
+
+(extern void gdk_draw_rectangle
+       (drawable (* GdkDrawable))
+       (gc       (* GdkGC))
+       (filled   gboolean)
+       (x        gint)
+       (y        gint)
+       (width    gint)
+       (height   gint))
+
+(extern void gdk_draw_pixbuf
+       (drawable (* GdkDrawable))
+       (gc (* GdkGC))
+       (pixbuf (* GdkPixbuf))
+       (src_x gint)
+       (src_y gint)
+       (dest_x gint)
+       (dest_y gint)
+       (width gint)
+       (height gint)
+       (dither GdkRgbDither)
+       (x_dither gint)
+       (y_dither gint))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkevents.cdecl b/src/gtk/Includes/gdkevents.cdecl
new file mode 100644 (file)
index 0000000..6a2c627
--- /dev/null
@@ -0,0 +1,428 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkevents.h |#
+
+;(include "gdkcolor")
+;(include "gdktypes")
+;(include "gdkdnd")
+;(include "gdkinput")
+
+;(enum (GDK_PRIORITY_EVENTS)
+;      (GDK_PRIORITY_REDRAW))
+
+(typedef GdkEventAny         (struct _GdkEventAny))
+(typedef GdkEventExpose      (struct _GdkEventExpose))
+(typedef GdkEventNoExpose    (struct _GdkEventNoExpose))
+(typedef GdkEventVisibility  (struct _GdkEventVisibility))
+(typedef GdkEventMotion      (struct _GdkEventMotion))
+(typedef GdkEventButton      (struct _GdkEventButton))
+(typedef GdkEventScroll      (struct _GdkEventScroll))
+(typedef GdkEventKey         (struct _GdkEventKey))
+(typedef GdkEventFocus       (struct _GdkEventFocus))
+(typedef GdkEventCrossing    (struct _GdkEventCrossing))
+(typedef GdkEventConfigure   (struct _GdkEventConfigure))
+(typedef GdkEventProperty    (struct _GdkEventProperty))
+(typedef GdkEventSelection   (struct _GdkEventSelection))
+(typedef GdkEventOwnerChange (struct _GdkEventOwnerChange))
+(typedef GdkEventProximity   (struct _GdkEventProximity))
+(typedef GdkEventClient      (struct _GdkEventClient))
+(typedef GdkEventDND         (struct _GdkEventDND))
+(typedef GdkEventWindowState (struct _GdkEventWindowState))
+(typedef GdkEventSetting     (struct _GdkEventSetting))
+(typedef GdkEventGrabBroken  (struct _GdkEventGrabBroken))
+
+(typedef GdkEvent            (union  _GdkEvent))
+
+(typedef GdkEventFunc        (* (function void
+                                 (event (* GdkEvent))
+                                 (data  gpointer))))
+
+;(typedef GdkXEvent void)
+
+(typedef GdkFilterReturn
+  (enum
+    (GDK_FILTER_CONTINUE)
+    (GDK_FILTER_TRANSLATE)
+    (GDK_FILTER_REMOVE)))
+
+(typedef GdkFilterFunc
+  (* (function GdkFilterReturn
+       (xevent (* GdkXEvent))
+       (event  (* GdkEvent))
+       (data   gpointer))))
+
+(typedef GdkEventType
+  (enum
+    (GDK_NOTHING)
+    (GDK_DELETE)
+    (GDK_DESTROY)
+    (GDK_EXPOSE)
+    (GDK_MOTION_NOTIFY)
+    (GDK_BUTTON_PRESS)
+    (GDK_2BUTTON_PRESS)
+    (GDK_3BUTTON_PRESS)
+    (GDK_BUTTON_RELEASE)
+    (GDK_KEY_PRESS)
+    (GDK_KEY_RELEASE)
+    (GDK_ENTER_NOTIFY)
+    (GDK_LEAVE_NOTIFY)
+    (GDK_FOCUS_CHANGE)
+    (GDK_CONFIGURE)
+    (GDK_MAP)
+    (GDK_UNMAP)
+    (GDK_PROPERTY_NOTIFY)
+    (GDK_SELECTION_CLEAR)
+    (GDK_SELECTION_REQUEST)
+    (GDK_SELECTION_NOTIFY)
+    (GDK_PROXIMITY_IN)
+    (GDK_PROXIMITY_OUT)
+    (GDK_DRAG_ENTER)
+    (GDK_DRAG_LEAVE)
+    (GDK_DRAG_MOTION)
+    (GDK_DRAG_STATUS)
+    (GDK_DROP_START)
+    (GDK_DROP_FINISHED)
+    (GDK_CLIENT_EVENT)
+    (GDK_VISIBILITY_NOTIFY)
+    (GDK_NO_EXPOSE)
+    (GDK_SCROLL)
+    (GDK_WINDOW_STATE)
+    (GDK_SETTING)
+    (GDK_OWNER_CHANGE)))
+
+(typedef GdkEventMask
+  (enum
+    (GDK_EXPOSURE_MASK)
+    (GDK_POINTER_MOTION_MASK)
+    (GDK_POINTER_MOTION_HINT_MASK)
+    (GDK_BUTTON_MOTION_MASK)
+    (GDK_BUTTON1_MOTION_MASK)
+    (GDK_BUTTON2_MOTION_MASK)
+    (GDK_BUTTON3_MOTION_MASK)
+    (GDK_BUTTON_PRESS_MASK)
+    (GDK_BUTTON_RELEASE_MASK)
+    (GDK_KEY_PRESS_MASK)
+    (GDK_KEY_RELEASE_MASK)
+    (GDK_ENTER_NOTIFY_MASK)
+    (GDK_LEAVE_NOTIFY_MASK)
+    (GDK_FOCUS_CHANGE_MASK)
+    (GDK_STRUCTURE_MASK)
+    (GDK_PROPERTY_CHANGE_MASK)
+    (GDK_VISIBILITY_NOTIFY_MASK)
+    (GDK_PROXIMITY_IN_MASK)
+    (GDK_PROXIMITY_OUT_MASK)
+    (GDK_SUBSTRUCTURE_MASK)
+    (GDK_SCROLL_MASK)
+    (GDK_ALL_EVENTS_MASK)))
+
+(typedef GdkVisibilityState
+  (enum
+    (GDK_VISIBILITY_UNOBSCURED)
+    (GDK_VISIBILITY_PARTIAL)
+    (GDK_VISIBILITY_FULLY_OBSCURED)))
+
+(typedef GdkScrollDirection
+  (enum
+    (GDK_SCROLL_UP)
+    (GDK_SCROLL_DOWN)
+    (GDK_SCROLL_LEFT)
+    (GDK_SCROLL_RIGHT)))
+
+(typedef GdkNotifyType
+  (enum
+    (GDK_NOTIFY_ANCESTOR)
+    (GDK_NOTIFY_VIRTUAL)
+    (GDK_NOTIFY_INFERIOR)
+    (GDK_NOTIFY_NONLINEAR)
+    (GDK_NOTIFY_NONLINEAR_VIRTUAL)
+    (GDK_NOTIFY_UNKNOWN)))
+
+(typedef GdkCrossingMode
+  (enum
+    (GDK_CROSSING_NORMAL)
+    (GDK_CROSSING_GRAB)
+    (GDK_CROSSING_UNGRAB)))
+
+(typedef GdkPropertyState
+  (enum
+    (GDK_PROPERTY_NEW_VALUE)
+    (GDK_PROPERTY_DELETE)))
+
+(typedef GdkWindowState
+  (enum
+    (GDK_WINDOW_STATE_WITHDRAWN)
+    (GDK_WINDOW_STATE_ICONIFIED)
+    (GDK_WINDOW_STATE_MAXIMIZED)
+    (GDK_WINDOW_STATE_STICKY)
+    (GDK_WINDOW_STATE_FULLSCREEN)
+    (GDK_WINDOW_STATE_ABOVE)
+    (GDK_WINDOW_STATE_BELOW)))
+
+(typedef GdkSettingAction
+  (enum
+    (GDK_SETTING_ACTION_NEW)
+    (GDK_SETTING_ACTION_CHANGED)
+    (GDK_SETTING_ACTION_DELETED)))
+
+(typedef GdkOwnerChange
+  (enum
+    (GDK_OWNER_CHANGE_NEW_OWNER)
+    (GDK_OWNER_CHANGE_DESTROY)
+    (GDK_OWNER_CHANGE_CLOSE)))
+
+(struct _GdkEventAny
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8))
+
+(struct _GdkEventExpose
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (area       GdkRectangle)
+  (region     (* GdkRegion))
+  (count      gint))
+
+(struct _GdkEventNoExpose
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8))
+
+(struct _GdkEventVisibility
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (state      GdkVisibilityState))
+
+(struct _GdkEventMotion
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (time       guint32)
+  (x          gdouble)
+  (y          gdouble)
+  (axes       (* gdouble))
+  (state      guint)
+  (is_hint    gint16)
+  (device     (* GdkDevice))
+  (x_root     gdouble)
+  (y_root     gdouble))
+
+(struct _GdkEventButton
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (time       guint32)
+  (x          gdouble)
+  (y          gdouble)
+  (axes       (* gdouble))
+  (state      guint)
+  (button     guint)
+  (device     (* GdkDevice))
+  (x_root     gdouble)
+  (y_root     gdouble))
+
+(struct _GdkEventScroll
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (time       guint32)
+  (x          gdouble)
+  (y          gdouble)
+  (state      guint)
+  (direction  GdkScrollDirection)
+  (device     (* GdkDevice))
+  (x_root     gdouble)
+  (y_root     gdouble))
+
+(struct _GdkEventKey
+  (type             GdkEventType)
+  (window           (* GdkWindow))
+  (send_event       gint8)
+  (time             guint32)
+  (state            guint)
+  (keyval           guint)
+  (length           gint)
+  (string           (* gchar))
+  (hardware_keycode guint16)
+  (group            guint8))
+
+(struct _GdkEventCrossing
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (subwindow  (* GdkWindow))
+  (time       guint32)
+  (x          gdouble)
+  (y          gdouble)
+  (x_root     gdouble)
+  (y_root     gdouble)
+  (mode       GdkCrossingMode)
+  (detail     GdkNotifyType)
+  (focus      gboolean)
+  (state      guint))
+
+(struct _GdkEventFocus
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (in         gint16))
+
+(struct _GdkEventConfigure
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (x          gint)
+  (y          gint)
+  (width      gint)
+  (height     gint))
+
+(struct _GdkEventProperty
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (atom       GdkAtom)
+  (time       guint32)
+  (state      guint))
+
+(struct _GdkEventSelection
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (selection  GdkAtom)
+  (target     GdkAtom)
+  (property   GdkAtom)
+  (time       guint32)
+  (requestor  GdkNativeWindow))
+
+(struct _GdkEventOwnerChange
+  (type           GdkEventType)
+  (window         (* GdkWindow))
+  (send_event     gint8)
+  (owner          GdkNativeWindow)
+  (reason         GdkOwnerChange)
+  (selection      GdkAtom)
+  (time           guint32)
+  (selection_time guint32))
+
+(struct _GdkEventProximity
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (time       guint32)
+  (device     (* GdkDevice)))
+
+(struct _GdkEventClient
+  (type         GdkEventType)
+  (window       (* GdkWindow))
+  (send_event   gint8)
+  (message_type GdkAtom)
+  (data_format  gushort)
+  (data         (union
+                (b (array char 20))
+                (s (array short 10))
+                (l (array long 5)))))
+
+(struct _GdkEventSetting
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (action     GdkSettingAction)
+  (name       (* char)))
+
+(struct _GdkEventWindowState
+  (type             GdkEventType)
+  (window           (* GdkWindow))
+  (send_event       gint8)
+  (changed_mask     GdkWindowState)
+  (new_window_state GdkWindowState))
+
+(struct _GdkEventGrabBroken
+  (type        GdkEventType)
+  (window      (* GdkWindow))
+  (send_event  gint8)
+  (keyboard    gboolean)
+  (implicit    gboolean)
+  (grab_window (* GdkWindow)))
+
+(struct _GdkEventDND
+  (type       GdkEventType)
+  (window     (* GdkWindow))
+  (send_event gint8)
+  (context    (* GdkDragContext))
+  (time       guint32)
+  (x_root     gshort)
+  (y_root     gshort))
+
+(union _GdkEvent
+  (type         GdkEventType)
+  (any          GdkEventAny)
+  (expose       GdkEventExpose)
+  (no_expose    GdkEventNoExpose)
+  (visibility   GdkEventVisibility)
+  (motion       GdkEventMotion)
+  (button       GdkEventButton)
+  (scroll       GdkEventScroll)
+  (key          GdkEventKey)
+  (crossing     GdkEventCrossing)
+  (focus_change GdkEventFocus)
+  (configure    GdkEventConfigure)
+  (property     GdkEventProperty)
+  (selection    GdkEventSelection)
+  (owner_change GdkEventOwnerChange)
+  (proximity    GdkEventProximity)
+  (client       GdkEventClient)
+  (dnd          GdkEventDND)
+  (window_state GdkEventWindowState)
+  (setting      GdkEventSetting)
+  (grab_broken GdkEventGrabBroken))
+
+;Most of these externs are commented out just to avoid inflating
+;gtk.so with a lot of useless or redundant trampolines.
+;
+;(extern GType gdk_event_get_type)
+;(extern gboolean gdk_events_pending)
+;(extern (* GdkEvent) gdk_event_get)
+;(extern (* GdkEvent) gdk_event_peek)
+;(extern (* GdkEvent) gdk_event_get_graphics_expose
+;      (window (* GdkWindow)))
+;(extern void gdk_event_put
+;      (event (* GdkEvent)))
+;
+;(extern (* GdkEvent) gdk_event_new
+;      (type GdkEventType))
+(extern (* GdkEvent) gdk_event_copy
+       (event (* GdkEvent)))
+(extern void gdk_event_free
+       (event (* GdkEvent)))
+(extern guint32 gdk_event_get_time
+       (event (* GdkEvent)))
+;(extern gboolean gdk_event_get_state
+;      (event (* GdkEvent))
+;      (state (* GdkModifierType)))
+;(extern gboolean gdk_event_get_coords
+;      (event (* GdkEvent))
+;      (x_win (* gdouble))
+;      (y_win (* gdouble)))
+;(extern gboolean gdk_event_get_root_coords
+;      (event  (* GdkEvent))
+;      (x_root (* gdouble))
+;      (y_root (* gdouble)))
+;(extern gboolean gdk_event_get_axis
+;      (event    (* GdkEvent))
+;      (axis_use GdkAxisUse)
+;      (value    (* gdouble)))
+;(extern void gdk_event_handler_set
+;      (func   GdkEventFunc)
+;      (data   gpointer)
+;      (notify GDestroyNotify))
+;
+;(extern void gdk_event_set_screen
+;      (event  (* GdkEvent)) (screen (* GdkScreen)))
+;
+;(extern (* GdkScreen) gdk_event_get_screen
+;      (event (* GdkEvent)))
+;
+;(extern void gdk_set_show_events
+;      (show_events gboolean))
+;(extern gboolean gdk_get_show_events)
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkfont.cdecl b/src/gtk/Includes/gdkfont.cdecl
new file mode 100644 (file)
index 0000000..da0968e
--- /dev/null
@@ -0,0 +1,38 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkfont.h |#
+
+;(include "gdktypes")
+;(include "pango-font")
+
+(typedef GdkFontType
+  (enum
+   (GDK_FONT_FONT)
+   (GDK_FONT_FONTSET)))
+
+(struct _GdkFont
+  (type GdkFontType)
+  (ascent gint)
+  (descent gint))
+
+(extern GType gdk_font_get_type)
+
+(extern (* GdkFont) gdk_font_ref
+       ((* GdkFont) font))
+(extern void gdk_font_unref
+       ((* GdkFont) font))
+(extern gint gdk_font_id
+       (font (const (* GdkFont))))
+(extern gboolean gdk_font_equal
+       (fonta (const (* GdkFont)))
+       (fontb (const (* GdkFont))))
+
+(extern (* GdkFont) gdk_font_load_for_display
+       (display (* GdkDisplay))
+       (font_name (const (* gchar))))
+(extern (* GdkFont) gdk_fontset_load_for_display
+       (GdkDisplay           *display)
+       (const gchar          *fontset_name))
+(extern (* GdkFont) gdk_font_from_description_for_display
+       (GdkDisplay           *display)
+       (PangoFontDescription *font_desc))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkgc.cdecl b/src/gtk/Includes/gdkgc.cdecl
new file mode 100644 (file)
index 0000000..1aa8f08
--- /dev/null
@@ -0,0 +1,215 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkgc.h |#
+
+;(include "gdkcolor")
+;(include "gdktypes")
+
+(typedef GdkGCValues (struct _GdkGCValues))
+(typedef GdkGCClass (struct _GdkGCClass))
+
+(typedef GdkCapStyle
+  (enum
+   (GDK_CAP_NOT_LAST)
+   (GDK_CAP_BUTT)
+   (GDK_CAP_ROUND)
+   (GDK_CAP_PROJECTING)))
+
+(typedef GdkFill
+  (enum
+   (GDK_SOLID)
+   (GDK_TILED)
+   (GDK_STIPPLED)
+   (GDK_OPAQUE_STIPPLED)))
+
+(typedef GdkFunction
+  (enum
+   (GDK_COPY)
+   (GDK_INVERT)
+   (GDK_XOR)
+   (GDK_CLEAR)
+   (GDK_AND)
+   (GDK_AND_REVERSE)
+   (GDK_AND_INVERT)
+   (GDK_NOOP)
+   (GDK_OR)
+   (GDK_EQUIV)
+   (GDK_OR_REVERSE)
+   (GDK_COPY_INVERT)
+   (GDK_OR_INVERT)
+   (GDK_NAND)
+   (GDK_NOR)
+   (GDK_SET)))
+
+(typedef GdkJoinStyle
+  (enum
+   (GDK_JOIN_MITER)
+   (GDK_JOIN_ROUND)
+   (GDK_JOIN_BEVEL)))
+
+(typedef GdkLineStyle
+  (enum
+   (GDK_LINE_SOLID)
+   (GDK_LINE_ON_OFF_DASH)
+   (GDK_LINE_DOUBLE_DASH)))
+
+(typedef GdkSubwindowMode
+  (enum
+   (GDK_CLIP_BY_CHILDREN)
+   (GDK_INCLUDE_INFERIORS)))
+
+(typedef GdkGCValuesMask
+  (enum
+   (GDK_GC_FOREGROUND)
+   (GDK_GC_BACKGROUND)
+   (GDK_GC_FONT)
+   (GDK_GC_FUNCTION)
+   (GDK_GC_FILL)
+   (GDK_GC_TILE)
+   (GDK_GC_STIPPLE)
+   (GDK_GC_CLIP_MASK)
+   (GDK_GC_SUBWINDOW)
+   (GDK_GC_TS_X_ORIGIN)
+   (GDK_GC_TS_Y_ORIGIN)
+   (GDK_GC_CLIP_X_ORIGIN)
+   (GDK_GC_CLIP_Y_ORIGIN)
+   (GDK_GC_EXPOSURES)
+   (GDK_GC_LINE_WIDTH)
+   (GDK_GC_LINE_STYLE)
+   (GDK_GC_CAP_STYLE)
+   (GDK_GC_JOIN_STYLE)))
+
+(struct _GdkGCValues
+  (foreground GdkColor)
+  (background GdkColor)
+  (font (* GdkFont))
+  (function GdkFunction)
+  (fill GdkFill)
+  (tile (* GdkPixmap))
+  (stipple (* GdkPixmap))
+  (clip_mask (* GdkPixmap))
+  (subwindow_mode GdkSubwindowMode)
+  (ts_x_origin gint)
+  (ts_y_origin gint)
+  (clip_x_origin gint)
+  (clip_y_origin gint)
+  (graphics_exposures gint)
+  (line_width gint)
+  (line_style GdkLineStyle)
+  (cap_style GdkCapStyle)
+  (join_style GdkJoinStyle))
+
+(struct _GdkGC
+  (parent_instance GObject)
+  (clip_x_origin gint)
+  (clip_y_origin gint)
+  (ts_x_origin gint)
+  (ts_y_origin gint)
+  (colormap (* GdkColormap)))
+
+(struct _GdkGCClass 
+  (parent_class GObjectClass)
+  (get_values (* (function void
+                          (gc (* GdkGC))
+                          (values (* GdkGCValues)))))
+  (set_values (* (function void
+                          (GdkGC          *gc)
+                          (GdkGCValues    *values)
+                          (GdkGCValuesMask mask))))
+  (set_dashes (* (function void
+                          (gc          (* GdkGC))
+                          (dash_offset gint)
+                          (dash_list   (array gint8))
+                          (gint        n))))
+
+  ;; Padding for future expansion
+  (_gdk_reserved1 (* (function void)))
+  (_gdk_reserved2 (* (function void)))
+  (_gdk_reserved3 (* (function void)))
+  (_gdk_reserved4 (* (function void))))
+
+;(extern GType gdk_gc_get_type)
+;(extern (* GdkGC) gdk_gc_new
+;      (drawable (* GdkDrawable)))
+;(extern (* GdkGC) gdk_gc_new_with_values
+;      (drawable (* GdkDrawable))
+;      (values (* GdkGCValues))
+;      (values_mask GdkGCValuesMask))
+;(extern void gdk_gc_get_values
+;      (gc (* GdkGC))
+;      (values (* GdkGCValues)))
+;(extern void gdk_gc_set_values
+;      (gc (* GdkGC))
+;      (values (* GdkGCValues))
+;      (values_mask GdkGCValuesMask))
+;(extern void gdk_gc_set_foreground
+;      (gc (* GdkGC))
+;      (color (const (* GdkColor))))
+;(extern void gdk_gc_set_background
+;      (gc (* GdkGC))
+;      (color (const (* GdkColor))))
+;(extern void gdk_gc_set_function
+;      (gc (* GdkGC))
+;      (function GdkFunction))
+;(extern void gdk_gc_set_fill
+;      (gc (* GdkGC))
+;      (fill GdkFill))
+;(extern void gdk_gc_set_tile
+;      (gc (* GdkGC))
+;      (tile (* GdkPixmap)))
+;(extern void gdk_gc_set_stipple
+;      (gc (* GdkGC))
+;      (stipple (* GdkPixmap)))
+;(extern void gdk_gc_set_ts_origin
+;      (gc (* GdkGC))
+;      (x gint) (y gint))
+;(extern void gdk_gc_set_clip_origin
+;      (gc (* GdkGC))
+;      (x gint) (y gint))
+;(extern void gdk_gc_set_clip_mask
+;      (gc (* GdkGC))
+;      (mask (* GdkBitmap)))
+(extern void gdk_gc_set_clip_rectangle
+       (gc (* GdkGC))
+       (rectangle (* GdkRectangle)))
+;(extern void gdk_gc_set_clip_region
+;      (gc (* GdkGC))
+;      (region (* GdkRegion)))
+;(extern void gdk_gc_set_subwindow
+;      (gc (* GdkGC))
+;      (mode GdkSubwindowMode))
+;(extern void gdk_gc_set_exposures
+;      (gc (* GdkGC))
+;      (exposures gboolean))
+;(extern void gdk_gc_set_line_attributes
+;      (gc (* GdkGC))
+;      (line_width gint)
+;      (line_style GdkLineStyle)
+;      (cap_style GdkCapStyle)
+;      (join_style GdkJoinStyle))
+;(extern void gdk_gc_set_dashes
+;      (gc (* GdkGC))
+;      (dash_offset gint)
+;      (dash_list (array gint8))
+;      (n gint))
+;(extern void gdk_gc_offset
+;      (gc (* GdkGC))
+;      (x_offset gint)
+;      (y_offset gint))
+;(extern void gdk_gc_copy
+;      (dst_gc (* GdkGC))
+;      (src_gc (* GdkGC)))
+;
+;(extern void gdk_gc_set_colormap
+;      (gc (* GdkGC))
+;      (colormap (* GdkColormap)))
+;(extern (* GdkColormap) gdk_gc_get_colormap
+;      (gc (* GdkGC)))
+;(extern void gdk_gc_set_rgb_fg_color
+;      (gc (* GdkGC))
+;      (color (const (* GdkColor))))
+;(extern void gdk_gc_set_rgb_bg_color
+;      (gc (* GdkGC))
+;      (color (const (* GdkColor))))
+;(extern (* GdkScreen) gdk_gc_get_screen
+;      (gc (* GdkGC)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkkeys.cdecl b/src/gtk/Includes/gdkkeys.cdecl
new file mode 100644 (file)
index 0000000..bb8f8d9
--- /dev/null
@@ -0,0 +1,63 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkkeys.h |#
+
+;(include "gdktypes")
+
+(typedef GdkKeymapKey (struct _GdkKeymapKey))
+
+(struct _GdkKeymapKey
+       (keycode guint)
+       (group gint)
+       (level gint))
+
+(typedef GdkKeymap (struct _GdkKeymap))
+(typedef GdkKeymapClass (struct _GdkKeymapClass))
+(struct _GdkKeymap
+       (parent_instance GObject)
+       (display (* GdkDisplay)))
+
+(struct _GdkKeymapClass
+       (parent_class GObjectClass)
+       (direction_changed (* (function void (keymap (* GdkKeymap)))))
+       (keys_changed (* (function void (keymap (* GdkKeymap))))))
+
+;(extern (* GdkKeymap) gdk_keymap_get_for_display
+;      (display (* GdkDisplay)))
+;
+;(extern guint gdk_keymap_lookup_key
+;      (keymap (* GdkKeymap))
+;      (key (const (* GdkKeymapKey))))
+;(extern gboolean gdk_keymap_translate_keyboard_state
+;      (keymap (* GdkKeymap))
+;      (hardware_keycode guint)
+;      (state GdkModifierType)
+;      (group gint)
+;      (keyval (* guint))
+;      (effective_group (* gint))
+;      (level (* gint))
+;      (consumed_modifiers (* GdkModifierType)))
+;(extern gboolean gdk_keymap_get_entries_for_keyval
+;      ((* GdkKeymap) keymap)
+;      (keyval guint)
+;      (keys (* (* GdkKeymapKey)))
+;      (n_keys (* gint)))
+;(extern gboolean gdk_keymap_get_entries_for_keycode
+;      (keymap (* GdkKeymap))
+;      (hardware_keycode guint)
+;      (keys (* (* GdkKeymapKey)))
+;      (keyvals (* (* guint)))
+;      (n_entries (* gint)))
+;(extern PangoDirection gdk_keymap_get_direction (keymap (* GdkKeymap)))
+
+(extern (* gchar) gdk_keyval_name (keyval guint))
+;(extern guint gdk_keyval_from_name (keyval_name (const (* gchar))))
+;(extern void gdk_keyval_convert_case
+;      (symbol guint) (lower (* guint)) (upper (* guint)))
+;(extern guint gdk_keyval_to_upper (keyval guint))
+;(extern guint gdk_keyval_to_lower (keyval guint))
+;(extern gboolean gdk_keyval_is_upper (keyval guint))
+;(extern gboolean gdk_keyval_is_lower (keyval guint))
+;
+;(extern guint32 gdk_keyval_to_unicode (keyval guint))
+;(extern guint gdk_unicode_to_keyval (wc guint32))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkkeysyms.cdecl b/src/gtk/Includes/gdkkeysyms.cdecl
new file mode 100644 (file)
index 0000000..77e9841
--- /dev/null
@@ -0,0 +1,1713 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkkeysyms.h |#
+
+(enum GdkKeysyms
+  (GDK_VoidSymbol)
+  (GDK_BackSpace)
+  (GDK_Tab)
+  (GDK_Linefeed)
+  (GDK_Clear)
+  (GDK_Return)
+  (GDK_Pause)
+  (GDK_Scroll_Lock)
+  (GDK_Sys_Req)
+  (GDK_Escape)
+  (GDK_Delete)
+  (GDK_Multi_key)
+  (GDK_Codeinput)
+  (GDK_SingleCandidate)
+  (GDK_MultipleCandidate)
+  (GDK_PreviousCandidate)
+  (GDK_Kanji)
+  (GDK_Muhenkan)
+  (GDK_Henkan_Mode)
+  (GDK_Henkan)
+  (GDK_Romaji)
+  (GDK_Hiragana)
+  (GDK_Katakana)
+  (GDK_Hiragana_Katakana)
+  (GDK_Zenkaku)
+  (GDK_Hankaku)
+  (GDK_Zenkaku_Hankaku)
+  (GDK_Touroku)
+  (GDK_Massyo)
+  (GDK_Kana_Lock)
+  (GDK_Kana_Shift)
+  (GDK_Eisu_Shift)
+  (GDK_Eisu_toggle)
+  (GDK_Kanji_Bangou)
+  (GDK_Zen_Koho)
+  (GDK_Mae_Koho)
+  (GDK_Home)
+  (GDK_Left)
+  (GDK_Up)
+  (GDK_Right)
+  (GDK_Down)
+  (GDK_Prior)
+  (GDK_Page_Up)
+  (GDK_Next)
+  (GDK_Page_Down)
+  (GDK_End)
+  (GDK_Begin)
+  (GDK_Select)
+  (GDK_Print)
+  (GDK_Execute)
+  (GDK_Insert)
+  (GDK_Undo)
+  (GDK_Redo)
+  (GDK_Menu)
+  (GDK_Find)
+  (GDK_Cancel)
+  (GDK_Help)
+  (GDK_Break)
+  (GDK_Mode_switch)
+  (GDK_script_switch)
+  (GDK_Num_Lock)
+  (GDK_KP_Space)
+  (GDK_KP_Tab)
+  (GDK_KP_Enter)
+  (GDK_KP_F1)
+  (GDK_KP_F2)
+  (GDK_KP_F3)
+  (GDK_KP_F4)
+  (GDK_KP_Home)
+  (GDK_KP_Left)
+  (GDK_KP_Up)
+  (GDK_KP_Right)
+  (GDK_KP_Down)
+  (GDK_KP_Prior)
+  (GDK_KP_Page_Up)
+  (GDK_KP_Next)
+  (GDK_KP_Page_Down)
+  (GDK_KP_End)
+  (GDK_KP_Begin)
+  (GDK_KP_Insert)
+  (GDK_KP_Delete)
+  (GDK_KP_Equal)
+  (GDK_KP_Multiply)
+  (GDK_KP_Add)
+  (GDK_KP_Separator)
+  (GDK_KP_Subtract)
+  (GDK_KP_Decimal)
+  (GDK_KP_Divide)
+  (GDK_KP_0)
+  (GDK_KP_1)
+  (GDK_KP_2)
+  (GDK_KP_3)
+  (GDK_KP_4)
+  (GDK_KP_5)
+  (GDK_KP_6)
+  (GDK_KP_7)
+  (GDK_KP_8)
+  (GDK_KP_9)
+  (GDK_F1)
+  (GDK_F2)
+  (GDK_F3)
+  (GDK_F4)
+  (GDK_F5)
+  (GDK_F6)
+  (GDK_F7)
+  (GDK_F8)
+  (GDK_F9)
+  (GDK_F10)
+  (GDK_F11)
+  (GDK_L1)
+  (GDK_F12)
+  (GDK_L2)
+  (GDK_F13)
+  (GDK_L3)
+  (GDK_F14)
+  (GDK_L4)
+  (GDK_F15)
+  (GDK_L5)
+  (GDK_F16)
+  (GDK_L6)
+  (GDK_F17)
+  (GDK_L7)
+  (GDK_F18)
+  (GDK_L8)
+  (GDK_F19)
+  (GDK_L9)
+  (GDK_F20)
+  (GDK_L10)
+  (GDK_F21)
+  (GDK_R1)
+  (GDK_F22)
+  (GDK_R2)
+  (GDK_F23)
+  (GDK_R3)
+  (GDK_F24)
+  (GDK_R4)
+  (GDK_F25)
+  (GDK_R5)
+  (GDK_F26)
+  (GDK_R6)
+  (GDK_F27)
+  (GDK_R7)
+  (GDK_F28)
+  (GDK_R8)
+  (GDK_F29)
+  (GDK_R9)
+  (GDK_F30)
+  (GDK_R10)
+  (GDK_F31)
+  (GDK_R11)
+  (GDK_F32)
+  (GDK_R12)
+  (GDK_F33)
+  (GDK_R13)
+  (GDK_F34)
+  (GDK_R14)
+  (GDK_F35)
+  (GDK_R15)
+  (GDK_Shift_L)
+  (GDK_Shift_R)
+  (GDK_Control_L)
+  (GDK_Control_R)
+  (GDK_Caps_Lock)
+  (GDK_Shift_Lock)
+  (GDK_Meta_L)
+  (GDK_Meta_R)
+  (GDK_Alt_L)
+  (GDK_Alt_R)
+  (GDK_Super_L)
+  (GDK_Super_R)
+  (GDK_Hyper_L)
+  (GDK_Hyper_R)
+  (GDK_ISO_Lock)
+  (GDK_ISO_Level2_Latch)
+  (GDK_ISO_Level3_Shift)
+  (GDK_ISO_Level3_Latch)
+  (GDK_ISO_Level3_Lock)
+  (GDK_ISO_Group_Shift)
+  (GDK_ISO_Group_Latch)
+  (GDK_ISO_Group_Lock)
+  (GDK_ISO_Next_Group)
+  (GDK_ISO_Next_Group_Lock)
+  (GDK_ISO_Prev_Group)
+  (GDK_ISO_Prev_Group_Lock)
+  (GDK_ISO_First_Group)
+  (GDK_ISO_First_Group_Lock)
+  (GDK_ISO_Last_Group)
+  (GDK_ISO_Last_Group_Lock)
+  (GDK_ISO_Left_Tab)
+  (GDK_ISO_Move_Line_Up)
+  (GDK_ISO_Move_Line_Down)
+  (GDK_ISO_Partial_Line_Up)
+  (GDK_ISO_Partial_Line_Down)
+  (GDK_ISO_Partial_Space_Left)
+  (GDK_ISO_Partial_Space_Right)
+  (GDK_ISO_Set_Margin_Left)
+  (GDK_ISO_Set_Margin_Right)
+  (GDK_ISO_Release_Margin_Left)
+  (GDK_ISO_Release_Margin_Right)
+  (GDK_ISO_Release_Both_Margins)
+  (GDK_ISO_Fast_Cursor_Left)
+  (GDK_ISO_Fast_Cursor_Right)
+  (GDK_ISO_Fast_Cursor_Up)
+  (GDK_ISO_Fast_Cursor_Down)
+  (GDK_ISO_Continuous_Underline)
+  (GDK_ISO_Discontinuous_Underline)
+  (GDK_ISO_Emphasize)
+  (GDK_ISO_Center_Object)
+  (GDK_ISO_Enter)
+  (GDK_dead_grave)
+  (GDK_dead_acute)
+  (GDK_dead_circumflex)
+  (GDK_dead_tilde)
+  (GDK_dead_macron)
+  (GDK_dead_breve)
+  (GDK_dead_abovedot)
+  (GDK_dead_diaeresis)
+  (GDK_dead_abovering)
+  (GDK_dead_doubleacute)
+  (GDK_dead_caron)
+  (GDK_dead_cedilla)
+  (GDK_dead_ogonek)
+  (GDK_dead_iota)
+  (GDK_dead_voiced_sound)
+  (GDK_dead_semivoiced_sound)
+  (GDK_dead_belowdot)
+  (GDK_dead_hook)
+  (GDK_dead_horn)
+  (GDK_First_Virtual_Screen)
+  (GDK_Prev_Virtual_Screen)
+  (GDK_Next_Virtual_Screen)
+  (GDK_Last_Virtual_Screen)
+  (GDK_Terminate_Server)
+  (GDK_AccessX_Enable)
+  (GDK_AccessX_Feedback_Enable)
+  (GDK_RepeatKeys_Enable)
+  (GDK_SlowKeys_Enable)
+  (GDK_BounceKeys_Enable)
+  (GDK_StickyKeys_Enable)
+  (GDK_MouseKeys_Enable)
+  (GDK_MouseKeys_Accel_Enable)
+  (GDK_Overlay1_Enable)
+  (GDK_Overlay2_Enable)
+  (GDK_AudibleBell_Enable)
+  (GDK_Pointer_Left)
+  (GDK_Pointer_Right)
+  (GDK_Pointer_Up)
+  (GDK_Pointer_Down)
+  (GDK_Pointer_UpLeft)
+  (GDK_Pointer_UpRight)
+  (GDK_Pointer_DownLeft)
+  (GDK_Pointer_DownRight)
+  (GDK_Pointer_Button_Dflt)
+  (GDK_Pointer_Button1)
+  (GDK_Pointer_Button2)
+  (GDK_Pointer_Button3)
+  (GDK_Pointer_Button4)
+  (GDK_Pointer_Button5)
+  (GDK_Pointer_DblClick_Dflt)
+  (GDK_Pointer_DblClick1)
+  (GDK_Pointer_DblClick2)
+  (GDK_Pointer_DblClick3)
+  (GDK_Pointer_DblClick4)
+  (GDK_Pointer_DblClick5)
+  (GDK_Pointer_Drag_Dflt)
+  (GDK_Pointer_Drag1)
+  (GDK_Pointer_Drag2)
+  (GDK_Pointer_Drag3)
+  (GDK_Pointer_Drag4)
+  (GDK_Pointer_Drag5)
+  (GDK_Pointer_EnableKeys)
+  (GDK_Pointer_Accelerate)
+  (GDK_Pointer_DfltBtnNext)
+  (GDK_Pointer_DfltBtnPrev)
+  (GDK_3270_Duplicate)
+  (GDK_3270_FieldMark)
+  (GDK_3270_Right2)
+  (GDK_3270_Left2)
+  (GDK_3270_BackTab)
+  (GDK_3270_EraseEOF)
+  (GDK_3270_EraseInput)
+  (GDK_3270_Reset)
+  (GDK_3270_Quit)
+  (GDK_3270_PA1)
+  (GDK_3270_PA2)
+  (GDK_3270_PA3)
+  (GDK_3270_Test)
+  (GDK_3270_Attn)
+  (GDK_3270_CursorBlink)
+  (GDK_3270_AltCursor)
+  (GDK_3270_KeyClick)
+  (GDK_3270_Jump)
+  (GDK_3270_Ident)
+  (GDK_3270_Rule)
+  (GDK_3270_Copy)
+  (GDK_3270_Play)
+  (GDK_3270_Setup)
+  (GDK_3270_Record)
+  (GDK_3270_ChangeScreen)
+  (GDK_3270_DeleteWord)
+  (GDK_3270_ExSelect)
+  (GDK_3270_CursorSelect)
+  (GDK_3270_PrintScreen)
+  (GDK_3270_Enter)
+  (GDK_space)
+  (GDK_exclam)
+  (GDK_quotedbl)
+  (GDK_numbersign)
+  (GDK_dollar)
+  (GDK_percent)
+  (GDK_ampersand)
+  (GDK_apostrophe)
+  (GDK_quoteright)
+  (GDK_parenleft)
+  (GDK_parenright)
+  (GDK_asterisk)
+  (GDK_plus)
+  (GDK_comma)
+  (GDK_minus)
+  (GDK_period)
+  (GDK_slash)
+  (GDK_0)
+  (GDK_1)
+  (GDK_2)
+  (GDK_3)
+  (GDK_4)
+  (GDK_5)
+  (GDK_6)
+  (GDK_7)
+  (GDK_8)
+  (GDK_9)
+  (GDK_colon)
+  (GDK_semicolon)
+  (GDK_less)
+  (GDK_equal)
+  (GDK_greater)
+  (GDK_question)
+  (GDK_at)
+  (GDK_A)
+  (GDK_B)
+  (GDK_C)
+  (GDK_D)
+  (GDK_E)
+  (GDK_F)
+  (GDK_G)
+  (GDK_H)
+  (GDK_I)
+  (GDK_J)
+  (GDK_K)
+  (GDK_L)
+  (GDK_M)
+  (GDK_N)
+  (GDK_O)
+  (GDK_P)
+  (GDK_Q)
+  (GDK_R)
+  (GDK_S)
+  (GDK_T)
+  (GDK_U)
+  (GDK_V)
+  (GDK_W)
+  (GDK_X)
+  (GDK_Y)
+  (GDK_Z)
+  (GDK_bracketleft)
+  (GDK_backslash)
+  (GDK_bracketright)
+  (GDK_asciicircum)
+  (GDK_underscore)
+  (GDK_grave)
+  (GDK_quoteleft)
+  (GDK_a)
+  (GDK_b)
+  (GDK_c)
+  (GDK_d)
+  (GDK_e)
+  (GDK_f)
+  (GDK_g)
+  (GDK_h)
+  (GDK_i)
+  (GDK_j)
+  (GDK_k)
+  (GDK_l)
+  (GDK_m)
+  (GDK_n)
+  (GDK_o)
+  (GDK_p)
+  (GDK_q)
+  (GDK_r)
+  (GDK_s)
+  (GDK_t)
+  (GDK_u)
+  (GDK_v)
+  (GDK_w)
+  (GDK_x)
+  (GDK_y)
+  (GDK_z)
+  (GDK_braceleft)
+  (GDK_bar)
+  (GDK_braceright)
+  (GDK_asciitilde)
+  (GDK_nobreakspace)
+  (GDK_exclamdown)
+  (GDK_cent)
+  (GDK_sterling)
+  (GDK_currency)
+  (GDK_yen)
+  (GDK_brokenbar)
+  (GDK_section)
+  (GDK_diaeresis)
+  (GDK_copyright)
+  (GDK_ordfeminine)
+  (GDK_guillemotleft)
+  (GDK_notsign)
+  (GDK_hyphen)
+  (GDK_registered)
+  (GDK_macron)
+  (GDK_degree)
+  (GDK_plusminus)
+  (GDK_twosuperior)
+  (GDK_threesuperior)
+  (GDK_acute)
+  (GDK_mu)
+  (GDK_paragraph)
+  (GDK_periodcentered)
+  (GDK_cedilla)
+  (GDK_onesuperior)
+  (GDK_masculine)
+  (GDK_guillemotright)
+  (GDK_onequarter)
+  (GDK_onehalf)
+  (GDK_threequarters)
+  (GDK_questiondown)
+  (GDK_Agrave)
+  (GDK_Aacute)
+  (GDK_Acircumflex)
+  (GDK_Atilde)
+  (GDK_Adiaeresis)
+  (GDK_Aring)
+  (GDK_AE)
+  (GDK_Ccedilla)
+  (GDK_Egrave)
+  (GDK_Eacute)
+  (GDK_Ecircumflex)
+  (GDK_Ediaeresis)
+  (GDK_Igrave)
+  (GDK_Iacute)
+  (GDK_Icircumflex)
+  (GDK_Idiaeresis)
+  (GDK_ETH)
+  (GDK_Eth)
+  (GDK_Ntilde)
+  (GDK_Ograve)
+  (GDK_Oacute)
+  (GDK_Ocircumflex)
+  (GDK_Otilde)
+  (GDK_Odiaeresis)
+  (GDK_multiply)
+  (GDK_Oslash)
+  (GDK_Ooblique)
+  (GDK_Ugrave)
+  (GDK_Uacute)
+  (GDK_Ucircumflex)
+  (GDK_Udiaeresis)
+  (GDK_Yacute)
+  (GDK_THORN)
+  (GDK_Thorn)
+  (GDK_ssharp)
+  (GDK_agrave)
+  (GDK_aacute)
+  (GDK_acircumflex)
+  (GDK_atilde)
+  (GDK_adiaeresis)
+  (GDK_aring)
+  (GDK_ae)
+  (GDK_ccedilla)
+  (GDK_egrave)
+  (GDK_eacute)
+  (GDK_ecircumflex)
+  (GDK_ediaeresis)
+  (GDK_igrave)
+  (GDK_iacute)
+  (GDK_icircumflex)
+  (GDK_idiaeresis)
+  (GDK_eth)
+  (GDK_ntilde)
+  (GDK_ograve)
+  (GDK_oacute)
+  (GDK_ocircumflex)
+  (GDK_otilde)
+  (GDK_odiaeresis)
+  (GDK_division)
+  (GDK_oslash)
+  (GDK_ooblique)
+  (GDK_ugrave)
+  (GDK_uacute)
+  (GDK_ucircumflex)
+  (GDK_udiaeresis)
+  (GDK_yacute)
+  (GDK_thorn)
+  (GDK_ydiaeresis)
+  (GDK_Aogonek)
+  (GDK_breve)
+  (GDK_Lstroke)
+  (GDK_Lcaron)
+  (GDK_Sacute)
+  (GDK_Scaron)
+  (GDK_Scedilla)
+  (GDK_Tcaron)
+  (GDK_Zacute)
+  (GDK_Zcaron)
+  (GDK_Zabovedot)
+  (GDK_aogonek)
+  (GDK_ogonek)
+  (GDK_lstroke)
+  (GDK_lcaron)
+  (GDK_sacute)
+  (GDK_caron)
+  (GDK_scaron)
+  (GDK_scedilla)
+  (GDK_tcaron)
+  (GDK_zacute)
+  (GDK_doubleacute)
+  (GDK_zcaron)
+  (GDK_zabovedot)
+  (GDK_Racute)
+  (GDK_Abreve)
+  (GDK_Lacute)
+  (GDK_Cacute)
+  (GDK_Ccaron)
+  (GDK_Eogonek)
+  (GDK_Ecaron)
+  (GDK_Dcaron)
+  (GDK_Dstroke)
+  (GDK_Nacute)
+  (GDK_Ncaron)
+  (GDK_Odoubleacute)
+  (GDK_Rcaron)
+  (GDK_Uring)
+  (GDK_Udoubleacute)
+  (GDK_Tcedilla)
+  (GDK_racute)
+  (GDK_abreve)
+  (GDK_lacute)
+  (GDK_cacute)
+  (GDK_ccaron)
+  (GDK_eogonek)
+  (GDK_ecaron)
+  (GDK_dcaron)
+  (GDK_dstroke)
+  (GDK_nacute)
+  (GDK_ncaron)
+  (GDK_odoubleacute)
+  (GDK_udoubleacute)
+  (GDK_rcaron)
+  (GDK_uring)
+  (GDK_tcedilla)
+  (GDK_abovedot)
+  (GDK_Hstroke)
+  (GDK_Hcircumflex)
+  (GDK_Iabovedot)
+  (GDK_Gbreve)
+  (GDK_Jcircumflex)
+  (GDK_hstroke)
+  (GDK_hcircumflex)
+  (GDK_idotless)
+  (GDK_gbreve)
+  (GDK_jcircumflex)
+  (GDK_Cabovedot)
+  (GDK_Ccircumflex)
+  (GDK_Gabovedot)
+  (GDK_Gcircumflex)
+  (GDK_Ubreve)
+  (GDK_Scircumflex)
+  (GDK_cabovedot)
+  (GDK_ccircumflex)
+  (GDK_gabovedot)
+  (GDK_gcircumflex)
+  (GDK_ubreve)
+  (GDK_scircumflex)
+  (GDK_kra)
+  (GDK_kappa)
+  (GDK_Rcedilla)
+  (GDK_Itilde)
+  (GDK_Lcedilla)
+  (GDK_Emacron)
+  (GDK_Gcedilla)
+  (GDK_Tslash)
+  (GDK_rcedilla)
+  (GDK_itilde)
+  (GDK_lcedilla)
+  (GDK_emacron)
+  (GDK_gcedilla)
+  (GDK_tslash)
+  (GDK_ENG)
+  (GDK_eng)
+  (GDK_Amacron)
+  (GDK_Iogonek)
+  (GDK_Eabovedot)
+  (GDK_Imacron)
+  (GDK_Ncedilla)
+  (GDK_Omacron)
+  (GDK_Kcedilla)
+  (GDK_Uogonek)
+  (GDK_Utilde)
+  (GDK_Umacron)
+  (GDK_amacron)
+  (GDK_iogonek)
+  (GDK_eabovedot)
+  (GDK_imacron)
+  (GDK_ncedilla)
+  (GDK_omacron)
+  (GDK_kcedilla)
+  (GDK_uogonek)
+  (GDK_utilde)
+  (GDK_umacron)
+  (GDK_Babovedot)
+  (GDK_babovedot)
+  (GDK_Dabovedot)
+  (GDK_Wgrave)
+  (GDK_Wacute)
+  (GDK_dabovedot)
+  (GDK_Ygrave)
+  (GDK_Fabovedot)
+  (GDK_fabovedot)
+  (GDK_Mabovedot)
+  (GDK_mabovedot)
+  (GDK_Pabovedot)
+  (GDK_wgrave)
+  (GDK_pabovedot)
+  (GDK_wacute)
+  (GDK_Sabovedot)
+  (GDK_ygrave)
+  (GDK_Wdiaeresis)
+  (GDK_wdiaeresis)
+  (GDK_sabovedot)
+  (GDK_Wcircumflex)
+  (GDK_Tabovedot)
+  (GDK_Ycircumflex)
+  (GDK_wcircumflex)
+  (GDK_tabovedot)
+  (GDK_ycircumflex)
+  (GDK_OE)
+  (GDK_oe)
+  (GDK_Ydiaeresis)
+  (GDK_overline)
+  (GDK_kana_fullstop)
+  (GDK_kana_openingbracket)
+  (GDK_kana_closingbracket)
+  (GDK_kana_comma)
+  (GDK_kana_conjunctive)
+  (GDK_kana_middledot)
+  (GDK_kana_WO)
+  (GDK_kana_a)
+  (GDK_kana_i)
+  (GDK_kana_u)
+  (GDK_kana_e)
+  (GDK_kana_o)
+  (GDK_kana_ya)
+  (GDK_kana_yu)
+  (GDK_kana_yo)
+  (GDK_kana_tsu)
+  (GDK_kana_tu)
+  (GDK_prolongedsound)
+  (GDK_kana_A)
+  (GDK_kana_I)
+  (GDK_kana_U)
+  (GDK_kana_E)
+  (GDK_kana_O)
+  (GDK_kana_KA)
+  (GDK_kana_KI)
+  (GDK_kana_KU)
+  (GDK_kana_KE)
+  (GDK_kana_KO)
+  (GDK_kana_SA)
+  (GDK_kana_SHI)
+  (GDK_kana_SU)
+  (GDK_kana_SE)
+  (GDK_kana_SO)
+  (GDK_kana_TA)
+  (GDK_kana_CHI)
+  (GDK_kana_TI)
+  (GDK_kana_TSU)
+  (GDK_kana_TU)
+  (GDK_kana_TE)
+  (GDK_kana_TO)
+  (GDK_kana_NA)
+  (GDK_kana_NI)
+  (GDK_kana_NU)
+  (GDK_kana_NE)
+  (GDK_kana_NO)
+  (GDK_kana_HA)
+  (GDK_kana_HI)
+  (GDK_kana_FU)
+  (GDK_kana_HU)
+  (GDK_kana_HE)
+  (GDK_kana_HO)
+  (GDK_kana_MA)
+  (GDK_kana_MI)
+  (GDK_kana_MU)
+  (GDK_kana_ME)
+  (GDK_kana_MO)
+  (GDK_kana_YA)
+  (GDK_kana_YU)
+  (GDK_kana_YO)
+  (GDK_kana_RA)
+  (GDK_kana_RI)
+  (GDK_kana_RU)
+  (GDK_kana_RE)
+  (GDK_kana_RO)
+  (GDK_kana_WA)
+  (GDK_kana_N)
+  (GDK_voicedsound)
+  (GDK_semivoicedsound)
+  (GDK_kana_switch)
+  (GDK_Farsi_0)
+  (GDK_Farsi_1)
+  (GDK_Farsi_2)
+  (GDK_Farsi_3)
+  (GDK_Farsi_4)
+  (GDK_Farsi_5)
+  (GDK_Farsi_6)
+  (GDK_Farsi_7)
+  (GDK_Farsi_8)
+  (GDK_Farsi_9)
+  (GDK_Arabic_percent)
+  (GDK_Arabic_superscript_alef)
+  (GDK_Arabic_tteh)
+  (GDK_Arabic_peh)
+  (GDK_Arabic_tcheh)
+  (GDK_Arabic_ddal)
+  (GDK_Arabic_rreh)
+  (GDK_Arabic_comma)
+  (GDK_Arabic_fullstop)
+  (GDK_Arabic_0)
+  (GDK_Arabic_1)
+  (GDK_Arabic_2)
+  (GDK_Arabic_3)
+  (GDK_Arabic_4)
+  (GDK_Arabic_5)
+  (GDK_Arabic_6)
+  (GDK_Arabic_7)
+  (GDK_Arabic_8)
+  (GDK_Arabic_9)
+  (GDK_Arabic_semicolon)
+  (GDK_Arabic_question_mark)
+  (GDK_Arabic_hamza)
+  (GDK_Arabic_maddaonalef)
+  (GDK_Arabic_hamzaonalef)
+  (GDK_Arabic_hamzaonwaw)
+  (GDK_Arabic_hamzaunderalef)
+  (GDK_Arabic_hamzaonyeh)
+  (GDK_Arabic_alef)
+  (GDK_Arabic_beh)
+  (GDK_Arabic_tehmarbuta)
+  (GDK_Arabic_teh)
+  (GDK_Arabic_theh)
+  (GDK_Arabic_jeem)
+  (GDK_Arabic_hah)
+  (GDK_Arabic_khah)
+  (GDK_Arabic_dal)
+  (GDK_Arabic_thal)
+  (GDK_Arabic_ra)
+  (GDK_Arabic_zain)
+  (GDK_Arabic_seen)
+  (GDK_Arabic_sheen)
+  (GDK_Arabic_sad)
+  (GDK_Arabic_dad)
+  (GDK_Arabic_tah)
+  (GDK_Arabic_zah)
+  (GDK_Arabic_ain)
+  (GDK_Arabic_ghain)
+  (GDK_Arabic_tatweel)
+  (GDK_Arabic_feh)
+  (GDK_Arabic_qaf)
+  (GDK_Arabic_kaf)
+  (GDK_Arabic_lam)
+  (GDK_Arabic_meem)
+  (GDK_Arabic_noon)
+  (GDK_Arabic_ha)
+  (GDK_Arabic_heh)
+  (GDK_Arabic_waw)
+  (GDK_Arabic_alefmaksura)
+  (GDK_Arabic_yeh)
+  (GDK_Arabic_fathatan)
+  (GDK_Arabic_dammatan)
+  (GDK_Arabic_kasratan)
+  (GDK_Arabic_fatha)
+  (GDK_Arabic_damma)
+  (GDK_Arabic_kasra)
+  (GDK_Arabic_shadda)
+  (GDK_Arabic_sukun)
+  (GDK_Arabic_madda_above)
+  (GDK_Arabic_hamza_above)
+  (GDK_Arabic_hamza_below)
+  (GDK_Arabic_jeh)
+  (GDK_Arabic_veh)
+  (GDK_Arabic_keheh)
+  (GDK_Arabic_gaf)
+  (GDK_Arabic_noon_ghunna)
+  (GDK_Arabic_heh_doachashmee)
+  (GDK_Farsi_yeh)
+  (GDK_Arabic_farsi_yeh)
+  (GDK_Arabic_yeh_baree)
+  (GDK_Arabic_heh_goal)
+  (GDK_Arabic_switch)
+  (GDK_Cyrillic_GHE_bar)
+  (GDK_Cyrillic_ghe_bar)
+  (GDK_Cyrillic_ZHE_descender)
+  (GDK_Cyrillic_zhe_descender)
+  (GDK_Cyrillic_KA_descender)
+  (GDK_Cyrillic_ka_descender)
+  (GDK_Cyrillic_KA_vertstroke)
+  (GDK_Cyrillic_ka_vertstroke)
+  (GDK_Cyrillic_EN_descender)
+  (GDK_Cyrillic_en_descender)
+  (GDK_Cyrillic_U_straight)
+  (GDK_Cyrillic_u_straight)
+  (GDK_Cyrillic_U_straight_bar)
+  (GDK_Cyrillic_u_straight_bar)
+  (GDK_Cyrillic_HA_descender)
+  (GDK_Cyrillic_ha_descender)
+  (GDK_Cyrillic_CHE_descender)
+  (GDK_Cyrillic_che_descender)
+  (GDK_Cyrillic_CHE_vertstroke)
+  (GDK_Cyrillic_che_vertstroke)
+  (GDK_Cyrillic_SHHA)
+  (GDK_Cyrillic_shha)
+  (GDK_Cyrillic_SCHWA)
+  (GDK_Cyrillic_schwa)
+  (GDK_Cyrillic_I_macron)
+  (GDK_Cyrillic_i_macron)
+  (GDK_Cyrillic_O_bar)
+  (GDK_Cyrillic_o_bar)
+  (GDK_Cyrillic_U_macron)
+  (GDK_Cyrillic_u_macron)
+  (GDK_Serbian_dje)
+  (GDK_Macedonia_gje)
+  (GDK_Cyrillic_io)
+  (GDK_Ukrainian_ie)
+  (GDK_Ukranian_je)
+  (GDK_Macedonia_dse)
+  (GDK_Ukrainian_i)
+  (GDK_Ukranian_i)
+  (GDK_Ukrainian_yi)
+  (GDK_Ukranian_yi)
+  (GDK_Cyrillic_je)
+  (GDK_Serbian_je)
+  (GDK_Cyrillic_lje)
+  (GDK_Serbian_lje)
+  (GDK_Cyrillic_nje)
+  (GDK_Serbian_nje)
+  (GDK_Serbian_tshe)
+  (GDK_Macedonia_kje)
+  (GDK_Ukrainian_ghe_with_upturn)
+  (GDK_Byelorussian_shortu)
+  (GDK_Cyrillic_dzhe)
+  (GDK_Serbian_dze)
+  (GDK_numerosign)
+  (GDK_Serbian_DJE)
+  (GDK_Macedonia_GJE)
+  (GDK_Cyrillic_IO)
+  (GDK_Ukrainian_IE)
+  (GDK_Ukranian_JE)
+  (GDK_Macedonia_DSE)
+  (GDK_Ukrainian_I)
+  (GDK_Ukranian_I)
+  (GDK_Ukrainian_YI)
+  (GDK_Ukranian_YI)
+  (GDK_Cyrillic_JE)
+  (GDK_Serbian_JE)
+  (GDK_Cyrillic_LJE)
+  (GDK_Serbian_LJE)
+  (GDK_Cyrillic_NJE)
+  (GDK_Serbian_NJE)
+  (GDK_Serbian_TSHE)
+  (GDK_Macedonia_KJE)
+  (GDK_Ukrainian_GHE_WITH_UPTURN)
+  (GDK_Byelorussian_SHORTU)
+  (GDK_Cyrillic_DZHE)
+  (GDK_Serbian_DZE)
+  (GDK_Cyrillic_yu)
+  (GDK_Cyrillic_a)
+  (GDK_Cyrillic_be)
+  (GDK_Cyrillic_tse)
+  (GDK_Cyrillic_de)
+  (GDK_Cyrillic_ie)
+  (GDK_Cyrillic_ef)
+  (GDK_Cyrillic_ghe)
+  (GDK_Cyrillic_ha)
+  (GDK_Cyrillic_i)
+  (GDK_Cyrillic_shorti)
+  (GDK_Cyrillic_ka)
+  (GDK_Cyrillic_el)
+  (GDK_Cyrillic_em)
+  (GDK_Cyrillic_en)
+  (GDK_Cyrillic_o)
+  (GDK_Cyrillic_pe)
+  (GDK_Cyrillic_ya)
+  (GDK_Cyrillic_er)
+  (GDK_Cyrillic_es)
+  (GDK_Cyrillic_te)
+  (GDK_Cyrillic_u)
+  (GDK_Cyrillic_zhe)
+  (GDK_Cyrillic_ve)
+  (GDK_Cyrillic_softsign)
+  (GDK_Cyrillic_yeru)
+  (GDK_Cyrillic_ze)
+  (GDK_Cyrillic_sha)
+  (GDK_Cyrillic_e)
+  (GDK_Cyrillic_shcha)
+  (GDK_Cyrillic_che)
+  (GDK_Cyrillic_hardsign)
+  (GDK_Cyrillic_YU)
+  (GDK_Cyrillic_A)
+  (GDK_Cyrillic_BE)
+  (GDK_Cyrillic_TSE)
+  (GDK_Cyrillic_DE)
+  (GDK_Cyrillic_IE)
+  (GDK_Cyrillic_EF)
+  (GDK_Cyrillic_GHE)
+  (GDK_Cyrillic_HA)
+  (GDK_Cyrillic_I)
+  (GDK_Cyrillic_SHORTI)
+  (GDK_Cyrillic_KA)
+  (GDK_Cyrillic_EL)
+  (GDK_Cyrillic_EM)
+  (GDK_Cyrillic_EN)
+  (GDK_Cyrillic_O)
+  (GDK_Cyrillic_PE)
+  (GDK_Cyrillic_YA)
+  (GDK_Cyrillic_ER)
+  (GDK_Cyrillic_ES)
+  (GDK_Cyrillic_TE)
+  (GDK_Cyrillic_U)
+  (GDK_Cyrillic_ZHE)
+  (GDK_Cyrillic_VE)
+  (GDK_Cyrillic_SOFTSIGN)
+  (GDK_Cyrillic_YERU)
+  (GDK_Cyrillic_ZE)
+  (GDK_Cyrillic_SHA)
+  (GDK_Cyrillic_E)
+  (GDK_Cyrillic_SHCHA)
+  (GDK_Cyrillic_CHE)
+  (GDK_Cyrillic_HARDSIGN)
+  (GDK_Greek_ALPHAaccent)
+  (GDK_Greek_EPSILONaccent)
+  (GDK_Greek_ETAaccent)
+  (GDK_Greek_IOTAaccent)
+  (GDK_Greek_IOTAdieresis)
+  (GDK_Greek_IOTAdiaeresis)
+  (GDK_Greek_OMICRONaccent)
+  (GDK_Greek_UPSILONaccent)
+  (GDK_Greek_UPSILONdieresis)
+  (GDK_Greek_OMEGAaccent)
+  (GDK_Greek_accentdieresis)
+  (GDK_Greek_horizbar)
+  (GDK_Greek_alphaaccent)
+  (GDK_Greek_epsilonaccent)
+  (GDK_Greek_etaaccent)
+  (GDK_Greek_iotaaccent)
+  (GDK_Greek_iotadieresis)
+  (GDK_Greek_iotaaccentdieresis)
+  (GDK_Greek_omicronaccent)
+  (GDK_Greek_upsilonaccent)
+  (GDK_Greek_upsilondieresis)
+  (GDK_Greek_upsilonaccentdieresis)
+  (GDK_Greek_omegaaccent)
+  (GDK_Greek_ALPHA)
+  (GDK_Greek_BETA)
+  (GDK_Greek_GAMMA)
+  (GDK_Greek_DELTA)
+  (GDK_Greek_EPSILON)
+  (GDK_Greek_ZETA)
+  (GDK_Greek_ETA)
+  (GDK_Greek_THETA)
+  (GDK_Greek_IOTA)
+  (GDK_Greek_KAPPA)
+  (GDK_Greek_LAMDA)
+  (GDK_Greek_LAMBDA)
+  (GDK_Greek_MU)
+  (GDK_Greek_NU)
+  (GDK_Greek_XI)
+  (GDK_Greek_OMICRON)
+  (GDK_Greek_PI)
+  (GDK_Greek_RHO)
+  (GDK_Greek_SIGMA)
+  (GDK_Greek_TAU)
+  (GDK_Greek_UPSILON)
+  (GDK_Greek_PHI)
+  (GDK_Greek_CHI)
+  (GDK_Greek_PSI)
+  (GDK_Greek_OMEGA)
+  (GDK_Greek_alpha)
+  (GDK_Greek_beta)
+  (GDK_Greek_gamma)
+  (GDK_Greek_delta)
+  (GDK_Greek_epsilon)
+  (GDK_Greek_zeta)
+  (GDK_Greek_eta)
+  (GDK_Greek_theta)
+  (GDK_Greek_iota)
+  (GDK_Greek_kappa)
+  (GDK_Greek_lamda)
+  (GDK_Greek_lambda)
+  (GDK_Greek_mu)
+  (GDK_Greek_nu)
+  (GDK_Greek_xi)
+  (GDK_Greek_omicron)
+  (GDK_Greek_pi)
+  (GDK_Greek_rho)
+  (GDK_Greek_sigma)
+  (GDK_Greek_finalsmallsigma)
+  (GDK_Greek_tau)
+  (GDK_Greek_upsilon)
+  (GDK_Greek_phi)
+  (GDK_Greek_chi)
+  (GDK_Greek_psi)
+  (GDK_Greek_omega)
+  (GDK_Greek_switch)
+  (GDK_leftradical)
+  (GDK_topleftradical)
+  (GDK_horizconnector)
+  (GDK_topintegral)
+  (GDK_botintegral)
+  (GDK_vertconnector)
+  (GDK_topleftsqbracket)
+  (GDK_botleftsqbracket)
+  (GDK_toprightsqbracket)
+  (GDK_botrightsqbracket)
+  (GDK_topleftparens)
+  (GDK_botleftparens)
+  (GDK_toprightparens)
+  (GDK_botrightparens)
+  (GDK_leftmiddlecurlybrace)
+  (GDK_rightmiddlecurlybrace)
+  (GDK_topleftsummation)
+  (GDK_botleftsummation)
+  (GDK_topvertsummationconnector)
+  (GDK_botvertsummationconnector)
+  (GDK_toprightsummation)
+  (GDK_botrightsummation)
+  (GDK_rightmiddlesummation)
+  (GDK_lessthanequal)
+  (GDK_notequal)
+  (GDK_greaterthanequal)
+  (GDK_integral)
+  (GDK_therefore)
+  (GDK_variation)
+  (GDK_infinity)
+  (GDK_nabla)
+  (GDK_approximate)
+  (GDK_similarequal)
+  (GDK_ifonlyif)
+  (GDK_implies)
+  (GDK_identical)
+  (GDK_radical)
+  (GDK_includedin)
+  (GDK_includes)
+  (GDK_intersection)
+  (GDK_union)
+  (GDK_logicaland)
+  (GDK_logicalor)
+  (GDK_partialderivative)
+  (GDK_function)
+  (GDK_leftarrow)
+  (GDK_uparrow)
+  (GDK_rightarrow)
+  (GDK_downarrow)
+  (GDK_blank)
+  (GDK_soliddiamond)
+  (GDK_checkerboard)
+  (GDK_ht)
+  (GDK_ff)
+  (GDK_cr)
+  (GDK_lf)
+  (GDK_nl)
+  (GDK_vt)
+  (GDK_lowrightcorner)
+  (GDK_uprightcorner)
+  (GDK_upleftcorner)
+  (GDK_lowleftcorner)
+  (GDK_crossinglines)
+  (GDK_horizlinescan1)
+  (GDK_horizlinescan3)
+  (GDK_horizlinescan5)
+  (GDK_horizlinescan7)
+  (GDK_horizlinescan9)
+  (GDK_leftt)
+  (GDK_rightt)
+  (GDK_bott)
+  (GDK_topt)
+  (GDK_vertbar)
+  (GDK_emspace)
+  (GDK_enspace)
+  (GDK_em3space)
+  (GDK_em4space)
+  (GDK_digitspace)
+  (GDK_punctspace)
+  (GDK_thinspace)
+  (GDK_hairspace)
+  (GDK_emdash)
+  (GDK_endash)
+  (GDK_signifblank)
+  (GDK_ellipsis)
+  (GDK_doubbaselinedot)
+  (GDK_onethird)
+  (GDK_twothirds)
+  (GDK_onefifth)
+  (GDK_twofifths)
+  (GDK_threefifths)
+  (GDK_fourfifths)
+  (GDK_onesixth)
+  (GDK_fivesixths)
+  (GDK_careof)
+  (GDK_figdash)
+  (GDK_leftanglebracket)
+  (GDK_decimalpoint)
+  (GDK_rightanglebracket)
+  (GDK_marker)
+  (GDK_oneeighth)
+  (GDK_threeeighths)
+  (GDK_fiveeighths)
+  (GDK_seveneighths)
+  (GDK_trademark)
+  (GDK_signaturemark)
+  (GDK_trademarkincircle)
+  (GDK_leftopentriangle)
+  (GDK_rightopentriangle)
+  (GDK_emopencircle)
+  (GDK_emopenrectangle)
+  (GDK_leftsinglequotemark)
+  (GDK_rightsinglequotemark)
+  (GDK_leftdoublequotemark)
+  (GDK_rightdoublequotemark)
+  (GDK_prescription)
+  (GDK_minutes)
+  (GDK_seconds)
+  (GDK_latincross)
+  (GDK_hexagram)
+  (GDK_filledrectbullet)
+  (GDK_filledlefttribullet)
+  (GDK_filledrighttribullet)
+  (GDK_emfilledcircle)
+  (GDK_emfilledrect)
+  (GDK_enopencircbullet)
+  (GDK_enopensquarebullet)
+  (GDK_openrectbullet)
+  (GDK_opentribulletup)
+  (GDK_opentribulletdown)
+  (GDK_openstar)
+  (GDK_enfilledcircbullet)
+  (GDK_enfilledsqbullet)
+  (GDK_filledtribulletup)
+  (GDK_filledtribulletdown)
+  (GDK_leftpointer)
+  (GDK_rightpointer)
+  (GDK_club)
+  (GDK_diamond)
+  (GDK_heart)
+  (GDK_maltesecross)
+  (GDK_dagger)
+  (GDK_doubledagger)
+  (GDK_checkmark)
+  (GDK_ballotcross)
+  (GDK_musicalsharp)
+  (GDK_musicalflat)
+  (GDK_malesymbol)
+  (GDK_femalesymbol)
+  (GDK_telephone)
+  (GDK_telephonerecorder)
+  (GDK_phonographcopyright)
+  (GDK_caret)
+  (GDK_singlelowquotemark)
+  (GDK_doublelowquotemark)
+  (GDK_cursor)
+  (GDK_leftcaret)
+  (GDK_rightcaret)
+  (GDK_downcaret)
+  (GDK_upcaret)
+  (GDK_overbar)
+  (GDK_downtack)
+  (GDK_upshoe)
+  (GDK_downstile)
+  (GDK_underbar)
+  (GDK_jot)
+  (GDK_quad)
+  (GDK_uptack)
+  (GDK_circle)
+  (GDK_upstile)
+  (GDK_downshoe)
+  (GDK_rightshoe)
+  (GDK_leftshoe)
+  (GDK_lefttack)
+  (GDK_righttack)
+  (GDK_hebrew_doublelowline)
+  (GDK_hebrew_aleph)
+  (GDK_hebrew_bet)
+  (GDK_hebrew_beth)
+  (GDK_hebrew_gimel)
+  (GDK_hebrew_gimmel)
+  (GDK_hebrew_dalet)
+  (GDK_hebrew_daleth)
+  (GDK_hebrew_he)
+  (GDK_hebrew_waw)
+  (GDK_hebrew_zain)
+  (GDK_hebrew_zayin)
+  (GDK_hebrew_chet)
+  (GDK_hebrew_het)
+  (GDK_hebrew_tet)
+  (GDK_hebrew_teth)
+  (GDK_hebrew_yod)
+  (GDK_hebrew_finalkaph)
+  (GDK_hebrew_kaph)
+  (GDK_hebrew_lamed)
+  (GDK_hebrew_finalmem)
+  (GDK_hebrew_mem)
+  (GDK_hebrew_finalnun)
+  (GDK_hebrew_nun)
+  (GDK_hebrew_samech)
+  (GDK_hebrew_samekh)
+  (GDK_hebrew_ayin)
+  (GDK_hebrew_finalpe)
+  (GDK_hebrew_pe)
+  (GDK_hebrew_finalzade)
+  (GDK_hebrew_finalzadi)
+  (GDK_hebrew_zade)
+  (GDK_hebrew_zadi)
+  (GDK_hebrew_qoph)
+  (GDK_hebrew_kuf)
+  (GDK_hebrew_resh)
+  (GDK_hebrew_shin)
+  (GDK_hebrew_taw)
+  (GDK_hebrew_taf)
+  (GDK_Hebrew_switch)
+  (GDK_Thai_kokai)
+  (GDK_Thai_khokhai)
+  (GDK_Thai_khokhuat)
+  (GDK_Thai_khokhwai)
+  (GDK_Thai_khokhon)
+  (GDK_Thai_khorakhang)
+  (GDK_Thai_ngongu)
+  (GDK_Thai_chochan)
+  (GDK_Thai_choching)
+  (GDK_Thai_chochang)
+  (GDK_Thai_soso)
+  (GDK_Thai_chochoe)
+  (GDK_Thai_yoying)
+  (GDK_Thai_dochada)
+  (GDK_Thai_topatak)
+  (GDK_Thai_thothan)
+  (GDK_Thai_thonangmontho)
+  (GDK_Thai_thophuthao)
+  (GDK_Thai_nonen)
+  (GDK_Thai_dodek)
+  (GDK_Thai_totao)
+  (GDK_Thai_thothung)
+  (GDK_Thai_thothahan)
+  (GDK_Thai_thothong)
+  (GDK_Thai_nonu)
+  (GDK_Thai_bobaimai)
+  (GDK_Thai_popla)
+  (GDK_Thai_phophung)
+  (GDK_Thai_fofa)
+  (GDK_Thai_phophan)
+  (GDK_Thai_fofan)
+  (GDK_Thai_phosamphao)
+  (GDK_Thai_moma)
+  (GDK_Thai_yoyak)
+  (GDK_Thai_rorua)
+  (GDK_Thai_ru)
+  (GDK_Thai_loling)
+  (GDK_Thai_lu)
+  (GDK_Thai_wowaen)
+  (GDK_Thai_sosala)
+  (GDK_Thai_sorusi)
+  (GDK_Thai_sosua)
+  (GDK_Thai_hohip)
+  (GDK_Thai_lochula)
+  (GDK_Thai_oang)
+  (GDK_Thai_honokhuk)
+  (GDK_Thai_paiyannoi)
+  (GDK_Thai_saraa)
+  (GDK_Thai_maihanakat)
+  (GDK_Thai_saraaa)
+  (GDK_Thai_saraam)
+  (GDK_Thai_sarai)
+  (GDK_Thai_saraii)
+  (GDK_Thai_saraue)
+  (GDK_Thai_sarauee)
+  (GDK_Thai_sarau)
+  (GDK_Thai_sarauu)
+  (GDK_Thai_phinthu)
+  (GDK_Thai_maihanakat_maitho)
+  (GDK_Thai_baht)
+  (GDK_Thai_sarae)
+  (GDK_Thai_saraae)
+  (GDK_Thai_sarao)
+  (GDK_Thai_saraaimaimuan)
+  (GDK_Thai_saraaimaimalai)
+  (GDK_Thai_lakkhangyao)
+  (GDK_Thai_maiyamok)
+  (GDK_Thai_maitaikhu)
+  (GDK_Thai_maiek)
+  (GDK_Thai_maitho)
+  (GDK_Thai_maitri)
+  (GDK_Thai_maichattawa)
+  (GDK_Thai_thanthakhat)
+  (GDK_Thai_nikhahit)
+  (GDK_Thai_leksun)
+  (GDK_Thai_leknung)
+  (GDK_Thai_leksong)
+  (GDK_Thai_leksam)
+  (GDK_Thai_leksi)
+  (GDK_Thai_lekha)
+  (GDK_Thai_lekhok)
+  (GDK_Thai_lekchet)
+  (GDK_Thai_lekpaet)
+  (GDK_Thai_lekkao)
+  (GDK_Hangul)
+  (GDK_Hangul_Start)
+  (GDK_Hangul_End)
+  (GDK_Hangul_Hanja)
+  (GDK_Hangul_Jamo)
+  (GDK_Hangul_Romaja)
+  (GDK_Hangul_Codeinput)
+  (GDK_Hangul_Jeonja)
+  (GDK_Hangul_Banja)
+  (GDK_Hangul_PreHanja)
+  (GDK_Hangul_PostHanja)
+  (GDK_Hangul_SingleCandidate)
+  (GDK_Hangul_MultipleCandidate)
+  (GDK_Hangul_PreviousCandidate)
+  (GDK_Hangul_Special)
+  (GDK_Hangul_switch)
+  (GDK_Hangul_Kiyeog)
+  (GDK_Hangul_SsangKiyeog)
+  (GDK_Hangul_KiyeogSios)
+  (GDK_Hangul_Nieun)
+  (GDK_Hangul_NieunJieuj)
+  (GDK_Hangul_NieunHieuh)
+  (GDK_Hangul_Dikeud)
+  (GDK_Hangul_SsangDikeud)
+  (GDK_Hangul_Rieul)
+  (GDK_Hangul_RieulKiyeog)
+  (GDK_Hangul_RieulMieum)
+  (GDK_Hangul_RieulPieub)
+  (GDK_Hangul_RieulSios)
+  (GDK_Hangul_RieulTieut)
+  (GDK_Hangul_RieulPhieuf)
+  (GDK_Hangul_RieulHieuh)
+  (GDK_Hangul_Mieum)
+  (GDK_Hangul_Pieub)
+  (GDK_Hangul_SsangPieub)
+  (GDK_Hangul_PieubSios)
+  (GDK_Hangul_Sios)
+  (GDK_Hangul_SsangSios)
+  (GDK_Hangul_Ieung)
+  (GDK_Hangul_Jieuj)
+  (GDK_Hangul_SsangJieuj)
+  (GDK_Hangul_Cieuc)
+  (GDK_Hangul_Khieuq)
+  (GDK_Hangul_Tieut)
+  (GDK_Hangul_Phieuf)
+  (GDK_Hangul_Hieuh)
+  (GDK_Hangul_A)
+  (GDK_Hangul_AE)
+  (GDK_Hangul_YA)
+  (GDK_Hangul_YAE)
+  (GDK_Hangul_EO)
+  (GDK_Hangul_E)
+  (GDK_Hangul_YEO)
+  (GDK_Hangul_YE)
+  (GDK_Hangul_O)
+  (GDK_Hangul_WA)
+  (GDK_Hangul_WAE)
+  (GDK_Hangul_OE)
+  (GDK_Hangul_YO)
+  (GDK_Hangul_U)
+  (GDK_Hangul_WEO)
+  (GDK_Hangul_WE)
+  (GDK_Hangul_WI)
+  (GDK_Hangul_YU)
+  (GDK_Hangul_EU)
+  (GDK_Hangul_YI)
+  (GDK_Hangul_I)
+  (GDK_Hangul_J_Kiyeog)
+  (GDK_Hangul_J_SsangKiyeog)
+  (GDK_Hangul_J_KiyeogSios)
+  (GDK_Hangul_J_Nieun)
+  (GDK_Hangul_J_NieunJieuj)
+  (GDK_Hangul_J_NieunHieuh)
+  (GDK_Hangul_J_Dikeud)
+  (GDK_Hangul_J_Rieul)
+  (GDK_Hangul_J_RieulKiyeog)
+  (GDK_Hangul_J_RieulMieum)
+  (GDK_Hangul_J_RieulPieub)
+  (GDK_Hangul_J_RieulSios)
+  (GDK_Hangul_J_RieulTieut)
+  (GDK_Hangul_J_RieulPhieuf)
+  (GDK_Hangul_J_RieulHieuh)
+  (GDK_Hangul_J_Mieum)
+  (GDK_Hangul_J_Pieub)
+  (GDK_Hangul_J_PieubSios)
+  (GDK_Hangul_J_Sios)
+  (GDK_Hangul_J_SsangSios)
+  (GDK_Hangul_J_Ieung)
+  (GDK_Hangul_J_Jieuj)
+  (GDK_Hangul_J_Cieuc)
+  (GDK_Hangul_J_Khieuq)
+  (GDK_Hangul_J_Tieut)
+  (GDK_Hangul_J_Phieuf)
+  (GDK_Hangul_J_Hieuh)
+  (GDK_Hangul_RieulYeorinHieuh)
+  (GDK_Hangul_SunkyeongeumMieum)
+  (GDK_Hangul_SunkyeongeumPieub)
+  (GDK_Hangul_PanSios)
+  (GDK_Hangul_KkogjiDalrinIeung)
+  (GDK_Hangul_SunkyeongeumPhieuf)
+  (GDK_Hangul_YeorinHieuh)
+  (GDK_Hangul_AraeA)
+  (GDK_Hangul_AraeAE)
+  (GDK_Hangul_J_PanSios)
+  (GDK_Hangul_J_KkogjiDalrinIeung)
+  (GDK_Hangul_J_YeorinHieuh)
+  (GDK_Korean_Won)
+  (GDK_Armenian_ligature_ew)
+  (GDK_Armenian_full_stop)
+  (GDK_Armenian_verjaket)
+  (GDK_Armenian_separation_mark)
+  (GDK_Armenian_but)
+  (GDK_Armenian_hyphen)
+  (GDK_Armenian_yentamna)
+  (GDK_Armenian_exclam)
+  (GDK_Armenian_amanak)
+  (GDK_Armenian_accent)
+  (GDK_Armenian_shesht)
+  (GDK_Armenian_question)
+  (GDK_Armenian_paruyk)
+  (GDK_Armenian_AYB)
+  (GDK_Armenian_ayb)
+  (GDK_Armenian_BEN)
+  (GDK_Armenian_ben)
+  (GDK_Armenian_GIM)
+  (GDK_Armenian_gim)
+  (GDK_Armenian_DA)
+  (GDK_Armenian_da)
+  (GDK_Armenian_YECH)
+  (GDK_Armenian_yech)
+  (GDK_Armenian_ZA)
+  (GDK_Armenian_za)
+  (GDK_Armenian_E)
+  (GDK_Armenian_e)
+  (GDK_Armenian_AT)
+  (GDK_Armenian_at)
+  (GDK_Armenian_TO)
+  (GDK_Armenian_to)
+  (GDK_Armenian_ZHE)
+  (GDK_Armenian_zhe)
+  (GDK_Armenian_INI)
+  (GDK_Armenian_ini)
+  (GDK_Armenian_LYUN)
+  (GDK_Armenian_lyun)
+  (GDK_Armenian_KHE)
+  (GDK_Armenian_khe)
+  (GDK_Armenian_TSA)
+  (GDK_Armenian_tsa)
+  (GDK_Armenian_KEN)
+  (GDK_Armenian_ken)
+  (GDK_Armenian_HO)
+  (GDK_Armenian_ho)
+  (GDK_Armenian_DZA)
+  (GDK_Armenian_dza)
+  (GDK_Armenian_GHAT)
+  (GDK_Armenian_ghat)
+  (GDK_Armenian_TCHE)
+  (GDK_Armenian_tche)
+  (GDK_Armenian_MEN)
+  (GDK_Armenian_men)
+  (GDK_Armenian_HI)
+  (GDK_Armenian_hi)
+  (GDK_Armenian_NU)
+  (GDK_Armenian_nu)
+  (GDK_Armenian_SHA)
+  (GDK_Armenian_sha)
+  (GDK_Armenian_VO)
+  (GDK_Armenian_vo)
+  (GDK_Armenian_CHA)
+  (GDK_Armenian_cha)
+  (GDK_Armenian_PE)
+  (GDK_Armenian_pe)
+  (GDK_Armenian_JE)
+  (GDK_Armenian_je)
+  (GDK_Armenian_RA)
+  (GDK_Armenian_ra)
+  (GDK_Armenian_SE)
+  (GDK_Armenian_se)
+  (GDK_Armenian_VEV)
+  (GDK_Armenian_vev)
+  (GDK_Armenian_TYUN)
+  (GDK_Armenian_tyun)
+  (GDK_Armenian_RE)
+  (GDK_Armenian_re)
+  (GDK_Armenian_TSO)
+  (GDK_Armenian_tso)
+  (GDK_Armenian_VYUN)
+  (GDK_Armenian_vyun)
+  (GDK_Armenian_PYUR)
+  (GDK_Armenian_pyur)
+  (GDK_Armenian_KE)
+  (GDK_Armenian_ke)
+  (GDK_Armenian_O)
+  (GDK_Armenian_o)
+  (GDK_Armenian_FE)
+  (GDK_Armenian_fe)
+  (GDK_Armenian_apostrophe)
+  (GDK_Georgian_an)
+  (GDK_Georgian_ban)
+  (GDK_Georgian_gan)
+  (GDK_Georgian_don)
+  (GDK_Georgian_en)
+  (GDK_Georgian_vin)
+  (GDK_Georgian_zen)
+  (GDK_Georgian_tan)
+  (GDK_Georgian_in)
+  (GDK_Georgian_kan)
+  (GDK_Georgian_las)
+  (GDK_Georgian_man)
+  (GDK_Georgian_nar)
+  (GDK_Georgian_on)
+  (GDK_Georgian_par)
+  (GDK_Georgian_zhar)
+  (GDK_Georgian_rae)
+  (GDK_Georgian_san)
+  (GDK_Georgian_tar)
+  (GDK_Georgian_un)
+  (GDK_Georgian_phar)
+  (GDK_Georgian_khar)
+  (GDK_Georgian_ghan)
+  (GDK_Georgian_qar)
+  (GDK_Georgian_shin)
+  (GDK_Georgian_chin)
+  (GDK_Georgian_can)
+  (GDK_Georgian_jil)
+  (GDK_Georgian_cil)
+  (GDK_Georgian_char)
+  (GDK_Georgian_xan)
+  (GDK_Georgian_jhan)
+  (GDK_Georgian_hae)
+  (GDK_Georgian_he)
+  (GDK_Georgian_hie)
+  (GDK_Georgian_we)
+  (GDK_Georgian_har)
+  (GDK_Georgian_hoe)
+  (GDK_Georgian_fi)
+  (GDK_Xabovedot)
+  (GDK_Ibreve)
+  (GDK_Zstroke)
+  (GDK_Gcaron)
+  (GDK_Ocaron)
+  (GDK_Obarred)
+  (GDK_xabovedot)
+  (GDK_ibreve)
+  (GDK_zstroke)
+  (GDK_gcaron)
+  (GDK_ocaron)
+  (GDK_obarred)
+  (GDK_SCHWA)
+  (GDK_schwa)
+  (GDK_Lbelowdot)
+  (GDK_lbelowdot)
+  (GDK_Abelowdot)
+  (GDK_abelowdot)
+  (GDK_Ahook)
+  (GDK_ahook)
+  (GDK_Acircumflexacute)
+  (GDK_acircumflexacute)
+  (GDK_Acircumflexgrave)
+  (GDK_acircumflexgrave)
+  (GDK_Acircumflexhook)
+  (GDK_acircumflexhook)
+  (GDK_Acircumflextilde)
+  (GDK_acircumflextilde)
+  (GDK_Acircumflexbelowdot)
+  (GDK_acircumflexbelowdot)
+  (GDK_Abreveacute)
+  (GDK_abreveacute)
+  (GDK_Abrevegrave)
+  (GDK_abrevegrave)
+  (GDK_Abrevehook)
+  (GDK_abrevehook)
+  (GDK_Abrevetilde)
+  (GDK_abrevetilde)
+  (GDK_Abrevebelowdot)
+  (GDK_abrevebelowdot)
+  (GDK_Ebelowdot)
+  (GDK_ebelowdot)
+  (GDK_Ehook)
+  (GDK_ehook)
+  (GDK_Etilde)
+  (GDK_etilde)
+  (GDK_Ecircumflexacute)
+  (GDK_ecircumflexacute)
+  (GDK_Ecircumflexgrave)
+  (GDK_ecircumflexgrave)
+  (GDK_Ecircumflexhook)
+  (GDK_ecircumflexhook)
+  (GDK_Ecircumflextilde)
+  (GDK_ecircumflextilde)
+  (GDK_Ecircumflexbelowdot)
+  (GDK_ecircumflexbelowdot)
+  (GDK_Ihook)
+  (GDK_ihook)
+  (GDK_Ibelowdot)
+  (GDK_ibelowdot)
+  (GDK_Obelowdot)
+  (GDK_obelowdot)
+  (GDK_Ohook)
+  (GDK_ohook)
+  (GDK_Ocircumflexacute)
+  (GDK_ocircumflexacute)
+  (GDK_Ocircumflexgrave)
+  (GDK_ocircumflexgrave)
+  (GDK_Ocircumflexhook)
+  (GDK_ocircumflexhook)
+  (GDK_Ocircumflextilde)
+  (GDK_ocircumflextilde)
+  (GDK_Ocircumflexbelowdot)
+  (GDK_ocircumflexbelowdot)
+  (GDK_Ohornacute)
+  (GDK_ohornacute)
+  (GDK_Ohorngrave)
+  (GDK_ohorngrave)
+  (GDK_Ohornhook)
+  (GDK_ohornhook)
+  (GDK_Ohorntilde)
+  (GDK_ohorntilde)
+  (GDK_Ohornbelowdot)
+  (GDK_ohornbelowdot)
+  (GDK_Ubelowdot)
+  (GDK_ubelowdot)
+  (GDK_Uhook)
+  (GDK_uhook)
+  (GDK_Uhornacute)
+  (GDK_uhornacute)
+  (GDK_Uhorngrave)
+  (GDK_uhorngrave)
+  (GDK_Uhornhook)
+  (GDK_uhornhook)
+  (GDK_Uhorntilde)
+  (GDK_uhorntilde)
+  (GDK_Uhornbelowdot)
+  (GDK_uhornbelowdot)
+  (GDK_Ybelowdot)
+  (GDK_ybelowdot)
+  (GDK_Yhook)
+  (GDK_yhook)
+  (GDK_Ytilde)
+  (GDK_ytilde)
+  (GDK_Ohorn)
+  (GDK_ohorn)
+  (GDK_Uhorn)
+  (GDK_uhorn)
+  (GDK_EcuSign)
+  (GDK_ColonSign)
+  (GDK_CruzeiroSign)
+  (GDK_FFrancSign)
+  (GDK_LiraSign)
+  (GDK_MillSign)
+  (GDK_NairaSign)
+  (GDK_PesetaSign)
+  (GDK_RupeeSign)
+  (GDK_WonSign)
+  (GDK_NewSheqelSign)
+  (GDK_DongSign)
+  (GDK_EuroSign)
+  (GDK_zerosuperior)
+  (GDK_foursuperior)
+  (GDK_fivesuperior)
+  (GDK_sixsuperior)
+  (GDK_sevensuperior)
+  (GDK_eightsuperior)
+  (GDK_ninesuperior)
+  (GDK_zerosubscript)
+  (GDK_onesubscript)
+  (GDK_twosubscript)
+  (GDK_threesubscript)
+  (GDK_foursubscript)
+  (GDK_fivesubscript)
+  (GDK_sixsubscript)
+  (GDK_sevensubscript)
+  (GDK_eightsubscript)
+  (GDK_ninesubscript)
+  (GDK_partdifferential)
+  (GDK_emptyset)
+  (GDK_elementof)
+  (GDK_notelementof)
+  (GDK_containsas)
+  (GDK_squareroot)
+  (GDK_cuberoot)
+  (GDK_fourthroot)
+  (GDK_dintegral)
+  (GDK_tintegral)
+  (GDK_because)
+  (GDK_approxeq)
+  (GDK_notapproxeq)
+  (GDK_notidentical)
+  (GDK_stricteq))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkrgb.cdecl b/src/gtk/Includes/gdkrgb.cdecl
new file mode 100644 (file)
index 0000000..70cf951
--- /dev/null
@@ -0,0 +1,9 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkrgb.h |#
+
+(typedef GdkRgbDither
+        (enum
+         (GDK_RGB_DITHER_NONE)
+         (GDK_RGB_DITHER_NORMAL)
+         (GDK_RGB_DITHER_MAX)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdktypes.cdecl b/src/gtk/Includes/gdktypes.cdecl
new file mode 100644 (file)
index 0000000..43bf3db
--- /dev/null
@@ -0,0 +1,100 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdktypes.h |#
+
+(include "glib")
+(include "pango")
+;(include "glib-object")
+
+;(include "gdkconfig")
+
+(enum (GDK_CURRENT_TIME))
+(enum (GDK_PARENT_RELATIVE))
+
+(typedef GdkPoint (struct _GdkPoint))
+(typedef GdkRectangle (struct _GdkRectangle))
+(typedef GdkSegment (struct _GdkSegment))
+(typedef GdkSpan (struct _GdkSpan))
+(typedef GdkWChar guint32)
+
+(typedef GdkAtom (* (struct _GdkAtom)))
+
+(typedef GdkNativeWindow gpointer)
+
+(typedef GdkColor (struct _GdkColor))
+(typedef GdkColormap (struct _GdkColormap))
+(typedef GdkCursor (struct _GdkCursor))
+;(typedef GdkFont (struct _GdkFont))
+;(typedef GdkGC (struct _GdkGC))
+;(typedef GdkImage (struct _GdkImage))
+;(typedef GdkRegion (struct _GdkRegion))
+;(typedef GdkVisual (struct _GdkVisual))
+
+(typedef GdkDrawable (struct _GdkDrawable))
+(typedef GdkBitmap (struct _GdkDrawable))
+(typedef GdkPixmap (struct _GdkDrawable))
+(typedef GdkWindow (struct _GdkDrawable))
+;(typedef GdkDisplay (struct _GdkDisplay))
+;(typedef GdkScreen (struct _GdkScreen))
+
+(typedef GdkModifierType
+        (enum
+         (GDK_SHIFT_MASK)
+         (GDK_LOCK_MASK)
+         (GDK_CONTROL_MASK)
+         (GDK_MOD1_MASK)
+         (GDK_MOD2_MASK)
+         (GDK_MOD3_MASK)
+         (GDK_MOD4_MASK)
+         (GDK_MOD5_MASK)
+         (GDK_BUTTON1_MASK)
+         (GDK_BUTTON2_MASK)
+         (GDK_BUTTON3_MASK)
+         (GDK_BUTTON4_MASK)
+         (GDK_BUTTON5_MASK)
+         (GDK_RELEASE_MASK)
+         ;;GDK_MODIFIER_MASK = GDK_RELEASE_MASK | 0x1fff
+         ))
+
+(typedef GdkInputCondition
+        (enum
+         (GDK_INPUT_READ)
+         (GDK_INPUT_WRITE)
+         (GDK_INPUT_EXCEPTION)))
+
+(typedef GdkStatus
+        (enum
+         (GDK_OK)
+         (GDK_ERROR)
+         (GDK_ERROR_PARAM)
+         (GDK_ERROR_FILE)
+         (GDK_ERROR_MEM)))
+
+(typedef GdkGrabStatus
+        (enum
+         (GDK_GRAB_SUCCESS)
+         (GDK_GRAB_ALREADY_GRABBED)
+         (GDK_GRAB_INVALID_TIME)
+         (GDK_GRAB_NOT_VIEWABLE)
+         (GDK_GRAB_FROZEN)))
+
+(struct _GdkPoint
+       (x gint)
+       (y gint))
+
+(struct _GdkRectangle
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint))
+
+(struct _GdkSegment
+       (x1 gint)
+       (y1 gint)
+       (x2 gint)
+       (y2 gint))
+
+(struct _GdkSpan
+       (x gint)
+       (y gint)
+       (width gint))
\ No newline at end of file
diff --git a/src/gtk/Includes/gdkwindow.cdecl b/src/gtk/Includes/gdkwindow.cdecl
new file mode 100644 (file)
index 0000000..2b32921
--- /dev/null
@@ -0,0 +1,222 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gdk/gdkwindow.h |#
+
+;(include "gdkdrawable")
+;(include "gdktypes")
+;(include "gdkevents")
+
+(typedef GdkGeometry (struct _GdkGeometry))
+(typedef GdkWindowAttr (struct _GdkWindowAttr))
+(typedef GdkPointerHooks (struct _GdkPointerHooks))
+
+(typedef GdkWindowClass
+        (enum
+         (GDK_INPUT_OUTPUT) (GDK_INPUT_ONLY)))
+
+(typedef GdkWindowType
+        (enum
+         (GDK_WINDOW_ROOT)
+         (GDK_WINDOW_TOPLEVEL)
+         (GDK_WINDOW_CHILD)
+         (GDK_WINDOW_DIALOG)
+         (GDK_WINDOW_TEMP)
+         (GDK_WINDOW_FOREIGN)))
+
+(typedef GdkWindowAttributesType
+        (enum
+         (GDK_WA_TITLE)
+         (GDK_WA_X)
+         (GDK_WA_Y)
+         (GDK_WA_CURSOR)
+         (GDK_WA_COLORMAP)
+         (GDK_WA_VISUAL)
+         (GDK_WA_WMCLASS)
+         (GDK_WA_NOREDIR)))
+
+(typedef GdkWindowHints
+        (enum
+         (GDK_HINT_POS)
+         (GDK_HINT_MIN_SIZE)
+         (GDK_HINT_MAX_SIZE)
+         (GDK_HINT_BASE_SIZE)
+         (GDK_HINT_ASPECT)
+         (GDK_HINT_RESIZE_INC)
+         (GDK_HINT_WIN_GRAVITY)
+         (GDK_HINT_USER_POS)
+         (GDK_HINT_USER_SIZE)))
+
+(typedef GdkWindowTypeHint
+        (enum
+         (GDK_WINDOW_TYPE_HINT_NORMAL)
+         (GDK_WINDOW_TYPE_HINT_DIALOG)
+         (GDK_WINDOW_TYPE_HINT_MENU)
+         (GDK_WINDOW_TYPE_HINT_TOOLBAR)
+         (GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
+         (GDK_WINDOW_TYPE_HINT_UTILITY)
+         (GDK_WINDOW_TYPE_HINT_DOCK)
+         (GDK_WINDOW_TYPE_HINT_DESKTOP)))
+
+(typedef GdkWMDecoration
+        (enum
+         (GDK_DECOR_ALL)
+         (GDK_DECOR_BORDER)
+         (GDK_DECOR_RESIZEH)
+         (GDK_DECOR_TITLE)
+         (GDK_DECOR_MENU)
+         (GDK_DECOR_MINIMIZE)
+         (GDK_DECOR_MAXIMIZE)))
+
+(typedef GdkWMFunction
+        (enum
+         (GDK_FUNC_ALL)
+         (GDK_FUNC_RESIZE)
+         (GDK_FUNC_MOVE)
+         (GDK_FUNC_MINIMIZE)
+         (GDK_FUNC_MAXIMIZE)
+         (GDK_FUNC_CLOSE)))
+
+(typedef GdkGravity
+        (enum
+         (GDK_GRAVITY_NORTH_WEST)
+         (GDK_GRAVITY_NORTH)
+         (GDK_GRAVITY_NORTH_EAST)
+         (GDK_GRAVITY_WEST)
+         (GDK_GRAVITY_CENTER)
+         (GDK_GRAVITY_EAST)
+         (GDK_GRAVITY_SOUTH_WEST)
+         (GDK_GRAVITY_SOUTH)
+         (GDK_GRAVITY_SOUTH_EAST)
+         (GDK_GRAVITY_STATIC)))
+
+(typedef GdkWindowEdge
+        (enum
+         (GDK_WINDOW_EDGE_NORTH_WEST)
+         (GDK_WINDOW_EDGE_NORTH)
+         (GDK_WINDOW_EDGE_NORTH_EAST)
+         (GDK_WINDOW_EDGE_WEST)
+         (GDK_WINDOW_EDGE_EAST)
+         (GDK_WINDOW_EDGE_SOUTH_WEST)
+         (GDK_WINDOW_EDGE_SOUTH)
+         (GDK_WINDOW_EDGE_SOUTH_EAST)))
+
+(struct _GdkWindowAttr
+       (title (* gchar))
+       (event_mask gint)
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint)
+       (wclass GdkWindowClass)
+       (visual (* GdkVisual))
+       (colormap (* GdkColormap))
+       (window_type GdkWindowType)
+       (cursor (* GdkCursor))
+       (wmclass_name (* gchar))
+       (wmclass_class (* gchar))
+       (override_redirect gboolean)
+       (type_hint GdkWindowTypeHint))
+
+(struct _GdkGeometry
+       (min_width gint)
+       (min_height gint)
+       (max_width gint)
+       (max_height gint)
+       (base_width gint)
+       (base_height gint)
+       (width_inc gint)
+       (height_inc gint)
+       (min_aspect gdouble)
+       (max_aspect gdouble)
+       (win_gravity GdkGravity))
+
+(struct _GdkPointerHooks 
+       (get_pointer (* (function (* GdkWindow)
+                                 (window (* GdkWindow))
+                                 (x (* gint))
+                                 (y (* gint))
+                                 (mask (* GdkModifierType)))))
+       (window_at_pointer (* (function (* GdkWindow)
+                                       (screen (* GdkScreen))
+                                       (win_x (* gint))
+                                       (win_y (* gint))))))
+
+(typedef GdkWindowObject (struct _GdkWindowObject))
+
+(typedef GdkWindowObjectClass (struct _GdkWindowObjectClass))
+
+(struct _GdkWindowObject
+       (parent_instance GdkDrawable)
+       (impl (* GdkDrawable))
+       (parent (* GdkWindowObject))
+       (user_data gpointer)
+       (x gint)
+       (y gint)
+       (extension_events gint)
+       (filters (* GList))
+       (children (* GList))
+       (bg_color GdkColor)
+       (bg_pixmap (* GdkPixmap))
+       (paint_stack (* GSList))
+       (update_area (* GdkRegion))
+       (update_freeze_count guint)
+       (window_type guint8)
+       (depth guint8)
+       (resize_count guint8)
+       (state GdkWindowState)
+       ;;(_skip guchar)
+       (event_mask GdkEventMask)
+       (update_and_descendants_freeze_count guint))
+
+(struct _GdkWindowObjectClass
+       (parent_class GdkDrawableClass))
+
+(extern (* GdkWindow) gdk_window_new
+       (parent (* GdkWindow))
+       (attributes (* GdkWindowAttr))
+       (attributes_mask gint))
+
+(extern void gdk_window_destroy
+       (window (* GdkWindow)))
+
+(extern void gdk_window_show
+       (window (* GdkWindow)))
+
+(extern void gdk_window_set_user_data
+       (window (* GdkWindow))
+       (user_data gpointer))
+
+(extern void gdk_window_move_resize
+       (window (* GdkWindow))
+       (x gint) (y gint) (width gint) (height gint))
+
+(extern void gdk_window_set_background
+       (window (* GdkWindow))
+       (color (const (* GdkColor))))
+
+(extern (* GdkWindow) gdk_window_get_pointer
+       (window (* GdkWindow))
+       (x (* gint))
+       (y (* gint))
+       (mask (* GdkModifierType)))
+
+(extern void gdk_window_clear_area
+       (window (* GdkWindow))
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint))
+
+(extern void gdk_window_scroll
+       (window (* GdkWindow))
+       (dx gint)
+       (dy gint))
+
+;(extern void gdk_window_invalidate_rect
+;      (window (* GdkWindow))
+;      (rect (* GdkRectangle))
+;      (invalidate_children gboolean))
+
+(extern void gdk_window_process_updates
+       (window (* GdkWindow))
+       (update_children gboolean))
\ No newline at end of file
diff --git a/src/gtk/Includes/genums.cdecl b/src/gtk/Includes/genums.cdecl
new file mode 100644 (file)
index 0000000..da7eb7b
--- /dev/null
@@ -0,0 +1,42 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/genums.h |#
+
+;(include "gtype")
+
+(typedef GEnumClass (struct _GEnumClass))
+(typedef GFlagsClass (struct _GFlagsClass))
+(typedef GEnumValue (struct _GEnumValue))
+(typedef GFlagsValue (struct _GFlagsValue))
+(struct        _GEnumClass
+       (g_type_class GTypeClass)
+       ;;< public >
+       (minimum gint)
+       (maximum gint)
+       (n_values guint)
+       (values (* GEnumValue)))
+(struct        _GFlagsClass
+       (g_type_class GTypeClass)
+       ;;< public >
+       (mask guint)
+       (n_values guint)
+       (values (* GFlagsValue)))
+(struct _GEnumValue
+       (value gint)
+       (value_name (* gchar))
+       (value_nick (* gchar)))
+(struct _GFlagsValue
+       (value guint)
+       (value_name (* gchar))
+       (value_nick (* gchar)))
+
+(extern void g_value_set_enum
+       (value (* GValue))
+       (v_enum gint))
+(extern gint g_value_get_enum
+       (value (const (* GValue))))
+(extern void g_value_set_flags
+               (value (* GValue))
+       (v_flags guint))
+(extern guint g_value_get_flags
+               (value (const (* GValue))))
\ No newline at end of file
diff --git a/src/gtk/Includes/gerror.cdecl b/src/gtk/Includes/gerror.cdecl
new file mode 100644 (file)
index 0000000..99f8ad0
--- /dev/null
@@ -0,0 +1,43 @@
+#| -*-Scheme-*-
+
+glib-2.0/glib/gerror.h |#
+
+(include "gquark")
+
+(typedef GError (struct _GError))
+
+(struct _GError
+       (domain GQuark)
+       (code gint)
+       (message (* gchar)))
+
+;(extern (* GError) g_error_new
+;      (domain GQuark)
+;      (code gint)
+;      (format (* (const gchar)))
+;      ...)
+
+;(extern (* GError) g_error_new_literal
+;      (domain GQuark)
+;      (code gint)
+;      (message (* (const gchar))))
+
+(extern void g_error_free (error (* GError)))
+
+;(extern (* GError) g_error_copy (error (* (const GError))))
+
+;(extern gboolean g_error_matches
+;      (error (* (const GError)))
+;      (domain GQuark)
+;      (code gint))
+
+;(extern void g_set_error
+;      (err (* (* GError)))
+;      (domain GQuark)
+;      (code gint)
+;      (format (* (const gchar)))
+;      ...)
+
+;(extern void g_propagate_error (dest (* (* GError))) (src (* GError)))
+
+;(extern void g_clear_error (err (* (* GError))))
diff --git a/src/gtk/Includes/glib.cdecl b/src/gtk/Includes/glib.cdecl
new file mode 100644 (file)
index 0000000..289d3a8
--- /dev/null
@@ -0,0 +1,54 @@
+#| -*-Scheme-*-
+
+glib-2.0/glib.h |#
+
+;(include "glib/galloca")
+;(include "glib/garray")
+;(include "glib/gasyncqueue")
+;(include "glib/gatomic")
+;(include "glib/gbacktrace")
+;(include "glib/gbase64")
+;(include "glib/gbookmarkfile")
+;(include "glib/gcache")
+;(include "glib/gcompletion")
+;(include "glib/gconvert")
+;(include "glib/gdataset")
+;(include "glib/gdate")
+;(include "glib/gdir")
+(include "gerror")
+;(include "glib/gfileutils")
+;(include "glib/ghash")
+;(include "glib/ghook")
+;(include "glib/giochannel")
+;(include "glib/gkeyfile")
+;(include "glib/glist")
+;(include "glib/gmacros")
+;(include "glib/gmain")
+;(include "glib/gmappedfile")
+;(include "glib/gmarkup")
+;(include "glib/gmem")
+;(include "glib/gmessages")
+;(include "glib/gnode")
+;(include "glib/goption")
+;(include "glib/gpattern")
+;(include "glib/gprimes")
+;(include "glib/gqsort")
+(include "gquark")
+;(include "glib/gqueue")
+;(include "glib/grand")
+;(include "glib/grel")
+;(include "glib/gregex")
+;(include "glib/gscanner")
+;(include "glib/gsequence")
+;(include "glib/gshell")
+;(include "glib/gslist")
+;(include "glib/gspawn")
+;(include "glib/gstrfuncs")
+;(include "glib/gstring")
+;(include "glib/gthread")
+;(include "glib/gthreadpool")
+;(include "glib/gtimer")
+;(include "glib/gtree")
+(include "gtypes")
+;(include "glib/gunicode")
+;(include "glib/gutils")
diff --git a/src/gtk/Includes/gobject.cdecl b/src/gtk/Includes/gobject.cdecl
new file mode 100644 (file)
index 0000000..e00c9d5
--- /dev/null
@@ -0,0 +1,120 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gobject.h |#
+
+;(include "gtype")
+;(include "gvalue")
+;(include "gparam")
+;(include "gclosure")
+;(include "gsignal")
+
+(typedef GObject (struct _GObject))
+(typedef GObjectClass (struct _GObjectClass))
+(typedef GObjectConstructParam (struct _GObjectConstructParam))
+(typedef GObjectGetPropertyFunc
+        (* (function void
+                     (object (* GObject))
+                     (property_id guint)
+                     (value (* GValue))
+                     (pspec (* GParamSpec)))))
+(typedef GObjectSetPropertyFunc
+        (* (function void
+                     (object (* GObject))
+                     (property_id guint)
+                     (value (const (* GValue)))
+                     (pspec (* GParamSpec)))))
+(typedef GObjectFinalizeFunc
+        (* (function void (object (* GObject)))))
+(typedef GWeakNotify
+        (* (function void
+                     (data gpointer)
+                     (where_the_object_was (* GObject)))))
+
+(struct _GObject
+       (g_type_instance GTypeInstance)
+       ;; < private >
+       (ref_count guint)
+       (qdata (* GData)))
+
+(struct _GObjectClass
+       (g_type_class GTypeClass)
+       ;; < private >
+       (construct_properties (* GSList))
+       ;; < public >
+       ;; overridable methods
+       (constructor
+        (* (function (* GObject)
+                     (type GType)
+                     (n_construct_properties guint)
+                     (construct_properties (* GObjectConstructParam)))))
+       (set_property
+        (* (function void
+                     (object (* GObject))
+                     (property_id guint)
+                     (value (const (* GValue)))
+                     (pspec (* GParamSpec)))))
+       (get_property
+        (* (function void
+                     (object (* GObject))
+                     (property_id guint)
+                     (value (* GValue))
+                     (pspec (* GParamSpec)))))
+       (dispose
+        (* (function void
+                     (object (* GObject)))))
+       (finalize
+        (* (function void
+                     (object (* GObject)))))
+
+       ;; seldomly overidden
+       (dispatch_properties_changed
+        (* (function void
+                     (object (* GObject))
+                     (n_pspecs guint)
+                     (pspecs (* (* GParamSpec))))))
+
+       ;; signals
+       (notify
+        (* (function void
+                     (object (* GObject))
+                     (pspec (* GParamSpec)))))
+
+       ;; called when done constructing
+       (constructed
+        (* (function void (object (* GObject)))))
+       ;; < private >
+       ;; padding
+       (pdummy (array gpointer 7)))
+
+(struct _GObjectConstructParam
+       (pspec (* GParamSpec))
+       (value (* GValue)))
+
+(extern (* GObjectClass) G_OBJECT_GET_CLASS (object (* GObject)))
+
+(extern GType G_OBJECT_TYPE (instance (* GTypeInstance)))
+
+(extern gpointer g_object_ref_sink (object gpointer))
+(extern gpointer g_object_ref (object gpointer))
+
+(extern void g_object_unref (object gpointer))
+
+(extern (* GParamSpec) g_object_class_find_property
+       (oclass (* GObjectClass))
+       (property_name (const (* gchar))))
+
+(extern void g_object_set_property
+       (object (* GObject))
+       (property_name (const (* gchar)))
+       (value (const (* GValue))))
+
+(extern void g_object_get_property
+       (object (* GObject))
+       (property_name (const (* gchar)))
+       (value (* GValue)))
+
+(extern void g_value_set_object
+       (value (* GValue))
+       (v_object gpointer))
+(extern (* GObject) g_value_get_object
+       (value (const (* GValue))))
diff --git a/src/gtk/Includes/gparam.cdecl b/src/gtk/Includes/gparam.cdecl
new file mode 100644 (file)
index 0000000..776750b
--- /dev/null
@@ -0,0 +1,61 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gparam.h |#
+
+(typedef GParamFlags
+        (enum
+         (G_PARAM_READABLE)
+         (G_PARAM_WRITABLE)
+         (G_PARAM_CONSTRUCT)
+         (G_PARAM_CONSTRUCT_ONLY)
+         (G_PARAM_LAX_VALIDATION)
+         (G_PARAM_STATIC_NAME)
+         (G_PARAM_STATIC_NICK)
+         (G_PARAM_STATIC_BLURB)))
+
+(typedef GParamSpec (struct _GParamSpec))
+(typedef GParamSpecClass (struct _GParamSpecClass))
+(typedef GParameter (struct _GParameter))
+;(typedef GParamSpecPool (struct _GParamSpecPool))
+
+(struct _GParamSpec
+       (g_type_instance GTypeInstance)
+       (name (* gchar))
+       (flags GParamFlags)
+       (value_type GType)
+       (owner_type GType)
+       ;;< private >
+       (_nick (* gchar))
+       (_blurb (* gchar))
+       (qdata (* GData))
+       (ref_count guint)
+       (param_id guint))
+
+(struct _GParamSpecClass
+       (g_type_class GTypeClass)
+       (value_type GType)
+       (finalize (* (function void (pspec (* GParamSpec)))))
+       ;; GParam methods
+       (value_set_default
+        (* (function void
+                     ((* GParamSpec) pspec)
+                     (value (* GValue)))))
+       (value_validate
+        (* (function gboolean
+                     (pspec (* GParamSpec))
+                     (value (* GValue)))))
+       (values_cmp
+        (* (function gint
+                     (pspec (* GParamSpec))
+                     (value1 (const (* GValue)))
+                     (value2 (const (* GValue))))))
+       ;;< private >
+       (dummy (array gpointer 4)))
+
+(struct _GParameter        ; auxillary structure for _setv() variants
+       (name (const (* gchar)))
+       (value GValue))
+
+(extern GType                          ;glib-2.0/gobject/gparam.h
+       G_PARAM_SPEC_VALUE_TYPE
+       (pspec (* GParamSpec)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gparamspecs.cdecl b/src/gtk/Includes/gparamspecs.cdecl
new file mode 100644 (file)
index 0000000..6e70e4c
--- /dev/null
@@ -0,0 +1,141 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gparamspecs.h |#
+
+;(include "gvalue")
+;(include "genums")
+;(include "gboxed")
+;(include "gobject")
+
+(typedef GParamSpecChar (struct _GParamSpecChar))
+(typedef GParamSpecUChar (struct _GParamSpecUChar))
+(typedef GParamSpecBoolean (struct _GParamSpecBoolean))
+(typedef GParamSpecInt (struct _GParamSpecInt))
+(typedef GParamSpecUInt (struct _GParamSpecUInt))
+(typedef GParamSpecLong (struct _GParamSpecLong))
+(typedef GParamSpecULong (struct _GParamSpecULong))
+;(typedef GParamSpecInt64 (struct _GParamSpecInt64))
+;(typedef GParamSpecUInt64 (struct _GParamSpecUInt64))
+;(typedef GParamSpecUnichar (struct _GParamSpecUnichar))
+(typedef GParamSpecEnum (struct _GParamSpecEnum))
+(typedef GParamSpecFlags (struct _GParamSpecFlags))
+(typedef GParamSpecFloat (struct _GParamSpecFloat))
+(typedef GParamSpecDouble (struct _GParamSpecDouble))
+(typedef GParamSpecString (struct _GParamSpecString))
+(typedef GParamSpecParam (struct _GParamSpecParam))
+(typedef GParamSpecBoxed (struct _GParamSpecBoxed))
+(typedef GParamSpecPointer (struct _GParamSpecPointer))
+(typedef GParamSpecValueArray (struct _GParamSpecValueArray))
+(typedef GParamSpecObject (struct _GParamSpecObject))
+(typedef GParamSpecOverride (struct _GParamSpecOverride))
+
+(struct _GParamSpecChar
+       (parent_instance GParamSpec)
+       (minimum gint8)
+       (maximum gint8)
+       (default_value gint8))
+
+(struct _GParamSpecUChar
+       (parent_instance GParamSpec)
+       (minimum guint8)
+       (maximum guint8)
+       (default_value guint8))
+
+(struct _GParamSpecBoolean
+       (parent_instance GParamSpec)
+       (default_value gboolean))
+
+(struct _GParamSpecInt
+       (parent_instance GParamSpec)
+       (minimum gint)
+       (maximum gint)
+       (default_value gint))
+
+(struct _GParamSpecUInt
+       (parent_instance GParamSpec)
+       (minimum guint)
+       (maximum guint)
+       (default_value guint))
+
+(struct _GParamSpecLong
+       (parent_instance GParamSpec)
+       (minimum glong)
+       (maximum glong)
+       (default_value glong))
+
+(struct _GParamSpecULong
+       (parent_instance GParamSpec)
+       (minimum gulong)
+       (maximum gulong)
+       (default_value gulong))
+
+;(struct _GParamSpecInt64
+;      (parent_instance GParamSpec)
+;      (minimum gint64)
+;      (maximum gint64)
+;      (default_value gint64))
+;
+;(struct _GParamSpecUInt64
+;      (parent_instance GParamSpec)
+;      (minimum guint64)
+;      (maximum guint64)
+;      (default_value guint64))
+
+;(struct _GParamSpecUnichar
+;      (parent_instance GParamSpec)
+;      (default_value gunichar))
+
+(struct _GParamSpecEnum
+       (parent_instance GParamSpec)
+       (enum_class (* GEnumClass))
+       (default_value gint))
+
+(struct _GParamSpecFlags
+       (parent_instance GParamSpec)
+       (flags_class (* GFlagsClass))
+       (default_value guint))
+
+(struct _GParamSpecFloat
+       (parent_instance GParamSpec)
+       (minimum gfloat)
+       (maximum gfloat)
+       (default_value gfloat)
+       (epsilon gfloat))
+
+(struct _GParamSpecDouble
+       (parent_instance GParamSpec)
+       (minimum gdouble)
+       (maximum gdouble)
+       (default_value gdouble)
+       (epsilon gdouble))
+
+(struct _GParamSpecString
+       (parent_instance GParamSpec)
+       (default_value (* gchar))
+       (cset_first (* gchar))
+       (cset_nth (* gchar))
+       (substitutor gchar)
+       ;;(_skip guchar)
+       )
+
+(struct _GParamSpecParam
+       (parent_instance GParamSpec))
+
+(struct _GParamSpecBoxed
+       (parent_instance GParamSpec))
+
+(struct _GParamSpecPointer
+       (parent_instance GParamSpec))
+
+(struct _GParamSpecValueArray
+       (parent_instance GParamSpec)
+       (element_spec (* GParamSpec))
+       (fixed_n_elements guint))
+
+(struct _GParamSpecObject
+       (parent_instance GParamSpec))
+
+(struct _GParamSpecOverride
+       ;;< private >
+       (parent_instance GParamSpec)
+       (overridden (* GParamSpec)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gquark.cdecl b/src/gtk/Includes/gquark.cdecl
new file mode 100644 (file)
index 0000000..b74034a
--- /dev/null
@@ -0,0 +1,16 @@
+#| -*-Scheme-*-
+
+glib-2.0/glib/gquark.h |#
+
+;(include "gtypes")
+
+(typedef GQuark guint32)
+
+(extern GQuark g_quark_try_string
+       (string (const (* gchar))))
+;(extern GQuark g_quark_from_static_string
+;      (string (const (* gchar))))
+(extern GQuark g_quark_from_string
+       (string (const (* gchar))))
+(extern (const (* gchar)) g_quark_to_string
+       (quark GQuark))
\ No newline at end of file
diff --git a/src/gtk/Includes/gsignal.cdecl b/src/gtk/Includes/gsignal.cdecl
new file mode 100644 (file)
index 0000000..81903de
--- /dev/null
@@ -0,0 +1,23 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gsignal.h |#
+
+;(include "gclosure")
+;(include "gvalue")
+;(include "gparam")
+;(include "gmarshal")
+
+(extern gulong g_signal_connect_data
+       (instance gpointer)
+       (detailed_signal (const (* gchar)))
+       (CALLBACK GCallback)
+       (ID gpointer)
+       (destroy_data GClosureNotify)
+       (connect_flags GConnectFlags))
+(typedef GCallback (* mumble))
+(typedef GClosureNotify (* mumble))
+(typedef GConnectFlags ulong)
+
+(extern void g_signal_handler_disconnect
+       (instance gpointer)
+       (handler_id gulong))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtk.cdecl b/src/gtk/Includes/gtk.cdecl
new file mode 100644 (file)
index 0000000..99f02f6
--- /dev/null
@@ -0,0 +1,165 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtk.h |#
+
+(include "gdk")
+;(include "gtkaboutdialog")
+;(include "gtkaccelgroup")
+;(include "gtkaccellabel")
+;(include "gtkaccelmap")
+;(include "gtkaccessible")
+;(include "gtkaction")
+;(include "gtkactiongroup")
+(include "gtkadjustment")
+;(include "gtkalignment")
+;(include "gtkarrow")
+;(include "gtkaspectframe")
+;(include "gtkbbox")
+;(include "gtkbin")
+;(include "gtkbindings")
+(include "gtkbox")
+;(include "gtkbutton")
+;(include "gtkcalendar")
+;(include "gtkcelllayout")
+;(include "gtkcellrenderer")
+;(include "gtkcellrenderercombo")
+;(include "gtkcellrendererpixbuf")
+;(include "gtkcellrendererprogress")
+;(include "gtkcellrenderertext")
+;(include "gtkcellrenderertoggle")
+;(include "gtkcellview")
+;(include "gtkcheckbutton")
+;(include "gtkcheckmenuitem")
+;(include "gtkclipboard")
+;(include "gtkclist")
+;(include "gtkcolorbutton")
+;(include "gtkcolorsel")
+;(include "gtkcolorseldialog")
+;(include "gtkcombo")
+;(include "gtkcombobox")
+;(include "gtkcomboboxentry")
+;(include "gtkcontainer")
+;(include "gtkctree")
+;(include "gtkcurve")
+;(include "gtkdialog")
+;(include "gtkdnd")
+;(include "gtkdrawingarea")
+;(include "gtkeditable")
+;(include "gtkentry")
+;(include "gtkentrycompletion")
+(include "gtkenums")
+;(include "gtkeventbox")
+;(include "gtkexpander")
+;(include "gtkfilesel")
+;(include "gtkfixed")
+;(include "gtkfilechooserbutton")
+;(include "gtkfilechooserdialog")
+;(include "gtkfilechooserwidget")
+;(include "gtkfontbutton")
+;(include "gtkfontsel")
+;(include "gtkframe")
+;(include "gtkgamma")
+;(include "gtkgc")
+;(include "gtkhandlebox")
+;(include "gtkhbbox")
+;(include "gtkhbox")
+;(include "gtkhpaned")
+;(include "gtkhruler")
+;(include "gtkhscale")
+;(include "gtkhscrollbar")
+;(include "gtkhseparator")
+;(include "gtkiconfactory")
+;(include "gtkicontheme")
+;(include "gtkiconview")
+;(include "gtkimage")
+;(include "gtkimagemenuitem")
+;(include "gtkimcontext")
+;(include "gtkimcontextsimple")
+;(include "gtkimmulticontext")
+;(include "gtkinputdialog")
+;(include "gtkinvisible")
+;(include "gtkitem")
+;(include "gtkitemfactory")
+;(include "gtklabel")
+;(include "gtklayout")
+;(include "gtklist")
+;(include "gtklistitem")
+;(include "gtkliststore")
+;(include "gtkmain")
+;(include "gtkmenu")
+;(include "gtkmenubar")
+;(include "gtkmenuitem")
+;(include "gtkmenushell")
+;(include "gtkmenutoolbutton")
+;(include "gtkmessagedialog")
+;(include "gtkmisc")
+;(include "gtkmodules")
+;(include "gtknotebook")
+(include "gtkobject")
+;(include "gtkoldeditable")
+;(include "gtkoptionmenu")
+;(include "gtkpaned")
+;(include "gtkpixmap")
+;(include "gtkplug")
+;(include "gtkpreview")
+;(include "gtkprogress")
+;(include "gtkprogressbar")
+;(include "gtkradioaction")
+;(include "gtkradiobutton")
+;(include "gtkradiomenuitem")
+;(include "gtkradiotoolbutton")
+;(include "gtkrange")
+;(include "gtkrc")
+;(include "gtkruler")
+;(include "gtkscale")
+;(include "gtkscrollbar")
+;(include "gtkscrolledwindow")
+;(include "gtkselection")
+;(include "gtkseparator")
+;(include "gtkseparatormenuitem")
+;(include "gtkseparatortoolitem")
+;(include "gtksettings")
+;(include "gtksignal")
+;(include "gtksizegroup")
+;(include "gtksocket")
+;(include "gtkspinbutton")
+;(include "gtkstatusbar")
+;(include "gtkstock")
+(include "gtkstyle")
+;(include "gtktable")
+;(include "gtktearoffmenuitem")
+;(include "gtktext")
+;(include "gtktextbuffer")
+;(include "gtktextview")
+;(include "gtktipsquery")
+;(include "gtktoggleaction")
+;(include "gtktogglebutton")
+;(include "gtktoggletoolbutton")
+;(include "gtktoolbar")
+;(include "gtktoolbar")
+;(include "gtktoolbutton")
+;(include "gtktoolitem")
+;(include "gtktooltips")
+;(include "gtktree")
+;(include "gtktreednd")
+;(include "gtktreeitem")
+;(include "gtktreemodel")
+;(include "gtktreemodelfilter")
+;(include "gtktreemodelsort")
+;(include "gtktreeselection")
+;(include "gtktreestore")
+;(include "gtktreeview")
+;(include "gtktreeviewcolumn")
+(include "gtktypeutils")
+;(include "gtkuimanager")
+;(include "gtkvbbox")
+(include "gtkvbox")
+;(include "gtkversion")
+;(include "gtkviewport")
+;(include "gtkvpaned")
+;(include "gtkvruler")
+;(include "gtkvscale")
+;(include "gtkvscrollbar")
+;(include "gtkvseparator")
+(include "gtkwidget")
+;(include "gtkwindow")
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkadjustment.cdecl b/src/gtk/Includes/gtkadjustment.cdecl
new file mode 100644 (file)
index 0000000..c969809
--- /dev/null
@@ -0,0 +1,42 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkadjustment.h |#
+
+(typedef GtkAdjustment (struct _GtkAdjustment))
+
+(struct _GtkAdjustment
+       (parent_instance GtkObject)
+       (lower gdouble)
+       (upper gdouble)
+       (value gdouble)
+       (step_increment gdouble)
+       (page_increment gdouble)
+       (page_size gdouble))
+
+;(extern GType gtk_adjustment_get_type)
+
+(extern (* GtkObject) gtk_adjustment_new
+       (value gdouble)
+       (lower gdouble)
+       (upper gdouble)
+       (step_increment gdouble)
+       (page_increment gdouble)
+       (page_size gdouble))
+
+(extern void gtk_adjustment_changed
+       (adjustment (* GtkAdjustment)))
+
+(extern void gtk_adjustment_value_changed
+       (adjustment (* GtkAdjustment)))
+
+;(extern void gtk_adjustment_clamp_page
+;      (adjustment (* GtkAdjustment))
+;      (lower gdouble)
+;      (upper gdouble))
+
+;(extern gdouble gtk_adjustment_get_value
+;      (adjustment (* GtkAdjustment)))
+
+;(extern void gtk_adjustment_set_value
+;      (adjustment (* GtkAdjustment))
+;      (value gdouble))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkbox.cdecl b/src/gtk/Includes/gtkbox.cdecl
new file mode 100644 (file)
index 0000000..26c3f58
--- /dev/null
@@ -0,0 +1,19 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkbox.h |#
+
+(extern void
+       gtk_box_pack_start
+       (box (* GtkBox))
+       (child (* GtkWidget))
+       (expand gboolean)
+       (fill gboolean)
+       (padding guint))
+
+(extern void
+       gtk_box_pack_end
+       (box (* GtkBox))
+       (child (* GtkWidget))
+       (expand gboolean)
+       (fill gboolean)
+       (padding guint))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkenums.cdecl b/src/gtk/Includes/gtkenums.cdecl
new file mode 100644 (file)
index 0000000..1fa8a7f
--- /dev/null
@@ -0,0 +1,301 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkenums.h |#
+
+;(include "glib-object")
+
+(typedef GtkAnchorType
+        (enum
+         (GTK_ANCHOR_CENTER)
+         (GTK_ANCHOR_NORTH)
+         (GTK_ANCHOR_NORTH_WEST)
+         (GTK_ANCHOR_NORTH_EAST)
+         (GTK_ANCHOR_SOUTH)
+         (GTK_ANCHOR_SOUTH_WEST)
+         (GTK_ANCHOR_SOUTH_EAST)
+         (GTK_ANCHOR_WEST)
+         (GTK_ANCHOR_EAST)
+         (GTK_ANCHOR_N)
+         (GTK_ANCHOR_NW)
+         (GTK_ANCHOR_NE)
+         (GTK_ANCHOR_S)
+         (GTK_ANCHOR_SW)
+         (GTK_ANCHOR_SE)
+         (GTK_ANCHOR_W)
+         (GTK_ANCHOR_E)))
+
+(typedef GtkArrowType
+        (enum
+         (GTK_ARROW_UP)
+         (GTK_ARROW_DOWN)
+         (GTK_ARROW_LEFT)
+         (GTK_ARROW_RIGHT)))
+
+(typedef GtkAttachOptions
+        (enum
+         (GTK_EXPAND)
+         (GTK_SHRINK)
+         (GTK_FILL)))
+
+(typedef GtkButtonBoxStyle
+        (enum
+         (GTK_BUTTONBOX_DEFAULT_STYLE)
+         (GTK_BUTTONBOX_SPREAD)
+         (GTK_BUTTONBOX_EDGE)
+         (GTK_BUTTONBOX_START)
+         (GTK_BUTTONBOX_END)))
+
+(typedef GtkCurveType
+        (enum
+         (GTK_CURVE_TYPE_LINEAR)
+         (GTK_CURVE_TYPE_SPLINE)
+         (GTK_CURVE_TYPE_FREE)))
+
+(typedef GtkDeleteType
+        (enum
+         (GTK_DELETE_CHARS)
+         (GTK_DELETE_WORD_ENDS)
+         (GTK_DELETE_WORDS)
+         (GTK_DELETE_DISPLAY_LINES)
+         (GTK_DELETE_DISPLAY_LINE_ENDS)
+         (GTK_DELETE_PARAGRAPH_ENDS)
+         (GTK_DELETE_PARAGRAPHS)
+         (GTK_DELETE_WHITESPACE)))
+
+(typedef GtkDirectionType
+        (enum
+         (GTK_DIR_TAB_FORWARD)
+         (GTK_DIR_TAB_BACKWARD)
+         (GTK_DIR_UP)
+         (GTK_DIR_DOWN)
+         (GTK_DIR_LEFT)
+         (GTK_DIR_RIGHT)))
+
+(typedef GtkExpanderStyle
+        (enum
+         (GTK_EXPANDER_COLLAPSED)
+         (GTK_EXPANDER_SEMI_COLLAPSED)
+         (GTK_EXPANDER_SEMI_EXPANDED)
+         (GTK_EXPANDER_EXPANDED)))
+
+(typedef GtkIconSize
+        (enum
+         (GTK_ICON_SIZE_INVALID)
+         (GTK_ICON_SIZE_MENU)
+         (GTK_ICON_SIZE_SMALL_TOOLBAR)
+         (GTK_ICON_SIZE_LARGE_TOOLBAR)
+         (GTK_ICON_SIZE_BUTTON)
+         (GTK_ICON_SIZE_DND)
+         (GTK_ICON_SIZE_DIALOG)))
+
+(typedef GtkTextDirection
+        (enum
+         (GTK_TEXT_DIR_NONE)
+         (GTK_TEXT_DIR_LTR)
+         (GTK_TEXT_DIR_RTL)))
+
+(typedef GtkJustification
+        (enum
+         (GTK_JUSTIFY_LEFT)
+         (GTK_JUSTIFY_RIGHT)
+         (GTK_JUSTIFY_CENTER)
+         (GTK_JUSTIFY_FILL)))
+
+(typedef GtkMenuDirectionType
+        (enum
+         (GTK_MENU_DIR_PARENT)
+         (GTK_MENU_DIR_CHILD)
+         (GTK_MENU_DIR_NEXT)
+         (GTK_MENU_DIR_PREV)))
+
+(typedef GtkMetricType
+        (enum
+         (GTK_PIXELS)
+         (GTK_INCHES)
+         (GTK_CENTIMETERS)))
+
+(typedef GtkMovementStep
+        (enum 
+         (GTK_MOVEMENT_LOGICAL_POSITIONS)
+         (GTK_MOVEMENT_VISUAL_POSITIONS)
+         (GTK_MOVEMENT_WORDS)
+         (GTK_MOVEMENT_DISPLAY_LINES)
+         (GTK_MOVEMENT_DISPLAY_LINE_ENDS)
+         (GTK_MOVEMENT_PARAGRAPHS)
+         (GTK_MOVEMENT_PARAGRAPH_ENDS)
+         (GTK_MOVEMENT_PAGES)
+         (GTK_MOVEMENT_BUFFER_ENDS)
+         (GTK_MOVEMENT_HORIZONTAL_PAGES)))
+
+(typedef GtkScrollStep
+        (enum 
+         (GTK_SCROLL_STEPS)
+         (GTK_SCROLL_PAGES)
+         (GTK_SCROLL_ENDS)
+         (GTK_SCROLL_HORIZONTAL_STEPS)
+         (GTK_SCROLL_HORIZONTAL_PAGES)
+         (GTK_SCROLL_HORIZONTAL_ENDS)))
+
+(typedef GtkOrientation
+        (enum
+         (GTK_ORIENTATION_HORIZONTAL)
+         (GTK_ORIENTATION_VERTICAL)))
+
+(typedef GtkCornerType
+        (enum
+         (GTK_CORNER_TOP_LEFT)
+         (GTK_CORNER_BOTTOM_LEFT)
+         (GTK_CORNER_TOP_RIGHT)
+         (GTK_CORNER_BOTTOM_RIGHT)))
+
+(typedef GtkPackType
+        (enum
+         (GTK_PACK_START)
+         (GTK_PACK_END)))
+
+(typedef GtkPathPriorityType
+        (enum
+         (GTK_PATH_PRIO_LOWEST)
+         (GTK_PATH_PRIO_GTK)
+         (GTK_PATH_PRIO_APPLICATION)
+         (GTK_PATH_PRIO_THEME)
+         (GTK_PATH_PRIO_RC)
+         (GTK_PATH_PRIO_HIGHEST)
+         (GTK_PATH_PRIO_MASK)))
+
+(typedef GtkPathType
+        (enum
+         (GTK_PATH_WIDGET)
+         (GTK_PATH_WIDGET_CLASS)
+         (GTK_PATH_CLASS)))
+
+(typedef GtkPolicyType
+        (enum
+         (GTK_POLICY_ALWAYS)
+         (GTK_POLICY_AUTOMATIC)
+         (GTK_POLICY_NEVER)))
+
+(typedef GtkPositionType
+        (enum
+         (GTK_POS_LEFT)
+         (GTK_POS_RIGHT)
+         (GTK_POS_TOP)
+         (GTK_POS_BOTTOM)))
+
+(typedef GtkReliefStyle
+        (enum
+         (GTK_RELIEF_NORMAL)
+         (GTK_RELIEF_HALF)
+         (GTK_RELIEF_NONE)))
+
+(typedef GtkResizeMode
+        (enum
+         (GTK_RESIZE_PARENT)
+         (GTK_RESIZE_QUEUE)
+         (GTK_RESIZE_IMMEDIATE)))
+
+(typedef GtkScrollType
+        (enum
+         (GTK_SCROLL_NONE)
+         (GTK_SCROLL_JUMP)
+         (GTK_SCROLL_STEP_BACKWARD)
+         (GTK_SCROLL_STEP_FORWARD)
+         (GTK_SCROLL_PAGE_BACKWARD)
+         (GTK_SCROLL_PAGE_FORWARD)
+         (GTK_SCROLL_STEP_UP)
+         (GTK_SCROLL_STEP_DOWN)
+         (GTK_SCROLL_PAGE_UP)
+         (GTK_SCROLL_PAGE_DOWN)
+         (GTK_SCROLL_STEP_LEFT)
+         (GTK_SCROLL_STEP_RIGHT)
+         (GTK_SCROLL_PAGE_LEFT)
+         (GTK_SCROLL_PAGE_RIGHT)
+         (GTK_SCROLL_START)
+         (GTK_SCROLL_END)))
+
+(typedef GtkSelectionMode
+        (enum
+         (GTK_SELECTION_NONE)
+         (GTK_SELECTION_SINGLE)
+         (GTK_SELECTION_BROWSE)
+         (GTK_SELECTION_MULTIPLE)
+         (GTK_SELECTION_EXTENDED)))
+
+(typedef GtkShadowType
+        (enum
+         (GTK_SHADOW_NONE)
+         (GTK_SHADOW_IN)
+         (GTK_SHADOW_OUT)
+         (GTK_SHADOW_ETCHED_IN)
+         (GTK_SHADOW_ETCHED_OUT)))
+
+(typedef GtkStateType
+        (enum
+         (GTK_STATE_NORMAL)
+         (GTK_STATE_ACTIVE)
+         (GTK_STATE_PRELIGHT)
+         (GTK_STATE_SELECTED)
+         (GTK_STATE_INSENSITIVE)))
+
+(typedef GtkToolbarStyle
+        (enum
+         (GTK_TOOLBAR_ICONS)
+         (GTK_TOOLBAR_TEXT)
+         (GTK_TOOLBAR_BOTH)
+         (GTK_TOOLBAR_BOTH_HORIZ)))
+
+(typedef GtkUpdateType
+        (enum
+         (GTK_UPDATE_CONTINUOUS)
+         (GTK_UPDATE_DISCONTINUOUS)
+         (GTK_UPDATE_DELAYED)))
+
+(typedef GtkVisibility
+        (enum
+         (GTK_VISIBILITY_NONE)
+         (GTK_VISIBILITY_PARTIAL)
+         (GTK_VISIBILITY_FULL)))
+
+(typedef GtkWindowPosition
+        (enum
+         (GTK_WIN_POS_NONE)
+         (GTK_WIN_POS_CENTER)
+         (GTK_WIN_POS_MOUSE)
+         (GTK_WIN_POS_CENTER_ALWAYS)
+         (GTK_WIN_POS_CENTER_ON_PARENT)))
+
+(typedef GtkWindowType
+        (enum
+         (GTK_WINDOW_TOPLEVEL)
+         (GTK_WINDOW_POPUP)))
+
+(typedef GtkWrapMode
+        (enum
+         (GTK_WRAP_NONE)
+         (GTK_WRAP_CHAR)
+         (GTK_WRAP_WORD)
+         (GTK_WRAP_WORD_CHAR)))
+
+(typedef GtkSortType
+        (enum
+         (GTK_SORT_ASCENDING)
+         (GTK_SORT_DESCENDING)))
+
+(typedef GtkIMPreeditStyle
+        (enum
+         (GTK_IM_PREEDIT_NOTHING)
+         (GTK_IM_PREEDIT_CALLBACK)
+         (GTK_IM_PREEDIT_NONE)))
+
+(typedef GtkIMStatusStyle
+        (enum
+         (GTK_IM_STATUS_NOTHING)
+         (GTK_IM_STATUS_CALLBACK)
+         (GTK_IM_STATUS_NONE)))
+
+(typedef GtkPackDirection
+        (enum
+         (GTK_PACK_DIRECTION_LTR)
+         (GTK_PACK_DIRECTION_RTL)
+         (GTK_PACK_DIRECTION_TTB)
+         (GTK_PACK_DIRECTION_BTT)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkobject.cdecl b/src/gtk/Includes/gtkobject.cdecl
new file mode 100644 (file)
index 0000000..a55788d
--- /dev/null
@@ -0,0 +1,39 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkobject.h |#
+
+;(include "gtkenums")
+;(include "gtktypeutils")
+;(include "gtkdebug")
+
+(typedef GtkObjectFlags
+        (enum
+         (GTK_IN_DESTRUCTION)
+         (GTK_FLOATING)
+         (GTK_RESERVED_1)
+         (GTK_RESERVED_2)))
+
+(typedef GtkObjectClass (struct _GtkObjectClass))
+
+(struct _GtkObject
+       (parent_instance GObject)
+       (flags guint32))
+
+(struct _GtkObjectClass
+       (parent_class GObjectClass)
+
+       ;; Non overridable class methods to set and get per class arguments
+       (set_arg (* (function void
+                             (object (* GtkObject))
+                             (arg (* GtkArg))
+                             (arg_id guint))))
+       (get_arg (* (function void
+                             (object (* GtkObject))
+                             (arg (* GtkArg))
+                             (arg_id guint))))
+
+       (destroy (* (function void
+                             (object (* GtkObject))))))
+
+(extern void gtk_object_sink (object (* GtkObject)))
+(extern void gtk_object_destroy (object (* GtkObject)))
diff --git a/src/gtk/Includes/gtkstyle.cdecl b/src/gtk/Includes/gtkstyle.cdecl
new file mode 100644 (file)
index 0000000..dc852dc
--- /dev/null
@@ -0,0 +1,119 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkstyle.h |#
+
+(typedef GtkWidget (struct _GtkWidget))
+
+(typedef GtkStyle (struct _GtkStyle))
+
+(struct _GtkStyle
+       (parent_instance GObject)
+
+       (fg (array GdkColor 5))
+       (bg (array GdkColor 5))
+       (light (array GdkColor 5))
+       (dark (array GdkColor 5))
+       (mid (array GdkColor 5))
+       (text (array GdkColor 5))
+       (base (array GdkColor 5))
+       (text_aa (array GdkColor 5))
+  
+       (black GdkColor)
+       (white GdkColor)
+       (font_desc (* PangoFontDescription))
+
+       (xthickness gint)
+       (ythickness gint)
+
+       (fg_gc (array (* GdkGC) 5))
+       (bg_gc (array (* GdkGC) 5))
+       (light_gc (array (* GdkGC) 5))
+       (dark_gc (array (* GdkGC) 5))
+       (mid_gc (array (* GdkGC) 5))
+       (text_gc (array (* GdkGC) 5))
+       (base_gc (array (* GdkGC) 5))
+       (text_aa_gc (array (* GdkGC) 5))
+       (black_gc (* GdkGC))
+       (white_gc (* GdkGC))
+
+       (bg_pixmap (array (* GdkPixmap) 5))
+
+       ;; < private >
+
+       (attach_count gint)
+
+       (depth gint)
+       (colormap (* GdkColormap))
+       (private_font (* GdkFont))
+       (private_font_desc (* PangoFontDescription))
+
+       (rc_style (* GtkRcStyle))
+
+       (styles (* GSList))
+       (property_cache (* GArray))
+       (icon_factories (* GSList)))
+
+(extern (* GtkStyle) gtk_style_attach
+       (style (* GtkStyle))
+       (window (* GdkWindow)))
+
+(extern void gtk_style_set_background
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType))
+
+(extern void gtk_paint_hline
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType)
+       (area (* GdkRectangle))
+       (widget (* GtkWidget))
+       (detail (const (* gchar)))
+       (x1 gint)
+       (x2 gint)
+       (y gint))
+
+(extern void gtk_paint_vline
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType)
+       (area (* GdkRectangle))
+       (widget (* GtkWidget))
+       (detail (const (* gchar)))
+       (y1_ gint)
+       (y2_ gint)
+       (x gint))
+
+(extern void gtk_paint_box
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType)
+       (shadow_type GtkShadowType)
+       (area (* GdkRectangle))
+       (widget (* GtkWidget))
+       (detail (const (* gchar)))
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint))
+
+(extern void gtk_paint_focus
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType)
+       (area (* GdkRectangle))
+       (widget (* GtkWidget))
+       (detail (const (* gchar)))
+       (x gint) (y gint)
+       (width gint) (height gint))
+
+(extern void gtk_paint_layout
+       (style (* GtkStyle))
+       (window (* GdkWindow))
+       (state_type GtkStateType)
+       (use_text gboolean)
+       (area (* GdkRectangle))
+       (widget (* GtkWidget))
+       (detail (const (* gchar)))
+       (x gint) (y gint)
+       (layout (* PangoLayout)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtktypeutils.cdecl b/src/gtk/Includes/gtktypeutils.cdecl
new file mode 100644 (file)
index 0000000..38940c7
--- /dev/null
@@ -0,0 +1,23 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtktypeutils.h |#
+
+;(include "glib-object")
+
+(typedef GtkType GType)
+
+;(include "gtktypebuiltins")
+
+;(typedef GtkArg (struct _GtkArg))
+(typedef GtkObject (struct _GtkObject))
+(typedef GtkFunction
+        (* (function gboolean (data gpointer))))
+(typedef GtkDestroyNotify
+        (* (function void (data gpointer))))
+(typedef GtkCallbackMarshal
+        (* (function void
+                     (object (* GtkObject))
+                     (data gpointer)
+                     (n_args guint)
+                     (args (* GtkArg)))))
+(typedef GtkSignalFunc (* (function void)))
diff --git a/src/gtk/Includes/gtkvbox.cdecl b/src/gtk/Includes/gtkvbox.cdecl
new file mode 100644 (file)
index 0000000..44a3d5a
--- /dev/null
@@ -0,0 +1,8 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkvbox.h |#
+
+(extern (* GtkWidget)
+       gtk_vbox_new
+       (homogeneous gboolean)
+       (spacing gint))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkwidget.cdecl b/src/gtk/Includes/gtkwidget.cdecl
new file mode 100644 (file)
index 0000000..cf9918a
--- /dev/null
@@ -0,0 +1,356 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkwidget.h |#
+
+;(include "gdk")
+;(include "gtkaccelgroup")
+;(include "gtkobject")
+;(include "gtkadjustment")
+;(include "gtkstyle")
+;(include "gtksettings")
+;(include "atkobject")
+
+(typedef GtkWidgetFlags
+        (enum
+         (GTK_TOPLEVEL)
+         (GTK_NO_WINDOW)
+         (GTK_REALIZED)
+         (GTK_MAPPED)
+
+         (GTK_VISIBLE)
+         (GTK_SENSITIVE)
+         (GTK_PARENT_SENSITIVE)
+         (GTK_CAN_FOCUS)
+
+         (GTK_HAS_FOCUS)
+         (GTK_CAN_DEFAULT)
+         (GTK_HAS_DEFAULT)
+         (GTK_HAS_GRAB)
+
+         (GTK_RC_STYLE)
+         (GTK_COMPOSITE_CHILD)
+         (GTK_NO_REPARENT)
+         (GTK_APP_PAINTABLE)
+         (GTK_RECEIVES_DEFAULT)
+         (GTK_DOUBLE_BUFFERED)
+         (GTK_NO_SHOW_ALL)))
+
+(typedef GtkWidgetHelpType
+        (enum
+         (GTK_WIDGET_HELP_TOOLTIP)
+         (GTK_WIDGET_HELP_WHATS_THIS)))
+
+(typedef GtkRequisition (struct _GtkRequisition))
+(typedef GtkAllocation GdkRectangle)
+;(typedef GtkSelectionData (struct _GtkSelectionData))
+(typedef GtkWidgetClass (struct _GtkWidgetClass))
+(typedef GtkWidgetAuxInfo (struct _GtkWidgetAuxInfo))
+(typedef GtkWidgetShapeInfo (struct _GtkWidgetShapeInfo))
+;(typedef GtkClipboard (struct _GtkClipboard))
+(typedef GtkCallback
+        (* (function void (widget (* GtkWidget)) (data gpointer))))
+
+(struct _GtkRequisition
+       (width gint)
+       (height gint))
+
+(struct _GtkWidget
+       (object GtkObject)
+       (private_flags guint16)
+       (state guint8)
+       (saved_state guint8)
+       (name (* gchar))
+       (style (* GtkStyle))
+       (requisition GtkRequisition)
+       (allocation GtkAllocation)
+       (window (* GdkWindow))
+       (parent (* GtkWidget)))
+
+(struct _GtkWidgetClass
+       (parent_class GtkObjectClass)
+       (activate_signal guint)
+       (set_scroll_adjustments_signal guint)
+       (dispatch_child_properties_changed
+        (* (function void
+                     (widget (* GtkWidget))
+                     (n_pspecs guint)
+                     (pspecs (* (* GParamSpec))))))
+       (show (* (function void (widget (* GtkWidget)))))
+       (show_all (* (function void (widget (* GtkWidget)))))
+       (hide (* (function void (widget (* GtkWidget)))))
+       (hide_all (* (function void (widget (* GtkWidget)))))
+       (map (* (function void (widget (* GtkWidget)))))
+       (unmap (* (function void (widget (* GtkWidget)))))
+       (realize (* (function void (widget (* GtkWidget)))))
+       (unrealize (* (function void (widget (* GtkWidget)))))
+       (size_request
+        (* (function void
+                     (widget (* GtkWidget))
+                     (requisition (* GtkRequisition)))))
+       (size_allocate
+        (* (function void
+                     (widget (* GtkWidget)) (allocation (* GtkAllocation)))))
+       (state_changed
+        (* (function void
+                     (widget (* GtkWidget)) (previous_state GtkStateType))))
+       (parent_set
+        (* (function void
+                     (widget (* GtkWidget)) (previous_parent (* GtkWidget)))))
+       (hierarchy_changed
+        (* (function void
+                     (widget (* GtkWidget))
+                     (previous_toplevel (* GtkWidget)))))
+       (style_set
+        (* (function void
+                     (widget (* GtkWidget)) (previous_style (* GtkStyle)))))
+       (direction_changed
+        (* (function void
+                     (widget (* GtkWidget))
+                     (previous_direction GtkTextDirection))))
+       (grab_notify
+        (* (function void
+                     (widget (* GtkWidget)) (was_grabbed gboolean))))
+       (child_notify
+        (* (function void
+                     (widget (* GtkWidget)) (pspec (* GParamSpec)))))
+       (mnemonic_activate
+        (* (function gboolean
+                     (widget (* GtkWidget)) (group_cycling gboolean))))
+       (grab_focus (* (function void (widget (* GtkWidget)))))
+       (focus (* (function gboolean
+                           (widget (* GtkWidget))
+                           (direction GtkDirectionType))))
+       (event (* (function gboolean
+                           (widget (* GtkWidget)) (event (* GdkEvent)))))
+       (button_press_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventButton)))))
+       (button_release_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventButton)))))
+       (scroll_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventScroll)))))
+       (motion_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventMotion)))))
+       (delete_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventAny)))))
+       (destroy_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventAny)))))
+       (expose_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventExpose)))))
+       (key_press_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventKey)))))
+       (key_release_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventKey)))))
+       (enter_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventCrossing)))))
+       (leave_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventCrossing)))))
+       (configure_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventConfigure)))))
+       (focus_in_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventFocus)))))
+       (focus_out_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventFocus)))))
+       (map_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventAny)))))
+       (unmap_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventAny)))))
+       (property_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventProperty)))))
+       (selection_clear_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventSelection)))))
+       (selection_request_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventSelection)))))
+       (selection_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventSelection)))))
+       (proximity_in_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventProximity)))))
+       (proximity_out_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventProximity)))))
+       (visibility_notify_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventVisibility)))))
+       (client_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventClient)))))
+       (no_expose_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventAny)))))
+       (window_state_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventWindowState)))))
+       (selection_get
+        (* (function void
+                     (widget (* GtkWidget))
+                     (selection_data (* GtkSelectionData))
+                     (info guint)
+                     (time_ guint))))
+       (selection_received
+        (* (function void
+                     (widget (* GtkWidget))
+                     (selection_data (* GtkSelectionData))
+                     (time_ guint))))
+       (drag_begin
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext)))))
+       (drag_end
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext)))))
+       (drag_data_get
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext))
+                     (selection_data (* GtkSelectionData))
+                     (info guint)
+                     (time_ guint))))
+       (drag_data_delete
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext)))))
+       (drag_leave
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext))
+                     (time_ guint))))
+       (drag_motion
+        (* (function gboolean
+                     (widget (* GtkWidget)) (context (* GdkDragContext))
+                     (x gint) (y gint) (time_ guint))))
+       (drag_drop
+        (* (function gboolean
+                     (widget (* GtkWidget)) (context (* GdkDragContext))
+                     (x gint) (y gint) (time_ guint))))
+       (drag_data_received
+        (* (function void
+                     (widget (* GtkWidget)) (context (* GdkDragContext))
+                     (x gint) (y gint)
+                     (selection_data (* GtkSelectionData))
+                     (info guint) (time_ guint))))
+       (popup_menu
+        (* (function gboolean
+                     (widget (* GtkWidget)))))
+       (show_help
+        (* (function gboolean
+                     (widget (* GtkWidget)) (help_type GtkWidgetHelpType))))
+       (get_accessible
+        (* (function (* AtkObject)
+                     (widget (* GtkWidget)))))
+       (screen_changed
+        (* (function void
+                     (widget (* GtkWidget)) (previous_screen (* GdkScreen)))))
+       (can_activate_accel
+        (* (function gboolean
+                     (widget (* GtkWidget)) (signal_id guint))))
+       (grab_broken_event
+        (* (function gboolean
+                     (widget (* GtkWidget)) (event (* GdkEventGrabBroken)))))
+       (composited_changed
+        (* (function void (widget (* GtkWidget)))))
+       (query_tooltip
+        (* (function gboolean
+                     (widget (* GtkWidget)) (x gint) (y gint)
+                     (keyboard_tooltip gboolean)
+                     (tooltip (* GtkTooltip)))))
+       (_gtk_reserved5 (* (function void)))
+       (_gtk_reserved6 (* (function void)))
+       (_gtk_reserved7 (* (function void))))
+
+(struct _GtkWidgetAuxInfo
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint)
+       ;;(_skip guint)
+       )
+
+(struct _GtkWidgetShapeInfo
+       (offset_x gint16)
+       (offset_y gint16)
+       (shape_mask (* GdkBitmap)))
+
+(extern void gtk_widget_destroy
+       (widget (* GtkWidget)))
+
+(extern void gtk_widget_show_all
+       (widget (* GtkWidget)))
+
+(extern void gtk_widget_queue_draw_area
+       (widget (* GtkWidget))
+       (x gint)
+       (y gint)
+       (width gint)
+       (height gint))
+
+(extern (* GdkWindow) gtk_widget_get_parent_window
+       (widget (* GtkWidget)))
+
+(extern (* GdkColormap) gtk_widget_get_colormap
+       (widget (* GtkWidget)))
+(extern (* GdkVisual) gtk_widget_get_visual
+       (widget (* GtkWidget)))
+
+(extern gint gtk_widget_get_events
+       (widget (* GtkWidget)))
+
+;;; Widget styles.
+
+(extern void gtk_widget_ensure_style
+       (widget (* GtkWidget)))
+
+(extern void gtk_widget_modify_style
+       (widget (* GtkWidget))
+       (style (* GtkRcStyle)))
+
+(extern (* GtkRcStyle)
+       gtk_widget_get_modifier_style
+       (widget (* GtkWidget)))
+
+(extern void gtk_widget_modify_fg
+       (widget (* GtkWidget))
+       (state GtkStateType)
+       (color (* (const GdkColor))))
+
+(extern void gtk_widget_modify_bg
+       (widget (* GtkWidget))
+       (state GtkStateType)
+       (color (* (const GdkColor))))
+
+(extern void gtk_widget_modify_text
+       (widget (* GtkWidget))
+       (state GtkStateType)
+       (color (* (const GdkColor))))
+
+(extern void gtk_widget_modify_base
+       (widget (* GtkWidget))
+       (state GtkStateType)
+       (color (* (const GdkColor))))
+
+(extern void gtk_widget_modify_font
+       (widget (* GtkWidget))
+       (font_desc (* PangoFontDescription)))
+
+(extern (* PangoContext)
+       gtk_widget_get_pango_context (widget (* GtkWidget)))
+
+(extern (* PangoLayout)
+       gtk_widget_create_pango_layout
+       (widget (* GtkWidget))
+       (text (const (* gchar))))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtype.cdecl b/src/gtk/Includes/gtype.cdecl
new file mode 100644 (file)
index 0000000..4c953e1
--- /dev/null
@@ -0,0 +1,76 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gtype.h |#
+
+(include "glib")
+
+(enum GFundamentalType
+  (G_TYPE_INVALID)
+  (G_TYPE_NONE)
+  (G_TYPE_INTERFACE)
+  (G_TYPE_CHAR)
+  (G_TYPE_UCHAR)
+  (G_TYPE_BOOLEAN)
+  (G_TYPE_INT)
+  (G_TYPE_UINT)
+  (G_TYPE_LONG)
+  (G_TYPE_ULONG)
+  (G_TYPE_INT64)
+  (G_TYPE_UINT64)
+  (G_TYPE_ENUM)
+  (G_TYPE_FLAGS)
+  (G_TYPE_FLOAT)
+  (G_TYPE_DOUBLE)
+  (G_TYPE_STRING)
+  (G_TYPE_POINTER)
+  (G_TYPE_BOXED)
+  (G_TYPE_PARAM)
+  (G_TYPE_OBJECT))
+
+(typedef GType guint)
+
+(typedef GValue (struct _GValue))
+;(typedef GTypeCValue (union  _GTypeCValue))
+;(typedef GTypePlugin (struct _GTypePlugin))
+(typedef GTypeClass (struct _GTypeClass))
+(typedef GTypeInterface (struct _GTypeInterface))
+(typedef GTypeInstance (struct _GTypeInstance))
+;(typedef GTypeInfo (struct _GTypeInfo))
+;(typedef GTypeFundamentalInfo (struct _GTypeFundamentalInfo))
+;(typedef GInterfaceInfo (struct _GInterfaceInfo))
+;(typedef GTypeValueTable (struct _GTypeValueTable))
+(typedef GTypeQuery (struct _GTypeQuery))
+
+(struct _GTypeClass
+       ;; < private >
+       (g_type GType))
+
+(struct _GTypeInstance
+       ;; < private >
+       (g_class (* GTypeClass)))
+
+(struct _GTypeInterface
+       ;; < private >
+       (g_type GType)
+       (g_instance_type GType))
+
+(struct _GTypeQuery
+       (type GType)
+       (type_name (const (* gchar)))
+       (class_size guint)
+       (instance_size guint))
+
+(typedef GTypeDebugFlags
+        (enum
+         (G_TYPE_DEBUG_NONE)
+         (G_TYPE_DEBUG_OBJECTS)
+         (G_TYPE_DEBUG_SIGNALS)
+         (G_TYPE_DEBUG_MASK)))
+
+(extern GType
+       G_TYPE_FUNDAMENTAL
+       (type_id GType))
+
+(extern (const (* gchar))
+       G_OBJECT_CLASS_NAME
+       (class (* GObjectClass)))
\ No newline at end of file
diff --git a/src/gtk/Includes/gtypes.cdecl b/src/gtk/Includes/gtypes.cdecl
new file mode 100644 (file)
index 0000000..82c8245
--- /dev/null
@@ -0,0 +1,59 @@
+#| -*-Scheme-*-
+
+glib-2.0/glib/gtypes.h |#
+
+;(include "glibconfig")
+(typedef gint8 char)
+(typedef gint16 short)
+(typedef gint32 int)
+(typedef gint64 long)
+(typedef guint8 uchar)
+(typedef guint16 ushort)
+(typedef guint32 uint)
+;(typedef guint64 ulonglong)
+(typedef gssize int)
+(typedef gsize uint)
+
+(typedef gchar char)
+(typedef gshort short)
+(typedef glong long)
+(typedef gint int)
+(typedef gboolean gint)
+
+(typedef guchar uchar)
+(typedef gushort ushort)
+(typedef gulong ulong)
+(typedef guint uint)
+
+(typedef gfloat float)
+(typedef gdouble double)
+
+(typedef gpointer (* void))
+(typedef gconstpointer (const (* void)))
+
+#|
+
+typedef gint            (*GCompareFunc)         (gconstpointer  a,
+                                                gconstpointer  b);
+typedef gint            (*GCompareDataFunc)     (gconstpointer  a,
+                                                gconstpointer  b,
+                                                gpointer       user_data);
+typedef gboolean        (*GEqualFunc)           (gconstpointer  a,
+                                                gconstpointer  b);
+typedef void            (*GDestroyNotify)       (gpointer       data);
+typedef void            (*GFunc)                (gpointer       data,
+                                                gpointer       user_data);
+typedef guint           (*GHashFunc)            (gconstpointer  key);
+typedef void            (*GHFunc)               (gpointer       key,
+                                                gpointer       value,
+                                                gpointer       user_data);
+typedef void            (*GFreeFunc)            (gpointer       data);
+typedef const gchar *   (*GTranslateFunc)       (const gchar   *str,
+                                                gpointer       data);
+|#
+
+(typedef GTimeVal (struct _GTimeVal))
+
+(struct _GTimeVal
+       (tv_sec glong)
+       (tv_usec glong))
\ No newline at end of file
diff --git a/src/gtk/Includes/gvalue.cdecl b/src/gtk/Includes/gvalue.cdecl
new file mode 100644 (file)
index 0000000..de10e25
--- /dev/null
@@ -0,0 +1,32 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gvalue.h |#
+
+(struct _GValue
+       (g_type GType)
+       (data (array
+              (union
+               (v_int gint)
+               (v_uint guint)
+               (v_long glong)
+               (v_ulong gulong)
+;              (v_int64 gint64)
+;              (v_uint64 guint64)
+               (v_float gfloat)
+               (v_double gdouble)
+               (v_pointer gpointer))
+              2)))
+
+(extern        (* GValue)
+       g_value_init
+       (value (* GValue))
+       (g_type GType))
+
+(extern (* GValue)
+       g_value_reset
+       (value (* GValue)))
+
+(extern gboolean
+       g_value_type_compatible
+       (src_type GType)
+       (dest_type GType))
\ No newline at end of file
diff --git a/src/gtk/Includes/gvaluetypes.cdecl b/src/gtk/Includes/gvaluetypes.cdecl
new file mode 100644 (file)
index 0000000..b23e15e
--- /dev/null
@@ -0,0 +1,76 @@
+#| -*-Scheme-*-
+
+glib-2.0/gobject/gvaluetypes.h |#
+
+;(include "gvalue")
+
+(extern void g_value_set_char
+       (value (* GValue))
+       (v_char gchar))
+(extern gchar g_value_get_char
+       (value (const (* GValue))))
+(extern void g_value_set_uchar
+       (value (* GValue))
+       (v_uchar guchar))
+(extern guchar g_value_get_uchar
+       (value (const (* GValue))))
+(extern void g_value_set_boolean
+       (value (* GValue))
+       (v_boolean gboolean))
+(extern gboolean g_value_get_boolean
+       (value (const (* GValue))))
+(extern void g_value_set_int
+       (value (* GValue))
+       (v_int gint))
+(extern gint g_value_get_int
+       (value (const (* GValue))))
+(extern void g_value_set_uint
+       (value (* GValue))
+       (v_uint guint))
+(extern guint g_value_get_uint
+       (value (const (* GValue))))
+(extern void g_value_set_long
+       (value (* GValue))
+       (v_long glong))
+(extern glong g_value_get_long
+       (value (const (* GValue))))
+(extern void g_value_set_ulong
+       (value (* GValue))
+       (v_ulong gulong))
+(extern gulong g_value_get_ulong
+       (value (const (* GValue))))
+;(extern void g_value_set_int64
+;      (value (* GValue))
+;      (v_int64 gint64))
+;(extern gint64 g_value_get_int64
+;      (value (const (* GValue))))
+;(extern void g_value_set_uint64
+;      (value (* GValue))
+;      (v_uint64 guint64))
+;(extern guint64 g_value_get_uint64
+;      (value (const (* GValue))))
+(extern void g_value_set_float
+       (value (* GValue))
+       (v_float gfloat))
+(extern gfloat g_value_get_float
+       (value (const (* GValue))))
+(extern void g_value_set_double
+       (value (* GValue))
+       (v_double gdouble))
+(extern gdouble g_value_get_double
+       (value (const (* GValue))))
+(extern void g_value_set_string
+       (value (* GValue))
+       (v_string (const (* gchar))))
+;(extern void g_value_set_static_string
+;      (value (* GValue))
+;      (v_string (const (* gchar))))
+(extern (const (* gchar)) g_value_get_string
+       (value (const (* GValue))))
+;(extern (* gchar) g_value_dup_string
+;      (value (const (* GValue))))
+(extern void g_value_set_pointer
+       (value (* GValue))
+       (v_pointer gpointer))
+(extern gpointer g_value_get_pointer
+       (value (const (* GValue))))
\ No newline at end of file
diff --git a/src/gtk/Includes/pango-context.cdecl b/src/gtk/Includes/pango-context.cdecl
new file mode 100644 (file)
index 0000000..d9614cc
--- /dev/null
@@ -0,0 +1,85 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pango-context.h |#
+
+(include "pango-font")
+;(include "pango-fontmap")
+;(include "pango-attributes")
+
+;(extern (* PangoFontMap)
+;      pango_context_get_font_map
+;      (context (* PangoContext)))
+
+(extern void
+       pango_context_list_families
+       (context (* PangoContext))
+       (families (* (* (* PangoFontFamily))))
+       (n_families (* int)))
+
+;(extern (* PangoFont)
+;      pango_context_load_font
+;      (context (* PangoContext))
+;      (desc (const (* PangoFontDescription))))
+
+;(extern (* PangoFontset)
+;      pango_context_load_fontset
+;      (context (* PangoContext))
+;      (desc (const (* PangoFontDescription)))
+;      (language (* PangoLanguage)))
+
+(extern (* PangoFontMetrics)
+       pango_context_get_metrics
+       (context (* PangoContext))
+       (desc (const (* PangoFontDescription)))
+       (language (* PangoLanguage)))
+
+;(extern void
+;      pango_context_set_font_description
+;      (context (* PangoContext))
+;      (desc (const (* PangoFontDescription))))
+
+(extern (* PangoLanguage)
+       pango_context_get_language
+       (context (* PangoContext)))
+
+;(extern void
+;      pango_context_set_language
+;      (context (* PangoContext))
+;      (language (* PangoLanguage)))
+
+;(extern void
+;      pango_context_set_base_dir
+;      (context (* PangoContext))
+;      (direction PangoDirection))
+
+;(extern PangoDirection
+;      pango_context_get_base_dir
+;      (context (* PangoContext)))
+
+;(extern void
+;      pango_context_set_matrix
+;      (context (* PangoContext))
+;      (matrix (const (* PangoMatrix))))
+
+;(extern (const (* PangoMatrix))
+;      pango_context_get_matrix
+;      (context (* PangoContext)))
+
+;(extern (* GList)
+;      pango_itemize
+;      (context (* PangoContext))
+;      (text (const (* char)))
+;      (start_index int)
+;      (length int)
+;      (attrs (* PangoAttrList))
+;      (cached_iter (* PangoAttrIterator)))
+
+;(extern (* GList)
+;      pango_itemize_with_base_dir
+;      (context (* PangoContext))
+;      (base_dir PangoDirection)
+;      (text (const (* char)))
+;      (start_index int)
+;      (length int)
+;      (attrs (* PangoAttrList))
+;      (cached_iter (* PangoAttrIterator)))
\ No newline at end of file
diff --git a/src/gtk/Includes/pango-font.cdecl b/src/gtk/Includes/pango-font.cdecl
new file mode 100644 (file)
index 0000000..0bf1bf4
--- /dev/null
@@ -0,0 +1,95 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pango-font.h |#
+
+;(include "pango-coverage")
+;(include "pango-types")
+
+;(include "glib-object")
+
+;(typedef PangoFontDescription (struct _PangoFontDescription))
+;(typedef PangoFontMetrics (struct _PangoFontMetrics))
+
+;(typedef PangoStyle
+;       (enum
+;        (PANGO_STYLE_NORMAL)          ;the font is upright.
+;        (PANGO_STYLE_OBLIQUE)         ;the font is slanted, but roman.
+;        (PANGO_STYLE_ITALIC)))        ;the font is slanted in italic style
+
+;(typedef PangoVariant
+;       (enum
+;        (PANGO_VARIANT_NORMAL)
+;        (PANGO_VARIANT_SMALL_CAPS)))
+
+;(typedef PangoWeight
+;       (enum
+;        (PANGO_WEIGHT_ULTRALIGHT)
+;        (PANGO_WEIGHT_LIGHT)
+;        (PANGO_WEIGHT_NORMAL)
+;        (PANGO_WEIGHT_SEMIBOLD)
+;        (PANGO_WEIGHT_BOLD)
+;        (PANGO_WEIGHT_ULTRABOLD)
+;        (PANGO_WEIGHT_HEAVY)))
+
+;(typedef PangoStretch
+;       (enum
+;        (PANGO_STRETCH_ULTRA_CONDENSED)
+;        (PANGO_STRETCH_EXTRA_CONDENSED)
+;        (PANGO_STRETCH_CONDENSED)
+;        (PANGO_STRETCH_SEMI_CONDENSED)
+;        (PANGO_STRETCH_NORMAL)
+;        (PANGO_STRETCH_SEMI_EXPANDED)
+;        (PANGO_STRETCH_EXPANDED)
+;        (PANGO_STRETCH_EXTRA_EXPANDED)
+;        (PANGO_STRETCH_ULTRA_EXPANDED)))
+
+;(typedef PangoFontMask
+;       (enum
+;        (PANGO_FONT_MASK_FAMILY)
+;        (PANGO_FONT_MASK_STYLE)
+;        (PANGO_FONT_MASK_VARIANT)
+;        (PANGO_FONT_MASK_WEIGHT)
+;        (PANGO_FONT_MASK_STRETCH)
+;        (PANGO_FONT_MASK_SIZE)))
+
+;; CSS scale factors (1.2 factor between each size) */
+;(define PANGO_SCALE_XX_SMALL 0.5787037037037)
+;(define PANGO_SCALE_X_SMALL  0.6444444444444)
+;(define PANGO_SCALE_SMALL    0.8333333333333)
+;(define PANGO_SCALE_MEDIUM   1.0)
+;(define PANGO_SCALE_LARGE    1.2)
+;(define PANGO_SCALE_X_LARGE  1.4399999999999)
+;(define PANGO_SCALE_XX_LARGE 1.728)
+
+(extern void pango_font_description_free (desc (* PangoFontDescription)))
+
+(extern (* PangoFontDescription)
+       pango_font_description_from_string
+       (str (* (const char))))
+
+(extern void pango_font_metrics_unref (metrics (* PangoFontMetrics)))
+(extern int pango_font_metrics_get_ascent (metrics (* PangoFontMetrics)))
+(extern int pango_font_metrics_get_descent (metrics (* PangoFontMetrics)))
+;(extern int pango_font_metrics_get_approximate_char_width (metrics (* PangoFontMetrics)))
+(extern int pango_font_metrics_get_approximate_digit_width (metrics (* PangoFontMetrics)))
+;(extern int pango_font_metrics_get_underline_position (metrics (* PangoFontMetrics)))
+;(extern int pango_font_metrics_get_unerline_thickness (metrics (* PangoFontMetrics)))
+;(extern int pango_font_metrics_get_strikethrough_position (metrics (* PangoFontMetrics)))
+;(extern int pango_font_metrics_get_strikethrough_thickness (metrics (* PangoFontMetrics)))
+
+(extern void pango_font_family_list_faces
+       (family (* PangoFontFamily))
+       (faces (* (* (* PangoFontFace))))
+       (n_faces (* int)))
+
+(extern (const (* char))
+       pango_font_family_get_name
+       (family (* PangoFontFamily)))
+
+(extern gboolean
+       pango_font_family_is_monospace
+       (family (* PangoFontFamily)))
+
+(extern (const (* char))
+       pango_font_face_get_face_name
+       (face (* PangoFontFace)))
\ No newline at end of file
diff --git a/src/gtk/Includes/pango-layout.cdecl b/src/gtk/Includes/pango-layout.cdecl
new file mode 100644 (file)
index 0000000..6f27065
--- /dev/null
@@ -0,0 +1,40 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pango-layout.h |#
+
+;(include "pango-attributes")
+(include "pango-context")
+;(include "pango-glyph-item")
+;(include "pango-tabs")
+
+(extern void pango_layout_get_extents
+       (layout (* PangoLayout))
+       (ink_rect (* PangoRectangle))
+       (logical_rect (* PangoRectangle)))
+(extern void pango_layout_get_pixel_extents
+       (layout (* PangoLayout))
+       (ink_rect (* PangoRectangle))
+       (logical_rect (* PangoRectangle)))
+(extern void pango_layout_set_text
+       (layout (* PangoLayout))
+       (text (const (* char)))
+       (length int))
+(extern void pango_layout_set_font_description
+       (layout (* PangoLayout))
+       (desc (const (* PangoFontDescription))))
+(extern void pango_layout_index_to_pos
+       (layout (* PangoLayout))
+       (index int)
+       (pos (* PangoRectangle)))
+(extern void pango_layout_xy_to_index
+       (layout (* PangoLayout))
+       (x int) (y int)
+       (index (* int))
+       (trailing (* int)))
+(extern (* PangoLayoutIter)
+       pango_layout_get_iter
+       (layout (* PangoLayout)))
+(extern void pango_layout_iter_free
+       (iter (* PangoLayoutIter)))
+(extern int pango_layout_iter_get_baseline
+        (iter (* PangoLayoutIter)))
diff --git a/src/gtk/Includes/pango-types.cdecl b/src/gtk/Includes/pango-types.cdecl
new file mode 100644 (file)
index 0000000..0aadc43
--- /dev/null
@@ -0,0 +1,14 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pango-types.h |#
+
+(include "glib")
+;(include "glib-object")
+
+(typedef PangoRectangle
+        (struct _PangoRectangle))
+(struct _PangoRectangle
+       (x int)
+       (y int)
+       (width int)
+       (height int))
\ No newline at end of file
diff --git a/src/gtk/Includes/pango.cdecl b/src/gtk/Includes/pango.cdecl
new file mode 100644 (file)
index 0000000..8444eb4
--- /dev/null
@@ -0,0 +1,25 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pango.h |#
+
+;(include "pango-attributes")
+;(include "pango-break")
+(include "pango-context")
+;(include "pango-coverage")
+;(include "pango-engine")
+;(include "pango-enum-types")
+;(include "pango-features")
+(include "pango-font")
+;(include "pango-fontmap")
+;(include "pango-fontset")
+;(include "pango-glyph")
+;(include "pango-glyph-item")
+;(include "pango-gravity")
+;(include "pango-item")
+(include "pango-layout")
+;(include "pango-matrix")
+;(include "pango-renderer")
+;(include "pango-script")
+;(include "pango-tabs")
+(include "pango-types")
+;(include "pango-utils")
\ No newline at end of file
diff --git a/src/gtk/Includes/pangocairo.cdecl b/src/gtk/Includes/pangocairo.cdecl
new file mode 100644 (file)
index 0000000..ae76354
--- /dev/null
@@ -0,0 +1,15 @@
+#| -*-Scheme-*-
+
+pango-1.0/pango/pangocairo.h |#
+
+(include "pango-context")
+;(include "pango-fontmap")
+(include "pango-layout")
+(include "cairo")
+
+;(typedef PangoCairoFont (struct _PangoCairoFont))
+;(typedef PangoCairoFontMap (struct _PangoCairoFontMap))
+
+(extern (* PangoLayout) pango_cairo_create_layout (cr (* cairo_t)))
+(extern void pango_cairo_update_layout (cr (* cairo_t))(layout (* PangoLayout)))
+(extern void pango_cairo_show_layout (cd (* cairo_t))(layout (* PangoLayout)))
diff --git a/src/gtk/Makefile-fragment b/src/gtk/Makefile-fragment
new file mode 100644 (file)
index 0000000..74feb9b
--- /dev/null
@@ -0,0 +1,68 @@
+#-*-Makefile-*-
+# $Id: $
+# gtk/Makefile-fragment
+
+TARGET_DIR = $(AUXDIR)/gtk
+
+generate: ../lib/lib/gtk-shim.so ../lib/lib/gtk-types.bin \
+         ../lib/lib/gtk-const.bin ../lib/conses.png
+
+../lib/lib/gtk-shim.so: gtk-shim.so
+       $(INSTALL_DATA) gtk-shim.so $@
+
+../lib/lib/gtk-types.bin: gtk-types.bin
+       $(INSTALL_DATA) gtk-types.bin $@
+
+../lib/lib/gtk-const.bin: gtk-const.bin
+       $(INSTALL_DATA) gtk-const.bin $@
+
+../lib/conses.png: conses.png
+       $(INSTALL_DATA) conses.png $@
+
+conses.png: conses.png.uu
+       uudecode conses.png.uu
+
+build:
+       echo '(load "compile")' \
+       | ../microcode/scheme --compiler --library ../lib --batch-mode
+
+install:
+       rm -rf $(DESTDIR)$(TARGET_DIR)
+       $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
+       $(INSTALL_COM) *.com $(DESTDIR)$(TARGET_DIR)/.
+       $(INSTALL_DATA) *.bci $(DESTDIR)$(TARGET_DIR)/.
+       $(INSTALL_DATA) gtk-*.pkd $(DESTDIR)$(TARGET_DIR)/.
+       $(INSTALL_DATA) load.scm $(DESTDIR)$(TARGET_DIR)/.
+       $(INSTALL_DATA) gtk-shim.so $(DESTDIR)$(AUXDIR)/lib/.
+       $(INSTALL_DATA) gtk-types.bin $(DESTDIR)$(AUXDIR)/lib/.
+       $(INSTALL_DATA) gtk-const.bin $(DESTDIR)$(AUXDIR)/lib/.
+
+gtk-shim.so: gtk-shim.o scmwidget.o
+       $(LINK_SHIM) $^ `pkg-config --libs gtk+-2.0`
+
+scmwidget.o: scmwidget.c
+       $(COMPILE_SHIM) `pkg-config --cflags gtk+-2.0` -c scmwidget.c
+
+scmwidget.c: scmwidget.c.stay
+       cp -p scmwidget.c.stay scmwidget.c
+
+gtk-shim.o: gtk-shim.c gtk-shim.h ../lib/mit-scheme.h
+       $(COMPILE_SHIM) `pkg-config --cflags gtk+-2.0` -o $@ -c $<
+
+gtk-shim.c gtk-const.c gtk-types.bin: gtk.cdecl
+       (echo "(load-option 'FFI)"; \
+        echo '(C-generate "gtk" "#include \"gtk-shim.h\"")') \
+       | mit-scheme --batch-mode
+
+gtk-const.bin: gtk-const.scm
+       echo '(sf "gtk-const")' | mit-scheme --compiler --batch-mode
+
+gtk-const.scm: gtk-const
+       ./gtk-const
+
+gtk-const: gtk-const.o
+       @rm -f $@
+       $(CCLD) $(CFLAGS) $(LDFLAGS) -o $@ $< `pkg-config --libs gtk+-2.0`
+
+gtk-const.o: gtk-const.c
+       $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0` -o $@ -c $<
diff --git a/src/gtk/Tags.sh b/src/gtk/Tags.sh
new file mode 100755 (executable)
index 0000000..09b8e66
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+#
+# $Id: Tags.sh,v 1.7 2008/01/30 20:02:08 cph Exp $
+
+# Utility to make TAGS file for the gtk build directory.
+# The working directory must be the build directory.
+
+etags gtk-shim.h scmwidget.c.stay --language=scheme \
+       `echo *.scm | sed 's/ gtk-const.scm//'` Includes/*.cdecl
diff --git a/src/gtk/compile.scm b/src/gtk/compile.scm
new file mode 100644 (file)
index 0000000..a1addd3
--- /dev/null
@@ -0,0 +1,44 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Compile the GTK system. |#
+
+(load-option 'CREF)
+(load-option 'SOS)
+(load-option 'FFI)
+(with-working-directory-pathname (directory-pathname (current-load-pathname))
+  (lambda ()
+    (let ((gtk-files '("gtk" "main" "gobject" "gtk-object"
+                      "scm-widget" "scm-layout"
+                      "gtk-ev" "demo")))
+
+      ;; Build an empty package for use at syntax-time.
+      ;; The C-include syntax will bind C-INCLUDES here.
+      (if (not (name->package '(GTK)))
+         (let ((package-set (package-set-pathname "gtk")))
+           (if (not (file-exists? package-set))
+               (cref/generate-trivial-constructor "gtk"))
+           (construct-packages-from-file (fasload package-set))))
+
+      ;; Load the gtkio primitives too.
+      (load-library-object-file "prgtkio" #t)
+
+      ;; Syntax in (gtk).
+      (fluid-let ((sf/default-syntax-table (->environment '(gtk)))
+                 (sf/default-declarations
+                  (cons '(usual-integrations) sf/default-declarations)))
+       (for-each (lambda (f) (sf-conditionally f #t)) gtk-files))
+
+      ;; Syntax in (runtime thread).
+      (fluid-let ((sf/default-syntax-table (->environment '(gtk thread)))
+                 (sf/default-declarations
+                  (cons '(usual-integrations) sf/default-declarations)))
+       (sf-conditionally "thread" #t))
+
+      ;; Cross-check.
+      (cref/generate-constructors "gtk" 'ALL)
+
+      ;; Compile.
+      (for-each compile-file (cons "thread" gtk-files))
+      )))
\ No newline at end of file
diff --git a/src/gtk/conses.png.uu b/src/gtk/conses.png.uu
new file mode 100644 (file)
index 0000000..37d7a38
--- /dev/null
@@ -0,0 +1,11 @@
+begin-base64 660 conses.png
+iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
+AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAABEklEQVRYw+2X4Q6DMAiE
+ucX3f+Xbj9laW6ilNLolIzFxWr4iwslAkjJpACAiEmKQ5M5xWb3nLGOzgAlq
+Xd9PRIr79lotQR/GazZ1xQ4h9zYACwjkg/W62scR1HgGyHwg/S7vLcuA1wKb
+iyhdQEnlcbWv3QUeBtiSXE8FIMQ4hEQrHDKLzahl1qDvq/BsNr/DtlP6SE1c
+zEi82VED2EE1+dIxIP9tABYQgFCRUQzV+JjFdWB5APHX+usZuNlyEaZOoJy7
+YmXBmQGcOsAYQq5M04t0racXy6R4lrFWiicYsS+ZNRV7GF8zFasRu6diFdEb
+ip+firfhldXI1Z2KHfafio9XYKSxW91K9+kQG4Gn/x0/bm8fAcEjKw488QAA
+AABJRU5ErkJggg==
+====
diff --git a/src/gtk/demo.scm b/src/gtk/demo.scm
new file mode 100644 (file)
index 0000000..9476c39
--- /dev/null
@@ -0,0 +1,214 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; A small drawing in two scm-layout widgets.
+;;; package: (gtk demo)
+
+
+(c-include "gtk")
+
+(define (scm-layout-demo)
+  (let* ((window (gtk-window-new 'toplevel))
+        (vbox (gtk-vbox-new #t 0))
+        (scroller1 (gtk-scrolled-window-new))
+        (scroller2 (gtk-scrolled-window-new))
+        (layout1 (scm-layout-new 200 200))
+        (layout2 (scm-layout-new 200 200)))
+    (gtk-window-set-title window "scm-layout-demo")
+    (gtk-window-set-default-size window 200 400)
+    (gtk-container-set-border-width window 10)
+    (gtk-container-add scroller1 layout1)
+    (gtk-container-add vbox scroller1)
+    (gtk-container-add scroller2 layout2)
+    (gtk-container-add vbox scroller2)
+    (gtk-container-add window vbox)
+    (gtk-widget-show-all window)
+    (g-signal-connect window (C-callback "delete_event")
+      (lambda (w e)
+       w e ;;Ignored.
+       (outf-console "; Closed "window".\n")
+       0))
+    (let ((drawing (demo-drawing layout1)))
+      (set-scm-layout-drawing! layout1 drawing)
+      (set-scm-layout-scroll-pos! layout1 175 150)
+      (set-scm-widget-event!
+       layout1 (demo-event layout1 (scm-layout-event layout1)))
+      (set-scm-layout-drawing! layout2 drawing)
+      (set-scm-layout-scroll-pos! layout2 175 150)
+      (set-scm-widget-event!
+       layout2 (demo-event layout2 (scm-layout-event layout2)))
+      (let ((cursor1 (add-box-item drawing 'BOTTOM))
+           (cursor2 (add-box-item drawing 'BOTTOM)))
+       (set-demo-drawing-cursor-items!
+        drawing (list (list cursor1 layout1) (list cursor2 layout2)))
+       (let ((thread (start-blinking drawing)))
+         (outf-console "; Cursor blinking courtesy of "thread".\n"))))
+    (outf-console "; Created "layout1" and "layout2"\n"))
+  unspecific)
+
+(define (demo-drawing device)
+  ;; DEVICE can (must, at the moment) be a scm-layout.
+  (let ((drawing (make-demo-drawing device)))
+    (set-drawing-size! drawing 500 500)
+    (let ((hline (add-hline-item drawing #f))
+         (vline (add-vline-item drawing #f))
+         (text (add-text-item drawing #f))
+         (box (add-box-item drawing #f))
+         (image (add-image-item-from-file
+                 drawing #f
+                 (merge-pathnames
+                  "conses.png" (system-library-directory-pathname "")))))
+      (set-drawn-item-position! hline 240 250)
+      (set-hline-item-size! hline 50)
+      (set-drawn-item-position! vline 250 240)
+      (set-vline-item-size! vline 50)
+      (set-drawn-item-position! text 250 250)
+      (set-text-item-text! text "Hello, World!")
+      (set-drawn-item-position! box 220 220)
+      (set-box-item-size! box 20 20)
+      (set-box-item-shadow! box 'etched-in)
+      (set-drawn-item-position! image 270 200)
+      drawing)))
+
+(define-class (<demo-drawing> (constructor () 1))
+    (<drawing>)
+  ;; An alist of cursors and their widgets, for the blinking thread
+  ;; and mouse motion handler.
+  (cursor-items define standard initial-value '()))
+
+(define (demo-event widget old-handler)
+  (named-lambda (scm-layout-demo::event GtkWidget GdkEvent)
+
+    (trace2 ";(scm-layout-demo::event "GtkWidget" "GdkEvent")\n")
+    (let ((type (C-> GdkEvent "GdkEvent any type")))
+      (cond
+       ((fix:= type (C-enum "GDK_MOTION_NOTIFY"))
+       (let* ((drawing (scm-layout-drawing widget))
+              ;; pointer coords
+              (xP (floor->exact (C-> GdkEvent "GdkEventMotion x")))
+              (yP (floor->exact (C-> GdkEvent "GdkEventMotion y")))
+              ;; scroll offset
+              (scroll (scm-layout-on-screen-area widget))
+              (xO (rect-x scroll))
+              (yO (rect-y scroll))
+              ;; drawing coords
+              (x (int:+ xP xO))
+              (y (int:+ yP yO)))
+         (trace2 "; Pointer moved to ("x","y") in "widget".\n")
+         (for-each
+          (lambda (item)
+            (if (not (text-item? item))
+                (trace "; Picked: "item"\n")
+                (let ((index (text-item-xy-to-index item x y))
+                      (text-area (drawn-item-area item)))
+                  (trace "; Picked: "index" in "(text-item-text item)"\n")
+                  (call-with-text-item-grapheme-rect
+                   item index
+                   (lambda (xG yG widthG heightG)
+                     (for-each
+                      (lambda (cursor.widgets)
+                        (if (memq widget (cdr cursor.widgets))
+                            (begin
+                              (set-box-item-pos-size!
+                               (car cursor.widgets)
+                               (int:+ xG (rect-x text-area))
+                               (int:+ yG (rect-y text-area))
+                               widthG heightG)
+                              ;; Keep the cursor on while tracking the mouse.
+                              (set-drawn-item-widgets!
+                               (car cursor.widgets)
+                               (cdr cursor.widgets)))))
+                      (demo-drawing-cursor-items drawing)))))))
+          (drawing-pick-list drawing widget x y)))
+       (C-call "gdk_window_get_pointer" #f
+               (C-> GdkEvent "GdkEventMotion window")
+               null-alien null-alien null-alien)
+       1 ;;Handled.
+       )
+
+       ((fix:= type (C-enum "GDK_BUTTON_RELEASE"))
+       (let ((scroll (scm-layout-on-screen-area widget))
+             (drawing (scm-layout-drawing widget))
+             (xp (floor->exact (C-> GdkEvent "GdkEventButton x")))
+             (yp (floor->exact (C-> GdkEvent "GdkEventButton y"))))
+         (let ((x (int:+ xp (rect-x scroll)))
+               (y (int:+ yp (rect-y scroll))))
+           (outf-console "; Pointer release at ("x","y").\n")
+           (for-each
+            (lambda (item)
+              (if (not (text-item? item))
+                  (outf-console "; Picked: "item"\n")
+                  (let ((index (text-item-xy-to-index item x y)))
+                    (outf-console "; Picked: "item" (char "index")\n"))))
+            (drawing-pick-list drawing widget x y))))
+       1 ;;Handled.
+       )
+
+       ((and (= type (C-enum "GDK_KEY_PRESS"))
+            (= (C-> GdkEvent "GdkEvent key keyval") (C-enum "GDK_D")))
+       (bkpt 'Test)
+       (old-handler GtkWidget GdkEvent))
+
+       (else
+       (old-handler GtkWidget GdkEvent))))))
+
+(define (start-blinking drawing)
+  (create-thread
+   #f
+   (lambda ()
+     (trace2 ";blinking start\n")
+     (let loop ()
+       ;; Off!
+       (for-each (lambda (cursor.widgets)
+                  (set-drawn-item-widgets! (car cursor.widgets) '()))
+                (demo-drawing-cursor-items drawing))
+       (trace2 ";blinked off\n")
+       (sleep-current-thread 500)
+       ;; On!
+       (for-each (lambda (cursor.widgets)
+                  (set-drawn-item-widgets! (car cursor.widgets)
+                                           (cdr cursor.widgets)))
+                (demo-drawing-cursor-items drawing))
+       (trace2 ";blinked on\n")
+       (sleep-current-thread 500)
+       (if (there-exists?
+           (demo-drawing-cursor-items drawing)
+           (lambda (cursor.widgets)
+             (there-exists? (cdr cursor.widgets)
+                            (lambda (W) (not (gtk-object-destroyed? W))))))
+          (loop)
+          (trace2 ";blinking ended\n"))))))
+\f
+
+(define trace? #f)
+(define trace2? #f)
+
+(define-syntax trace
+  (syntax-rules ()
+    ((_ . ARGS) (if trace? ((lambda () (outf-console . ARGS)))))))
+
+(define-syntax trace2
+  (syntax-rules ()
+    ((_ . ARGS) (if trace2? ((lambda () (outf-console . ARGS)))))))
\ No newline at end of file
diff --git a/src/gtk/gobject.scm b/src/gtk/gobject.scm
new file mode 100644 (file)
index 0000000..71f711e
--- /dev/null
@@ -0,0 +1,584 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; GtkObjects
+;;; package: (gtk gobject)
+
+
+(c-include "gtk")
+
+(define-class <gobject> ()
+
+  ;; The GObject alien.  A null alien if the toolkit object has not
+  ;; been created (yet), or has been finalized.
+  (alien define accessor
+        initializer (lambda () (make-alien '|GObject|)))
+
+  ;; A pair, shared with finalize thunk closures.  The cdr of this
+  ;; pair is the alist associating signal names with Scheme callback
+  ;; IDs and toolkit handles.  In this alist, a callback ID will be #f
+  ;; if the signal was disconnected.
+  (signals define standard
+          initializer (lambda () (list 'GOBJECT-SIGNALS))))
+
+(define-integrable (gobject-finalized? object)
+  (alien-null? (gobject-alien object)))
+
+(define-method initialize-instance ((object <gobject>))
+  ;; Arrange for all gobject signal handlers to be de-registered if
+  ;; GCed.  The object itself is g_object_unref'ed.
+  (add-gc-cleanup object
+                 (gobject-finalize-thunk
+                  (gobject-alien object)
+                  (gobject-signals object))))
+
+(define (gobject-finalize-thunk alien signals)
+  ;; Return a thunk closed over ALIEN and SIGNALS (but not the gobject).
+  (lambda ()
+    (gobject-finalize! alien signals)))
+
+(define (gobject-finalize! alien signals)
+  ;; This is finalization from Scheme perspective, not necessarily the
+  ;; toolkit's.
+
+  (if (not (alien-null? alien))
+      (begin
+       (C-call "g_object_unref" alien)
+       (alien-null! alien)))
+
+  (for-each (lambda (name.id.handle)
+             (let ((id.handle (cdr name.id.handle)))
+               ;; Hacking this ID.HANDLE pair atomically.
+               (without-interrupts
+                (lambda ()
+                  (let ((id (car id.handle)))
+                    (if id
+                        (begin
+                          (de-register-c-callback id)
+                          (set-car! id.handle #f)
+                          (set-cdr! id.handle #f))))))))
+           (cdr signals)))
+
+(define (gobject-unref object)
+  ;; Calls g_object_unref to release Scheme's reference to the toolkit
+  ;; object.  May be called multiple times; g_object_unref will be
+  ;; called once (per wrapper object).
+  (without-interrupts
+   (lambda ()
+     (gobject-finalize! (gobject-alien object) (gobject-signals object)))))
+
+(define (g-signal-connect object alien-function closure)
+  ;; Allocate a callback and connect it with g_signal_connect_...  The
+  ;; signal name is assumed to be the same as ALIEN-FUNCTION's name,
+  ;; e.g.  in
+  ;;
+  ;;     (g-signal-connect window (C-callback "delete_event") method)
+  ;;
+  ;; the signal name is assumed to be "delete_event".
+
+  (let* ((name (alien-function/name alien-function))
+        (sym (string->symbol name))
+        (alien (gobject-alien object))
+        (signals (gobject-signals object))
+        (sym.id.handle (or (assq sym (cdr signals))
+                           (let ((entry (cons* sym #f #f)))
+                             (set-cdr! signals (cons entry (cdr signals)))
+                             entry)))
+        (id.handle (cdr sym.id.handle)))
+    ;; Disconnect existing signal handler.
+    (g-signal-disconnect!? alien id.handle)
+    ;; Connect.
+    (without-interrupts
+     (lambda ()
+       (let ((id (car id.handle)))
+        (if (not id)
+            (let ((newid (register-c-callback closure)))
+              (set-car! id.handle newid)
+              (set-cdr! id.handle
+                        (C-call "g_signal_connect_data"
+                                alien name
+                                alien-function newid
+                                null-alien 0)))))))))
+
+(define (g-signal-disconnect object name)
+  (let* ((str (if (string? name) name
+                 (ferror "The signal name ("name") is not a string.")))
+        (sym (string->symbol str))
+        (signals (gobject-signals object))
+        (alien (gobject-alien object))
+        (sym.id.handle (assq sym (cdr signals))))
+    (if (not sym.id.handle)
+       (ferror "No signal "name" on "object" to disconnect.")
+       (if (not (g-signal-disconnect!? alien (cdr sym.id.handle)))
+           (fwarn "Signal "name" already disconnected from "object".")))))
+
+(define (g-signal-disconnect!? alien id.handle)
+  ;; Don't even THINK about recovering pairs from the signal list.
+  (without-interrupts
+   (lambda ()
+     (let ((id (car id.handle)))
+       (and id
+           (begin
+             (C-call "g_signal_handler_disconnect" alien (cdr id.handle))
+             (set-cdr! id.handle #f)
+             (de-register-c-callback (car id.handle))
+             (set-car! id.handle #f)
+             #t))))))
+\f
+
+;;; GC Cleanups
+
+;;; Intended for any object needing a cleanup after it is GCed (any
+;;; GObject?).  Like the code in FFI/malloc.scm but does not need to
+;;; make copies (and keep the copies consistent).  These cleanup
+;;; thunks can share an object's aliens at least -- something not
+;;; possible for malloc!  The shared structures (aliens) do not
+;;; reference the object, and can be held strongly.
+
+;;; Note that a cleanup thunk cannot refer to its object.  It should
+;;; not even close over a variable referring to the object.  It
+;;; probably should not refer to any other object hoping for a
+;;; cleanup.
+
+;;; A cleanup thunk may be called multiple times, so it might
+;;; check first for a nulled alien before freeing a resource, and null
+;;; that alien without interrupts after the resource is freed.
+
+(define gc-cleanups '())
+
+(define (initialize-gc-cleanups!)
+  (set! gc-cleanups '())
+  (add-gc-daemon! run-gc-cleanups))
+
+(define (run-gc-cleanups)
+  (let loop ((alist gc-cleanups)
+            (prev #f))
+    (if (pair? alist)
+       (if (weak-pair/car? (car alist))
+           (loop (cdr alist) alist)
+           (let ((thunk (weak-cdr (car alist)))
+                 (next (cdr alist)))
+             (thunk)
+             (if prev
+                 (set-cdr! prev next)
+                 (set! gc-cleanups next))
+             (loop next prev))))))
+
+(define (reset-gc-cleanups!)
+  (set! gc-cleanups '()))
+
+(define (add-gc-cleanup object cleanup-thunk)
+  (without-interrupts
+   (lambda ()
+     (set! gc-cleanups
+          (cons (weak-cons object cleanup-thunk) gc-cleanups)))))
+\f
+
+;;; Properties
+
+(define (gobject-get-property gobject property)
+
+  (let ((object (check-gobject gobject))
+       (name (check-prop-name property))
+       (gvalue (malloc (C-sizeof "GValue") '|GValue|)))
+
+    (define (unimplemented type)
+      (ferror "Property "name" (for "object") is "type" (unimplemented)."))
+
+    (C-call "g_object_get_property" (gobject-alien object) name gvalue)
+    (let* ((type (C-> gvalue "GValue g_type"))
+          (value
+           (case type
+             (((C-enum "G_TYPE_INVALID"))
+              (ferror "Property "name" (for "object") is invalid."))
+             (((C-enum "G_TYPE_NONE"))
+              (ferror "Property "name" (for "object") is void."))
+             (((C-enum "G_TYPE_INTERFACE")) (unimplemented "an interface"))
+             (((C-enum "G_TYPE_CHAR"))
+              (C-call "g_value_get_char" gvalue))
+             (((C-enum "G_TYPE_UCHAR"))
+              (C-call "g_value_get_uchar" gvalue))
+             (((C-enum "G_TYPE_BOOLEAN"))
+              (C-call "g_value_get_boolean" gvalue))
+             (((C-enum "G_TYPE_INT"))
+              (C-call "g_value_get_int" gvalue))
+             (((C-enum "G_TYPE_UINT"))
+              (C-call "g_value_get_uint" gvalue))
+             (((C-enum "G_TYPE_LONG"))
+              (C-call "g_value_get_long" gvalue))
+             (((C-enum "G_TYPE_ULONG"))
+              (C-call "g_value_get_ulong" gvalue))
+;            (((C-enum "G_TYPE_INT64"))
+;             (C-call "g_value_get_int64" gvalue))
+;            (((C-enum "G_TYPE_UINT64"))
+;             (C-call "g_value_get_uint64" gvalue))
+             (((C-enum "G_TYPE_ENUM"))
+              (C-call "g_value_get_enum" gvalue))
+             (((C-enum "G_TYPE_FLAGS"))
+              (C-call "g_value_get_flags" gvalue))
+             (((C-enum "G_TYPE_FLOAT"))
+              (C-call "g_value_get_float" gvalue))
+             (((C-enum "G_TYPE_DOUBLE"))
+              (C-call "g_value_get_double" gvalue))
+             (((C-enum "G_TYPE_STRING"))
+              (let ((alien (make-alien '(const (* |gchar|)))))
+                (C-call "g_value_get_string" alien gvalue)
+                (let ((str (c-peek-cstring alien)))
+                  (free alien)
+                  str)))
+             (((C-enum "G_TYPE_POINTER"))
+              (let ((alien (make-alien '|gpointer|)))
+                (C-call "g_value_get_pointer" alien gvalue)
+                alien))
+             (((C-enum "G_TYPE_BOXED")) (unimplemented "a boxed"))
+             (((C-enum "G_TYPE_PARAM")) (unimplemented "a param"))
+             (((C-enum "G_TYPE_OBJECT"))
+              (let ((alien (make-alien '|GObject|)))
+                (C-call "g_value_get_object" alien gvalue)
+                alien))
+             (else
+              (ferror "Unexpected GFundamentalType "
+                      (C-enum "enum GFundamentalType" type)
+                      " ("type").")))))
+      (free gvalue)
+      value)))
+
+(define (gobject-set-properties gobject . property-list)
+  ;; WAS primitive G-OBJECT-SET-PROPERTIES [gtk.c]
+  (let* ((object (check-gobject gobject))
+        (object-alien (gobject-alien object))
+        (gvalue (malloc (C-sizeof "GValue") '|GValue|))
+        (pspec (malloc (C-sizeof "GParamSpec") '|GParamSpec|))
+        (gtype (malloc (C-sizeof "GType") '|GType|))
+        (gclass (gobject-get-gclass object-alien))
+        (gclass-name (gclass-get-name gclass)))
+    (let loop ((plist property-list))
+      (cond ((null? plist) unspecific)
+           ((not (and (pair? plist) (pair? (cdr plist))))
+            (ferror "Odd length property list: "property-list))
+           (else
+            (let ((name (check-prop-name (car plist)))
+                  (value (cadr plist)))
+              (C-call "g_object_class_find_property" pspec gclass name)
+              (if (alien-null? pspec)
+                  (ferror "There is no "name" property for class "
+                          gclass-name"."))
+              (let ((flags (C-> pspec "GParamSpec flags")))
+                (if (flag-set? flags (C-enum "G_PARAM_WRITABLE"))
+                    (ferror "The "name" property of "
+                            gclass-name" is not writable."))
+                (if (not (flag-set? flags (C-enum "G_PARAM_CONSTRUCT_ONLY")))
+                    (ferror "The "name" property of "
+                            gclass-name" may not be set"
+                            " outside its constructor."))
+                (C-call "G_PARAM_SPEC_VALUE_TYPE" gtype pspec)
+                (C-call "g_value_init" gvalue gtype)
+                ;;       g_value_set_* gvalue *
+                (let ((fundamental (C-call "G_TYPE_FUNDAMENTAL" gtype)))
+                  (case fundamental
+                    (((C-enum "G_TYPE_CHAR"))
+                     (C-call "g_value_set_char"
+                             gvalue (check-prop-char value name)))
+                    (((C-enum "G_TYPE_UCHAR"))
+                     (C-call "g_value_set_uchar"
+                             gvalue (check-prop-uchar value name)))
+                    (((C-enum "G_TYPE_INT"))
+                     (C-call "g_value_set_int"
+                             gvalue (check-prop-int value name)))
+                    (((C-enum "G_TYPE_UINT"))
+                     (C-call "g_value_set_uint"
+                             gvalue (check-prop-uint value name)))
+;                   (((C-enum "G_TYPE_LONG"))
+;                    (C-call "g_value_set_long"
+;                            gvalue (check-prop-long value name)))
+;                   (((C-enum "G_TYPE_ULONG"))
+;                    (C-call "g_value_set_ulong"
+;                            gvalue (check-prop-ulong value name)))
+                    (((C-enum "G_TYPE_FLOAT"))
+                     (C-call "g_value_set_float"
+                             gvalue (check-prop-flonum value name)))
+                    (((C-enum "G_TYPE_DOUBLE"))
+                     (C-call "g_value_set_double"
+                             gvalue (check-prop-flonum value name)))
+                    (((C-enum "G_TYPE_STRING"))
+                     (C-call "g_value_set_string"
+                             gvalue (check-prop-string value name)))
+                    (((C-enum "G_TYPE_BOOLEAN"))
+                     (C-call "g_value_set_boolean"
+                             gvalue (check-prop-boolean value name)))
+                    (((C-enum "G_TYPE_ENUM"))
+                     (C-call "g_value_set_enum"
+                             gvalue (check-prop-enum value name)))
+                    (((C-enum "G_TYPE_FLAGS"))
+                     (C-call "g_value_set_flags"
+                             gvalue (check-prop-flags value name)))
+                    (((C-enum "G_TYPE_OBJECT"))
+                     (let* ((value-alien
+                             (cond ((gobject? value) (gobject-alien value))
+                                   ((alien? value) value)
+                                   (else
+                                    (ferror
+                                     "The value "value" for property "
+                                     name" of "gclass-name" is not a"
+                                     " <gobject> nor alien."))))
+                            (value-gtype
+                             (gobject-get-gtype value-alien)))
+                       (if (fix:zero? (C-call "g_value_type_compatible"
+                                              value-gtype gtype))
+                           (ferror "The value "value" for property "
+                                   name" of "gclass-name
+                                   " has incompatible type "
+                                   (gclass-get-name
+                                    (gobject-get-gclass value-alien))
+                                   "."))
+                       (C-call "g_value_set_object" gvalue value-alien)))
+                    (else
+                     (ferror "Fundamental GType "
+                             (C-enum "enum GFundamentalType" fundamental)
+                             " (the type of the "name" property of a "
+                             gclass-name") is not supported."))))
+                (C-call "g_object_set_property" object-alien name gvalue)
+                (C-call "g_value_reset" gvalue)))
+            (loop (cddr plist)))))
+    (free gtype)
+    (free pspec)
+    (free gvalue))
+  unspecific)
+
+(define (gobject-get-gclass alien)
+  (let ((ret (make-alien '|GObjectClass|)))
+    (C-call "G_OBJECT_GET_CLASS" ret alien)
+    ret))
+
+(define (gclass-get-name gclass)
+  ;; GCLASS should be an alien of type GObjectClass.
+  (let ((c* (make-alien '(* |gchar|))))
+    (C-call "G_OBJECT_CLASS_NAME" c* gclass)
+    (c-peek-cstring c*)))
+
+(define (gobject-get-gtype gobject)
+  (let ((ret (make-alien '|GType|)))
+    (C-call "G_OBJECT_TYPE" ret (gobject-alien gobject))
+    ret))
+
+(define (flag-set? fixnum mask)
+  (not (fix:zero? (fix:and fixnum mask))))
+
+(define (check-gobject obj)
+  (if (gobject? obj)
+      (if (gobject-finalized? obj) obj
+         (ferror "The object "obj" has been finalized."))
+      (ferror "The object "obj" is not a <gobject> instance.")))
+
+(define (check-prop-name name)
+  ;; Allows NAME to be a symbol OR string.
+  (cond ((symbol? name) (symbol-name name))
+       ((string? name) name)
+       (else (check-prop-name
+              (ferror "Invalid property name "name".")))))
+
+(define (check-prop-value value property verb-phrase type-predicate)
+  (if (type-predicate value) value
+      (check-prop-value
+       (ferror "The value ("value") for the "
+              property" property must "verb-phrase".")
+       property verb-phrase type-predicate)))
+
+(define (check-prop-char value name)
+  (check-prop-value value name "fit in a char"
+                   (lambda (x) (and (fixnum? x)
+                                    (fix:<= -128 x) (fix:< x 128)))))
+
+(define (check-prop-uchar value name)
+  (check-prop-value value name "fit in an unsigned char"
+                   (lambda (x) (and (fixnum? x) (fix:<= 0 x) (fix:< x 256)))))
+
+(define (check-prop-int value name)
+  (check-prop-value value name "fit in an int"
+                   (lambda (x) (and (exact-integer? x)
+                                    (<= (expt -2 31) x (- (expt 2 32) 1))))))
+
+(define (uint? x)
+  (and (exact-integer? x) (<= 0 x (- (expt 2 32) 1))))
+
+(define (check-prop-uint value name)
+  (check-prop-value value name "fit in an unsigned int" uint?))
+
+;(define (check-prop-long value name)
+;  (check-prop-value value name "fit in a long"
+;                  (lambda (x) (and (exact-integer? x)
+;                                   (<= (expt -2 63) x (- (expt 2 64) 1))))))
+
+;(define (check-prop-ulong value name)
+;  (check-prop-value value name "fit in an unsigned long"
+;                  (lambda (x) (and (exact-integer? x)
+;                                   (<= 0 x (- (expt 2 64) 1))))))
+
+(define (check-prop-flonum value name)
+  (check-prop-value value name "be a flonum" flo:flonum?))
+
+(define (check-prop-string value name)
+  (check-prop-value value name "be a string" string?))
+
+(define (check-prop-boolean value name)
+  (check-prop-value value name "be a boolean"
+                   (lambda (x) (or (eq? #t x) (eq? #f x)))))
+
+(define (check-prop-enum value name)
+  (check-prop-value value name "be an enum" uint?))
+
+(define (check-prop-flags value name)
+  (check-prop-value value name "be a flagset" uint?))
+
+(define (check-prop-gobject value name)
+  (check-prop-value value name "be a gobject" gobject?))
+\f
+
+;;; GQuarks
+
+;;; No way (nor need) to GC.  Cache them here and toss cache when
+;;; restored or reloaded.
+
+(define gquark-from-string-cache (make-string-hash-table))
+
+(define gquark-to-string-cache (make-eqv-hash-table))
+
+(define (gquark-from-string string)
+  ;; Returns the GQuark, an integer.
+  (or (hash-table/get gquark-from-string-cache string #f)
+      (let ((gq (C-call "g_quark_from_string" string)))
+       (hash-table/put! gquark-from-string-cache string gq)
+       (hash-table/put! gquark-to-string-cache gq string)
+       gq)))
+
+(define (gquark-to-string gquark)
+  (or (hash-table/get gquark-to-string-cache gquark #f)
+      (ferror "This GQuark ("gquark") has never been cached!")))
+
+(define (reset-quark-cache!)
+  (set! gquark-from-string-cache (make-string-hash-table))
+  (set! gquark-to-string-cache (make-eqv-hash-table))
+  unspecific)
+\f
+
+;;;; GdkPixbufLoaders
+
+(define-class (<pixbuf-loader> (constructor ()))
+     (<gobject>)
+  (port define standard initial-value #f)
+  (thread define standard initial-value #f)
+  (error-message define standard initial-value #f)
+  (pixbuf define standard initializer (lambda () (make-alien '|GdkPixbuf|))))
+
+(define-method initialize-instance ((loader <pixbuf-loader>))
+  (call-next-method loader)
+  (add-gc-cleanup loader (pixbuf-loader-finalize-thunk
+                         (pixbuf-loader-pixbuf loader)))
+  (C-call "gdk_pixbuf_loader_new" (gobject-alien loader))
+  (g-signal-connect loader (C-callback "area_prepared")
+                   (pixbuf-loader-area-prepared loader)))
+
+(define (pixbuf-loader-finalize-thunk pixbuf-alien)
+  (named-lambda (pixbuf-loader::finalize-thunk)
+
+    (if (not (alien-null? pixbuf-alien))
+       (begin
+         (C-call "g_object_unref" pixbuf-alien)
+         (alien-null! pixbuf-alien)))
+    ;; Signals finalized by initialize-instance(<gobject>...) method's
+    ;; gc-cleanup.
+    ))
+
+(define (pixbuf-loader-area-prepared loader)
+  (named-lambda (pixbuf-loader::area-prepared GdkPixbufLoader)
+
+    (let ((pixbuf (pixbuf-loader-pixbuf loader)))
+      (C-call "gdk_pixbuf_loader_get_pixbuf" pixbuf GdkPixbufLoader)
+      (C-call "g_object_ref" pixbuf))))
+
+(define-integrable (pixbuf-loader-started? loader)
+  (not (eq? #f (pixbuf-loader-port loader))))
+
+(define-integrable (pixbuf-loader-done? loader)
+  (let ((port (pixbuf-loader-port loader)))
+    (and port (not (port/input-open? port)))))
+
+(define (start-pixbuf-loader loader input-port)
+  (without-interrupts
+   (lambda ()
+     (if (pixbuf-loader-started? loader)
+        (if (pixbuf-loader-done? loader)
+            (ferror loader" is already finished.")
+            (ferror loader" has already started.")))
+     (set-pixbuf-loader-port! loader input-port)))
+  (set-pixbuf-loader-thread!
+   loader (create-pixbuf-loader-thread loader)))
+
+(define (create-pixbuf-loader-thread loader)
+  (create-thread
+   #f (lambda ()
+       (let ((port (pixbuf-loader-port loader))
+             (alien (gobject-alien loader))
+             (GError-ptr (malloc (C-sizeof "*") '(* |GError|)))
+             (buff (allocate-external-string 4200)))
+         (C->= GError-ptr "* GError" 0)
+         (let ((buff-address (external-string-descriptor buff)))
+
+           (define (note-error)
+             (let* ((GError (C-> GError-ptr "*" (make-alien '|GError|)))
+                    (message (and (not (alien-null? GError))
+                                  (c-peek-cstring
+                                   (C-> GError "GError message")))))
+               (set-pixbuf-loader-error-message!
+                loader (or message "Bogus GError address."))
+               (C-call "g_error_free" GError)
+               (free GError-ptr)))
+
+           (let loop ()
+             (let ((n (input-port/read-string! port buff)))
+               ;; Adaptively grow the buff if n == 4200?
+               (cond ((and (fix:zero? n) (eof-object? (peek-char port)))
+                      (if (fix:zero?
+                           (C-call "gdk_pixbuf_loader_close" alien GError-ptr))
+                          (note-error)
+                          (close-input-port port))
+                      ;; (gobject-unref loader)  Need to ref the pixbuf first!
+                      unspecific)
+                     ((not (fix:zero?
+                            (C-call "gdk_pixbuf_loader_write"
+                                    alien buff-address n GError-ptr)))
+                      (loop))
+                     (else
+                      (note-error)
+                      unspecific)))))))))
+
+(define (load-pixbuf-from-file loader filename)
+  (start-pixbuf-loader
+   loader (open-binary-input-file (->namestring (->truename filename)))))
+
+(define (initialize-package!)
+  (add-event-receiver! event:after-restore reset-quark-cache!)
+  (add-event-receiver! event:after-restore reset-gc-cleanups!)
+  unspecific)
\ No newline at end of file
diff --git a/src/gtk/gtk-ev.scm b/src/gtk/gtk-ev.scm
new file mode 100644 (file)
index 0000000..8aa92ec
--- /dev/null
@@ -0,0 +1,541 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; An event viewer, a translation of Havoc Pennington's GtkEv example.
+;;; package: (gtk)
+
+(declare (usual-integrations))
+\f
+
+(c-include "gtk")
+
+(define (gtk-event-viewer)
+  (let ((window (gtk-window-new 'toplevel))
+       (gtk-ev (gtk-event-viewer-new)))
+    (gtk-container-add window gtk-ev)
+    (gtk-window-set-title window "gtk-event-viewer")
+    (gtk-container-set-border-width window 10)
+    (g-signal-connect window (C-callback "delete_event")
+      (let ((counter 0))
+       (named-lambda (gtk-event-viewer::delete-event w e)
+         (trace2 ";(gtk-event-viewer::delete_event "w" "e")\n")
+         (let ((num (number->string (- 2 counter))))
+           (push-text gtk-ev (list (string-append "Delete me "num" times."))))
+         (outf-console ";Delete me "(- 2 counter)" times.\n")
+         (set! counter (1+ counter))
+         ;; Three or more is the charm.
+         (if (> counter 2) 0 1))))
+    (gtk-widget-show-all window)
+    gtk-ev))
+
+(define-class (<gtk-event-viewer>
+              (constructor make-gtk-event-viewer ()))
+    (<scm-widget>)
+
+  ;; GdkWindow alien, and the window geometry (allocation).
+  (window define standard
+         initializer (lambda () (make-alien '|GdkWindow|)))
+  (geometry define standard
+           initializer make-rect)
+
+  ;; GdkWindow alien, and the window geometry (computed from the allocation).
+  (event-window define standard
+               initializer (lambda () (make-alien '|GdkWindow|)))
+  (event-box define standard
+            initializer make-rect)
+
+  ;; Geometry of the description area.
+  (description-box define standard
+                  initializer make-rect)
+
+  ;; List of lines (strings, no newlines) to be displayed in the
+  ;; description area.
+  (buffer define standard
+         initial-value '()))
+
+(define (gtk-event-viewer-new)
+  (let ((w (make-gtk-event-viewer)))
+    (set-scm-widget-size-request! w (gtk-event-viewer-size-request w))
+    (set-scm-widget-size-allocate! w (gtk-event-viewer-size-allocate  w))
+    (set-scm-widget-realize! w (gtk-event-viewer-realize  w))
+    (set-scm-widget-unrealize! w (gtk-event-viewer-unrealize  w))
+    (set-scm-widget-event! w (gtk-event-viewer-event w))
+    w))
+
+(define (gtk-event-viewer-realize widget)
+  (named-lambda (gtk-event-viewer::realize GtkWidget)
+
+    (trace2 ";((gtk-event-viewer-realize "widget") "GtkWidget")\n")
+    (guarantee-my-alien 'gtk-event-viewer::realize widget GtkWidget)
+
+    ;; ScmWidget automatically sets GTK_REALIZED.
+
+    (let ((attr (malloc (C-sizeof "GdkWindowAttr") '|GdkWindowAttr|))
+         (main-GdkWindow (gtk-event-viewer-window widget))
+         (event-GdkWindow (gtk-event-viewer-event-window widget))
+         (parent-GdkWindow (make-alien '|GdkWindow|))
+         ;(GdkVisual (make-alien '|GdkVisual|))
+         ;(GdkColormap (make-alien '|GdkColormap|))
+         (GdkCursor (make-alien '|GdkCursor|))
+         (GtkStyle (make-alien '(struct |_GtkStyle|))))
+
+      ;; Main widget window.
+
+      ;(C-call "gtk_widget_get_visual" GdkVisual GtkWidget)
+      ;(check-!null GdkVisual "Could not get GdkVisual.")
+      ;(C-call "gtk_widget_get_colormap" GdkColormap GtkWidget)
+      ;(check-!null GdkColormap "Could not get GdkColormap.")
+
+      (C->= attr "GdkWindowAttr window_type" (C-enum "GDK_WINDOW_CHILD"))
+      (let ((b (gtk-event-viewer-geometry widget)))
+       (C->= attr "GdkWindowAttr x" (rect-x b))
+       (C->= attr "GdkWindowAttr y" (rect-y b))
+       (C->= attr "GdkWindowAttr width" (rect-width b))
+       (C->= attr "GdkWindowAttr height" (rect-height b)))
+      (C->= attr "GdkWindowAttr wclass" (C-enum "GDK_INPUT_OUTPUT"))
+      ;;(C->= attr "GdkWindowAttr visual" GdkVisual)
+      ;;(C->= attr "GdkWindowAttr colormap" GdkColormap)
+      (C->= attr "GdkWindowAttr event_mask"
+           (bit-or (C-call "gtk_widget_get_events" GtkWidget)
+                   (C-enum "GDK_EXPOSURE_MASK")))
+
+      (C-call "gtk_widget_get_parent_window" parent-GdkWindow GtkWidget)
+      (check-!null parent-GdkWindow "Could not get parent.")
+
+      (C-call "gdk_window_new" main-GdkWindow parent-GdkWindow attr
+             (bit-or (C-enum "GDK_WA_X") (C-enum "GDK_WA_Y")
+                     ;;(C-enum "GDK_WA_VISUAL") (C-enum "GDK_WA_COLORMAP")
+                     ))
+      (check-!null main-GdkWindow "Could not create main window.")
+      (C->= GtkWidget "GtkWidget window" main-GdkWindow)
+      (C-call "gdk_window_set_user_data" main-GdkWindow GtkWidget)
+
+      ;; Event window
+      (C-call "gdk_cursor_new" GdkCursor (C-enum "GDK_CROSSHAIR"))
+      (check-!null GdkCursor "Could not create cursor.")
+      (C->= attr "GdkWindowAttr window_type" (C-enum "GDK_WINDOW_CHILD"))
+      (let ((b (gtk-event-viewer-event-box widget)))
+       (C->= attr "GdkWindowAttr x" (rect-x b))
+       (C->= attr "GdkWindowAttr y" (rect-y b))
+       (C->= attr "GdkWindowAttr width" (rect-width b))
+       (C->= attr "GdkWindowAttr height" (rect-height b)))
+      (C->= attr "GdkWindowAttr wclass" (C-enum "GDK_INPUT_OUTPUT"))
+      ;;(C->= attr "GdkWindowAttr visual" GdkVisual)
+      ;;(C->= attr "GdkWindowAttr colormap" GdkColormap)
+      (C->= attr "GdkWindowAttr event_mask" (C-enum "GDK_ALL_EVENTS_MASK"))
+      (C->= attr "GdkWindowAttr cursor" GdkCursor)
+      (C-call "gdk_window_new" event-GdkWindow main-GdkWindow attr
+             (bit-or (C-enum "GDK_WA_X") (C-enum "GDK_WA_Y")
+                     ;;(C-enum "GDK_WA_VISUAL") (C-enum "GDK_WA_COLORMAP")
+                     (C-enum "GDK_WA_CURSOR")))
+      (check-!null event-GdkWindow "Could not create event window.")
+      (C-call "gdk_window_set_user_data" event-GdkWindow GtkWidget)
+      (C-call "gdk_window_show" event-GdkWindow)
+      (C-call "gdk_cursor_destroy" GdkCursor)
+
+      ;; Style
+
+      (C-call "gtk_style_attach" GtkStyle
+             (C-> GtkWidget "GtkWidget style") main-GdkWindow)
+      (C->= GtkWidget "GtkWidget style" GtkStyle)
+      (C-call "gtk_style_set_background"
+             GtkStyle main-GdkWindow (C-enum "GTK_STATE_NORMAL"))
+      (C-call "gdk_window_set_background"
+             event-GdkWindow
+             (C-array-loc! (C-> GtkStyle "struct _GtkStyle base")
+                           "GdkColor" (C-enum "GTK_STATE_NORMAL")))
+      unspecific)))
+
+(define (gtk-event-viewer-unrealize widget)
+  (named-lambda (gtk-event-viewer::unrealize GtkWidget)
+
+    (trace2 ";((gtk-event-viewer-unrealize "widget") "GtkWidget")\n")
+    (guarantee-my-alien 'GTK-EVENT-VIEWER::UNREALIZE widget GtkWidget)
+
+    ;; ScmWidget automatically unmaps if necessary.
+
+    ;; Destroy our child window.
+    (let ((event-GdkWindow (gtk-event-viewer-event-window widget)))
+      (if (not (alien-null? event-GdkWindow))
+         (begin
+           (C-call "gdk_window_set_user_data" event-GdkWindow null-alien)
+           (C-call "gdk_window_destroy" event-GdkWindow)
+           (alien-null! event-GdkWindow))))
+
+    ;; The ScmWidget will chain up, calling parent_class->unrealize,
+    ;; as required by the toolkit.
+    unspecific))
+
+(define (gtk-event-viewer-size-request widget)
+  (named-lambda (gtk-event-viewer::size-request GtkWidget GtkRequisition)
+
+    (trace2 ";((gtk-event-viewer-size-request "widget") "GtkWidget" "GtkRequisition")\n")
+    (guarantee-my-alien 'GTK-EVENT-VIEWER::SIZE-REQUEST widget GtkWidget)
+
+    ;; GtkEv always wants to be the same fixed size.
+
+    (C->= GtkRequisition "GtkRequisition width" 450)
+    (C->= GtkRequisition "GtkRequisition height" 300)
+    unspecific))
+
+(define (gtk-event-viewer-size-allocate widget)
+  (named-lambda (gtk-event-viewer::size-allocate GtkWidget GtkAllocation)
+
+    (trace2 ";((gtk-event-viewer-size-allocate "widget") "GtkWidget" "GtkAllocation")\n")
+    (guarantee-my-alien 'GTK-EVENT-VIEWER::SIZE-ALLOCATE widget GtkWidget)
+
+    (let ((x (C-> GtkAllocation "GtkAllocation x"))
+         (y (C-> GtkAllocation "GtkAllocation y"))
+         (width (C-> GtkAllocation "GtkAllocation width"))
+         (height (C-> GtkAllocation "GtkAllocation height"))
+         (spacing 10))
+      (set-rect! (gtk-event-viewer-geometry widget) x y width height)
+      (C->= GtkWidget "GtkWidget allocation x" x)
+      (C->= GtkWidget "GtkWidget allocation y" y)
+      (C->= GtkWidget "GtkWidget allocation width" width)
+      (C->= GtkWidget "GtkWidget allocation height" height)
+      (let ((event-width (max (- width (* 2 spacing)) 0))
+           (event-height (max (- (quotient height 5) spacing) 0)))
+       (let ((event-x (quotient (- width event-width) 2))
+             (event-y (min height spacing)))
+         (set-rect! (gtk-event-viewer-event-box widget)
+                    event-x event-y event-width event-height)
+         (let* ((desc-x event-x)
+                (desc-y (+ event-y (+ event-height spacing)))
+                (desc-width event-width)
+                (desc-height (max (- height (+ event-height (* 3 spacing)))
+                                  0)))
+           (set-rect! (gtk-event-viewer-description-box widget)
+                      desc-x desc-y desc-width desc-height))
+
+         (if (not (alien-null? (gtk-event-viewer-window widget))) ;GTK_WIDGET_REALIZED
+             (begin
+               (C-call "gdk_window_move_resize"
+                       (gtk-event-viewer-window widget) x y width height)
+               (C-call "gdk_window_move_resize"
+                       (gtk-event-viewer-event-window widget)
+                       event-x event-y event-width event-height)))
+         unspecific)))))
+
+;;; For debugging.
+;;;(define gtk-event-viewer-events '())
+
+(define (gtk-event-viewer-event widget)
+  (named-lambda (gtk-event-viewer::event GtkWidget GdkEvent)
+
+    (trace2 ";((gtk-event-viewer-event "widget") "GtkWidget" "GdkEvent")\n")
+    (guarantee-my-alien 'gtk-event-viewer::event widget GtkWidget)
+    (let ((window (C-> GdkEvent "GdkEvent any window"))
+         (type (C-> GdkEvent "GdkEvent any type")))
+      (let ((addr (alien/address-string window))
+           (name (C-enum "GdkEventType" type)))
+       (trace "; "name" on window 0x"addr".\n"))
+
+;;;   (set! gtk-event-viewer-events (cons (let ((alien (make-alien '|GdkEvent|)))
+;;;                               (C-call "gdk_event_copy" alien GdkEvent)
+;;;                               (check-!null alien "could not copy event")
+;;;                               alien)
+;;;                             gtk-event-viewer-events))
+
+      (if (not (alien=? window (gtk-event-viewer-window widget)))
+         (push-text widget (event-to-text GdkEvent)))
+
+      (if (= type (C-enum "GDK_EXPOSE"))
+         (expose-handler widget GdkEvent)
+         (begin
+           (if (and (= type (C-enum "GDK_KEY_PRESS"))
+                    (= (C-> GdkEvent "GdkEvent key keyval")
+                       (C-enum "GDK_D")))
+               ;; Test debugging in a callback.
+               (bkpt 'Test))
+
+           (if (= type (C-enum "GDK_MOTION_NOTIFY"))
+               (C-call "gdk_window_get_pointer" #f
+                       (C-> GdkEvent "GdkEventMotion window")
+                       null-alien null-alien null-alien))
+           0 ;;FALSE -- not handled.
+           )))))
+
+(define (expose-handler widget GdkEventExpose)
+
+  (let ((window (C-> GdkEventExpose "GdkEventExpose window"))
+       (x (C-> GdkEventExpose "GdkEventExpose area x"))
+       (y (C-> GdkEventExpose "GdkEventExpose area y"))
+       (width (C-> GdkEventExpose "GdkEventExpose area width"))
+       (height (C-> GdkEventExpose "GdkEventExpose area height")))
+    (trace ";  Expose "x","y" "width"x"height"\n")
+    (cond ((alien=? (gtk-event-viewer-window widget) window)
+          (paint-window widget x y width height))
+         ((alien=? (gtk-event-viewer-event-window widget) window)
+          (paint-event-window widget x y width height))
+         (else (ferror "gtk-event-viewer-expose: unexpected window "window))))
+  1 ;;TRUE -- handled.
+  )
+
+(define (paint-window widget x y width height)
+  (trace2 ";(paint-window "widget" "x" "y" "width" "height")\n")
+  (let* ((alien (gobject-alien widget))
+        (window (gtk-event-viewer-window widget))
+        (rect (gtk-event-viewer-event-box widget))
+        (style (C-> alien "GtkWidget style"))
+        (state (C-> alien "GtkWidget state"))
+        (black-gc (C-> style "GtkStyle black_gc"))
+        (exposed-area (gdk-rectangle x y width height)))
+
+    ;; No longer needed in Gtk+2.0.
+    ;;(C-call "gdk_window_clear_area" window x y width height)
+    ;;(C-call "gdk_gc_set_clip_rectangle" black-gc exposed-area)
+
+    ;; Draw a black rectangle around the event window
+
+    (C-call "gdk_draw_rectangle" window black-gc 0
+           (-1+ (rect-x rect))
+           (-1+ (rect-y rect))
+           (+ 2 (rect-width rect))
+           (+ 2 (rect-height rect)))
+    (C-call "gdk_gc_set_clip_rectangle" black-gc null-alien)
+
+    ;; Draw text in the description area, if applicable.
+
+    (if (gtk-event-viewer-buffer widget)
+       (let* ((descrip-box (gtk-event-viewer-description-box widget))
+              (descrip-gdkrect (gdk-rectangle-from-rect descrip-box))
+              (intersection (gdk-rectangle)))
+         (if (not (= 0 (C-call "gdk_rectangle_intersect"
+                                   exposed-area descrip-gdkrect intersection)))
+             (let ((space 2)
+                   (desc-bottom (rect-max-y descrip-box))
+                   (layout (make-alien '|PangoLayout|)))
+               (C-call "gtk_widget_create_pango_layout" layout
+                       alien null-alien)
+               (let loop ((y (rect-y descrip-box))
+                          (lines (gtk-event-viewer-buffer widget)))
+                 (if (null? lines)
+                     unspecific
+                     (let ((line (car lines))
+                           (iter (make-alien '|PangoLayoutIter|)))
+                       (C-call "pango_layout_set_text" layout line -1)
+                       (C-call "pango_layout_get_iter" iter layout)
+                       (let ((baseline
+                              (pangos->pixels
+                               (C-call "pango_layout_iter_get_baseline"
+                                       iter))))
+                         (C-call "gtk_paint_layout"
+                                 style window state 1 ;; Use the text gc.
+                                 intersection alien "gtk-event-viewer"
+                                 10 y layout)
+                         (C-call "pango_layout_iter_free" iter)
+                         (alien-null! iter)
+                         (let ((new-y (+ y (+ baseline space))))
+                           (if (> new-y desc-bottom)
+                               (begin
+                                 (set-cdr! lines '())
+                                 unspecific)
+                               (loop new-y (cdr lines))))))))
+               (C-call "g_object_unref" layout)))
+         (free descrip-gdkrect)
+         (free intersection)))
+
+    (if (gtk-widget-has-focus? widget)
+       (C-call "gtk_paint_focus"
+               style window state null-alien alien "gtk-event-viewer"
+               x y (-1+ width) (-1+ height)))
+    (free exposed-area)
+    unspecific))
+
+(define (paint-event-window widget x y width height)
+  (trace2 ";(paint-event-window "widget" "x" "y" "width" "height")\n")
+  (let ((alien (gobject-alien widget))
+       (event-window (gtk-event-viewer-event-window widget))
+       (extent (pango-rectangle))
+       (layout (make-alien '|PangoLayout|))
+       (area (pango-rectangle x y width height)))
+    (C-call "gdk_window_clear_area" event-window x y width height)
+    (let ((title (string-append "Event Window (0x"
+                               (alien/address-string event-window)")")))
+      (C-call "gtk_widget_create_pango_layout" layout alien title))
+    (C-call "pango_layout_get_pixel_extents" layout extent null-alien)
+    (C-call "gtk_paint_layout"
+           (C-> alien "GtkWidget style")
+           event-window
+           (C-> alien "GtkWidget state")
+           1 ;; Use the text gc, not the fg gc.
+           area alien "gtk-event-viewer"
+           ;;center
+           (quotient (- (rect-width (gtk-event-viewer-event-box widget))
+                        (C-> extent "PangoRectangle width"))
+                     2)
+           0
+           layout)
+    (C-call "g_object_unref" layout)
+    (free extent)
+    (free area)
+    unspecific))
+
+(define (push-text ev lines)
+  (set-gtk-event-viewer-buffer! ev (append lines (gtk-event-viewer-buffer ev)))
+  (if (gtk-widget-drawable? ev)
+      (let ((a (gobject-alien ev))
+           (r (gtk-event-viewer-description-box ev)))
+       (C-call "gtk_widget_queue_draw_area"
+               a (rect-x r) (rect-y r) (rect-width r) (rect-height r)))))
+\f
+
+(define (event-to-text GdkEvent)
+  (let ((name-line (event-name-line GdkEvent))
+       (any-line (any-event-line GdkEvent))
+       (detail (event-detail-line GdkEvent))
+       (state (event-state-line GdkEvent)))
+    (append!
+     (list name-line)
+     (list (string-append "  " any-line))
+     (if detail (list (string-append "  " detail)) '())
+     (if state (list (string-append "  " state)) '()))))
+
+(define (event-name-line GdkEvent)
+  (let ((type (C-> GdkEvent "GdkEvent any type")))
+    (string-append (symbol-name (C-enum "GdkEventType" type)) "\n")))
+
+(define (any-event-line GdkEvent)
+  (let ((event-time (C-call "gdk_event_get_time" GdkEvent))
+       (addr (alien/address-string (C-> GdkEvent "GdkEvent any window")))
+       (send (if (not (= 0 (C-> GdkEvent "GdkEvent any send_event")))
+                 "True" "False")))
+    (if (not (= event-time (C-enum "GDK_CURRENT_TIME")))
+       (cat "Window: 0x"addr" Time: "event-time" send_event: "send"\n")
+       (cat "Window: 0x"addr" send_event: "send"\n"))))
+
+(define (cat . objects)
+  (apply string-append (map (lambda (obj)
+                             (if (string? obj) obj (write-to-string obj)))
+                           objects)))
+
+(define (event-state-line GdkEvent)
+  (let* ((type (C-> GdkEvent "GdkEvent any type"))
+        (state ;;GdkModifierType
+         (cond ((= type (C-enum "GDK_MOTION_NOTIFY"))
+                (C-> GdkEvent "GdkEvent motion state"))
+               ((memv type `(,(C-enum "GDK_BUTTON_PRESS")
+                             ,(C-enum "GDK_2BUTTON_PRESS")
+                             ,(C-enum "GDK_3BUTTON_PRESS")
+                             ,(C-enum "GDK_BUTTON_RELEASE")))
+                (C-> GdkEvent "GdkEvent button state"))
+               ((memv type `(,(C-enum "GDK_KEY_PRESS")
+                             ,(C-enum "GDK_KEY_RELEASE")))
+                (C-> GdkEvent "GdkEvent key state"))
+               (else #f)))
+        (line
+         (and state
+              (string-append
+               (decorated-string-append
+                "" " | " ""
+                (append!
+                 (if (not (= 0 (bit-and state (C-enum "GDK_SHIFT_MASK"))))
+                     (list "Shift") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_LOCK_MASK"))))
+                     (list "Lock") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_CONTROL_MASK"))))
+                     (list "Ctrl") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_MOD1_MASK"))))
+                     (list "Mod1") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_MOD2_MASK"))))
+                     (list "Mod2") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_MOD3_MASK"))))
+                     (list "Mod3") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_MOD4_MASK"))))
+                     (list "Mod4") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_MOD5_MASK"))))
+                     (list "Mod5") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_BUTTON1_MASK"))))
+                     (list "Button1") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_BUTTON2_MASK"))))
+                     (list "Button2") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_BUTTON3_MASK"))))
+                     (list "Button3") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_BUTTON4_MASK"))))
+                     (list "Button4") '())
+                 (if (not (= 0 (bit-and state (C-enum "GDK_RELEASE_MASK"))))
+                     (list "Release") '())))
+               "\n"))))
+    (if (or (not line) (string=? line "\n")) #f line)))
+
+(define (event-detail-line GdkEvent)
+  (let ((type (C-> GdkEvent "GdkEvent any type")))
+    (cond ((= type (C-enum "GDK_EXPOSE"))
+          (let ((x (C-> GdkEvent "GdkEvent expose area x"))
+                (y (C-> GdkEvent "GdkEvent expose area y"))
+                (width (C-> GdkEvent "GdkEvent expose area width"))
+                (height (C-> GdkEvent "GdkEvent expose area height"))
+                (count (C-> GdkEvent "GdkEvent expose count")))
+            (cat "Area: "x","y" "width"x"height" Count: "count"\n")))
+         ((= type (C-enum "GDK_MOTION_NOTIFY"))
+          (let ((x (C-> GdkEvent "GdkEvent motion x"))
+                (y (C-> GdkEvent "GdkEvent motion y")))
+            (cat "x: "x" y: "y"\n")))
+         ((memq type `(,(C-enum "GDK_BUTTON_PRESS")
+                       ,(C-enum "GDK_2BUTTON_PRESS")
+                       ,(C-enum "GDK_3BUTTON_PRESS")
+                       ,(C-enum "GDK_BUTTON_RELEASE")))
+          (cat "Button: "(C-> GdkEvent "GdkEvent button button")"\n"))
+         ((memq type `(,(C-enum "GDK_KEY_PRESS")
+                       ,(C-enum "GDK_KEY_RELEASE")))
+          (let ((keyval (C-enum "enum GdkKeysyms"
+                                (C-> GdkEvent "GdkEvent key keyval")))
+                (text (let ((alien (make-alien '|gchar|)))
+                        (C-> GdkEvent "GdkEvent key string" alien)
+                        (c-peek-cstring alien))))
+            (cat "Keyval: "keyval" Text: "text"\n")))
+         (else
+          #f))))
+
+(define (check-!null alien message)
+  (if (alien-null? alien)
+      (begin
+       (ferror "gtk-event-viewer: "message))
+      alien))
+
+(define (guarantee-my-alien name widget alien)
+  ;; Complain if the WIDGET's alien does not match ALIEN.  NAME is the
+  ;; widget method name or other debugging help.  Just warn, since
+  ;; this is used in callbacks.
+
+  (cond ((alien-null? (gobject-alien widget))
+        (fwarn "in "name", "widget" has been finalized (or never"
+               " initialized)."))
+       ((not (alien=? alien (gobject-alien widget)))
+        (fwarn "in "name", "alien" is not the expected "
+               (gobject-alien widget)"."))))
+\f
+
+(define trace? #f)
+(define trace2? #f)
+
+(define-syntax trace
+  (syntax-rules ()
+    ((_ . ARGS) (if trace? ((lambda () (outf-console . ARGS)))))))
+
+(define-syntax trace2
+  (syntax-rules ()
+    ((_ . ARGS) (if trace2? ((lambda () (outf-console . ARGS)))))))
\ No newline at end of file
diff --git a/src/gtk/gtk-object.scm b/src/gtk/gtk-object.scm
new file mode 100644 (file)
index 0000000..16f4268
--- /dev/null
@@ -0,0 +1,326 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; GtkObjects/GtkWidgets/GtkContainers
+;;; package: (gtk object)
+
+
+(c-include "gtk")
+
+(define-class <gtk-object> (<gobject>)
+  (destroyed? define standard initial-value #f))
+
+(define-method initialize-instance ((object <gtk-object>))
+  ;; Arrange for all gtk-objects to be destroyed by gtk_object_destroy
+  ;; when GCed.  Does NOT chain (further) up; gtk-object-cleanup is
+  ;; sufficient.  g_object_unref probably should NOT be called!
+  (add-gc-cleanup object
+                 (gtk-object-cleanup-thunk
+                  (gobject-alien object)
+                  (gobject-signals object))))
+
+(define (gtk-object-cleanup-thunk alien signals)
+  ;; Return a thunk closed over ALIEN and SIGNALS (but not the gtk-object).
+ (lambda ()
+   (gtk-object-cleanup alien signals)))
+
+(define (gtk-object-cleanup alien signals)
+  (without-interrupts
+   (lambda ()
+     (if (not (alien-null? alien))
+        (begin
+          (C-call "gtk_object_destroy" alien)
+          (alien-null! alien)))))
+  ;; De-register signals.  Nulled alien will not be g_object_unrefed.
+  (gobject-finalize! alien signals))
+
+(define-generic gtk-object-destroy (object))
+
+(define-method gtk-object-destroy ((object <gtk-object>))
+  ;; Calls gtk_object_destroy and sets the destroyed? flag.
+  (if (not (gtk-object-destroyed? object))
+      (begin
+       (set-gtk-object-destroyed?! object #t)
+       (gtk-object-cleanup (gobject-alien object) (gobject-signals object)))))
+\f
+
+;;;; GtkAdjustments
+
+(define-class (<gtk-adjustment> (constructor ())) (<gtk-object>))
+
+;(define-integrable (gtk-adjustment-value adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment value"))
+;(define-integrable (gtk-adjustment-lower adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment lower"))
+;(define-integrable (gtk-adjustment-upper adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment upper"))
+;(define-integrable (gtk-adjustment-step-increment adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment step_increment"))
+;(define-integrable (gtk-adjustment-page-increment adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment page_increment"))
+;(define-integrable (gtk-adjustment-page-size adjustment)
+;  (C-> (live-alien-adjustment adjustment) "GtkAdjustment page_size"))
+(define (live-alien-adjustment object)
+  (if (gtk-adjustment? object)
+      (if (not (gobject-finalized? object))
+         (gobject-alien object)
+         (ferror "The gtk-adjustment "object" has been finalized."))
+      (ferror "The object "object" is not a <gtk-adjustment> instance.")))
+
+(define (set-gtk-adjustment! adjustment value
+                            lower upper page-size
+                            step-incr page-incr)
+  (let ((alien (live-alien-adjustment adjustment))
+       (new-lower (floor->exact (check-real lower)))
+       (new-upper (floor->exact (check-real upper)))
+       (new-value (floor->exact (check-real value)))
+       (new-page-size (floor->exact (check-real page-size)))
+       (new-step-incr (floor->exact (check-real step-incr)))
+       (new-page-incr (floor->exact (check-real page-incr))))
+    (let ((old-lower (floor->exact (C-> alien "GtkAdjustment lower")))
+         (old-upper (floor->exact (C-> alien "GtkAdjustment upper")))
+         (old-value (floor->exact (C-> alien "GtkAdjustment value")))
+         (old-page-size
+          (floor->exact (C-> alien "GtkAdjustment page_size")))
+         (old-step-incr
+          (floor->exact (C-> alien "GtkAdjustment step_increment")))
+         (old-page-incr
+          (floor->exact (C-> alien "GtkAdjustment page_increment"))))
+      (if (not (int:= new-lower old-lower))
+         (C->= alien "GtkAdjustment lower" new-lower))
+      (if (not (int:= new-upper old-upper))
+         (C->= alien "GtkAdjustment upper" new-upper))
+      (if (not (int:= new-value old-value))
+         (C->= alien "GtkAdjustment value" new-value))
+      (if (not (int:= new-page-size old-page-size))
+         (C->= alien "GtkAdjustment page_size" new-page-size))
+      (if (not (int:= new-step-incr old-step-incr))
+         (C->= alien "GtkAdjustment step_increment" new-step-incr))
+      (if (not (int:= new-page-incr old-page-incr))
+         (C->= alien "GtkAdjustment page_increment" new-page-incr))
+      (if (or (not (int:= new-lower old-lower))
+             (not (int:= new-upper old-upper))
+             (not (int:= new-page-size old-page-size))
+             (not (int:= new-step-incr old-step-incr))
+             (not (int:= new-page-incr old-page-incr)))
+         (C-call "gtk_adjustment_changed" alien))
+      (if (not (int:= new-value old-value))
+         (C-call "gtk_adjustment_value_changed" alien)))))
+
+(define (check-real object)
+  (if (real? object) object
+      (ferror "The object "object" is not a real number.")))
+\f
+
+;;;; GtkWidgets, GtkContainers
+
+(define-class <gtk-widget> (<gtk-object>)
+
+  ;; The parent <gtk-widget> or #f.
+  (parent define standard initial-value #f))
+
+(define (gtk-widget-has-focus? widget)
+  (let* ((alien (gobject-alien (check-gtk-widget widget)))
+        (flags (C-> alien "GtkWidget object flags")))
+    (not (int:zero? (bit-and flags (C-enum "GTK_HAS_FOCUS"))))))
+
+(define (gtk-widget-drawable? widget)
+  (let* ((alien (gobject-alien (check-gtk-widget widget)))
+        (flags (C-> alien "GtkWidget object flags")))
+    (and (not (int:zero? (bit-and flags (C-enum "GTK_VISIBLE"))))
+        (not (int:zero? (bit-and flags (C-enum "GTK_MAPPED")))))))
+
+(define (gtk-widget-show-all widget)
+  (C-call "gtk_widget_show_all"
+         (gobject-alien (check-gtk-widget widget))))
+
+(define-class <gtk-container> (<gtk-widget>)
+
+  ;; A list of child gtk-widgets.
+  (children define standard initial-value '()))
+
+(define-method gtk-object-destroy ((widget <gtk-container>))
+  ;; Calls gtk_object_destroy for WIDGET and all its children.
+
+  (call-next-method widget)
+  (for-each (lambda (child) (gtk-container-destroy-child child))
+           (gtk-container-children widget)))
+
+(define (gtk-container-destroy-child child)
+  ;; Destroy the child of a container without actually calling
+  ;; gtk_object_destroy, since an earlier call to gtk_object_destroy
+  ;; with an ancestor gtk-widget has already destroyed this child in
+  ;; the toolkit.  Just mark these wrappers as destroyed (implicitly).
+  (if (not (gtk-object-destroyed? child))
+      (let ((alien (gobject-alien child)))
+       (alien-null! alien)
+       (gtk-object-destroy child))))
+
+(define (gtk-container-add parent child)
+  ;; gtk_container_add with some Scheme-side bookkeeping.
+  (let ((children (gtk-container-children parent)))
+    (if (memq child children)
+       (ferror child" is already contained in "parent"."))
+    (set-gtk-container-children! parent (cons child children)))
+  (set-gtk-widget-parent! child parent)
+  (C-call "gtk_container_add"
+         (gobject-alien parent) (gobject-alien child))
+  unspecific)
+
+(define (gtk-container-set-border-width container width)
+  (C-call "gtk_container_set_border_width"
+         (gobject-alien (check-gtk-container container))
+         width))
+
+(define (check-gtk-widget object)
+  (if (gtk-widget? object) object
+      (ferror object" is not a <gtk-widget> instance.")))
+
+(define (check-gtk-container object)
+  (if (gtk-container? object) object
+      (ferror object" is not a <gtk-container> instance.")))
+\f
+
+;;; GtkLabels
+
+(define-class (<gtk-label> (constructor ())) (<gtk-widget>))
+
+(define (gtk-label-new string)
+  (let* ((s (if (string? string) string
+               (ferror "The gtk-label string ("string") is not a string.")))
+        (l (make-gtk-label))
+        (a (gobject-alien l)))
+    (C-call "gtk_label_new" a s)
+    (if (alien-null? a) (ferror "Could not create label "string"."))
+    l))
+
+(define (gtk-label-get-text label)
+  (let ((retval (make-alien '|gchar|)))
+    (C-call "gtk_label_get_text" retval (gobject-alien label))
+    (c-peek-cstring retval)))
+
+(define (gtk-label-set-text label string)
+  (let ((s (if (string? string) string
+              (ferror "The gtk-label string ("string") is not a string."))))
+    (C-call "gtk_label_set_text" (gobject-alien label) s)))
+\f
+
+;;; GtkButtons
+
+(define-class (<gtk-button> (constructor ())) (<gtk-container>))
+
+(define (gtk-button-new)
+  (let* ((b (make-gtk-button))
+        (a (gobject-alien b)))
+    (C-call "gtk_button_new" a)
+    (if (alien-null? a) (ferror "Could not create button."))
+    b))
+\f
+
+;;; GtkVBox
+
+(define-class (<gtk-vbox> (constructor ())) (<gtk-container>))
+
+(define (gtk-vbox-new homogeneous? spacing)
+  ;; homogeneous : TRUE if all children are to be given equal space allotments.
+  ;; spacing : the number of pixels to place by default between children.
+
+  (let* ((vbox (make-gtk-vbox))
+        (alien (gobject-alien vbox)))
+    (C-call "gtk_vbox_new" alien (if homogeneous? 1 0) spacing)
+    (if (alien-null? alien) (ferror "Could not create vbox."))
+    vbox))
+
+(define (gtk-box-pack-start box child expand? fill? padding)
+  (let ((children (gtk-container-children box)))
+    (if (memq child children)
+       (ferror "Child "child" is already packed in parent "box"."))
+    (set-gtk-container-children! box (cons child children)))
+  (set-gtk-widget-parent! child box)
+  (C-call "gtk_box_pack_start" (gobject-alien box) (gobject-alien child)
+         (if expand? 1 0) (if fill? 1 0) padding)
+  unspecific)
+
+(define (gtk-box-pack-end box child expand? fill? padding)
+  (let ((children (gtk-container-children box)))
+    (if (memq child children)
+       (ferror "Child "child" is already packed in parent "box"."))
+    (set-gtk-container-children! box (cons child children)))
+  (set-gtk-widget-parent! child box)
+  (C-call "gtk_box_pack_end" (gobject-alien box) (gobject-alien child)
+         (if expand? 1 0) (if fill? 1 0) padding)
+  unspecific)
+\f
+
+;;;; GtkScrolledWindows
+
+(define-class (<gtk-scrolled-window>
+              (constructor make-gtk-scrolled-window ()))
+  (<gtk-container>))
+
+(define (gtk-scrolled-window-new)
+  (let* ((window (make-gtk-scrolled-window))
+        (alien (gobject-alien window)))
+    (C-call "gtk_scrolled_window_new" alien null-alien null-alien)
+    (if (alien-null? alien) (ferror "Could not create GtkScrolledWindow."))
+    window))
+\f
+
+;;;; GtkWindows
+
+(define-class (<gtk-window> (constructor make-gtk-window (type)))
+             (<gtk-container>)
+  ;; 'POPUP or 'TOPLEVEL
+  (type define accessor))
+
+(define (gtk-window-new type)
+  (let* ((type (check-window-type type))
+        (window (make-gtk-window type))
+        (alien (gobject-alien window)))
+    (C-call "gtk_window_new" alien
+           (case type
+             ((TOPLEVEL) (C-enum "GTK_WINDOW_TOPLEVEL"))
+             ((POPUP) (C-enum "GTK_WINDOW_POPUP"))))
+    (if (alien-null? alien) (ferror "Could not create window."))
+    (g-signal-connect window (C-callback "destroy")
+      (named-lambda (gtk-window-new::destroy GtkObject)
+       GtkObject ;;ignore
+       (gtk-object-destroy window)))
+    (C-call "gtk_window_set_default_size" alien -1 -1)
+    window))
+
+(define (check-window-type type)
+  (case type
+    ((TOPLEVEL POPUP) type)
+    (else
+     (check-window-type
+      (ferror "The argument to gtk-window-new must be one of"
+             " the symbols TOPLEVEL or POPUP (not "type").")))))
+
+(define (gtk-window-set-title window string)
+  (C-call "gtk_window_set_title" (gobject-alien window) string))
+
+(define (gtk-window-set-default-size window width height)
+  (C-call "gtk_window_set_default_size" (gobject-alien window) width height))
\ No newline at end of file
diff --git a/src/gtk/gtk-shim.h b/src/gtk/gtk-shim.h
new file mode 100644 (file)
index 0000000..96919ce
--- /dev/null
@@ -0,0 +1,69 @@
+/* -*-C-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+*/
+
+/* Header for gtk-shim.c, gtk-const.c and scmwidget.c. */
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkwidget.h>
+#include <cairo/cairo.h>
+
+#define GTK_TYPE_SCMWIDGET    (scm_widget_get_type ())
+#define GTK_SCMWIDGET(obj)    (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_SCMWIDGET, ScmWidget))
+#define GTK_IS_SCMWIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_SCMWIDGET))
+
+typedef unsigned int uint;
+typedef struct _ScmWidgetClass ScmWidgetClass;
+typedef struct _ScmWidget ScmWidget;
+
+struct _ScmWidgetClass
+{
+  GtkWidgetClass parent_class;
+  void (*set_scroll_adjustments) (GtkWidget *widget,
+                                 GtkAdjustment *hadjustment,
+                                 GtkAdjustment *vadjustment);
+
+  /* Padding for future expansion */
+  void (*_gtk_reserved1) (void);
+  void (*_gtk_reserved2) (void);
+  void (*_gtk_reserved3) (void);
+  void (*_gtk_reserved4) (void);
+};
+
+struct _ScmWidget
+{
+  GtkWidget widget;
+  /* Callback ids, for the methods to use when calling the callback tramps. */
+  gint finalize;
+  gint destroy;
+  gint realize;
+  gint unrealize;
+  gint size_request;
+  gint size_allocate;
+  gint event;
+  gint set_scroll_adjustments;
+};
+
+extern GtkWidget* scm_widget_new (void);
diff --git a/src/gtk/gtk.cdecl b/src/gtk/gtk.cdecl
new file mode 100644 (file)
index 0000000..cd8d90b
--- /dev/null
@@ -0,0 +1,170 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; C declarations for gtk.so.
+\f
+
+(include "Includes/gdkkeysyms")
+(include "Includes/gdk-pixbuf")
+(include "Includes/gtk")
+(include "Includes/pango")
+(include "Includes/cairo")
+;;(include "Includes/cairo-xlib")  Needs definitions for Drawable, Display...
+(include "Includes/pangocairo")
+
+;;; ScmWidget
+
+(typedef ScmWidget
+        (struct _ScmWidget
+                (widget GtkWidget)
+                (finalize gint)
+                (destroy gint)
+                (realize gint)
+                (unrealize gint)
+                (size_request gint)
+                (size_allocate gint)
+                (event gint)
+                (set_scroll_adjustments gint)))
+
+(extern (* GtkWidget) scm_widget_new)
+
+(callback void widget_finalize
+         (ID int) (object (* GObject)))
+(callback void widget_destroy
+         (ID int) (object (* GtkObject)))
+(callback void widget_realize
+         (ID int) (widget (* GtkWidget)))
+(callback void widget_unrealize
+         (ID int) (widget (* GtkWidget)))
+(callback void widget_size_request
+         (ID int) (widget (* GtkWidget)) (requisition (* GtkRequisition)))
+(callback void widget_size_allocate
+         (ID int) (widget (* GtkWidget)) (allocation (* GtkAllocation)))
+(callback gint widget_event
+         (ID int) (widget (* GtkWidget)) (event (* GdkEvent)))
+(callback void widget_set_scroll_adjustments
+         (ID int) (widget (* GtkWidget))
+         (hadj (* GtkAdjustment)) (vadj (* GtkAdjustment)))
+\f
+
+;;; Signal handlers.
+
+(callback void destroy
+         (object (* GtkObject))
+         (ID gpointer))
+
+(callback gboolean delete_event
+         (window (* GtkWidget))
+         (event (* GdkEventAny))
+         (ID gpointer))
+
+(callback void clicked
+         (widget (* GtkWidget))
+         (ID gpointer))
+
+(callback void value_changed
+         (adjustment (* GtkAdjustment))
+         (ID gpointer))
+
+(callback void size_prepared
+         (loader (* GdkPixbufLoader))
+         (width gint)
+         (height gint)
+         (ID gpointer))
+
+(callback void area_prepared
+         (loader (* GdkPixbufLoader))
+         (ID gpointer))
+
+(callback void area_updated
+         (loader (* GdkPixbufLoader))
+         (x gint)
+         (y gint)
+         (width gint)
+         (height gint)
+         (ID gpointer))
+\f
+
+;;; Random
+
+(extern void g_free                    ;glib-2.8.6/glib/gmem.h
+       (mem gpointer))
+
+(extern gboolean gtk_init_check
+       (argc (* int))
+       (argv (* (* (* char)))))
+
+(extern void
+       gtk_widget_queue_resize
+       (widget (* GtkWidget)))
+
+(extern void                           ;gtk+-2.4.0/gtk/gtkcontainer.h
+       gtk_container_add
+       (container (* GtkContainer))
+       (widget    (* GtkWidget)))
+
+(extern void                           ;gtk+-2.4.0/gtk/gtkcontainer.h
+       gtk_container_set_border_width
+       (container (* GtkContainer))
+       (border_width guint))
+
+(extern (* GtkWidget)                  ;gtk+-2.4.0/gtk/gtkwindow.h
+       gtk_window_new
+       (type GtkWindowType))
+
+(extern (* GtkWidget)                  ;gtk+-2.4.0/gtk/gtkbutton.h
+       gtk_button_new)
+
+(extern (* GtkWidget)                  ;gtk+-2.4.0/gtk/gtklabel.h
+       gtk_label_new
+       (str (* (const char))))
+
+(extern void                           ;gtk+-2.4.0/gtk/gtkwindow.h
+       gtk_window_set_title
+       (window (* GtkWindow))
+       (title  (* (const gchar))))
+
+(extern void                           ;gtk+-2.10.14/gtk/gtkwindow.h
+       gtk_window_set_default_size
+       (window (* GtkWindow))
+       (width gint)
+       (height gint))
+
+(extern (* (const gchar))              ;gtk+-2.4.0/gtk/gtklabel.h
+       gtk_label_get_text
+       (label (* GtkLabel)))
+
+(extern void gtk_label_set_text                ;gtk+-2.4.0/gtk/gtklabel.h
+       (label (* GtkLabel))
+       (str (* (const char))))
+
+(extern void gdk_rgb_find_color                ;gtk+-2.8.20/gdk/gdkrgb.h
+        (colormap (* GdkColormap))
+       (color (* GdkColor)))
+
+(extern (* GtkWidget)                  ;gtk+-2.8.20/gtk/gtkscrolledwindow.h
+       gtk_scrolled_window_new
+       (hadjustment (* GtkAdjustment))
+       (vadjustment (* GtkAdjustment)))
\ No newline at end of file
diff --git a/src/gtk/gtk.pkg b/src/gtk/gtk.pkg
new file mode 100644 (file)
index 0000000..f2c6049
--- /dev/null
@@ -0,0 +1,127 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Gtk System Packaging |#
+
+(global-definitions "../runtime/runtime")
+(global-definitions "../ffi/ffi")
+(global-definitions "../sos/sos")
+
+(define-package (gtk)
+  (parent ())
+  (files "gtk"))
+
+(define-package (gtk main)
+  (parent (gtk))
+  (files "main")
+  (import (runtime load)
+         *unused-command-line*
+         hook/process-command-line
+         default/process-command-line)
+  (export (gtk)
+         gtk-time-slice-window?
+         gtk-time-slice-window!
+         gtk-select-trace?
+         gtk-select-trace!)
+  (initialization (initialize-package!)))
+
+(define-package (gtk thread)
+  (parent (runtime thread))
+  (files "thread")
+  (export (gtk)
+         create-gtk-thread
+         kill-gtk-thread)
+  (import (runtime primitive-io)
+         select-registry-handle))
+
+(define-package (gtk gobject)
+  (parent (gtk))
+  (files "gobject")
+  (export (gtk)
+         <gobject> gobject-alien
+         gobject-unref gobject-finalized? gobject-finalize!
+         g-signal-connect g-signal-disconnect add-gc-cleanup
+         gobject-get-property gobject-set-properties
+         gquark-from-string gquark-to-string
+         <pixbuf-loader> make-pixbuf-loader load-pixbuf-from-file
+         pixbuf-loader-started? pixbuf-loader-done?)
+  (initialization (initialize-package!)))
+
+(define-package (gtk object)
+  (parent (gtk))
+  (files "gtk-object")
+  (export (gtk)
+         <gtk-object> gtk-object-destroyed? gtk-object-destroy
+         <gtk-adjustment> make-gtk-adjustment set-gtk-adjustment!
+         <gtk-widget> gtk-widget? gtk-widget-parent
+         gtk-widget-has-focus? gtk-widget-drawable? gtk-widget-show-all
+         <gtk-container> gtk-container?
+         gtk-container-children gtk-container-add
+         gtk-container-set-border-width
+         <gtk-window> gtk-window-type
+         gtk-window-new gtk-window-set-title gtk-window-set-default-size
+         <gtk-button> gtk-button-new
+         <gtk-label> gtk-label-new
+         gtk-label-get-text gtk-label-set-text
+         <gtk-vbox> gtk-vbox-new gtk-box-pack-start gtk-box-pack-end
+         <gtk-scrolled-window> gtk-scrolled-window-new
+         pango-rectangle pangos->pixels pixels->pangos
+         pango-font-families pango-context-list-families
+         pango-font-family-get-name pango-font-family-is-monospace?
+         pango-font-family-faces pango-font-face-get-name)
+  (import (gtk gobject) gobject-finalize! gobject-signals))
+
+(define-package (gtk widget)
+  (parent (gtk))
+  (files "scm-widget")
+  (export (gtk)
+         <scm-widget>
+         set-scm-widget-destroy!
+         set-scm-widget-realize! set-scm-widget-unrealize!
+         set-scm-widget-size-request! set-scm-widget-size-allocate!
+         set-scm-widget-event! set-scm-widget-set-scroll-adjustments!))
+
+(define-package (gtk layout)
+  (parent (gtk))
+  (files "scm-layout")
+  (export (gtk)
+
+         <scm-layout> scm-layout-new
+         scm-layout-geometry set-scm-layout-size!
+         scm-layout-drawing set-scm-layout-drawing!
+         scm-layout-on-screen-area set-scm-layout-scroll-pos!
+
+         <drawing> make-drawing set-drawing-size! drawing-pick-list
+
+         <drawn-item> drawn-item-area set-drawn-item-position!
+         drawn-item-widgets set-drawn-item-widgets!
+
+         <box-item> add-box-item set-box-item-size!
+         set-box-item-pos-size! set-box-item-shadow!
+
+         <hline-item> add-hline-item set-hline-item-size!
+         <vline-item> add-vline-item set-vline-item-size!
+
+         <text-item> add-text-item text-item-text set-text-item-text!
+         text-item? text-item-xy-to-index
+         call-with-text-item-grapheme-rect
+
+         <image-item> add-image-item-from-file
+
+         image-item-area-updated image-item-area-prepared
+         image-item-size-prepared))
+
+(define-package (gtk event-viewer)
+  (parent (gtk))
+  (files "gtk-ev")
+  (export ()
+         gtk-event-viewer))
+
+(define-package (gtk demo)
+  (parent (gtk))
+  (files "demo")
+  (import (gtk layout)
+         scm-layout-event)
+  (export ()
+         scm-layout-demo))
\ No newline at end of file
diff --git a/src/gtk/gtk.scm b/src/gtk/gtk.scm
new file mode 100644 (file)
index 0000000..31bca4a
--- /dev/null
@@ -0,0 +1,334 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; Core utilities.
+;;; package: (gtk)
+
+
+(c-include "gtk")
+
+(define (bit-and . numbers)
+  (bit-string->unsigned-integer
+   (fold-left
+    (lambda (bits num)
+      (let ((bits2 (unsigned-integer->bit-string 32 num)))
+       (bit-string-and! bits bits2)
+       bits))
+    (signed-integer->bit-string 32 -1)
+    numbers)))
+
+(define (bit-or . numbers)
+  (bit-string->unsigned-integer
+   (fold-left
+    (lambda (bits num)
+      (let ((bits2 (unsigned-integer->bit-string 32 num)))
+       (bit-string-or! bits bits2)
+       bits))
+    (unsigned-integer->bit-string 32 0)
+    numbers)))
+\f
+
+;;;; Rectangles.
+
+(define-structure (rect (constructor make-rect (#!optional x y width height))
+                       (print-procedure 
+                        (standard-unparser-method 'RECT
+                         (lambda (rect port)
+                           (write-string
+                            (let ((x (number->string (rect-x rect)))
+                                  (y (number->string (rect-y rect)))
+                                  (w (number->string (rect-width rect)))
+                                  (h (number->string (rect-height rect))))
+                              (string-append " "w"x"h" at "x","y))
+                            port)))))
+  (x #f) (y #f) (width #f) (height #f))
+
+(define-integrable (set-rect! rect x y width height)
+  (set-rect-x! rect x)
+  (set-rect-y! rect y)
+  (set-rect-width! rect width)
+  (set-rect-height! rect height))
+
+(define-integrable (set-rect-pos! rect x y)
+  (set-rect-x! rect x)
+  (set-rect-y! rect y))
+
+(define-integrable (set-rect-size! rect width height)
+  (set-rect-width! rect width)
+  (set-rect-height! rect height))
+
+(define-integrable (rect-nominal? rect)
+  ;; An integer in every slot.
+  (and (integer? (rect-x rect))
+       (integer? (rect-y rect))
+       (integer? (rect-width rect))
+       (integer? (rect-height rect))))
+
+;;; The rest of these procedures assume a "nominal" rectangle.
+
+(define-integrable (rect-max-y rect) (int:+ (rect-y rect) (rect-height rect)))
+(define-integrable (rect-max-x rect) (int:+ (rect-x rect) (rect-width rect)))
+(define-integrable rect-min-x rect-x)
+(define-integrable rect-min-y rect-y)
+
+(define-integrable (call-with-rect-bounds rect receiver)
+  ;; Tail-calls RECEIVER with the RECT's minx, maxx, miny and maxy (in
+  ;; that order).  Assumes RECT is nominal.
+  (let ((x (rect-x rect))
+       (y (rect-y rect))
+       (width (rect-width rect))
+       (height (rect-height rect)))
+    (receiver x (int:+ x width) y (int:+ y height))))
+
+(define-integrable (int:max integer1 integer2)
+  (if (int:> integer1 integer2) integer1 integer2))
+(define-integrable (int:min integer1 integer2)
+  (if (int:< integer1 integer2) integer1 integer2))
+
+(define-integrable (point-in-rect? x y rect)
+  (call-with-rect-bounds rect
+   (lambda (min-x max-x min-y max-y)
+     (and (int:<= min-x x) (int:<= x max-x)
+         (int:<= min-y y) (int:<= y max-y)))))
+
+(define-integrable (rect-intersect? rect1 rect2)
+  ;; Useful when you do not need to cons a new rect.
+  (call-with-rect-bounds rect1
+   (lambda (min-x1 max-x1 min-y1 max-y1)
+     (call-with-rect-bounds rect2
+      (lambda (min-x2 max-x2 min-y2 max-y2)
+       (cond ((int:< max-x1 min-x2) #f)
+             ((int:< max-y1 min-y2) #f)
+             ((int:< max-x2 min-x1) #f)
+             ((int:< max-y2 min-y1) #f)
+             (else #t)))))))
+
+(define (rect-intersection rect1 rect2)
+  ;; Returns #f if RECT1 and RECT2 do not intersect, else returns a
+  ;; new rect -- the intersection.  Assumes both rectangles are
+  ;; nominal.
+  (call-with-rect-bounds rect1
+   (lambda (min-x1 max-x1 min-y1 max-y1)
+     (call-with-rect-bounds rect2
+      (lambda (min-x2 max-x2 min-y2 max-y2)
+       (cond ((int:< max-x1 min-x2) #f)
+             ((int:< max-y1 min-y2) #f)
+             ((int:< max-x2 min-x1) #f)
+             ((int:< max-y2 min-y1) #f)
+             (else
+              (let ((min-x (int:max min-x1 min-x2))
+                    (min-y (int:max min-y1 min-y2))
+                    (max-x (int:min max-x1 max-x2))
+                    (max-y (int:min max-y1 max-y2)))
+                (make-rect min-x min-y
+                           (int:- max-x min-x)
+                           (int:- max-y min-y))))))))))
+
+(define (window-intersection window item)
+  ;; Returns #f if WINDOW and ITEM do not intersect, else returns a
+  ;; new rect -- the intersection *translated* to WINDOW's coords.
+  ;; Assumes both rectangles are nominal.
+  (call-with-rect-bounds window
+   (lambda (window-x-start window-x-end window-y-start window-y-end)
+     (call-with-rect-bounds item
+      (lambda (item-x-start item-x-end item-y-start item-y-end)
+       (cond ((< window-x-end item-x-start) #f)
+             ((< window-y-end item-y-start) #f)
+             ((< item-x-end window-x-start) #f)
+             ((< item-y-end window-y-start) #f)
+             (else
+              (let ((x (int:max window-x-start item-x-start))
+                    (y (int:max window-y-start item-y-start))
+                    (x-end (int:min window-x-end item-x-end))
+                    (y-end (int:min window-y-end item-y-end)))
+                (make-rect (int:- x window-x-start)
+                           (int:- y window-y-start)
+                           (int:- x-end x)
+                           (int:- y-end y))))))))))
+
+(define (gdk-rectangle #!optional x y width height)
+  (let ((alien (malloc (C-sizeof "GdkRectangle") '|GdkRectangle|)))
+    (if (default-object? x) alien
+       (begin
+         (C->= alien "GdkRectangle x" (check-integer x))
+         (if (default-object? y) alien
+             (begin
+               (C->= alien "GdkRectangle y" (check-integer y))
+               (if (default-object? width) alien
+                   (begin
+                     (C->= alien "GdkRectangle width" (check-integer width))
+                     (if (default-object? height) alien
+                         (begin
+                           (C->= alien "GdkRectangle height"
+                                 (check-integer height))
+                           alien))))))))))
+
+(define (gdk-rectangle-from-rect rect)
+  (gdk-rectangle (rect-x rect) (rect-y rect)
+                (rect-width rect) (rect-height rect)))
+
+(define-integrable (check-integer obj)
+  (if (integer? obj) obj
+      (ferror "not an integer: "obj)))
+\f
+
+;;;; Ferror
+
+(define condition-type:ferror
+  (make-condition-type
+   'FORMATTED-ERROR
+   condition-type:error
+   '(ARGS)
+   (lambda (condition port)
+     (write-string ";Error: " port)
+     (for-each (lambda (arg)
+                (if (string? arg)
+                    (write-string arg port)
+                    (write arg port)))
+              (access-condition condition 'ARGS))
+     (newline port))))
+
+(define ferror
+  (let ((signal (condition-signaller condition-type:ferror '(ARGS)
+                                    standard-error-handler)))
+    (named-lambda (ferror . args)
+      (call-with-current-continuation
+       (lambda (continuation)
+        (with-restart
+         'USE-VALUE                    ;name
+         "Return a value from the call to ferror." ;reporter
+         continuation                  ;effector
+         (lambda ()                    ;interactor
+           (values (prompt-for-evaluated-expression
+                    "Value to return from ferror")))
+         (lambda ()                    ;thunk
+           (signal args))))))))
+
+(define condition-type:fwarn
+  (make-condition-type
+   'FORMATTED-WARNING
+   condition-type:warning
+   '(ARGS)
+   (lambda (condition port)
+     (write-string ";Warning: " port)
+     (for-each (lambda (arg)
+                (if (string? arg)
+                    (write-string arg port)
+                    (write arg port)))
+              (access-condition condition 'ARGS))
+     (newline port))))
+
+(define fwarn
+  (let ((signal (condition-signaller condition-type:fwarn '(ARGS)
+                                    standard-warning-handler)))
+    (named-lambda (fwarn . args)
+      (with-simple-restart 'MUFFLE-WARNING "Ignore warning."
+       (lambda () (signal args))))))
+\f
+
+;;;; Pango
+
+(define (pango-rectangle #!optional x y width height)
+  (if (default-object? x)
+      (malloc (C-sizeof "PangoRectangle") '|PangoRectangle|)
+      (let ((rect (malloc (C-sizeof "PangoRectangle") '|PangoRectangle|)))
+       (C->= rect "PangoRectangle x" x)
+       (C->= rect "PangoRectangle y" y)
+       (C->= rect "PangoRectangle width" width)
+       (C->= rect "PangoRectangle height" height)
+       rect)))
+
+(define-integrable (pangos->pixels pango-units)
+  (quotient (int:+ pango-units 512) 1024))
+
+(define-integrable (pixels->pangos pixel-units)
+  (* pixel-units 1024))
+
+(define (pango-font-families widget)
+  (let ((PangoContext (make-alien '|PangoContext|)))
+    (C-call "gtk_widget_get_pango_context" PangoContext
+           (gobject-alien widget))
+    (pango-context-list-families PangoContext)))
+
+(define (pango-context-list-families PangoContext)
+  (let ((data-arg (malloc (C-sizeof "*") '(* (* |PangoFontFamily|))))
+       (count-arg (malloc (C-sizeof "int") 'int)))
+    (C-call "pango_context_list_families" PangoContext data-arg count-arg)
+    (let ((data (C-> data-arg "*" (make-alien '(* |PangoFontFamily|))))
+         (count (C-> count-arg "int")))
+      (free data-arg) (free count-arg)
+      (let* ((scan (copy-alien data))
+            (family (make-alien '|PangoFontFamily|))
+            (alist
+             (let loop ((i 0) (entries '()))
+               (if (fix:< i count)
+                   (begin
+                     (C-> scan "*" family)
+                     (alien-byte-increment! scan (C-sizeof "*"))
+                     (loop (fix:1+ i)
+                           (cons
+                            (cons* (pango-font-family-get-name family)
+                                   (pango-font-family-is-monospace? family)
+                                   (pango-font-family-faces family))
+                            entries)))
+                   entries))))
+       (C-call "g_free" data)
+       alist))))
+
+(define (pango-font-family-get-name PangoFontFamily)
+  (let ((name (make-alien '(const char))))
+    (C-call "pango_font_family_get_name" name PangoFontFamily)
+    (c-peek-cstring name)))
+
+(define (pango-font-family-is-monospace? PangoFontFamily)
+  (not (fix:zero? (C-call "pango_font_family_is_monospace" PangoFontFamily))))
+
+(define (pango-font-family-faces PangoFontFamily)
+  (let ((data-arg (malloc (C-sizeof "*") '(* (* |PangoFontFace|))))
+       (count-arg (malloc (C-sizeof "int") 'int)))
+    (C-call "pango_font_family_list_faces" PangoFontFamily data-arg count-arg)
+    (let ((data (C-> data-arg "*" (make-alien '(* |PangoFontFace|))))
+         (count (C-> count-arg "int")))
+      (free data-arg) (free count-arg)
+      (let* ((scan (copy-alien data))
+            (face (make-alien '|PangoFontFace|))
+            (faces
+             (let loop ((i 0) (faces '()))
+               (if (fix:< i count)
+                   (begin
+                     (C-> scan "*" face)
+                     (alien-byte-increment! scan (C-sizeof "*"))
+                     (loop (fix:1+ i)
+                           (cons
+                            (pango-font-face-get-name face)
+                            faces)))
+                   faces))))
+       (C-call "g_free" data)
+       faces))))
+
+(define (pango-font-face-get-name PangoFontFace)
+  (let ((name (make-alien '(const char))))
+    (C-call "pango_font_face_get_face_name" name PangoFontFace)
+    (c-peek-cstring name)))
\ No newline at end of file
diff --git a/src/gtk/hello.scm b/src/gtk/hello.scm
new file mode 100644 (file)
index 0000000..3ca0d75
--- /dev/null
@@ -0,0 +1,37 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+This is Havoc Pennington's Hello World example from GGAD, nicely wrapped. |#
+
+(declare (usual-integrations))
+
+(C-include "gtk")
+
+(define (hello)
+  (let ((window (gtk-window-new 'toplevel))
+       (button (gtk-button-new))
+       (label (gtk-label-new "Hello, World!")))
+    (gtk-container-add button label)
+    (gtk-container-add window button)
+    (gtk-window-set-title window "Hello")
+    (gtk-container-set-border-width button 10)
+    (let ((counter 0))
+      (g-signal-connect window (C-callback "delete_event")
+       (lambda (w e)
+         (outf-console ";Delete me "(- 2 counter)" times.\n")
+         (set! counter (1+ counter))
+         ;; Three or more is the charm.
+         (if (> counter 2) 0 1)))
+      (g-signal-connect button (C-callback "clicked")
+       (lambda (w)
+         (if (= counter 1)
+             (begin
+               (outf-console "\n;Erroring in "(current-thread)"...\n")
+               (error "Testing error handling.")))
+         (let ((text (gtk-label-get-text label)))
+           (gtk-label-set-text
+            label (list->string (reverse! (string->list text)))))
+         unspecific)))
+    (gtk-widget-show-all window)
+    window))
\ No newline at end of file
diff --git a/src/gtk/load.scm b/src/gtk/load.scm
new file mode 100644 (file)
index 0000000..014bfb0
--- /dev/null
@@ -0,0 +1,11 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Load the Gtk option. |#
+
+(load-option 'SOS)
+(with-loader-base-uri (system-library-uri "gtk/")
+  (lambda ()
+    (load-package-set "gtk")))
+(add-subsystem-identification! "Gtk" '(0 1))
\ No newline at end of file
diff --git a/src/gtk/main.scm b/src/gtk/main.scm
new file mode 100644 (file)
index 0000000..292fecc
--- /dev/null
@@ -0,0 +1,105 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; Main Loop Hack
+;;; package: (gtk main)
+
+
+(c-include "gtk")
+
+(define-syntax ucode-primitive
+  (sc-macro-transformer
+   (lambda (form environment)
+     environment
+     (apply make-primitive-procedure (cdr form)))))
+
+(define (initialize-package!)
+  (let ((processor hook/process-command-line))
+    (set! hook/process-command-line
+         (lambda (line)
+           (processor (list->vector (gtk-init (vector->list line))))
+           (gtk-main+))))
+  (gtk-init *unused-command-line*)
+  (gtk-main+))
+
+(define (gtk-init args)
+  ;; Call gtk_init_check.  Signals an error if gtk_init_check returns 0.
+  ;; Returns a list of unused ARGS.
+  (let ((arg-count (guarantee-list-of-type->length
+                   args string? "list of commandline arguments (strings)"
+                   'GTK-INIT))
+       (vars-size (+ (C-sizeof "int")          ;gtk_init_check return var
+                     (C-sizeof "* * char"))))  ;gtk_init_check return var
+    (let* ((vector-size
+           (* (C-sizeof "* char") (+ arg-count 1))) ; null terminated vector
+          (total-size
+           (+ vars-size vector-size
+              (fold-left (lambda (sum arg)
+                           (+ sum (string-length arg) 1)) ;null terminated
+                         0 args)))
+          (bytes (malloc total-size #f))
+          (vector (alien-byte-increment bytes vars-size))
+          (arg-scan (alien-byte-increment vector vector-size))
+          (vector-scan (copy-alien vector))
+          (count-var bytes)
+          (vector-var (alien-byte-increment count-var (C-sizeof "int"))))
+      (for-each (lambda (arg)
+                 (c-poke-pointer! vector-scan arg-scan)
+                 (c-poke-string! arg-scan arg))
+               args)
+      (C->= count-var "int" arg-count)
+      (C->= vector-var "* * char" vector)
+      (if (fix:zero? (C-call "gtk_init_check" count-var vector-var))
+         (error "Could not initialize Gtk.")
+         (let ((new-argc (C-> count-var "int")))
+           (C-> vector-var "* * char" vector-scan)
+           (let ((new-args
+                  (let loop ((i 0)(args '()))
+                    (if (fix:< i new-argc)
+                        (loop (fix:1+ i)
+                              (cons (c-peek-cstringp! vector-scan) args))
+                        (reverse! args)))))
+             (free bytes)
+             new-args))))))
+
+(define (gtk-main+)
+  ;; Establishes a GMainLoop in which scheme is an idle task.  
+  (load-library-object-file "prgtkio" #t)
+  (without-interrupts
+   (lambda ()
+     ((ucode-primitive gtk-main+))
+     (create-gtk-thread))))
+
+(define (gtk-main+-quit)
+  ;; Sortof does the opposite of gtk-main+.
+  (without-interrupts
+   (lambda ()
+     (kill-gtk-thread)
+     ((ucode-primitive gtk-main+-quit)))))
+
+(define gtk-time-slice-window? (ucode-primitive gtk-time-slice-window? 0))
+(define gtk-time-slice-window! (ucode-primitive gtk-time-slice-window! 1))
+(define gtk-select-trace? (ucode-primitive gtk-select-trace? 0))
+(define gtk-select-trace! (ucode-primitive gtk-select-trace! 1))
\ No newline at end of file
diff --git a/src/gtk/pango-cairo.scm b/src/gtk/pango-cairo.scm
new file mode 100644 (file)
index 0000000..7a6e9b9
--- /dev/null
@@ -0,0 +1,59 @@
+#| -*-Scheme-*-
+
+This is example 1 from section "Cairo Rendering" of the "Pango
+Reference Manual for Pango 1.18.3". |#
+
+(define (pango-cairo #!optional filename)
+
+  (define pi (* 4 (atan 1 1)))
+  (define radius 150)
+  (define n_words 10)
+  (define font "Sans Bold 27")
+
+  (define (draw-text cr)
+    (let ((layout (make-alien '|PangoLayout|))
+         (extent (malloc (C-sizeof "PangoRectangle") '|PangoRectangle|))
+         (desc (make-alien '|PangoFontDescription|)))
+      ;; Center coordinates on the middle of the region we are drawing
+      (C-call "cairo_translate" cr radius radius)
+      ;; Create a PangoLayout, set the font and text
+      (C-call "pango_cairo_create_layout" layout cr)
+      (C-call "pango_layout_set_text" layout "Text" 4)
+      (C-call "pango_font_description_from_string" desc font)
+      (C-call "pango_layout_set_font_description" layout desc)
+      (C-call "pango_font_description_free" desc)
+      ;; Draw the layout N_WORDS times in a circle
+      (do ((i 0 (1+ i)))
+         ((fix:= i n_words))
+       (C-call "cairo_save" cr)
+       (let* ((angle (* 360. (/ i n_words)))
+              ;; Gradient from red at angle == 60 to blue at angle == 240
+              (red (/ (+ 1. (cos (* (- angle 60.) (/ pi 180.)))) 2.)))
+         (C-call "cairo_set_source_rgb" cr red 0 (- 1. red))
+         (C-call "cairo_rotate" cr (* angle (/ pi 180.)))
+         ;; Inform Pango to re-layout the text with the new transformation
+         (C-call "pango_cairo_update_layout" cr layout)
+         (C-call "pango_layout_get_pixel_extents" layout 0 extent)
+         (C-call "cairo_move_to" cr
+                 (- (/ (C-> extent "PangoRectangle width") 2))
+                 (- radius))
+         (C-call "pango_cairo_show_layout" cr layout)
+         (C-call "cairo_restore" cr)))
+      (C-call "g_object_unref" layout)
+      (free extent)))
+
+  (let ((surface (make-alien '|cairo_surface_t|))
+       (cr (make-alien '|cairo_t|))
+       (filename (if (default-object? filename) "pango-cairo.png" filename)))
+    (C-call "cairo_image_surface_create" surface
+           (C-enum "CAIRO_FORMAT_ARGB32")
+           (* 2 radius) (* 2 radius))                            
+    (C-call "cairo_create" cr surface)
+    (C-call "cairo_set_source_rgb" cr 1.0 1.0 1.0)
+    (C-call "cairo_paint" cr)
+    (draw-text cr)
+    (C-call "cairo_destroy" cr)
+    (let ((status (C-call "cairo_surface_write_to_png" surface filename)))
+      (C-call "cairo_surface_destroy" surface)
+      (if (not (= status (C-enum "CAIRO_STATUS_SUCCESS")))
+         (ferror "Could not save png to '"filename"'.")))))
\ No newline at end of file
diff --git a/src/gtk/scm-layout.scm b/src/gtk/scm-layout.scm
new file mode 100644 (file)
index 0000000..b0ce108
--- /dev/null
@@ -0,0 +1,920 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; A <scm-widget> implementing a scrollable GtkDrawingArea-like widget.
+;;; package: (gtk layout)
+
+(declare (usual-integrations))
+\f
+
+(c-include "gtk")
+
+(define-class (<scm-layout> (constructor make-scm-layout ()))
+    (<scm-widget>)
+
+  ;; Our window, a GdkWindow alien, and its geometry (allocation).
+  ;; Until realized, these are null and #f (x, y, width and height).
+  ;; If realized, they are non-null and fixnums (respectively).
+  (window define accessor
+         initializer (lambda () (make-alien '|GdkWindow|)))
+  (geometry define accessor initializer make-rect)
+
+  (vadjustment define standard initial-value #f)
+  (hadjustment define standard initial-value #f)
+
+  ;; Scrollable area (drawing size), in logical device coords.
+  ;; The rectangle contains integers (or #f if uninitialized).
+  (scrollable-area define accessor
+                  initializer (lambda () (make-rect 0 0 100 100)))
+
+  ;; Scroll offset and window size (on-screen area).
+  ;; The rectangle contains integers (or #f if uninitialized).
+  ;; The width and height should match the window geometry.
+  (on-screen-area define accessor
+                 initializer (lambda () (make-rect 0 0 100 100)))
+
+  ;; The drawing.
+  (drawing define standard
+          modifier %set-scm-layout-drawing!
+          initial-value #f))
+
+(define (scm-layout-new width height)
+  (let ((w (check-non-negative-fixnum width))
+       (h (check-non-negative-fixnum height))
+       (layout (make-scm-layout)))
+    (let ((alien (gobject-alien layout)))
+      (C->= alien "GtkWidget requisition width" w)
+      (C->= alien "GtkWidget requisition height" h))
+    (set-scm-widget-size-request! layout (scm-layout-size-request layout))
+    (set-scm-widget-size-allocate! layout (scm-layout-size-allocate  layout))
+    (set-scm-widget-realize! layout (scm-layout-realize  layout))
+    (set-scm-widget-event! layout (scm-layout-event layout))
+    (set-scm-widget-set-scroll-adjustments!
+     layout (scm-layout-set-scroll-adjustments layout))
+    layout))
+
+(define (set-scm-layout-size! widget width height)
+  ;; Tells WIDGET to (re)request the given WIDTH and HEIGHT in pixels.
+  (let ((w (check-non-negative-fixnum width))
+       (h (check-non-negative-fixnum height))
+       (alien (check-scm-layout-alien widget)))
+    (let ((rw (C-> alien "GtkWidget requisition width"))
+         (rh (C-> alien "GtkWidget requisition height")))
+      (if (not (and (fix:= w rw) (fix:= h rh)))
+         (begin
+           (if (not (fix:= w rw))
+               (C->= alien "GtkWidget requisition width" w))
+           (if (not (fix:= h rh))
+               (C->= alien "GtkWidget requisition height" h))
+           (if (not (alien-null? (scm-layout-window widget))) ;;realized
+               (C-call "gtk_widget_queue_resize" alien)))))))
+
+(define (set-scm-layout-scroll-size! widget width height)
+  ;; Tells WIDGET to adjust its scrollable area.  Notifies any
+  ;; scrollbars.
+  (set-rect-size! (scm-layout-scrollable-area widget) width height)
+  (adjust-adjustments widget))
+
+(define (set-scm-layout-scroll-pos! widget x y)
+  (let ((xI (check-non-negative-integer x))
+       (yI (check-non-negative-integer y))
+       (window-area (scm-layout-on-screen-area widget))
+       (alien-window (scm-layout-window widget)))
+    (let ((xW (rect-x window-area)) (yW (rect-y window-area)))
+      (set-rect-pos! window-area xI yI)
+      (adjust-adjustments widget)
+
+      (if (not (alien-null? alien-window))
+         (let ((dx (int:- xI xW)) (dy (int:- yI yW)))
+           (if (not (or (int:zero? dx) (int:zero? dy)))
+               ;; If more than 25% will remain onscreen, scroll; else jump.
+               (let ((width (rect-width window-area))
+                     (height (rect-height window-area)))
+                 (if (< 0.25 (/ (* dx dy) (* width height)))
+                     ;; Scroll.
+                     (C-call "gdk_window_scroll" alien-window
+                             (int:* -1 dx) (int:* -1 dy))
+                     ;; Jump.
+                     (C-call "gtk_widget_queue_draw_area"
+                             (gobject-alien widget) 0 0 width height))
+                 (C-call "gdk_window_process_updates" alien-window 0))))))))
+
+(define (set-scm-layout-drawing! widget drawing)
+  (let ((old (scm-layout-drawing widget))
+       (new (check-drawing drawing))
+       (alien (check-scm-layout-alien widget)))
+    (if old (drawing-remove-widget! old widget))
+    (%set-scm-layout-drawing! widget new)
+    (drawing-add-widget! new widget)
+    (let ((a (drawing-area new)))
+      (set-scm-layout-scroll-size! widget (rect-width a) (rect-height a)))
+    (if (not (alien-null? (scm-layout-window widget))) ;;realized
+       (let ((geo (scm-layout-geometry widget)))
+         (C-call "gtk_widget_queue_draw_area" alien
+                 0 0 (rect-width geo) (rect-height geo))))))
+
+(define-integrable (check-scm-layout-alien obj)
+  (if (scm-layout? obj) (gobject-alien obj)
+      (ferror "Not a <scm-layout> instance: "obj)))
+\f
+
+;;;; Callback handlers.
+
+(define (scm-layout-size-request widget)
+  (named-lambda (scm-layout::size-request GtkWidget GtkRequisition)
+    GtkWidget ;;Ignored.
+
+;;;    (%trace ";((scm-layout-size-request "widget") "GtkWidget" "
+;;;        GtkRequisition")\n")
+
+    (let ((alien (gobject-alien widget)))
+      (let ((width (C-> alien "GtkWidget requisition width"))
+           (height(C-> alien "GtkWidget requisition height")))
+       (C->= GtkRequisition "GtkRequisition width" width)
+       (C->= GtkRequisition "GtkRequisition height" height)
+       (%trace "; Requisition: "widget"x"height" from "widget"\n")
+       ))))
+
+(define (scm-layout-size-allocate widget)
+  (named-lambda (scm-layout::size-allocate GtkWidget GtkAllocation)
+
+;;;    (%trace ";((scm-layout-size-allocate "widget") "GtkWidget" "GtkAllocation")\n")
+
+    (let ((x (C-> GtkAllocation "GtkAllocation x"))
+         (y (C-> GtkAllocation "GtkAllocation y"))
+         (width (C-> GtkAllocation "GtkAllocation width"))
+         (height (C-> GtkAllocation "GtkAllocation height"))
+         (rect (scm-layout-geometry widget)))
+      (set-rect! rect x y width height)
+      (%trace "; Allocation: "rect" to "widget"\n")
+      (set-rect-size! (scm-layout-on-screen-area widget) width height)
+      ;; For the random toolkit GtkWidget method.
+      (C->= GtkWidget "GtkWidget allocation x" x)
+      (C->= GtkWidget "GtkWidget allocation y" y)
+      (C->= GtkWidget "GtkWidget allocation width" width)
+      (C->= GtkWidget "GtkWidget allocation height" height)
+      (let ((window (scm-layout-window widget)))
+       (if (not (alien-null? window)) ;;realized
+           (begin
+             (C-call "gdk_window_move_resize" window x y width height)
+             (adjust-adjustments widget)))))))
+
+(define (scm-layout-realize widget)
+  (named-lambda (scm-layout::realize GtkWidget)
+
+;;;    (%trace ";((scm-layout-realize "widget") "GtkWidget")\n")
+
+    ;; ScmWidget automatically sets GTK_REALIZED.
+
+    (let ((attr (malloc (C-sizeof "GdkWindowAttr") '|GdkWindowAttr|))
+         (main-GdkWindow (scm-layout-window widget))
+         (GtkStyle (C-> GtkWidget "GtkWidget style"))
+         (parent-GdkWindow (make-alien '|GdkWindow|))
+         (GdkVisual (make-alien '|GdkVisual|))
+         (GdkColormap (make-alien '|GdkColormap|)))
+
+      ;; Create widget window.
+
+      (C-call "gtk_widget_get_visual" GdkVisual GtkWidget)
+      (check-!null GdkVisual "Could not get GdkVisual.")
+      (C-call "gtk_widget_get_colormap" GdkColormap GtkWidget)
+      (check-!null GdkColormap "Could not get GdkColormap.")
+
+      (C->= attr "GdkWindowAttr window_type" (C-enum "GDK_WINDOW_CHILD"))
+      (let ((r (scm-layout-geometry widget)))
+       ;; Just assume geometry has been allocated?!
+       (C->= attr "GdkWindowAttr x" (rect-x r))
+       (C->= attr "GdkWindowAttr y" (rect-y r))
+       (C->= attr "GdkWindowAttr width" (rect-width r))
+       (C->= attr "GdkWindowAttr height" (rect-height r)))
+      (C->= attr "GdkWindowAttr wclass" (C-enum "GDK_INPUT_OUTPUT"))
+      (C->= attr "GdkWindowAttr visual" GdkVisual)
+      (C->= attr "GdkWindowAttr colormap" GdkColormap)
+      (C->= attr "GdkWindowAttr event_mask" (C-enum "GDK_ALL_EVENTS_MASK"))
+
+      (C-call "gtk_widget_get_parent_window" parent-GdkWindow GtkWidget)
+      (check-!null parent-GdkWindow "Could not get parent.")
+
+      (C-call "gdk_window_new" main-GdkWindow parent-GdkWindow attr
+             (bit-or (C-enum "GDK_WA_X") (C-enum "GDK_WA_Y")
+                     (C-enum "GDK_WA_VISUAL") (C-enum "GDK_WA_COLORMAP")))
+      (check-!null main-GdkWindow "Could not create main window.")
+      (C->= GtkWidget "GtkWidget window" main-GdkWindow)
+      (C-call "gdk_window_set_user_data" main-GdkWindow GtkWidget)
+      (%trace "; Realize "widget" on "main-GdkWindow"\n")
+
+      ;; Style
+
+      (C-call "gtk_style_attach" GtkStyle
+             (C-> GtkWidget "GtkWidget style") main-GdkWindow)
+      (C->= GtkWidget "GtkWidget style" GtkStyle)
+      (C-call "gtk_style_set_background"
+             GtkStyle main-GdkWindow (C-enum "GTK_STATE_NORMAL"))
+      unspecific)))
+
+(define (scm-layout-event widget)
+  (named-lambda (scm-layout::event GtkWidget GdkEvent)
+    GtkWidget widget ;;Ignored, thus far.
+;;;    (%trace ";((scm-layout-event "widget") "GtkWidget" "GdkEvent")\n")
+
+    (let ((type (C-> GdkEvent "GdkEvent any type")))
+
+      (cond ((fix:= type (C-enum "GDK_EXPOSE"))
+            (let ((window (C-> GdkEvent "GdkEvent any window"))
+                  (x (C-> GdkEvent "GdkEventExpose area x"))
+                  (y (C-> GdkEvent "GdkEventExpose area y"))
+                  (width (C-> GdkEvent "GdkEventExpose area width"))
+                  (height (C-> GdkEvent "GdkEventExpose area height"))
+                  ;;(count (C-> GdkEvent "GdkEventExpose count"))
+                  (drawing (scm-layout-drawing widget))
+                  (widget-window (scm-layout-window widget)))
+              (cond ((not (alien=? window widget-window))
+                     (%trace "; Expose a strange window "window
+                             " (not "widget-window").\n"))
+                    (drawing
+                     (let* ((scroll (scm-layout-on-screen-area widget))
+                            (offx (rect-x scroll))
+                            (offy (rect-y scroll)))
+                       (%trace "; Expose area "widget"x"height"+"x"+"y
+                               " of "widget".\n")
+                       (drawing-expose drawing widget window
+                                       (make-rect (int:+ x offx) (int:+ y offy)
+                                                  width height)))))))
+
+           (else
+            (let ((name (C-enum "GdkEventType" type))
+                  (addr (alien/address-string
+                         (C-> GdkEvent "GdkEvent any window"))))
+              (%trace "; "name" on "GtkWidget" (window 0x"addr").\n")))))
+    1 ;;TRUE -- "handled" -- done.
+    ))
+
+(define (scm-layout-set-scroll-adjustments widget)
+  (named-lambda (scm-layout::set-scroll-adjustments
+                GtkWidget hGtkAdjustment vGtkAdjustment)
+    GtkWidget ;;Ignored.
+
+;;;    (%trace ";((scm-layout-set-scroll-adjustments "widget")"
+;;;        " "GtkWidget" "hGtkAdjustment" "vGtkAdjustment")\n")
+    (let ((haddr (alien/address-string hGtkAdjustment))
+         (vaddr (alien/address-string vGtkAdjustment)))
+      (%trace "; Adjustments: 0x"haddr" 0x"vaddr"\n"))
+    (connect-adjustment (scm-layout-hadjustment widget) hGtkAdjustment
+                       widget set-scm-layout-hadjustment!)
+    (connect-adjustment (scm-layout-vadjustment widget) vGtkAdjustment
+                       widget set-scm-layout-vadjustment!)
+    (adjust-adjustments widget)
+    0 ;; What does this mean?
+    ))
+
+(define (connect-adjustment old-adjustment new-alien widget setter)
+  ;; Disconnects OLD-ADJUSTMENT (if any) and applies SETTER to WIDGET
+  ;; and the new adjustment (if any).
+
+  (let ((old-alien (and old-adjustment (gobject-alien old-adjustment))))
+    ;; Disconnect.
+    (cond ((not old-adjustment))
+         ((alien=? new-alien old-alien))
+         (else
+          (gobject-unref old-adjustment)))
+    ;; Connect.
+    (cond ((alien-null? new-alien))
+         ((and old-adjustment (alien=? new-alien old-alien)))
+         (else
+          (let ((new-adjustment (make-gtk-adjustment)))
+            (copy-alien-address! (gobject-alien new-adjustment) new-alien)
+            (C-call "g_object_ref_sink" new-alien new-alien)
+            (setter widget new-adjustment)
+            (g-signal-connect
+             new-adjustment (C-callback "value_changed")
+             (scm-layout-adjustment-value-changed widget new-adjustment)))))))
+
+(define (scm-layout-adjustment-value-changed widget adjustment)
+  (named-lambda (scm-layout::adjustment-value-changed GtkAdjustment)
+    GtkAdjustment ;;Ignored.
+
+;;;    (%trace ";((scm-layout-adjustment-value-changed "widget" "adjustment")"
+;;;        " "GtkAdjustment")\n")
+
+    (let ((alien-widget (gobject-alien widget))
+         (alien-window (scm-layout-window widget))
+         (window-area (scm-layout-on-screen-area widget))
+         (vadjustment (scm-layout-vadjustment widget))
+         (hadjustment (scm-layout-hadjustment widget))
+         (alien-adjustment (gobject-alien adjustment)))
+      (let ((value
+            (floor->exact (C-> alien-adjustment "GtkAdjustment value"))))
+       (cond ((eq? adjustment vadjustment)
+              (let* ((y (rect-y window-area))
+                     (dy (int:- value y)))
+                (%trace "; Vadjustment to "value" (dy:"dy")\n")
+                (if (not (int:zero? dy))
+                    (let ((width (rect-width window-area)))
+                      (set-rect-y! window-area value)
+                      (if (> (abs dy) (* 0.90 width))
+                          (let ((height (rect-height window-area)))
+                            (if (not (alien-null? alien-window)) ;;realized
+                                (C-call "gtk_widget_queue_draw_area"
+                                        alien-widget 0 0 width height)))
+                          (C-call "gdk_window_scroll"
+                                  alien-window 0 (int:* -1 dy)))
+                      (C-call "gdk_window_process_updates" alien-window 0)))))
+             ((eq? adjustment hadjustment)
+              (let* ((x (rect-x window-area))
+                     (height (rect-height window-area))
+                     (dx (int:- value x)))
+                (%trace "; Hadjustment to "value" (dx:"dx")\n")
+                (if (not (int:zero? dx))
+                    (begin
+                      (set-rect-x! window-area value)
+                      (if (> (abs dx) (* 0.90 height))
+                          (let ((width (rect-width window-area)))
+                            (if (not (alien-null? alien-window)) ;;realized
+                                (C-call "gtk_widget_queue_draw_area"
+                                        alien-widget 0 0 width height)))
+                          (C-call "gdk_window_scroll"
+                                  alien-window (int:* -1 dx) 0))
+                      (C-call "gdk_window_process_updates" alien-window 0)))))
+             (else (fwarn "Unexpected adjustment "adjustment
+                          " (not "vadjustment" nor "hadjustment").")))))))
+
+(define (adjust-adjustments widget)
+  ;; Called when the widget gets new adjustments or its size or
+  ;; scrollable area changes.
+
+  (let ((hadj (scm-layout-hadjustment widget))
+       (vadj (scm-layout-vadjustment widget)))
+    (if (and vadj (not (gobject-finalized? vadj)))
+       (let* ((total-height (rect-height (scm-layout-scrollable-area widget)))
+              (scroll (scm-layout-on-screen-area widget))
+              (window-height (rect-height scroll))
+              (value (rect-y scroll)))
+         (set-gtk-adjustment!
+          vadj value                   ;value
+          0 total-height               ;lower (top), upper (bottom)
+          window-height 10             ;page-size, step-increment
+          (- window-height             ;page-increment
+             (* 0.05 window-height)))))
+    (if (and hadj (not (gobject-finalized? hadj)))
+       (let* ((total-width (rect-width (scm-layout-scrollable-area widget)))
+              (scroll (scm-layout-on-screen-area widget))
+              (window-width (rect-width scroll))
+              (value (rect-x scroll)))
+         (set-gtk-adjustment!
+          hadj value
+          0 total-width
+          window-width 10
+          (- window-width (* 0.05 window-width)))))))
+\f
+
+;;;; Drawings
+
+(define-class (<drawing> (constructor () 1))
+    ()
+  (area define accessor initializer (lambda () (make-rect 0 0 0 0)))
+  (widgets define standard initial-value '())
+  (display-list define standard initial-value '()))
+
+(define-method initialize-instance ((d <drawing>) widget)
+  (set-drawing-widgets! d (list widget)))
+
+(define (check-drawing obj)
+  (if (drawing? obj) obj
+      (ferror "Not a <drawing> instance: "obj)))
+
+(define (drawing-damage item #!optional rect)
+  ;; Invalidates any widget areas affected by RECT in ITEM.  By
+  ;; default, RECT is ITEM's entire area.
+;;;  (%trace ";(drawing-damage "drawing" "item")\n")
+
+  (let ((area (if (default-object? rect)
+                 (drawn-item-area item)
+                 rect))
+       (drawing (drawn-item-drawing item)))
+    (if (not (rect-nominal? area))
+       (ferror "Cannot damage an item ("item") with an ill-defined area."))
+    (if (and (not (int:zero? (rect-width area)))
+            (not (int:zero? (rect-height area))))
+       (for-each
+        (lambda (widget)
+          (let ((intersect (let ((a (scm-layout-on-screen-area widget)))
+                             (and (rect-nominal? a)
+                                  (window-intersection a area)))))
+            (if (and intersect (not (gtk-object-destroyed? widget)))
+                (C-call "gtk_widget_queue_draw_area"
+                        (gobject-alien widget)
+                        (rect-x intersect) (rect-y intersect)
+                        (rect-width intersect) (rect-height intersect)))))
+        (let ((widgets (drawn-item-widgets item)))
+          (if (eq? #f widgets)
+              (drawing-widgets drawing)
+              widgets))))))
+
+(define-integrable (drawing-pick-list drawing widget x y)
+  ;; Return a list of <drawn-item>s in DRAWING that are tangible in
+  ;; WIDGET at (X,Y).
+
+  (keep-matching-items (drawing-display-list drawing)
+                      (lambda (item)
+                        (let ((widgets (drawn-item-widgets item))
+                              (area (drawn-item-area item)))
+                          (and (or (eq? widgets #f)
+                                   (memq widget widgets))
+                               (point-in-rect? x y area))))))
+
+(define (drawing-expose drawing widget window area)
+  ;; AREA is in drawing coords.
+
+  (if (rect-nominal? area)
+      (for-each
+       (lambda (item)
+        (let ((item-area (drawn-item-area item))
+              (widgets (drawn-item-widgets item)))
+          (if (and (or (eq? widgets #f)
+                       (memq widget widgets))
+                   (rect-nominal? item-area)
+                   (rect-intersect? item-area area))
+              (drawn-item-expose item widget window area))))
+       (drawing-display-list drawing))))
+
+(define-generic drawn-item-expose (item widget window expose-area)
+  ;; Due to the checks in drawing-expose, methods of this generic can
+  ;; assume expose-area and the draw item's area are well-defined (all
+  ;; four members are integers), intersecting, and ITEM is visible in
+  ;; WIDGET.  Methods may also assume the widget is realized and its
+  ;; window's (gc's) clipping is already set.  The widget's scroll
+  ;; offset (on-screen area) is also always well-defined.
+  )
+
+(define (drawing-add-widget! drawing widget)
+  (if (not (scm-layout? widget))
+      (ferror "Not a <scm-layout>: "widget))
+  (let ((widgets (drawing-widgets drawing)))
+    (if (not (memq widget widgets))
+       (set-drawing-widgets! drawing (cons widget widgets)))))
+
+(define (drawing-remove-widget! drawing widget)
+  (if (not (scm-layout? widget))
+      (ferror "Not a <scm-layout>: "widget))
+  (let ((widgets (drawing-widgets drawing)))
+    (if (not (memq widget widgets))
+       (ferror "Widget "widget" not found on list for drawing "drawing"."))
+    (set-drawing-widgets! drawing (delq! widget widgets))))
+
+(define (drawing-add-item! drawing item where)
+  (cond ((or (eq? #f where)
+            (eq? 'TOP where))
+        (set-drawing-display-list!
+         drawing (append! (drawing-display-list drawing) (list item))))
+       ((eq? 'BOTTOM where)
+        (set-drawing-display-list!
+         drawing (cons item (drawing-display-list drawing))))
+       (else (ferror "Bad where: "where)))
+  (drawing-damage item))
+
+(define (set-drawing-size! drawing width height)
+  (let ((w (check-non-negative-integer width))
+       (h (check-non-negative-integer height)))
+    (set-rect-size! (drawing-area drawing) w h)
+    (for-each
+     (lambda (widget) (set-scm-layout-scroll-size! widget w h))
+     (drawing-widgets drawing))))
+\f
+
+;;;; Drawn items.
+
+(define-class <drawn-item>
+    ()
+  (area define standard initializer (lambda () (make-rect 0 0 0 0)))
+  (drawing define standard initial-value #f)
+  ;; #f if the item is visible in all widgets.
+  ;; Else, a list of widgets in which the item should be drawn.
+  (widgets define standard modifier %set-drawn-item-widgets! initial-value #f))
+
+(define-method initialize-instance ((item <drawn-item>) where)
+  (drawing-add-item! (drawn-item-drawing item) item where))
+
+(define (set-drawn-item-position! item x y)
+  (let ((area (drawn-item-area item))
+       (ix (check-non-negative-integer x))
+       (iy (check-non-negative-integer y)))
+    (let ((curr-x (rect-x area))
+         (curr-y (rect-y area))
+         (width (rect-width area))
+         (height (rect-height area)))
+
+      ;; Two trivial cases, and a general one.
+      (cond ((and (integer? curr-x) (int:= x curr-x)
+                 (integer? curr-y) (int:= y curr-y))
+            unspecific)
+           ((or (not (integer? width)) (int:zero? width)
+                (not (integer? height)) (int:zero? height))
+            (set-rect-pos! area ix iy))
+           (else
+            (drawing-damage item)
+            (set-rect-pos! area ix iy)
+            (drawing-damage item))))))
+
+(define (%set-drawn-item-size! item width height)
+  (let ((area (drawn-item-area item)))
+    (drawing-damage item)
+    (set-rect-size! area width height)
+    (drawing-damage item)))
+
+(define (set-drawn-item-widgets! item new)
+  ;; Draw ITEM only on the NEW widgets.  If NEW is #f, ITEM will
+  ;; appear in all views.
+  (let ((old (drawn-item-widgets item)))
+    (if (not (equal? old new))
+       (begin
+         (drawing-damage item)
+         (%set-drawn-item-widgets! item new)
+         (drawing-damage item)))))
+
+(define (drawn-item-widget item)
+  ;; Return a widget that will display the item.
+  (let* ((drawing (drawn-item-drawing item))
+        (widgets (drawing-widgets drawing)))
+    (if (null? widgets)
+       (ferror "No widgets display drawing "drawing".")
+       (car widgets))))
+\f
+
+;;;; Simple Items (e.g. the toolkit's gtk_paint_* operators).
+
+(define-class (<box-item> (constructor add-box-item (drawing) 1))
+    (<drawn-item>)
+  (shadow define standard
+         accessor %box-item-shadow
+         modifier %set-box-item-shadow!
+         initial-value (C-enum "GTK_SHADOW_NONE")))
+
+(define-method drawn-item-expose ((item <box-item>) widget window area)
+  area ;;Ignored.  Assumed clipping already set.
+;;;  (%trace "; (Re)Drawing "item" on "widget".\n")
+
+  (let ((widgets (drawn-item-widgets item)))
+    (if (or (eq? #f widgets)
+           (memq widget widgets))
+       (let ((alien (gobject-alien widget))
+             (scroll (scm-layout-on-screen-area widget)))
+         (let ((scroll-x (rect-x scroll))
+               (scroll-y (rect-y scroll))
+               (style (C-> alien "GtkWidget style"))
+               (state (C-enum "GTK_STATE_ACTIVE"))
+               (area (drawn-item-area item)))
+           (C-call "gtk_paint_box"
+                   style window state (%box-item-shadow item)
+                   null-alien alien null-alien ;area widget detail
+                   (int:- (rect-x area) scroll-x)
+                   (int:- (rect-y area) scroll-y)
+                   (rect-width area)
+                   (rect-height area)))))))
+
+(define (set-box-item-size! item width height)
+  (let ((w (check-non-negative-fixnum width))
+       (h (check-non-negative-fixnum height)))
+    (%set-drawn-item-size! item w h)))
+
+(define (set-box-item-pos-size! item x y width height)
+  (let ((area (drawn-item-area item))
+       (xI (if (and (integer? x) (not (int:negative? x))) x 0))
+       (yI (if (and (integer? y) (not (int:negative? y))) y 0))
+       (wI (if (and (fixnum? width) (not (fix:negative? width))) width 0))
+       (hI (if (and (fixnum? height) (not (fix:negative? height))) height 0)))
+    (drawing-damage item)
+    (set-rect! area xI yI wI hI)
+    (drawing-damage item)))
+
+(define (box-item-shadow item)
+  (case (%box-item-shadow item)
+    (((C-enum "GTK_SHADOW_NONE")) 'NONE)
+    (((C-enum "GTK_SHADOW_IN")) 'IN)
+    (((C-enum "GTK_SHADOW_OUT")) 'OUT)
+    (((C-enum "GTK_SHADOW_ETCHED_IN")) 'ETCHED-IN)
+    (((C-enum "GTK_SHADOW_ETCHED_OUT")) 'ETCHED-OUT)))
+
+(define (set-box-item-shadow! item type)
+  (let ((new
+        (case type
+          ((NONE) (C-enum "GTK_SHADOW_NONE"))
+          ((IN) (C-enum "GTK_SHADOW_IN"))
+          ((OUT) (C-enum "GTK_SHADOW_OUT"))
+          ((ETCHED-IN) (C-enum "GTK_SHADOW_ETCHED_IN"))
+          ((ETCHED-OUT) (C-enum "GTK_SHADOW_ETCHED_OUT"))
+          (else (ferror "Not a shadow type: "type".")))))
+    (if (not (fix:= new (%box-item-shadow item)))
+       (begin
+         (%set-box-item-shadow! item new)
+         (drawing-damage item)))))
+
+(define-class (<hline-item> (constructor add-hline-item (drawing) 1))
+    (<drawn-item>))
+
+(define-method drawn-item-expose ((item <hline-item>) widget window area)
+  area ;;Ignored.  Assumed clipping already set.
+;;;  (%trace "; (Re)Drawing "item" on "widget".\n")
+
+  (let ((widgets (drawn-item-widgets item)))
+    (if (or (eq? #f widgets)
+           (memq widget widgets))
+       (let ((alien (gobject-alien widget))
+             (scroll (scm-layout-on-screen-area widget)))
+         (let ((scroll-x (rect-x scroll))
+               (scroll-y (rect-y scroll))
+               (style (C-> alien "GtkWidget style"))
+               (state (C-enum "GTK_STATE_NORMAL"))
+               (area (drawn-item-area item)))
+           (C-call "gtk_paint_hline"
+                   style window state
+                   null-alien alien null-alien ;area widget detail
+                   (int:- (rect-min-x area) scroll-x)
+                   (int:- (rect-max-x area) scroll-x)
+                   (int:- (rect-y area) scroll-y)))))))
+
+(define (set-hline-item-size! item width)
+  (let ((w (check-non-negative-fixnum width))
+       (hline (check-hline-item item)))
+    (%set-drawn-item-size! hline w (rect-height (drawn-item-area hline)))))
+
+(define (check-hline-item obj)
+  (if (hline-item? obj) obj
+      (ferror "Not an <hline-item> instance: "obj)))
+
+(define-class (<vline-item> (constructor add-vline-item (drawing) 1))
+    (<drawn-item>))
+
+(define-method drawn-item-expose ((item <vline-item>) widget window area)
+  area ;;Ignored.  Assumed clipping already set.
+;;;  (%trace "; (Re)Drawing "item" on "widget".\n")
+
+  (let ((widgets (drawn-item-widgets item)))
+    (if (or (eq? #f widgets)
+           (memq widget widgets))
+       (let ((alien (gobject-alien widget))
+             (scroll (scm-layout-on-screen-area widget)))
+         (let ((scroll-x (rect-x scroll))
+               (scroll-y (rect-y scroll))
+               (style (C-> alien "GtkWidget style"))
+               (state (C-enum "GTK_STATE_NORMAL"))
+               (area (drawn-item-area item)))
+           (C-call "gtk_paint_vline"
+                   style window state
+                   null-alien alien null-alien ;area widget detail
+                   (int:- (rect-min-y area) scroll-y)
+                   (int:- (rect-max-y area) scroll-y)
+                   (int:- (rect-x area) scroll-x)))))))
+
+(define (set-vline-item-size! item height)
+  (let ((h (check-non-negative-fixnum height))
+       (vline (check-vline-item item)))
+    (%set-drawn-item-size! vline (rect-width (drawn-item-area vline)) h)))
+
+(define (check-vline-item obj)
+  (if (vline-item? obj) obj
+      (ferror "Not a <vline-item> instance: "obj)))
+\f
+
+;;;; Text Items (aka PangoLayouts)
+
+(define-class (<text-item> (constructor add-text-item (drawing) 1))
+    (<drawn-item>)
+  (pango-layout define accessor
+               initializer (lambda () (make-alien '|PangoLayout|)))
+  (text define standard
+       modifier %set-text-item-text!
+       initial-value #f))
+
+(define-method initialize-instance ((item <text-item>) where)
+  (call-next-method item where)
+  (add-gc-cleanup item
+                 (text-item-finalize-thunk (text-item-pango-layout item))))
+
+(define (text-item-finalize-thunk pango-layout)
+  ;; Return a thunk closed over PANGO-LAYOUT (NOT the item).
+  (lambda ()
+    (if (not (alien-null? pango-layout))
+       (begin
+         (C-call "g_object_unref" pango-layout)
+         (alien-null! pango-layout)))))
+
+(define-method drawn-item-expose ((item <text-item>) widget window area)
+  area ;;Ignored.  Assumed clipping already set.
+;;;  (%trace "; (Re)Drawing "item" on "widget".\n")
+
+  (let ((widgets (drawn-item-widgets item)))
+    (if (or (eq? #f widgets)
+           (memq widget widgets))
+       (let ((alien (gobject-alien widget))
+             (scroll (scm-layout-on-screen-area widget)))
+         (let ((scroll-x (rect-x scroll))
+               (scroll-y (rect-y scroll))
+               (style (C-> alien "GtkWidget style"))
+               (state (C-> alien "GtkWidget state"))
+               (area (drawn-item-area item))
+               (layout (text-item-pango-layout item)))
+           (if (not (alien-null? layout))
+               (C-call "gtk_paint_layout"
+                       style window state 1
+                       null-alien alien null-alien ;area widget detail
+                       (int:- (rect-x area) scroll-x)
+                       (int:- (rect-y area) scroll-y)
+                       layout)))))))
+
+(define (set-text-item-text! text-item text)
+  (let ((layout (text-item-pango-layout text-item)))
+
+    (drawing-damage text-item)
+
+    (if (alien-null? layout)
+       (begin
+         (C-call "gtk_widget_create_pango_layout" layout
+                 (gobject-alien (drawn-item-widget text-item)) text))
+       (begin
+         (C-call "pango_layout_set_text" layout text -1)))
+    (let ((log-extent (pango-rectangle))
+         (ink-extent null-alien))
+      (C-call "pango_layout_get_pixel_extents" layout ink-extent log-extent)
+      (set-rect-size! (drawn-item-area text-item)
+                     (C-> log-extent "GdkRectangle width")
+                     (C-> log-extent "GdkRectangle height"))
+      (%set-text-item-text! text-item text)
+      (free log-extent))
+
+    (drawing-damage text-item)
+
+    unspecific))
+
+(define (text-item-xy-to-index item x y)
+  ;; Assumes (X,Y) is in ITEM's area (all logical dev. coords.).
+  (let ((layout (text-item-pango-layout item))
+       (area (drawn-item-area item)))
+    (if (not (alien-null? layout))
+       (let ((index-alien (malloc (C-sizeof "int") '(* int)))
+             ;;-> layout coords.
+             (xL (int:- x (rect-x area)))
+             (yL (int:- y (rect-y area))))
+         (if (fix:= 0 (C-call "pango_layout_xy_to_index" layout
+                              (pixels->pangos xL) (pixels->pangos yL)
+                              index-alien null-alien))
+             (begin
+               (free index-alien)
+               #f)
+             (let ((index (C-> index-alien "int")))
+               (free index-alien)
+               index)))
+       #f)))
+
+(define (call-with-text-item-grapheme-rect item index receiver)
+  ;; Calls RECEIVER with the x, y, width and height of the grapheme at
+  ;; INDEX in ITEM.
+  (let ((layout (text-item-pango-layout item))
+       (rect (pango-rectangle)))
+    (C-call "pango_layout_index_to_pos" layout index rect)
+    (let ((x (pangos->pixels (C-> rect "PangoRectangle x")))
+         (y (pangos->pixels (C-> rect "PangoRectangle y")))
+         (width (pangos->pixels (C-> rect "PangoRectangle width")))
+         (height (pangos->pixels (C-> rect "PangoRectangle height"))))
+      (free rect)
+      (receiver x y width height))))
+\f
+
+;;;; Images (aka GdkPixbufLoaders)
+
+(define-class (<image-item> (constructor add-image-item (drawing) 1))
+    (<drawn-item>)
+  (pixbuf-loader define accessor
+                initializer make-pixbuf-loader)
+  (pixbuf define standard initial-value #f))
+
+(define-method initialize-instance ((item <image-item>) where)
+  (call-next-method item where)
+  (let ((loader (image-item-pixbuf-loader item)))
+    (g-signal-connect loader (C-callback "size_prepared")
+                     (image-item-size-prepared item))
+    (g-signal-connect loader (C-callback "area_prepared")
+                     (image-item-area-prepared item))
+    (g-signal-connect loader (C-callback "area_updated")
+                     (image-item-area-updated item))))
+
+(define (image-item-size-prepared item)
+  (named-lambda (image-item::size-prepared GdkPixbufLoader width height)
+    GdkPixbufLoader ;;Ignored.
+    (%trace "; image-item::size-prepared "item" "width" "height"\n")
+
+    (%set-drawn-item-size! item width height)))
+
+(define (image-item-area-prepared item)
+  (named-lambda (image-item::area-prepared GdkPixbufLoader)
+    GdkPixbufLoader ;;Ignored.
+
+    (let ((loader (image-item-pixbuf-loader item))
+         (pixbuf (if (not (image-item-pixbuf item))
+                     (let ((a (make-alien '|GdkPixbuf|)))
+                       (set-image-item-pixbuf! item a)
+                       a)
+                     (ferror "Image-item "item" already has a pixbuf!"))))
+      (C-call "gdk_pixbuf_loader_get_pixbuf" pixbuf (gobject-alien loader))
+      ;; Fill with non-background (non-fg) color? (Pick from a GtkStyle!!!)
+      (%trace "; image-item::area-prepared "item" ("pixbuf")\n"))))
+
+(define (image-item-area-updated item)
+  (named-lambda (image-item::area-updated GdkPixbufLoader x y width height)
+    GdkPixbufLoader ;;Ignored.
+
+    (let ((rect (make-rect x y width height)))
+      (%trace "; image-item::area-updated "item" "rect"\n")
+      (drawing-damage item rect))))
+
+(define-method drawn-item-expose ((item <image-item>) widget window area)
+;;;  (%trace "; (Re)Drawing "item" on "widget".\n")
+
+  (let ((widgets (drawn-item-widgets item)))
+    (if (or (eq? #f widgets)
+           (memq widget widgets))
+       (let ((pixbuf (image-item-pixbuf item)))
+         (if (and pixbuf (not (alien-null? pixbuf)))
+             (let ((item-area (drawn-item-area item))
+                   (scroll (scm-layout-on-screen-area widget))
+                   (GdkGC* (let ((alien (make-alien '(* |GdkGC|))))
+                             (C-> (gobject-alien widget) "GtkWidget style"
+                                  alien)
+                             (C-> alien "GtkStyle fg_gc" alien)
+                             (C-array-loc! alien "* GdkGC"
+                                           (C-enum "GTK_STATE_NORMAL"))
+                             (C-> alien "* GdkGC" alien)
+                             alien)))
+               (let ((i (rect-intersection item-area area))
+                     (scroll-x (rect-x scroll))
+                     (scroll-y (rect-y scroll)))
+                 (C-call "gdk_draw_pixbuf"
+                         window GdkGC* pixbuf
+                         ;; drawing->image
+                         (int:- (rect-x i) (rect-x item-area)) ;src_x
+                         (int:- (rect-y i) (rect-y item-area)) ;src_y
+                         ;; drawing->window
+                         (int:- (rect-x i) scroll-x) ;dest_x
+                         (int:- (rect-y i) scroll-y) ;dest_y
+                         (rect-width i) (rect-height i)
+                         (C-enum "GDK_RGB_DITHER_NONE")
+                         0 0           ;x_dither, y_dither
+                         ))))))))
+
+(define (add-image-item-from-file drawing where filename)
+  ;; WHERE can be 'TOP (or #f) or 'BOTTOM.
+  (let ((item (add-image-item drawing (check-where where))))
+    (load-pixbuf-from-file (image-item-pixbuf-loader item) filename)
+    item))
+
+(define (check-where where)
+  (cond ((eq? where #f) 'TOP)
+       ((eq? where 'TOP) 'TOP)
+       ((eq? where 'BOTTOM) 'BOTTOM)
+       (else (ferror "The WHERE argument ("where") must be TOP (or #f)"
+                     " or BOTTOM if it is not optional."))))
+
+(define (check-non-negative-fixnum obj)
+  (if (fixnum? obj)
+      (if (fix:negative? obj)
+         (ferror "Not a NON-NEGATIVE fixnum: "obj)
+         obj)
+      (ferror "Not a non-negative fixnum: "obj)))
+
+(define (check-non-negative-integer obj)
+  (if (integer? obj)
+      (if (int:negative? obj)
+         (ferror "Not a NON-NEGATIVE integer: "obj)
+         obj)
+      (ferror "Not a non-negative integer: "obj)))
+
+(define (check-!null alien message)
+  (if (alien-null? alien)
+      (ferror "scm-layout: "message)
+      alien))
+
+(define %trace? #f)
+(define (%trace . objects)
+  (if %trace?
+      (apply outf-console objects)))
\ No newline at end of file
diff --git a/src/gtk/scm-widget.scm b/src/gtk/scm-widget.scm
new file mode 100644 (file)
index 0000000..d0ba579
--- /dev/null
@@ -0,0 +1,116 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; A <gtk-widget> representing a ScmWidget.
+;;; package: (gtk widget)
+
+
+(c-include "gtk")
+
+(define-class <scm-widget> (<gtk-widget>))
+
+(define-method initialize-instance ((new <scm-widget>))
+  ;; Calls scm_widget_new, modifying NEW's alien.
+  (let ((a (gobject-alien new)))
+    (C-call "scm_widget_new" a)
+    (if (alien-null? a) (ferror "Could not create a Scheme widget."))
+    (let ((id (register-c-callback
+              (named-lambda (scm-widget::finalize GObject)
+                (scm-widget-finalize! GObject)))))
+      (C->= a "ScmWidget finalize" id)
+      unspecific)))
+
+(define (scm-widget-finalize! GObject)
+  (define (de-register id)
+    (if (zero? id) unspecific (de-register-c-callback id)))
+  (de-register
+   (C-> GObject "ScmWidget finalize"))
+  (C->= GObject "ScmWidget finalize" 0)
+  (de-register
+   (C-> GObject "ScmWidget destroy"))
+  (C->= GObject "ScmWidget destroy" 0)
+  (de-register
+   (C-> GObject "ScmWidget realize"))
+  (C->= GObject "ScmWidget realize" 0)
+  (de-register
+   (C-> GObject "ScmWidget unrealize"))
+  (C->= GObject "ScmWidget unrealize" 0)
+  (de-register
+   (C-> GObject "ScmWidget size_request"))
+  (C->= GObject "ScmWidget size_request" 0)
+  (de-register
+   (C-> GObject "ScmWidget size_allocate"))
+  (C->= GObject "ScmWidget size_allocate" 0)
+  (de-register
+   (C-> GObject "ScmWidget event"))
+  (C->= GObject "ScmWidget event" 0)
+  (de-register
+   (C-> GObject "ScmWidget set_scroll_adjustments"))
+  (C->= GObject "ScmWidget set_scroll_adjustments" 0)
+  unspecific)
+
+(define (set-scm-widget-destroy! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget destroy")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget destroy" (register-c-callback proc))))
+
+(define (set-scm-widget-realize! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget realize")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget realize" (register-c-callback proc))))
+
+(define (set-scm-widget-unrealize! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget unrealize")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget unrealize" (register-c-callback proc))))
+
+(define (set-scm-widget-size-request! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget size_request")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget size_request" (register-c-callback proc))))
+
+(define (set-scm-widget-size-allocate! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget size_allocate")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget size_allocate" (register-c-callback proc))))
+
+(define (set-scm-widget-event! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget event")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien "ScmWidget event" (register-c-callback proc))))
+
+(define (set-scm-widget-set-scroll-adjustments! widget proc)
+  (let* ((alien (gobject-alien widget))
+        (id (C-> alien "ScmWidget set_scroll_adjustments")))
+    (if (not (zero? id)) (de-register-c-callback id))
+    (C->= alien
+         "ScmWidget set_scroll_adjustments"
+         (register-c-callback proc))))
\ No newline at end of file
diff --git a/src/gtk/scmwidget.c.stay b/src/gtk/scmwidget.c.stay
new file mode 100644 (file)
index 0000000..f1f1925
--- /dev/null
@@ -0,0 +1,298 @@
+/* -*-C-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+*/
+
+/* The ScmWidget, represented in Scheme by a <scm-widget>. */
+
+#include <mit-scheme.h>
+#include "gtk-shim.h"
+
+static void scm_widget_class_init (ScmWidgetClass* klass);
+static void scm_widget_init (ScmWidget* sw);
+static void scm_widget_finalize (GObject* object);
+static void scm_widget_destroy (GtkObject* object);
+static void scm_widget_realize (GtkWidget* widget);
+static void scm_widget_unrealize (GtkWidget* widget);
+static void scm_widget_size_request (GtkWidget* widget, GtkRequisition* requisition);
+static void scm_widget_size_allocate (GtkWidget* widget, GtkAllocation* allocation);
+static gint scm_widget_event (GtkWidget* widget, GdkEvent* event);
+static void scm_widget_set_scroll_adjustments (GtkWidget* widget, GtkAdjustment *hadj, GtkAdjustment *vadj);
+
+/* The callbacks in gtk.cdecl. */
+extern void Scm_widget_finalize (int ID, GObject* object);
+extern void Scm_widget_destroy (int ID, GtkObject* object);
+extern void Scm_widget_realize (int ID, GtkWidget* widget);
+extern void Scm_widget_unrealize (int ID, GtkWidget* widget);
+extern void Scm_widget_size_request (int ID, GtkWidget* w, GtkRequisition* r);
+extern void Scm_widget_size_allocate (int ID, GtkWidget* w, GtkAllocation* a);
+extern gint Scm_widget_event (int ID, GtkWidget* widget, GdkEvent* event);
+extern void Scm_widget_set_scroll_adjustments (int ID, GtkWidget* widget, GtkAdjustment *hadj, GtkAdjustment *vadj);
+
+GType
+scm_widget_get_type (void)
+{
+  static GType widget_type = 0;
+
+  if (!widget_type) {
+    static const GTypeInfo widget_type_info = {
+      sizeof (ScmWidgetClass),
+      NULL,                    /* base_init */
+      NULL,                    /* base_finalize */
+      (GClassInitFunc) scm_widget_class_init,
+      NULL,                    /* class_finalize */
+      NULL,                    /* class_data */
+      sizeof (ScmWidget),
+      0,                       /* n_preallocs */
+      (GInstanceInitFunc) scm_widget_init,
+      NULL                     /* value_table */
+    };
+
+    widget_type
+      = g_type_register_static (GTK_TYPE_WIDGET, "ScmWidget",
+                               &widget_type_info, 0);
+  }
+
+  return widget_type;
+}
+
+static GtkWidgetClass* parent_class = NULL;
+
+/* VOID:OBJECT,OBJECT (./gtkmarshalers.list:91) */
+static void
+marshal_VOID__OBJECT_OBJECT (GClosure     *closure,
+                            GValue       *return_value G_GNUC_UNUSED,
+                            guint         n_param_values,
+                            const GValue *param_values,
+                            gpointer      invocation_hint G_GNUC_UNUSED,
+                            gpointer      marshal_data)
+{
+  typedef void (*MarshalFunc) (gpointer     data1,
+                               gpointer     arg_1,
+                               gpointer     arg_2,
+                               gpointer     data2);
+  register MarshalFunc callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_get_object (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_get_object (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (MarshalFunc) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_value_get_object (param_values + 1),
+            g_value_get_object (param_values + 2),
+            data2);
+}
+
+static void
+scm_widget_class_init (ScmWidgetClass *klass)
+{
+  GObjectClass *gobject_class;
+  GtkObjectClass *object_class;
+  GtkWidgetClass *widget_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  object_class = (GtkObjectClass*) klass;
+  widget_class = (GtkWidgetClass*) klass;
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class->finalize = scm_widget_finalize;
+
+  object_class->destroy = scm_widget_destroy;
+
+  widget_class->realize = scm_widget_realize;
+  widget_class->unrealize = scm_widget_unrealize;
+
+  widget_class->size_request = scm_widget_size_request;
+
+  widget_class->size_allocate = scm_widget_size_allocate;
+
+  widget_class->event = scm_widget_event;
+
+  klass->set_scroll_adjustments = scm_widget_set_scroll_adjustments;
+  widget_class->set_scroll_adjustments_signal =
+    g_signal_new ("set_scroll_adjustments",
+                 G_OBJECT_CLASS_TYPE (gobject_class),
+                 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                 /*  */
+                 G_STRUCT_OFFSET (ScmWidgetClass, set_scroll_adjustments),
+                 NULL, NULL, /* Accumulator and accu_data. */
+                 marshal_VOID__OBJECT_OBJECT,
+                 G_TYPE_NONE, 2,
+                 GTK_TYPE_ADJUSTMENT,
+                 GTK_TYPE_ADJUSTMENT);
+}
+
+static void
+scm_widget_init (ScmWidget* w)
+{
+  GTK_WIDGET_SET_FLAGS (GTK_WIDGET(w), GTK_CAN_FOCUS);
+  w->finalize = 0;
+  w->destroy = 0;
+  w->realize = 0;
+  w->unrealize = 0;
+  w->size_request = 0;
+  w->size_allocate = 0;
+  w->event = 0;
+  w->set_scroll_adjustments = 0;
+}
+
+GtkWidget *
+scm_widget_new (void)
+{
+  ScmWidget* sw = (ScmWidget*) g_object_new (GTK_TYPE_SCMWIDGET, NULL);
+  return ((GtkWidget*)sw);
+}
+\f
+
+
+/* ScmWidget methods.
+
+   These methods call the callback trampolines, adding the ID argument
+   previously stored in the ScmWidget. */
+
+static void
+scm_widget_finalize (GObject* object)
+{
+  ScmWidget* w = GTK_SCMWIDGET (object);
+  int ID = w->finalize;
+  if (ID == 0) {
+    outf_error ("ScmWidget (0x%x) had no finalize callback.\n", (uint)w);
+    outf_flush_error ();
+  } else {
+    Scm_widget_finalize (ID, object);
+  }
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+scm_widget_destroy (GtkObject* object)
+{
+  ScmWidget* w = GTK_SCMWIDGET (object);
+  int ID = w->destroy;
+  if (ID != 0) {
+    Scm_widget_destroy (ID, object);
+  }
+
+  GTK_OBJECT_CLASS(parent_class)->destroy (object);
+}
+
+static void
+scm_widget_realize (GtkWidget* widget)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->realize;
+  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+  if (ID == 0) {
+    outf_error ("ScmWidget (0x%x) had no realize callback.\n", (uint)w);
+    outf_flush_error ();
+  } else {
+    Scm_widget_realize (ID, widget);
+  }
+}
+
+static void
+scm_widget_unrealize (GtkWidget* widget)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->unrealize;
+
+  if (GTK_WIDGET_MAPPED (widget)) {
+    gtk_widget_unmap (widget);
+    GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
+  }
+
+  if (ID != 0) {
+    Scm_widget_unrealize (ID, widget);
+  }
+
+  if (GTK_WIDGET_CLASS (parent_class) ->unrealize) {
+    (* GTK_WIDGET_CLASS (parent_class) ->unrealize) (widget);
+  }
+}
+
+static void
+scm_widget_size_request (GtkWidget* widget, GtkRequisition* requisition)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->size_request;
+  if (ID == 0) {
+    outf_error ("ScmWidget (0x%x) had no size_request callback.\n", (uint)w);
+    outf_flush_error ();
+  } else {
+    Scm_widget_size_request (ID, widget, requisition);
+  }
+}
+
+static void
+scm_widget_size_allocate (GtkWidget* widget, GtkAllocation* allocation)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->size_allocate;
+  if (ID == 0) {
+    outf_error ("ScmWidget (0x%x) had no size_allocate callback.\n", (uint)w);
+    outf_flush_error ();
+  } else {
+    Scm_widget_size_allocate (ID, widget, allocation);
+  }
+}
+
+static gboolean
+scm_widget_event (GtkWidget* widget, GdkEvent* event)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->event;
+  if (ID == 0) {
+    outf_error ("ScmWidget (0x%x) had no event callback.\n", (uint)w);
+    outf_flush_error ();
+    return FALSE;                      /* NOT handled */
+  } else {
+    return Scm_widget_event (ID, widget, event);
+  }
+}
+
+static void
+scm_widget_set_scroll_adjustments (GtkWidget* widget,
+                                  GtkAdjustment *hadj, GtkAdjustment *vadj)
+{
+  ScmWidget* w = GTK_SCMWIDGET (widget);
+  int ID = w->set_scroll_adjustments;
+  if (ID == 0) {
+    /* This is nominal. */
+  } else {
+    Scm_widget_set_scroll_adjustments (ID, widget, hadj, vadj);
+  }
+}
diff --git a/src/gtk/thread.scm b/src/gtk/thread.scm
new file mode 100644 (file)
index 0000000..066edf4
--- /dev/null
@@ -0,0 +1,79 @@
+#| -*-Scheme-*-
+
+$Id: $
+
+Copyright (C) 2007, 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+|#
+
+;;;; The Toolkit Thread
+;;; package: (gtk thread)
+;;; parent: (runtime thread)
+
+
+(define tracing? #f)
+
+(define-syntax trace
+  (syntax-rules ()
+    ((_ . MSG)
+     (if tracing? ((lambda () (outf-console . MSG)))))))
+
+(define gtk-thread #f)
+
+;;; With the following thread always running, the runtime system
+;;; should no longer use wait-for-io, nor need to signal
+;;; condition-type:no-thread!
+
+(define (create-gtk-thread)
+  (if gtk-thread (error "A GTk thread already exists."))
+  (set! gtk-thread
+       (create-thread
+        #f (lambda ()
+             (let ((self (current-thread)))
+               (let gtk-thread-loop ()
+                 (let ((time (time-limit self)))
+                   (trace ";run-gtk until "time"\n")
+                   ((ucode-primitive run-gtk 2)
+                    (select-registry-handle io-registry) time)
+                   (trace ";run-gtk done at "(real-time-clock)"\n"))
+                 (signal-thread-events)
+                 (yield-current-thread)
+                 (gtk-thread-loop)))))))
+
+(define (signal-thread-events)
+  ;; NOTE: This should match the start of thread-timer-interrupt-handler.
+  (set! next-scheduled-timeout #f)
+  (deliver-timer-events)
+  (maybe-signal-io-thread-events))
+
+(define (time-limit self)
+  (if (thread/next self)
+      0
+      (if (integer? next-scheduled-timeout)
+         next-scheduled-timeout
+         (begin
+           (outf-console
+            "\n;Warning: bogus timeout: "next-scheduled-timeout"\n")
+           (+ (real-time-clock) 1000)))))
+
+(define (kill-gtk-thread)
+  (if (not gtk-thread) (error "A GTk thread is not running."))
+  (signal-thread-event
+   gtk-thread (lambda () (exit-current-thread #t))))
\ No newline at end of file
diff --git a/src/microcode/achost.ac b/src/microcode/achost.ac
new file mode 100644 (file)
index 0000000..0c5ae42
--- /dev/null
@@ -0,0 +1,219 @@
+### -*-M4-*-
+###
+### Copyright (C) 2010 Massachusetts Institute of Technology
+###
+### This file is part of MIT/GNU Scheme.
+###
+### MIT/GNU Scheme is free software; you can redistribute it and/or
+### modify it under the terms of the GNU General Public License as
+### published by the Free Software Foundation; either version 2 of the
+### License, or (at your option) any later version.
+###
+### MIT/GNU Scheme is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+### General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with MIT/GNU Scheme; if not, write to the Free Software
+### Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+### 02110-1301, USA.
+
+AC_CANONICAL_HOST
+
+dnl Save these prior to running AC_PROG_CC.
+SAVED_CFLAGS=${CFLAGS}
+SAVED_LDFLAGS=${LDFLAGS}
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_CC_STDC
+if test "x${ac_cv_prog_cc_c99}" != xno; then
+   AC_DEFINE([HAVE_STDC_99], [1], [Does the compiler support C99?])
+fi
+if test "x${ac_cv_prog_cc_c89}" != xno; then
+   AC_DEFINE([HAVE_STDC_89], [1], [Does the compiler support C89?])
+fi
+AC_C_BACKSLASH_A
+AC_C_BIGENDIAN
+AC_C_CONST
+AC_C_RESTRICT
+AC_C_VOLATILE
+AC_C_INLINE
+AC_C_STRINGIZE
+AC_C_PROTOTYPES
+AC_PROG_EGREP
+AC_PROG_FGREP
+AC_PROG_GREP
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+
+if test ${GCC} = yes; then
+
+    dnl Discard flags computed by AC_PROG_CC; we'll use our own.
+    CFLAGS=${SAVED_CFLAGS}
+    LDFLAGS=${SAVED_LDFLAGS}
+
+    if test ${enable_debugging} = no; then
+       CFLAGS="${CFLAGS} -O3"
+    else
+       CFLAGS="${CFLAGS} -O0 -g -DENABLE_DEBUGGING_TOOLS"
+       LDFLAGS="${LDFLAGS} -g"
+    fi
+    CFLAGS="${CFLAGS} -Wall -Wundef -Wpointer-arith -Winline"
+    CFLAGS="${CFLAGS} -Wstrict-prototypes -Wnested-externs -Wredundant-decls"
+
+    AC_MSG_CHECKING([for GCC>=4])
+    AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+           [[
+           #if __GNUC__ >= 4
+           ;
+           #else
+           #error "gcc too old"
+           #endif
+           ]],
+           [[]]
+       )],
+       [
+       AC_MSG_RESULT([yes])
+       CFLAGS="${CFLAGS} -Wextra -Wno-sign-compare -Wno-unused-parameter"
+       CFLAGS="${CFLAGS} -Wold-style-definition"
+       ],
+       [AC_MSG_RESULT([no])])
+
+    # other possibilities:
+    # -Wmissing-prototypes -Wunreachable-code -Wwrite-strings
+fi
+FOO=`${INSTALL} --help 2> /dev/null | ${FGREP} -e --preserve-timestamps`
+if test "x${FOO}" != x; then
+    INSTALL="${INSTALL} --preserve-timestamps"
+fi
+CCLD=${CC}
+
+MIT_SCHEME_NATIVE_CODE([${enable_native_code}],[${host_cpu}])
+
+if test x${mit_scheme_native_code} = xhppa; then
+   GC_HEAD_FILES="${GC_HEAD_FILES} hppacach.h"
+fi
+
+AUXDIR_NAME=mit-scheme-${mit_scheme_native_code}
+EXE_NAME=mit-scheme-${mit_scheme_native_code}
+
+dnl Add OS-dependent customizations.  This must happen before checking
+dnl any headers or library routines, because it may add CFLAGS or
+dnl LDFLAGS that the subsequent checks require.
+
+DO_GCC_TESTS=no
+GNU_LD=no
+case ${host_os} in
+linux-gnu)
+    M4_FLAGS="${M4_FLAGS} -P __linux__,1"
+    DO_GCC_TESTS=yes
+    GNU_LD=yes
+    ;;
+freebsd*)
+    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
+    DO_GCC_TESTS=yes
+    GNU_LD=yes
+    ;;
+dragonfly*)
+    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
+    DO_GCC_TESTS=yes
+    GNU_LD=yes
+    ;;
+darwin*)
+    if test -n "${with_macosx_version}"; then
+       MACOSX=${with_macosx_version}
+       MACOSX_CFLAGS="-mmacosx-version-min=${MACOSX}"
+    else
+       MACOSX=`sw_vers | ${GREP} ^ProductVersion: \
+           | ${EGREP} -o '[[0-9]+\.[0-9]+]'`
+       if test -z "${MACOSX}"; then
+           AC_MSG_ERROR([Unable to determine MacOSX version])
+       fi
+       MACOSX_CFLAGS=
+    fi
+    if test "${MACOSX}" = 10.4; then
+       SDK=MacOSX${MACOSX}u
+    else
+       SDK=MacOSX${MACOSX}
+    fi
+    MACOSX_SYSROOT=/Developer/SDKs/${SDK}.sdk
+    if test ! -d "${MACOSX_SYSROOT}"; then
+       AC_MSG_ERROR([No MacOSX SDK for version: ${MACOSX}])
+    fi
+    MACOSX_CFLAGS="${MACOSX_CFLAGS} -isysroot ${MACOSX_SYSROOT}"
+    MACOSX_CFLAGS="${MACOSX_CFLAGS} -fconstant-cfstrings"
+    AC_MSG_NOTICE([Compiling for MacOSX version ${MACOSX}])
+    case ${mit_scheme_native_code} in
+    i386)
+       MACOSX_CFLAGS="-arch i386 ${MACOSX_CFLAGS}"
+       AS_FLAGS="-arch i386 ${AS_FLAGS}"
+       SCHEME_LDFLAGS="${SCHEME_LDFLAGS} -Wl,-pagezero_size,04000000"
+       ;;
+    x86-64)
+       MACOSX_CFLAGS="-arch x86_64 ${MACOSX_CFLAGS}"
+       AS_FLAGS="-arch x86_64 ${AS_FLAGS}"
+       ;;
+    esac
+    CFLAGS="${CFLAGS} ${MACOSX_CFLAGS}"
+    LDFLAGS="${LDFLAGS} ${MACOSX_CFLAGS} -Wl,-syslibroot,${MACOSX_SYSROOT}"
+    LDFLAGS="${LDFLAGS} -framework CoreFoundation"
+    MODULE_LDFLAGS="${MODULE_LDFLAGS} -bundle"
+    if test "${with_module_loader}" != no; then
+      if test "${with_module_loader}" = yes; then
+       MODULE_LOADER='$(SCHEME_EXE)'
+      else
+       MODULE_LOADER="${with_module_loader}"
+      fi
+      MODULE_LDFLAGS="${MODULE_LDFLAGS} -bundle_loader "'$(MODULE_LOADER)'
+    fi
+    AUX_PROGRAMS="${AUX_PROGRAMS} macosx-starter"
+    ;;
+netbsd*)
+    DO_GCC_TESTS=yes
+    GNU_LD=yes
+    ;;
+openbsd*)
+    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
+    DO_GCC_TESTS=yes
+    GNU_LD=yes
+    ;;
+solaris*)
+    # How do we tell whether we're using GNU ld or Solaris ld?
+    if test ${GCC} = yes; then
+       DO_GCC_TESTS=yes
+       M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
+    fi
+    LDFLAGS="${LDFLAGS} -lsocket -lnsl"
+    ;;
+esac
+
+if test "${DO_GCC_TESTS}" = yes; then
+    if test "${GNU_LD}" = yes; then
+       SCHEME_LDFLAGS="${SCHEME_LDFLAGS} -export-dynamic"
+    fi
+    MODULE_CFLAGS="${MODULE_CFLAGS} -fPIC"
+    MODULE_LDFLAGS="${MODULE_LDFLAGS} -shared -fPIC"
+    SHIM_CFLAGS="${SHIM_CFLAGS} -fPIC"
+    SHIM_LDFLAGS="${SHIM_LDFLAGS} -shared -fPIC"
+    AC_MSG_CHECKING([for ELF binaries])
+    AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+           [[]],
+           [[
+           #ifdef __ELF__
+           return 0;
+           #endif
+           return 1;
+           ]]
+       )],
+       [
+       AC_MSG_RESULT([yes])
+       M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
+       M4_FLAGS="${M4_FLAGS} -P __ELF__,1"
+       ],
+       [AC_MSG_RESULT([no])])
+fi
index 6ea3b0c1b2812fc0d88be62286e7e12356edec64..a93eb376d70c65ab070707f064753995e29611c5 100644 (file)
@@ -169,6 +169,11 @@ AC_ARG_WITH([module-loader],
        [Pathname of the Scheme executable, for building modules only]))
 : ${with_module_loader='yes'}
 
+AC_ARG_WITH([gtk],
+    AS_HELP_STRING([--with-gtk],
+       [Support the GNOME Toolkit if available [[yes]]]))
+: ${with_gtk='yes'}
+
 dnl Substitution variables to be filled in below.
 AS_FLAGS=
 GC_HEAD_FILES="gccode.h cmpgc.h cmpintmd-config.h cmpintmd.h"
@@ -196,202 +201,7 @@ AUXDIR_NAME=
 EXE_NAME=
 INSTALL_INCLUDE=
 
-AC_CANONICAL_HOST
-
-dnl Save these prior to running AC_PROG_CC.
-SAVED_CFLAGS=${CFLAGS}
-SAVED_LDFLAGS=${LDFLAGS}
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_CC_STDC
-if test "x${ac_cv_prog_cc_c99}" != xno; then
-   AC_DEFINE([HAVE_STDC_99], [1], [Does the compiler support C99?])
-fi
-if test "x${ac_cv_prog_cc_c89}" != xno; then
-   AC_DEFINE([HAVE_STDC_89], [1], [Does the compiler support C89?])
-fi
-AC_C_BACKSLASH_A
-AC_C_BIGENDIAN
-AC_C_CONST
-AC_C_RESTRICT
-AC_C_VOLATILE
-AC_C_INLINE
-AC_C_STRINGIZE
-AC_C_PROTOTYPES
-AC_PROG_EGREP
-AC_PROG_FGREP
-AC_PROG_GREP
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-
-if test ${GCC} = yes; then
-
-    dnl Discard flags computed by AC_PROG_CC; we'll use our own.
-    CFLAGS=${SAVED_CFLAGS}
-    LDFLAGS=${SAVED_LDFLAGS}
-
-    if test ${enable_debugging} = no; then
-       CFLAGS="${CFLAGS} -O3"
-    else
-       CFLAGS="${CFLAGS} -O0 -g -DENABLE_DEBUGGING_TOOLS"
-       LDFLAGS="${LDFLAGS} -g"
-    fi
-    CFLAGS="${CFLAGS} -Wall -Wundef -Wpointer-arith -Winline"
-    CFLAGS="${CFLAGS} -Wstrict-prototypes -Wnested-externs -Wredundant-decls"
-
-    AC_MSG_CHECKING([for GCC>=4])
-    AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM(
-           [[
-           #if __GNUC__ >= 4
-           ;
-           #else
-           #error "gcc too old"
-           #endif
-           ]],
-           [[]]
-       )],
-       [
-       AC_MSG_RESULT([yes])
-       CFLAGS="${CFLAGS} -Wextra -Wno-sign-compare -Wno-unused-parameter"
-       CFLAGS="${CFLAGS} -Wold-style-definition"
-       ],
-       [AC_MSG_RESULT([no])])
-
-    # other possibilities:
-    # -Wmissing-prototypes -Wunreachable-code -Wwrite-strings
-fi
-FOO=`${INSTALL} --help 2> /dev/null | ${FGREP} -e --preserve-timestamps`
-if test "x${FOO}" != x; then
-    INSTALL="${INSTALL} --preserve-timestamps"
-fi
-CCLD=${CC}
-
-MIT_SCHEME_NATIVE_CODE([${enable_native_code}],[${host_cpu}])
-
-if test x${mit_scheme_native_code} = xhppa; then
-   GC_HEAD_FILES="${GC_HEAD_FILES} hppacach.h"
-fi
-
-AUXDIR_NAME=mit-scheme-${mit_scheme_native_code}
-EXE_NAME=mit-scheme-${mit_scheme_native_code}
-
-dnl Add OS-dependent customizations.  This must happen before checking
-dnl any headers or library routines, because it may add CFLAGS or
-dnl LDFLAGS that the subsequent checks require.
-
-DO_GCC_TESTS=no
-GNU_LD=no
-case ${host_os} in
-linux-gnu)
-    M4_FLAGS="${M4_FLAGS} -P __linux__,1"
-    DO_GCC_TESTS=yes
-    GNU_LD=yes
-    ;;
-freebsd*)
-    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
-    DO_GCC_TESTS=yes
-    GNU_LD=yes
-    ;;
-dragonfly*)
-    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
-    DO_GCC_TESTS=yes
-    GNU_LD=yes
-    ;;
-darwin*)
-    if test -n "${with_macosx_version}"; then
-       MACOSX=${with_macosx_version}
-       MACOSX_CFLAGS="-mmacosx-version-min=${MACOSX}"
-    else
-       MACOSX=`sw_vers | ${GREP} ^ProductVersion: \
-           | ${EGREP} -o '[[0-9]+\.[0-9]+]'`
-       if test -z "${MACOSX}"; then
-           AC_MSG_ERROR([Unable to determine MacOSX version])
-       fi
-       MACOSX_CFLAGS=
-    fi
-    if test "${MACOSX}" = 10.4; then
-       SDK=MacOSX${MACOSX}u
-    else
-       SDK=MacOSX${MACOSX}
-    fi
-    MACOSX_SYSROOT=/Developer/SDKs/${SDK}.sdk
-    if test ! -d "${MACOSX_SYSROOT}"; then
-       AC_MSG_ERROR([No MacOSX SDK for version: ${MACOSX}])
-    fi
-    MACOSX_CFLAGS="${MACOSX_CFLAGS} -isysroot ${MACOSX_SYSROOT}"
-    MACOSX_CFLAGS="${MACOSX_CFLAGS} -fconstant-cfstrings"
-    AC_MSG_NOTICE([Compiling for MacOSX version ${MACOSX}])
-    case ${mit_scheme_native_code} in
-    i386)
-       MACOSX_CFLAGS="-arch i386 ${MACOSX_CFLAGS}"
-       AS_FLAGS="-arch i386 ${AS_FLAGS}"
-       SCHEME_LDFLAGS="${SCHEME_LDFLAGS} -Wl,-pagezero_size,04000000"
-       ;;
-    x86-64)
-       MACOSX_CFLAGS="-arch x86_64 ${MACOSX_CFLAGS}"
-       AS_FLAGS="-arch x86_64 ${AS_FLAGS}"
-       ;;
-    esac
-    CFLAGS="${CFLAGS} ${MACOSX_CFLAGS}"
-    LDFLAGS="${LDFLAGS} ${MACOSX_CFLAGS} -Wl,-syslibroot,${MACOSX_SYSROOT}"
-    LDFLAGS="${LDFLAGS} -framework CoreFoundation"
-    MODULE_LDFLAGS="${MODULE_LDFLAGS} -bundle"
-    if test "${with_module_loader}" != no; then
-      if test "${with_module_loader}" = yes; then
-       MODULE_LOADER='$(SCHEME_EXE)'
-      else
-       MODULE_LOADER="${with_module_loader}"
-      fi
-      MODULE_LDFLAGS="${MODULE_LDFLAGS} -bundle_loader "'$(MODULE_LOADER)'
-    fi
-    AUX_PROGRAMS="${AUX_PROGRAMS} macosx-starter"
-    ;;
-netbsd*)
-    DO_GCC_TESTS=yes
-    GNU_LD=yes
-    ;;
-openbsd*)
-    M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
-    DO_GCC_TESTS=yes
-    GNU_LD=yes
-    ;;
-solaris*)
-    # How do we tell whether we're using GNU ld or Solaris ld?
-    if test ${GCC} = yes; then
-       DO_GCC_TESTS=yes
-       M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
-    fi
-    LDFLAGS="${LDFLAGS} -lsocket -lnsl"
-    ;;
-esac
-
-if test "${DO_GCC_TESTS}" = yes; then
-    if test "${GNU_LD}" = yes; then
-       SCHEME_LDFLAGS="${SCHEME_LDFLAGS} -export-dynamic"
-    fi
-    MODULE_CFLAGS="${MODULE_CFLAGS} -fPIC"
-    MODULE_LDFLAGS="${MODULE_LDFLAGS} -shared -fPIC"
-    AC_MSG_CHECKING([for ELF binaries])
-    AC_RUN_IFELSE(
-       [AC_LANG_PROGRAM(
-           [[]],
-           [[
-           #ifdef __ELF__
-           return 0;
-           #endif
-           return 1;
-           ]]
-       )],
-       [
-       AC_MSG_RESULT([yes])
-       M4_FLAGS="${M4_FLAGS} -P SUPPRESS_LEADING_UNDERSCORE,1"
-       M4_FLAGS="${M4_FLAGS} -P __ELF__,1"
-       ],
-       [AC_MSG_RESULT([no])])
-fi
+m4_include(achost.ac)
 
 dnl Checks for libraries.
 AC_CHECK_LIB([m], [exp])
@@ -976,6 +786,22 @@ if test ${enable_valgrind_mode} != no; then
     M4_FLAGS="${M4_FLAGS} -P VALGRIND_MODE,1"
 fi
 
+dnl Add support for Gtk if present.
+AC_CHECK_PROG([PKG_CONFIG], [pkg-config], [yes])
+if test ${with_gtk} = yes; then
+    AC_MSG_CHECKING([for gtk])
+    if test "${PKG_CONFIG}" != yes; then
+       AC_MSG_RESULT([no, no pkg-config])
+    else
+       if pkg-config --exists gtk+-2.0; then
+           AC_MSG_RESULT([yes])
+           MODULE_TARGETS="${MODULE_TARGETS} prgtkio.so"
+       else
+           AC_MSG_RESULT([no, ! pkg-config --exists gtk+-2.0])
+       fi
+    fi
+fi
+
 OPTIONAL_BASES="${OPTIONAL_BASES} cmpint cmpintmd comutl"
 
 case ${mit_scheme_native_code} in
index 89824c892505ba77950d028822ccee82b44dc9a2..2f47fc1f9c71d8eddbb5a02c16eb71511ffe3bbb 100644 (file)
@@ -216,8 +216,14 @@ prx11.so: prx11.o x11base.o x11color.o x11graph.o x11term.o @MODULE_LOADER@
        $(LINK_MODULE) prx11.o x11base.o x11color.o x11graph.o x11term.o \
          -lX11 $(MODULE_LIBS)
 
+prgtkio.so: prgtkio.o scheme
+       $(LINK_MODULE) prgtkio.o `pkg-config --libs gtk+-2.0` $(MODULE_LIBS)
+
 @MODULE_RULES@
 
+prgtkio.o: prgtkio.c
+       $(COMPILE_MODULE) `pkg-config --cflags gtk+-2.0` -c $<
+
 tags: TAGS
 TAGS:
        etags -r '/^DEF[A-Z0-9_]*[ \t]*(\("[^"]+"\|[a-zA-Z_][a-zA-Z0-9_]*\)/' \
index 81bf608a6afd4327570b03c37b45454263128b81..bd8435df6c2cc75cceaac3aab8fbddbd17d2f3ef 100644 (file)
@@ -36,6 +36,7 @@ USA.
 "pruxdld"
 "pruxffi"
 "prx11"
+"prgtkio"
 "svm1-interp"
 "termcap"
 "terminfo"
index d6d6274200325ef1c5d65f228adc1002f0e80d85..4577f7596df8a839fdecf4ef941d11d0ad7b63c9 100644 (file)
@@ -101,6 +101,9 @@ extern void OS_remove_from_select_registry
   (select_registry_t registry, int fd, unsigned int mode);
 extern unsigned int OS_select_registry_length
   (select_registry_t registry);
+extern void OS_select_registry_entry
+  (select_registry_t registry, unsigned int index,
+    int * fd_r, unsigned int * mode_r);
 extern void OS_select_registry_result
   (select_registry_t registry, unsigned int index,
     int * fd_r, unsigned int * mode_r);
@@ -108,5 +111,6 @@ extern int OS_test_select_registry
   (select_registry_t registry, int blockp);
 extern int OS_test_select_descriptor
   (int fd, int blockp, unsigned int mode);
+extern select_registry_t arg_select_registry (int arg_number);
 
 #endif /* SCM_OSIO_H */
diff --git a/src/microcode/prgtkio.c b/src/microcode/prgtkio.c
new file mode 100644 (file)
index 0000000..3cb447e
--- /dev/null
@@ -0,0 +1,525 @@
+/* -*-C-*-
+
+$Id: $
+
+Copyright (C) 2008, 2009  Matthew Birkholz
+
+This file is part of MIT/GNU Scheme.
+
+MIT/GNU Scheme is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+MIT/GNU Scheme is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with MIT/GNU Scheme; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+USA.
+
+*/
+
+/* SchemeSource -- the custom GSource that runs Scheme in an idle task. */
+
+#include "scheme.h"
+#include "prims.h"
+#include "pruxffi.h"
+
+#include "osio.h"
+#include "osenv.h"
+#include "ux.h"
+#include "uxio.h"
+#include "uxselect.h"
+#include "uxproc.h"
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+struct _SchemeSource
+{
+  GSource source;
+
+  /* This is in GSource, but is private(?). */
+  GMainContext* main_context;
+
+  /* The main loop running in main_context (if any). */
+  GMainLoop* main_loop;
+
+  /* The list of GPollFDs that have been added to the main_context. */
+  GSList* gpollfds;
+
+  /* When to give up waiting. */
+  double time_limit;
+};
+typedef struct _SchemeSource SchemeSource;
+
+static gboolean scheme_source_prepare (GSource* source, gint* timeout);
+static gboolean scheme_source_check (GSource* source);
+static int pending_io (SchemeSource* source);
+static gboolean scheme_source_dispatch (GSource* source, GSourceFunc callback, gpointer user_data);
+SchemeSource* scheme_source_new (void);
+void scheme_source_destroy (SchemeSource* source);
+static void clear_registry (SchemeSource* source);
+static void set_registry (SchemeSource* source, GSList* new, double time);
+
+static SchemeSource* scheme_source;
+extern int cstack_depth;       /* in pruxffi.c */
+static SCHEME_OBJECT tracing_gtk_select;
+static GSList* gtk_registry (select_registry_t registry);
+
+static int slice_counter = 0;
+static GtkWidget* slice_window;
+static GtkWidget* slice_label;
+static GtkWidget* status_label;
+static void open_slice_window (void);
+static void close_slice_window (void);
+static gchar* gpollfds_string (GSList* gpollfds);
+
+static gboolean
+scheme_source_prepare (GSource* source, gint* timeout)
+{
+  /* Return TRUE when ready to dispatch (without a poll).
+
+     Return FALSE and set `timeout' to do a poll/check before
+     dispatching. */
+
+  SchemeSource* src = (SchemeSource*)source;
+  double dtime = OS_real_time_clock ();
+  int timeo = src->time_limit - dtime;
+  if (timeo <= 0
+      || pending_interrupts_p ()
+      || OS_process_any_status_change ())
+    {
+      if (tracing_gtk_select == SHARP_T)
+       {
+         if (timeo > 0)
+           {
+             outf_console (";scheme_source_prepare: %s\n",
+                           pending_interrupts_p ()
+                           ? "interrupt" : "subprocess");
+           }
+         else
+           {
+             outf_console
+               (";scheme_source_prepare: timeout at %.1f (in %dmsec)\n",
+                dtime, timeo);
+           }
+         outf_flush_console ();
+       }
+      return (TRUE);           /* Ready for immediate dispatch. */
+    }
+
+  if (tracing_gtk_select == SHARP_T)
+    {
+      outf_console (";scheme_source_prepare: polling for %dmsec\n", timeo);
+      outf_flush_console ();
+    }
+  *timeout = timeo;
+  return (FALSE);      /* Poll/check before dispatching. */
+}
+
+static gboolean
+scheme_source_check (GSource* source)
+{
+  /* Return TRUE when ready to dispatch (after the poll). */
+
+  SchemeSource* src = (SchemeSource*)source;
+  double time = OS_real_time_clock ();
+  if (time > src->time_limit
+      || pending_io (src)
+      || pending_interrupts_p ()
+      || OS_process_any_status_change ())
+    {
+      if (tracing_gtk_select == SHARP_T
+         && (time > src->time_limit
+             || pending_interrupts_p ()
+             || OS_process_any_status_change ()))
+       {
+         outf_console (";scheme_source_check: %s\n",
+                       pending_interrupts_p () ? "interrupt"
+                       : OS_process_any_status_change () ? "subprocess"
+                       : time > src->time_limit ? "timeout"
+                       : "i/o ready");
+         outf_flush_console ();
+       }
+      return (TRUE);           /* Ready for immediate dispatch. */
+    }
+  return (FALSE);              /* No I/O ready; no timeout. */
+}
+
+static int
+pending_io (SchemeSource* src)
+{
+  GSList* scan;
+
+  if (tracing_gtk_select == SHARP_T)
+    {
+      scan = src->gpollfds;
+      while (scan != NULL)
+       {
+         GPollFD* gfd = scan->data;
+         if (gfd->revents != 0)
+           {
+             outf_console (";scheme_source_check: i/o ready on %d\n",
+                           gfd->fd);
+           }
+         scan = scan->next;
+       }
+    }
+
+  scan = src->gpollfds;
+  while (scan != NULL)
+    {
+      GPollFD* gfd = scan->data;
+      if (gfd->revents != 0)
+       return (TRUE);
+      scan = scan->next;
+    }
+  return (FALSE);
+}
+
+static gboolean
+scheme_source_dispatch (GSource* source,
+                       GSourceFunc callback, gpointer user_data)
+{
+  /* Executes our "idle" task.  Ignore the callback and user_data
+     arguments.  Must return TRUE to stay on the list of mainloop
+     event sources. */
+
+  SchemeSource* src = (SchemeSource*)source;
+
+  slice_counter += 1;
+  if (slice_window != NULL)
+    {
+      gchar* fdstr, * text;
+
+      text = g_strdup_printf ("Scheme time-slice: %d\n", slice_counter);
+      gtk_label_set_text(GTK_LABEL(slice_label), text);
+      g_free (text);
+
+      fdstr = gpollfds_string (src->gpollfds);
+      text = g_strdup_printf ("Channels:%s", fdstr);
+      if (fdstr[0] != '\0') g_free (fdstr);
+      gtk_label_set_text(GTK_LABEL(status_label), text);
+      g_free (text);
+    }
+  if (tracing_gtk_select == SHARP_T)
+    {
+      outf_console (";scheme_source_dispatch: running time slice %d\n",
+                   slice_counter);
+      outf_flush_console ();
+    }
+  Interpret (1);
+  if (tracing_gtk_select == SHARP_T)
+    {
+      outf_console (";scheme_source_dispatch: finished time slice %d\n",
+                   slice_counter);
+      outf_flush_console ();
+    }
+  return (TRUE);               /* Not a once-only. */
+}
+
+GSourceFuncs scheme_source_funcs =
+{
+  scheme_source_prepare,
+  scheme_source_check,
+  scheme_source_dispatch,
+  NULL,
+  NULL,
+  NULL
+};
+
+SchemeSource*
+scheme_source_new (void)
+{
+  GSource* source = g_source_new (&scheme_source_funcs, sizeof (SchemeSource));
+  SchemeSource* src = (SchemeSource*)source;
+  GMainContext* context = g_main_context_default ();
+  src->main_context = context;
+  src->main_loop = g_main_loop_new (context, FALSE);
+  src->gpollfds = NULL;
+  src->time_limit = 0.0;
+  g_source_attach (source, context);
+  return (src);
+}
+
+void
+scheme_source_destroy (SchemeSource* source)
+{
+  clear_registry (source);
+  if (source->main_loop != NULL)
+    {
+      g_main_loop_unref (source->main_loop);
+      source->main_loop = NULL;
+    }
+  g_source_destroy ((GSource*) source);
+}
+
+static void
+clear_registry (SchemeSource* source)
+{
+  GSList* gpollfds = source->gpollfds;
+  if (gpollfds != NULL)
+    {
+      GMainContext* context = source->main_context;
+      GSList* scan = gpollfds;
+      while (scan != NULL)
+       {
+         GPollFD* gfd = scan->data;
+         g_main_context_remove_poll (context, gfd);
+         g_free (gfd);
+         scan->data = NULL;
+         scan = scan->next;
+       }
+      g_slist_free (gpollfds);
+    }
+  source->gpollfds = NULL;
+}
+
+static void
+set_registry (SchemeSource* source, GSList* new, double time)
+{
+  /* Set the source's current gpollfds to match NEW.  Warns if the
+     registry is already set. */
+
+  if (source->gpollfds != NULL)
+    clear_registry (source);
+
+  source->time_limit = time;
+  source->gpollfds = new;
+  {
+    GMainContext* context = source->main_context;
+    while (new != NULL)
+      {
+       GPollFD* gfd = new->data;
+       g_main_context_add_poll (context, gfd, G_PRIORITY_DEFAULT);
+       new = new->next;
+      }
+  }
+}
+\f
+
+/* Invoking main_loop_run. */
+
+DEFINE_PRIMITIVE ("GTK-MAIN+", Prim_gtk_main_plus, 0, 0, 0)
+{
+  /* Runs a GMainLoop with scheme_source attached. */
+
+  PRIMITIVE_HEADER (0);
+
+  canonicalize_primitive_context ();
+  {
+    if (scheme_source != NULL)
+      error_external_return ();
+
+    scheme_source = scheme_source_new ();
+    g_main_loop_run (scheme_source->main_loop);
+    /* Heap may have been GCed!  Luckily we don't need it. */
+    scheme_source_destroy (scheme_source);
+    scheme_source = NULL;
+  }
+  PRIMITIVE_RETURN (SHARP_T);
+}
+
+DEFINE_PRIMITIVE ("GTK-MAIN+-QUIT", Prim_gtk_main_plus_quit, 0, 0, 0)
+{
+  PRIMITIVE_HEADER (0);
+
+  canonicalize_primitive_context ();
+  {
+    if (scheme_source == NULL)
+      error_external_return ();
+
+    g_main_loop_quit (scheme_source->main_loop);
+  }
+  PRIMITIVE_RETURN (SHARP_F);
+}
+
+DEFINE_PRIMITIVE ("RUN-GTK", Prim_run_gtk, 2, 2, 0)
+{
+  /* Return to the toolkit with the scheme_source set up to dispatch
+     to Scheme again when I/O is ready, or a certain TIME has passed.
+     If TIME has already passed, the I/O registry is ignored and
+     Scheme is ready to run again immediately.  If I/O is empty, the
+     simulated poll should not re-enter Scheme until TIME. */
+
+  PRIMITIVE_HEADER (2);
+  canonicalize_primitive_context ();
+  {
+    select_registry_t r = arg_select_registry (1);
+    double time = arg_real_number (2);
+    set_registry (scheme_source, gtk_registry (r), time);
+    if (tracing_gtk_select == SHARP_T)
+      {
+       GSList* gpollfds = scheme_source->gpollfds;
+       gchar* fdstr = gpollfds_string (gpollfds);
+       outf_console (";run_gtk%s%s until %.1f\n",
+                     gpollfds == NULL ? "" : " waiting on", fdstr, time);
+       outf_flush_console ();
+       if (fdstr[0] != '\0') g_free (fdstr);
+      }
+    POP_PRIMITIVE_FRAME (2);
+    SET_EXP (SHARP_F);
+    PRIMITIVE_ABORT (PRIM_RETURN_TO_C);
+    /*NOTREACHED*/
+    PRIMITIVE_RETURN (UNSPECIFIC);
+  }
+}
+\f
+
+/* Gtk Select Registries -- GSLists of GPollFDs. */
+
+/* SELECT_MODE_ -> GIOCondition */
+#define DECODE_MODE(mode)                                              \
+(((((mode) & SELECT_MODE_READ) != 0) ? G_IO_IN : 0)                    \
+ | ((((mode) & SELECT_MODE_WRITE) != 0) ? G_IO_OUT : 0))
+
+/* GIOCondition -> SELECT_MODE_ */
+#define ENCODE_MODE(revents)                                           \
+(((((revents) & G_IO_IN) != 0) ? SELECT_MODE_READ : 0)                 \
+ | ((((revents) & G_IO_OUT) != 0) ? SELECT_MODE_WRITE : 0)             \
+ | ((((revents) & G_IO_ERR) != 0) ? SELECT_MODE_ERROR : 0)             \
+ | ((((revents) & G_IO_HUP) != 0) ? SELECT_MODE_HUP : 0))
+
+static GSList*
+gtk_registry (select_registry_t registry)
+{
+  /* Construct Gtk's version of a select_registry_t. */
+
+  int len = OS_select_registry_length (registry);
+  int i = 0;
+  GSList* list = NULL;
+
+  while (i < len)
+    {
+      int fd;
+      unsigned int mode;
+      GPollFD* item = g_malloc (sizeof (GPollFD));
+      OS_select_registry_entry (registry, i, (&fd), (&mode));
+      item->fd = fd;
+      item->events = DECODE_MODE (mode) | G_IO_ERR | G_IO_HUP;
+      item->revents = 0;
+      list = g_slist_prepend (list, item);
+      i += 1;
+    }
+  return (list);
+}
+
+static gchar*
+gpollfds_string (GSList* gpollfds)
+{
+  /* Construct a string describing the fds and r/w flags in GPOLLFDS,
+     e.g. " 0(r)" */
+
+  gchar* string = "";
+  GSList* scan = gpollfds;
+  while (scan != NULL)
+    {
+      GPollFD* gfd = scan->data;
+      int mode = (gfd->events) & (~(G_IO_HUP|G_IO_ERR));
+      gchar* next = g_strdup_printf ("%s %d(%s)", string, gfd->fd,
+                                    (mode == (G_IO_IN|G_IO_OUT) ? "rw"
+                                     : mode == G_IO_IN ? "r"
+                                     : mode == G_IO_OUT ? "w" : "?"));
+      if (string[0] != '\0')
+       g_free (string);
+      string = next;
+      scan = scan->next;
+    }
+  return (string);
+}
+
+static void
+open_slice_window (void)
+{
+  slice_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  GtkWidget* vbox = gtk_vbox_new(FALSE, 5);
+  status_label  = gtk_label_new("Channels:");
+  slice_label  = gtk_label_new("Scheme time-slice: 0");
+  gtk_container_add(GTK_CONTAINER(slice_window), vbox);
+  gtk_box_pack_start (GTK_BOX (vbox), status_label, FALSE, FALSE, 2);
+  gtk_box_pack_end (GTK_BOX (vbox), slice_label, FALSE, FALSE, 2);
+  gtk_window_set_title(GTK_WINDOW(slice_window), "Scheme Time-Slice Counter");
+  gtk_window_set_type_hint (GTK_WINDOW(slice_window),
+                           GDK_WINDOW_TYPE_HINT_UTILITY);
+  gtk_widget_show_all (slice_window);
+  gtk_window_parse_geometry (GTK_WINDOW (slice_window), "250x50+0-40");
+}
+
+static void
+close_slice_window (void)
+{
+  gtk_widget_destroy (GTK_WIDGET (slice_window));
+  slice_window = NULL;
+  status_label = NULL;
+  slice_label = NULL;
+}
+
+DEFINE_PRIMITIVE ("GTK-TIME-SLICE-WINDOW?", Prim_gtk_time_slice_window_p, 0,0,0)
+{
+  PRIMITIVE_HEADER (0);
+
+  PRIMITIVE_RETURN (slice_window == NULL ? SHARP_F : SHARP_T);
+}
+
+DEFINE_PRIMITIVE ("GTK-TIME-SLICE-WINDOW!", Prim_gtk_time_slice_window, 1, 1, 0)
+{
+  PRIMITIVE_HEADER (1);
+  {
+    SCHEME_OBJECT arg = ARG_REF(1);
+    if (arg == SHARP_F)
+      {
+       if (slice_window != NULL)
+         close_slice_window();
+      }
+    else
+      {
+       if (slice_window == NULL)
+         open_slice_window();
+      }
+    PRIMITIVE_RETURN (arg);
+  }
+}
+
+DEFINE_PRIMITIVE ("GTK-SELECT-TRACE?", Prim_gtk_select_trace_p, 0, 0, 0)
+{
+  PRIMITIVE_HEADER (0);
+
+  PRIMITIVE_RETURN (tracing_gtk_select);
+}
+
+DEFINE_PRIMITIVE ("GTK-SELECT-TRACE!", Prim_gtk_select_trace, 1, 1, 0)
+{
+  PRIMITIVE_HEADER (1);
+  {
+    SCHEME_OBJECT arg = ARG_REF(1);
+    tracing_gtk_select = (arg == SHARP_F ? SHARP_F : SHARP_T);
+    PRIMITIVE_RETURN (arg);
+  }
+}
+
+
+#ifdef COMPILE_AS_MODULE
+
+char*
+dload_initialize_file (void)
+{
+  scheme_source = NULL;
+  slice_window = NULL;
+  tracing_gtk_select = SHARP_F;
+
+  declare_primitive ("GTK-MAIN+", Prim_gtk_main_plus, 0, 0, 0);
+  declare_primitive ("GTK-MAIN+-QUIT", Prim_gtk_main_plus_quit, 0, 0, 0);
+  declare_primitive ("RUN-GTK", Prim_run_gtk, 2, 2, 0);
+  declare_primitive ("GTK-TIME-SLICE-WINDOW?", Prim_gtk_time_slice_window_p, 0, 0, 0);
+  declare_primitive ("GTK-TIME-SLICE-WINDOW!", Prim_gtk_time_slice_window, 1, 1, 0);
+  declare_primitive ("GTK-SELECT-TRACE?", Prim_gtk_select_trace_p, 0, 0, 0);
+  declare_primitive ("GTK-SELECT-TRACE!", Prim_gtk_select_trace, 1, 1, 0);
+  return ("#prgtkio");
+}
+
+#endif /* COMPILE_AS_MODULE */
index 9ea92b65b2f86cc0860df70cad7a1d9ac7624209..c0f83a2967552ad7f8640ff3e8df1d9eca50d0aa 100644 (file)
@@ -254,7 +254,7 @@ DEFINE_PRIMITIVE ("NEW-MAKE-PIPE", Prim_new_make_pipe, 2, 2,
 \f
 /* Select registry */
 
-static select_registry_t
+select_registry_t
 arg_select_registry (int arg_number)
 {
   return ((select_registry_t) (arg_ulong_integer (arg_number)));
index 158abb2949e837fd9f63d8b0733163238d44d936..aaa8c9c33fa8a8b8513ff71f55b705e667e89bc9 100644 (file)
@@ -535,6 +535,17 @@ OS_select_registry_length (select_registry_t registry)
   return (SR_N_FDS (r));
 }
 
+void
+OS_select_registry_entry (select_registry_t registry,
+                         unsigned int index,
+                         int * fd_r,
+                         unsigned int * mode_r)
+{
+  struct select_registry_s * r = registry;
+  (*fd_r) = ((SR_ENTRY (r, index)) -> fd);
+  (*mode_r) = (ENCODE_MODE ((SR_ENTRY (r, index)) -> events));
+}
+
 void
 OS_select_registry_result (select_registry_t registry,
                           unsigned int index,
index 660e08fe3eb99a1f10079297c9e2704f4e5dff0e..0d9854075598ac93d0a28bc220d8043f2e92a2f5 100644 (file)
@@ -6,6 +6,7 @@ install:
        rm -rf $(DESTDIR)$(RUNDIR)
        $(mkinstalldirs) $(DESTDIR)$(RUNDIR)
        $(INSTALL_DATA) *.bci $(DESTDIR)$(RUNDIR)/.
+       $(INSTALL_DATA) runtime-*.pkd $(DESTDIR)$(RUNDIR)/.
        @for F in $(RUNOPTS); do \
            CMD="$(INSTALL_COM) $${F}.com $(DESTDIR)$(RUNDIR)/.";\
            echo "$${CMD}"; eval "$${CMD}";\
index 40d52be22d43836f25326555a7b9b7088b0b690a..d16ca5f3313dc699222f7ce6a62da855d9bee74e 100644 (file)
@@ -100,6 +100,7 @@ USA.
   (set! timer-interval 100)
   (initialize-io-blocking)
   (add-event-receiver! event:after-restore initialize-io-blocking)
+  (set! tracing? #f)
   (detach-thread (make-thread #f))
   (add-event-receiver! event:before-exit stop-thread-timer))
 
@@ -204,6 +205,7 @@ USA.
   unspecific)
 
 (define (thread-not-running thread state)
+  (trace ";thread-not-running: stopping "thread" in state "state"\n")
   (set-thread/execution-state! thread state)
   (let ((thread* (thread/next thread)))
     (set-thread/next! thread #f)
@@ -211,6 +213,7 @@ USA.
   (run-first-thread))
 
 (define (run-first-thread)
+  (trace ";run-first-thread "first-running-thread"\n")
   (if first-running-thread
       (run-thread first-running-thread)
       (begin
@@ -282,21 +285,34 @@ USA.
   (set-thread/execution-state! (current-thread) 'RUNNING))
 
 (define (thread-timer-interrupt-handler)
+  (trace ";Thread timer: interrupt in "first-running-thread"\n")
   (set! next-scheduled-timeout #f)
-  (set-interrupt-enables! interrupt-mask/gc-ok)
   (deliver-timer-events)
   (maybe-signal-io-thread-events)
   (let ((thread first-running-thread))
+    (trace ";Thread timer: first runnable: "thread".\n")
     (cond ((not thread)
-          (%maybe-toggle-thread-timer))
+          (%maybe-toggle-thread-timer)
+          (trace ";Thread timer: continuing with timer set for "
+                 next-scheduled-timeout".\n"))
          ((thread/continuation thread)
+          (trace ";Thread timer: switching to "thread".\n")
           (run-thread thread))
          ((not (eq? 'RUNNING-WITHOUT-PREEMPTION
                     (thread/execution-state thread)))
+          (trace ";Thread timer: yielding to "(thread/next thread)".\n")
           (yield-thread thread))
          (else
+          (trace ";Thread timer: continuing with "thread".\n")
           (%resume-current-thread thread)))))
 
+(define tracing? #f)
+
+(define-syntax trace
+  (syntax-rules ()
+    ((_ . MSG)
+     (if tracing? ((lambda () (outf-console . MSG)))))))
+
 (define (yield-current-thread)
   (without-interrupts
    (lambda ()
@@ -318,6 +334,7 @@ USA.
           (set-thread/next! last-running-thread thread)
           (set! last-running-thread thread)
           (set! first-running-thread next)
+          (trace ";yield-thread: "thread" yields to "next"\n")
           (run-thread next))))))
 \f
 (define (exit-current-thread value)
@@ -415,6 +432,7 @@ USA.
 
 (define (wait-for-io)
   (%maybe-toggle-thread-timer #f)
+  (trace ";wait-for-io: next timeout = "next-scheduled-timeout"\n")
   (let ((catch-errors
         (lambda (thunk)
           (let ((thread (console-thread)))
@@ -442,6 +460,7 @@ USA.
        (let ((result
               (catch-errors
                (lambda ()
+                 (trace ";wait-for-io: blocking for i/o\n")
                  (set-interrupt-enables! interrupt-mask/all)
                  (test-select-registry io-registry #t)))))
          (set-interrupt-enables! interrupt-mask/gc-ok)
@@ -449,9 +468,15 @@ USA.
          (let ((thread first-running-thread))
            (if thread
                (if (thread/continuation thread)
-                   (run-thread thread)
-                   (%maybe-toggle-thread-timer))
-               (wait-for-io)))))))
+                   (begin
+                     (trace ";wait-for-io: running "thread"\n")
+                     (run-thread thread))
+                   (begin
+                     (trace ";wait-for-io: continuing "thread"\n")
+                     (%maybe-toggle-thread-timer)))
+               (begin
+                 (trace ";wait-for-io: looping\n")
+                 (wait-for-io))))))))
 \f
 (define (signal-select-result result)
   (cond ((vector? result)
@@ -774,7 +799,9 @@ USA.
                                   signal-thread-event thread event))
           (%signal-thread-event thread event)
           (if (and (not self) first-running-thread)
-              (run-thread first-running-thread)
+              (begin
+                (trace ";signal-thread-event running "first-running-thread"\n")
+                (run-thread first-running-thread))
               (%maybe-toggle-thread-timer)))))))
 
 (define (%signal-thread-event thread event)