Support scm-layout colors: fg, bg, text and base.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Thu, 30 Jul 2009 04:36:51 +0000 (21:36 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Tue, 21 Dec 2010 17:29:18 +0000 (10:29 -0700)
* doc/.gitignore, src/.gitignore, src/TAGS, src/gtk/ed-ffi.scm:

Added the Gtk build products/byproducts, Emacs and Edwin source file
declarations.

* src/gtk/Includes/: gdkcolor.cdecl, gdktypes.cdecl, gdkwindow.cdecl,
  gtk.cdecl, gtkrc.cdecl, gtkstyle.cdecl, gtkwidget.cdecl,
  gtkwindow.cdecl, pango-layout.cdecl:

Declare additional C functions and constants.

* src/gtk/Makefile-fragment:

Make C-generate products dependent on ALL .cdecl files, including all
of Includes/*.cdecl.

* src/gtk/compile.scm:

Factored some common code into a tricked-out sf procedure: sf+.

* src/gtk/gtk-object.scm:

Added new widget and window functions.  Do more argument type
checking.

* src/gtk/gtk.cdecl:

Removed gtk_window_new, gtk_window_set_title and
gtk_window_set_default_size to Includes/gtkwindow.cdecl.

* src/gtk/gtk.pkg:

Export new widget, window and color procedures.

* src/gtk/scm-layout.scm:

Uncomment trace statements; implement trace as a syntactic keyword.
Comment out visual and colormap GdkWindowAttr settings.  Added
accessors and mutators for the widget's four GTK_STATE_NORMAL colors.

17 files changed:
src/TAGS
src/gtk/Includes/gdkcolor.cdecl
src/gtk/Includes/gdktypes.cdecl
src/gtk/Includes/gdkwindow.cdecl
src/gtk/Includes/gtk.cdecl
src/gtk/Includes/gtkrc.cdecl [new file with mode: 0644]
src/gtk/Includes/gtkstyle.cdecl
src/gtk/Includes/gtkwidget.cdecl
src/gtk/Includes/gtkwindow.cdecl [new file with mode: 0644]
src/gtk/Includes/pango-layout.cdecl
src/gtk/Makefile-fragment
src/gtk/compile.scm
src/gtk/ed-ffi.scm [new file with mode: 0644]
src/gtk/gtk-object.scm
src/gtk/gtk.cdecl
src/gtk/gtk.pkg
src/gtk/scm-layout.scm

index e0668593b9f1c08e4c01a0e000c0644f769bdb34..c54e128f0e303c3eaa312b24d392c47e0238b717 100644 (file)
--- a/src/TAGS
+++ b/src/TAGS
@@ -16,3 +16,5 @@ cref/TAGS,include
 rcs/TAGS,include
 \f
 ffi/TAGS,include
+\f
+gtk/TAGS,include
index 9535948dd4ad6ccf2a0137bf21af4276e7379ef8..e7af670f398b5d570fc5ad8a9c57c9844412eeee 100644 (file)
@@ -53,9 +53,9 @@ gtk-2.0/gdk/gdkcolor.h |#
 ;      (color (const (* GdkColor))))
 ;(extern void gdk_color_free
 ;      (color (* GdkColor)))
-;(extern gint gdk_color_parse
-;      (spec (const (* gchar)))
-;      (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
index 43bf3dbdc6f9e72e025cae813b493d0f42bf2963..58ef7c44cee2c0ae9775acbb7cf04eba538ad119 100644 (file)
@@ -52,9 +52,11 @@ gtk-2.0/gdk/gdktypes.h |#
          (GDK_BUTTON3_MASK)
          (GDK_BUTTON4_MASK)
          (GDK_BUTTON5_MASK)
+         (GDK_SUPER_MASK)
+         (GDK_HYPER_MASK)
+         (GDK_META_MASK)
          (GDK_RELEASE_MASK)
-         ;;GDK_MODIFIER_MASK = GDK_RELEASE_MASK | 0x1fff
-         ))
+         (GDK_MODIFIER_MASK)))
 
 (typedef GdkInputCondition
         (enum
index 2b3292160cf7205975ff07d551a25cb374bcd312..de51593bf7e936cb5e43653065d2633f7e9f8788 100644 (file)
@@ -212,10 +212,11 @@ gtk-2.0/gdk/gdkwindow.h |#
        (dx gint)
        (dy gint))
 
-;(extern void gdk_window_invalidate_rect
-;      (window (* GdkWindow))
-;      (rect (* GdkRectangle))
-;      (invalidate_children gboolean))
+(extern void
+       gdk_window_invalidate_rect
+       (window (* GdkWindow))
+       (rect (* (const GdkRectangle)))
+       (invalidate_children gboolean))
 
 (extern void gdk_window_process_updates
        (window (* GdkWindow))
index 99f02f6a8304097aa01b2bf6b25231cbd6771e01..15b2b06de242ff316fd70d471e65d2358c3f2f69 100644 (file)
@@ -109,7 +109,7 @@ gtk-2.0/gtk/gtk.h |#
 ;(include "gtkradiomenuitem")
 ;(include "gtkradiotoolbutton")
 ;(include "gtkrange")
-;(include "gtkrc")
+(include "gtkrc")
 ;(include "gtkruler")
 ;(include "gtkscale")
 ;(include "gtkscrollbar")
@@ -162,4 +162,4 @@ gtk-2.0/gtk/gtk.h |#
 ;(include "gtkvscrollbar")
 ;(include "gtkvseparator")
 (include "gtkwidget")
-;(include "gtkwindow")
\ No newline at end of file
+(include "gtkwindow")
\ No newline at end of file
diff --git a/src/gtk/Includes/gtkrc.cdecl b/src/gtk/Includes/gtkrc.cdecl
new file mode 100644 (file)
index 0000000..54a1095
--- /dev/null
@@ -0,0 +1,30 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkrc.h |#
+
+(typedef GtkRcFlags
+        (enum
+         (GTK_RC_FG)
+         (GTK_RC_BG)
+         (GTK_RC_TEXT)
+         (GTK_RC_BASE)))
+
+(struct _GtkRcStyle
+       (parent_instance GObject)
+       (name (* gchar))
+       (bg_pixmap_name (array (* gchar) 5))
+       (font_desc (* PangoFontDescription))
+       (color_flags (array GtkRcFlags 5))
+       (fg (array GdkColor 5))
+       (bg (array GdkColor 5))
+       (text (array GdkColor 5))
+       (base (array GdkColor 5))
+       (xthickness gint)
+       (ythickness gint)
+       ;; private
+       ;; (rc_properties (* GArray))
+       ;; (rc_style_lists (* GSList))
+       ;; (icon_factories (* GSList))
+       ;; bit field
+       ;; (engine_specified guint)
+       )
\ No newline at end of file
index dc852dc3b250e3c19348b019f1b38da89ab9a4f9..bb78ee4bff883bfd1614e057af4ebe6ecb0d6a12 100644 (file)
@@ -5,6 +5,7 @@ gtk-2.0/gtk/gtkstyle.h |#
 (typedef GtkWidget (struct _GtkWidget))
 
 (typedef GtkStyle (struct _GtkStyle))
+(typedef GtkRcStyle (struct _GtkRcStyle))
 
 (struct _GtkStyle
        (parent_instance GObject)
@@ -62,6 +63,11 @@ gtk-2.0/gtk/gtkstyle.h |#
        (window (* GdkWindow))
        (state_type GtkStateType))
 
+(extern gboolean gtk_style_lookup_color
+       (style (* GtkStyle))
+       (color_name (const (* gchar)))
+       (color (* GdkColor)))
+
 (extern void gtk_paint_hline
        (style (* GtkStyle))
        (window (* GdkWindow))
index cf9918af905d62d26b4ca8999a7c9b648e567e9e..70439ab76ed47324ab6c67fc8a7bd954cdde9a35 100644 (file)
@@ -299,9 +299,15 @@ gtk-2.0/gtk/gtkwidget.h |#
        (width gint)
        (height gint))
 
+(extern void gtk_widget_grab_focus
+       (widget (* GtkWidget)))
+
 (extern (* GdkWindow) gtk_widget_get_parent_window
        (widget (* GtkWidget)))
 
+(extern void gtk_widget_error_bell
+       (widget (* GtkWidget)))
+
 (extern (* GdkColormap) gtk_widget_get_colormap
        (widget (* GtkWidget)))
 (extern (* GdkVisual) gtk_widget_get_visual
diff --git a/src/gtk/Includes/gtkwindow.cdecl b/src/gtk/Includes/gtkwindow.cdecl
new file mode 100644 (file)
index 0000000..f5935d9
--- /dev/null
@@ -0,0 +1,55 @@
+#| -*-Scheme-*-
+
+gtk-2.0/gtk/gtkwindow.h |#
+
+(include "gdk")
+;(include "gtkaccelgroup")
+;(include "gtkbin")
+(include "gtkenums")
+(include "gtkwidget")
+
+;(typedef GtkWindow (struct _GtkWindow))
+;(typedef GtkWindowGeometryInfo (struct _GtkWindowGeometryInfo))
+
+(extern (* GtkWidget)
+       gtk_window_new
+       (type GtkWindowType))
+
+(extern void
+       gtk_window_set_title
+       (window (* GtkWindow))
+       (title  (* (const gchar))))
+
+(extern void
+       gtk_window_set_geometry_hints
+       (window (* GtkWindow))
+       (geometry_widget (* GtkWidget))
+       (geometry (* GdkGeometry))
+       (geom_mask GdkWindowHints))
+
+(extern void
+       gtk_window_present
+       (window (* GtkWindow)))
+
+(extern void
+       gtk_window_set_default_size
+       (window (* GtkWindow))
+       (width gint)
+       (height gint))
+
+(extern void
+       gtk_window_get_default_size
+       (window (* GtkWindow))
+       (width (* gint))
+       (height (* gint)))
+
+(extern void
+       gtk_window_resize
+       (window (* GtkWindow))
+       (width gint)
+       (height gint))
+
+(extern gboolean
+       gtk_window_parse_geometry
+       (window (* GtkWindow))
+       (geometry (* (const gchar))))
\ No newline at end of file
index 6f27065eb6b5e50facb9838efe7d52010e032c47..cb622cd9480f09e380936af5cad958394a042042 100644 (file)
@@ -7,6 +7,8 @@ pango-1.0/pango/pango-layout.h |#
 ;(include "pango-glyph-item")
 ;(include "pango-tabs")
 
+(extern int pango_layout_get_spacing
+       (layout (* PangoLayout)))
 (extern void pango_layout_get_extents
        (layout (* PangoLayout))
        (ink_rect (* PangoRectangle))
index 74feb9bde8d88040e4f98b5e350ae9520b775eb5..f718e04bffed83cbcf8235230a1c79d7b14a6749 100644 (file)
@@ -49,7 +49,7 @@ scmwidget.c: scmwidget.c.stay
 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
+gtk-shim.c gtk-const.c gtk-types.bin: gtk.cdecl Includes/*.cdecl
        (echo "(load-option 'FFI)"; \
         echo '(C-generate "gtk" "#include \"gtk-shim.h\"")') \
        | mit-scheme --batch-mode
index a1addd393b452003cc99884304fb2943d2979499..ec3de31b722869c888fd2ed64a54e75bd7d3e7ec 100644 (file)
@@ -7,11 +7,18 @@ 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")))
+                      "gtk-ev" "demo"))
+         (sf+
+          (lambda (files env deps)
+            (fluid-let ((sf/default-declarations
+                         (cons '(usual-integrations)
+                               sf/default-declarations)))
+              (sf-with-dependencies files deps (->environment env))))))
 
       ;; Build an empty package for use at syntax-time.
       ;; The C-include syntax will bind C-INCLUDES here.
@@ -24,17 +31,8 @@ Compile the GTK system. |#
       ;; 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))
+      (sf+ gtk-files '(gtk) '("gtk-const"))
+      (sf+ "thread" '(gtk thread) '())
 
       ;; Cross-check.
       (cref/generate-constructors "gtk" 'ALL)
diff --git a/src/gtk/ed-ffi.scm b/src/gtk/ed-ffi.scm
new file mode 100644 (file)
index 0000000..fdc3f57
--- /dev/null
@@ -0,0 +1,17 @@
+#| -*- Scheme -*-
+
+$Id: $
+
+GTK buffer packaging info |#
+
+(standard-scheme-find-file-initialization
+ '#(
+    ("gtk"     (gtk))
+    ("gobject" (gtk gobject))
+    ("gtk-object" (gtk gtk-object))
+    ("scm-widget" (gtk widget))
+    ("scm-layout" (gtk layout))
+    ("thread"  (gtk thread))
+    ("main"    (gtk main))
+    ("gtk-ev"  (gtk event-viewer))
+    ("demo"    (gtk demo))))
\ No newline at end of file
index ba7f0302d866f54c3564aab29b3a7b6a72ffa23a..3cbe0cc67022d1a89ab1fb1138ec19146adbab24 100644 (file)
@@ -160,8 +160,13 @@ USA.
         (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))))
+  (C-call "gtk_widget_show_all" (gobject-alien (check-gtk-widget widget))))
+
+(define (gtk-widget-grab-focus widget)
+  (C-call "gtk_widget_grab_focus" (gobject-alien (check-gtk-widget widget))))
+
+(define (gtk-widget-error-bell widget)
+  (C-call "gtk_widget_error_bell" (gobject-alien (check-gtk-widget widget))))
 
 (define-class <gtk-container> (<gtk-widget>)
 
@@ -326,12 +331,49 @@ USA.
       (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 (guarantee-gtk-window object operator)
+  (if (not (gtk-window? object))
+      (error:wrong-type-argument object "<gtk-window>" operator)))
+
+(define (gtk-window-set-title window title)
+  (guarantee-gtk-window window 'gtk-window-set-title)
+  (guarantee-string title 'gtk-window-set-title)
+  (C-call "gtk_window_set_title" (gobject-alien window) title))
+
+(define (gtk-window-get-default-size window receiver)
+  ;; Calls RECEIVER with WINDOW's default width and height.
+  (let* ((*width (malloc (fix:* 2 (C-sizeof "gint")) 'gint))
+        (*height (alien-byte-increment *width (C-sizeof "gint") 'gint)))
+    (C-call "gtk_window_get_default_size" window *width *height)
+    (let ((width (C-> *width "* gint"))
+         (height (C-> *height "* gint")))
+      (free *width)
+      (receiver width height))))
 
 (define (gtk-window-set-default-size window width height)
+  (guarantee-gtk-window window 'gtk-window-set-default-size)
+  (guarantee-integer width 'gtk-window-set-default-size)
+  (guarantee-integer height 'gtk-window-set-default-size)
   (C-call "gtk_window_set_default_size" (gobject-alien window) width height))
 
+(define (gtk-window-parse-geometry window geometry)
+  (guarantee-gtk-window window 'gtk-window-parse-geometry)
+  (guarantee-string geometry 'gtk-window-parse-geometry)
+  (if (fix:zero? (C-call "gtk_window_parse_geometry"
+                        (gobject-alien window) geometry))
+      (ferror "Could not parse geometry string: "geometry)))
+
+(define (gtk-window-resize window width height)
+  (guarantee-gtk-window window 'gtk-window-resize)
+  (guarantee-integer width 'gtk-window-resize)
+  (guarantee-integer height 'gtk-window-resize)
+  (C-call "gtk_window_resize" (gobject-alien window) width height))
+
+(define (gtk-window-present window)
+  (guarantee-gtk-window window 'gtk-window-present)
+  (C-call "gtk_window_present" (gobject-alien window)))
+
+
 (define trace? #f)
 
 (define-syntax trace
index cd8d90b5768eabc9d0ce9391c2e409bfea10cfff..1d6989f7d8118dde93211c14a3288df808f4336f 100644 (file)
@@ -130,10 +130,6 @@ USA.
        (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)
 
@@ -141,17 +137,6 @@ USA.
        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)))
index 957ee35e9bc5d0d1de6e8e31fcbf49eea550d320..40a6331da6a143b243a12267f7ebec6d5389ae8c 100644 (file)
@@ -37,11 +37,17 @@ Gtk System Packaging |#
          <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-widget-grab-focus
+         gtk-widget-error-bell
          <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-window-new gtk-window-set-title
+         gtk-window-set-default-size gtk-window-get-default-size
+         gtk-window-parse-geometry
+         gtk-window-resize
+         gtk-window-present
          <gtk-button> gtk-button-new
          <gtk-label> gtk-label-new
          gtk-label-get-text gtk-label-set-text
@@ -73,6 +79,12 @@ Gtk System Packaging |#
          scm-layout-drawing set-scm-layout-drawing!
          scm-layout-on-screen-area set-scm-layout-scroll-pos!
 
+         scm-layout-fg-color scm-layout-bg-color
+         scm-layout-text-color scm-layout-base-color
+         set-scm-layout-fg-color! set-scm-layout-bg-color!
+         set-scm-layout-text-color! set-scm-layout-base-color!
+         scm-layout-parse-color
+
          <drawing> make-drawing set-drawing-size! drawing-pick-list
 
          <drawn-item> drawn-item-area set-drawn-item-position!
index 4511831847c884665d9ea1c7b9f39dd3e8fffc48..fe5ee0d98c6a5352b281e4967c0a3fa24540f69a 100644 (file)
@@ -33,12 +33,16 @@ USA.
     (<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).
+  ;; Until realized, these are a NULL alien and #f.  If realized, they
+  ;; are a non-NULL alien and a rectangular area in device coordinates
+  ;; (e.g. size in pixels, offset within parent window [ancestor
+  ;; widget]).
+
   (window define accessor
          initializer (lambda () (make-alien '|GdkWindow|)))
   (geometry define accessor initializer make-rect)
 
+  ;; Scrollbar widgets.
   (vadjustment define standard initial-value #f)
   (hadjustment define standard initial-value #f)
 
@@ -138,14 +142,147 @@ USA.
       (ferror "Not a <scm-layout> instance: "obj)))
 \f
 
+;;;; Colors
+
+(define (scm-layout-fg-color layout)
+  ;; Returns LAYOUT's foreground color as a new vector: #(red green blue).
+  (let ((gtkstyle (C-> (gobject-alien layout) "GtkWidget style")))
+    (peek-rgb (C-> gtkstyle "GtkStyle fg"))))
+
+(define (peek-rgb colors)
+  (let ((color (C-array-loc colors "GdkColor" (C-enum "GTK_STATE_NORMAL"))))
+    (vector (/ (C-> color "GdkColor red") 65535)
+           (/ (C-> color "GdkColor green") 65535)
+           (/ (C-> color "GdkColor blue") 65535))))
+
+(define (scm-layout-bg-color layout)
+  ;; Returns LAYOUT's background color as a new vector: #(red green blue).
+  (let ((gtkstyle (C-> (gobject-alien layout) "GtkWidget style")))
+    (peek-rgb (C-> gtkstyle "GtkStyle bg"))))
+
+(define (scm-layout-text-color layout)
+  ;; Returns LAYOUT's text color as a new vector: #(red green blue).
+  (let ((gtkstyle (C-> (gobject-alien layout) "GtkWidget style")))
+    (peek-rgb (C-> gtkstyle "GtkStyle text"))))
+
+(define (scm-layout-base-color layout)
+  ;; Returns LAYOUT's base color as a new vector: #(red green blue).
+  (let ((gtkstyle (C-> (gobject-alien layout) "GtkWidget style")))
+    (peek-rgb (C-> gtkstyle "GtkStyle base"))))
+
+(define (set-scm-layout-fg-color! layout color)
+  ;; Queues a complete redraw.
+  (let ((gdkcolor (->gdkcolor color layout 'set-scm-layout-fg-color!)))
+    (set-gdkcolor! layout gdkcolor set-rcstyle-fg-color!)
+    (free gdkcolor)))
+
+(define (set-gdkcolor! layout gdkcolor applicator)
+  (let ((scmwidget (gobject-alien layout))
+       (rcstyle (make-alien '|GtkRcStyle|)))
+    (C-call "gtk_widget_get_modifier_style" rcstyle scmwidget)
+    (applicator rcstyle gdkcolor)
+    (C-call "gtk_widget_modify_style" scmwidget rcstyle) ; rcstyle destroyed
+    (if (not (alien-null? (scm-layout-window layout))) ;realized
+       (let ((geo (scm-layout-geometry layout)))
+         (C-call "gtk_widget_queue_draw_area" scmwidget
+                 0 0 (rect-width geo) (rect-height geo))))))
+
+(define (set-rcstyle-fg-color! rcstyle gdkcolor)
+  (set-rcstyle-gdkcolor! gdkcolor (C-enum "GTK_STATE_NORMAL")
+                        (C-> rcstyle "struct _GtkRcStyle fg")
+                        (C-> rcstyle "struct _GtkRcStyle color_flags")
+                        (C-enum "GTK_RC_FG")))
+
+(define (set-rcstyle-gdkcolor! newcolor index colors flagss newflag)
+  (let ((color (C-array-loc! colors "GdkColor" index))
+       (flags (C-array-loc! flagss "uint" index)))
+    (C->= color "GdkColor red" (C-> newcolor "GdkColor red"))
+    (C->= color "GdkColor green" (C-> newcolor "GdkColor green"))
+    (C->= color "GdkColor blue" (C-> newcolor "GdkColor blue"))
+    (C->= flags "GtkRcFlags" (fix:or newflag (C-> flags "GtkRcFlags")))))
+
+(define (set-scm-layout-bg-color! layout color)
+  ;; Queues a complete redraw.
+  (let ((gdkcolor (->gdkcolor color layout 'set-scm-layout-bg-color!)))
+    (set-gdkcolor! layout gdkcolor set-rcstyle-bg-color!)
+    (free gdkcolor))
+  (let ((gdkwindow (scm-layout-window layout)))
+    (if (not (alien-null? gdkwindow))  ;realized
+       (let* ((scmwidget (gobject-alien layout))
+              (style (C-> scmwidget "GtkWidget style")))
+         (C-call "gtk_style_set_background" style gdkwindow
+                 (C-enum "GTK_STATE_NORMAL"))))))
+
+(define (set-rcstyle-bg-color! rcstyle gdkcolor)
+  (set-rcstyle-gdkcolor! gdkcolor (C-enum "GTK_STATE_NORMAL")
+                        (C-> rcstyle "struct _GtkRcStyle bg")
+                        (C-> rcstyle "struct _GtkRcStyle color_flags")
+                        (C-enum "GTK_RC_BG")))
+
+(define (set-scm-layout-text-color! layout color)
+  ;; Queues a complete redraw.
+  (let ((gdkcolor (->gdkcolor color layout 'set-scm-layout-text-color!)))
+    (set-gdkcolor! layout gdkcolor set-rcstyle-text-color!)
+    (free gdkcolor)))
+
+(define (set-rcstyle-text-color! rcstyle gdkcolor)
+  (set-rcstyle-gdkcolor! gdkcolor (C-enum "GTK_STATE_NORMAL")
+                        (C-> rcstyle "struct _GtkRcStyle text")
+                        (C-> rcstyle "struct _GtkRcStyle color_flags")
+                        (C-enum "GTK_RC_TEXT")))
+
+(define (set-scm-layout-base-color! layout color)
+  ;; Queues a complete redraw.
+  (let ((gdkcolor (->gdkcolor color layout 'set-scm-layout-base-color!)))
+    (set-gdkcolor! layout gdkcolor set-rcstyle-base-color!)
+    (free gdkcolor)))
+
+(define (set-rcstyle-base-color! rcstyle gdkcolor)
+  (set-rcstyle-gdkcolor! gdkcolor (C-enum "GTK_STATE_NORMAL")
+                        (C-> rcstyle "struct _GtkRcStyle base")
+                        (C-> rcstyle "struct _GtkRcStyle color_flags")
+                        (C-enum "GTK_RC_BASE")))
+
+(define (->gdkcolor object layout operator)
+  (let ((rgb (->rgb object layout operator))
+       (gdkcolor (malloc (C-sizeof "GdkColor") '|GdkColor|)))
+    (C->= gdkcolor "GdkColor red" (round (* (vector-ref rgb 0) 65535)))
+    (C->= gdkcolor "GdkColor green" (round (* (vector-ref rgb 1) 65535)))
+    (C->= gdkcolor "GdkColor blue" (round (* (vector-ref rgb 2) 65535)))
+    gdkcolor))
+
+(define (->rgb object layout operator)
+  (or (and (string? object)
+          (scm-layout-parse-color layout object))
+      (and (vector? object) (= 3 (vector-length object))
+          object)
+      (error:wrong-type-argument object "a color name or #(rgb)" operator)))
+
+(define (scm-layout-parse-color layout string)
+  ;; Returns the color named by STRING, or #F.  STRING can be a color
+  ;; name, hex number, or symbolic color name for the LAYOUT widget.
+  (guarantee-string string 'scm-layout-parse-color)
+  (let ((scmwidget (gobject-alien layout)))
+    (let ((style (C-> scmwidget "GtkWidget style"))
+         (gdkcolor (malloc (C-sizeof "GdkColor") '|GdkColor|)))
+      (if (and (zero? (C-call "gtk_style_lookup_color" style string gdkcolor))
+              (zero? (C-call "gdk_color_parse" string gdkcolor)))
+         (begin
+           (free gdkcolor)
+           #f)
+         (let ((rgb (vector (/ (C-> gdkcolor "GdkColor red") 65535)
+                            (/ (C-> gdkcolor "GdkColor green") 65535)
+                            (/ (C-> gdkcolor "GdkColor blue") 65535))))
+           (free gdkcolor)
+           rgb)))))
+\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")
+    (trace ";((scm-layout-size-request "widget") "GtkWidget
+          " "GtkRequisition")\n")
 
     (let ((alien (gobject-alien widget)))
       (let ((width (C-> alien "GtkWidget requisition width"))
@@ -157,8 +294,8 @@ USA.
 
 (define (scm-layout-size-allocate widget)
   (named-lambda (scm-layout::size-allocate GtkWidget GtkAllocation)
-
-;;;    (trace ";((scm-layout-size-allocate "widget") "GtkWidget" "GtkAllocation")\n")
+    (trace ";((scm-layout-size-allocate "widget") "GtkWidget
+          " "GtkAllocation")\n")
 
     (let ((x (C-> GtkAllocation "GtkAllocation x"))
          (y (C-> GtkAllocation "GtkAllocation y"))
@@ -181,8 +318,7 @@ USA.
 
 (define (scm-layout-realize widget)
   (named-lambda (scm-layout::realize GtkWidget)
-
-;;;    (trace ";((scm-layout-realize "widget") "GtkWidget")\n")
+    (trace ";((scm-layout-realize "widget") "GtkWidget")\n")
 
     ;; ScmWidget automatically sets GTK_REALIZED.
 
@@ -190,8 +326,8 @@ USA.
          (main-GdkWindow (scm-layout-window widget))
          (GtkStyle (C-> GtkWidget "GtkWidget style"))
          (parent-GdkWindow (make-alien '|GdkWindow|))
-         (GdkVisual (make-alien '|GdkVisual|))
-         (GdkColormap (make-alien '|GdkColormap|))
+;        (GdkVisual (make-alien '|GdkVisual|))
+;        (GdkColormap (make-alien '|GdkColormap|))
          (check-!null (lambda (alien message)
                         (if (alien-null? alien)
                             (ferror "scm-layout: "message)
@@ -199,10 +335,10 @@ USA.
 
       ;; 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-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)))
@@ -212,8 +348,8 @@ USA.
        (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 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)
@@ -221,7 +357,8 @@ USA.
 
       (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")))
+;                    (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)
@@ -230,7 +367,7 @@ USA.
       ;; Style
 
       (C-call "gtk_style_attach" GtkStyle
-             (C-> GtkWidget "GtkWidget style") main-GdkWindow)
+             (C-> GtkWidget "GtkWidget style" GtkStyle) main-GdkWindow)
       (C->= GtkWidget "GtkWidget style" GtkStyle)
       (C-call "gtk_style_set_background"
              GtkStyle main-GdkWindow (C-enum "GTK_STATE_NORMAL"))
@@ -238,8 +375,7 @@ USA.
 
 (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")
+    (trace ";((scm-layout-event "widget") "GtkWidget" "GdkEvent")\n")
 
     (let ((type (C-> GdkEvent "GdkEvent any type")))
 
@@ -276,10 +412,9 @@ USA.
 (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")
 
-;;;    (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"))
@@ -315,10 +450,8 @@ USA.
 
 (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")
+    (trace ";((scm-layout-adjustment-value-changed "widget" "adjustment")"
+          " "GtkAdjustment")\n")
 
     (let ((alien-widget (gobject-alien widget))
          (alien-window (scm-layout-window widget))
@@ -363,7 +496,7 @@ USA.
                           " (not "vadjustment" nor "hadjustment").")))))))
 
 (define (adjust-adjustments widget)
-  ;; Called when the widget gets new adjustments or its size or
+  ;; Called after the widget gets new adjustment(s) or its size or
   ;; scrollable area changes.
 
   (let ((hadj (scm-layout-hadjustment widget))
@@ -409,7 +542,7 @@ USA.
 (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")
+  (trace ";(drawing-damage "item")\n")
 
   (let ((area (if (default-object? rect)
                  (drawn-item-area item)
@@ -575,7 +708,7 @@ USA.
 
 (define-method drawn-item-expose ((item <box-item>) widget window area)
   area ;;Ignored.  Assumed clipping already set.
-;;;  (trace "; (Re)Drawing "item" on "widget".\n")
+  (trace "; (Re)Drawing "item" on "widget".\n")
 
   (let ((widgets (drawn-item-widgets item)))
     (if (or (eq? #f widgets)
@@ -637,7 +770,7 @@ USA.
 
 (define-method drawn-item-expose ((item <hline-item>) widget window area)
   area ;;Ignored.  Assumed clipping already set.
-;;;  (trace "; (Re)Drawing "item" on "widget".\n")
+  (trace "; (Re)Drawing "item" on "widget".\n")
 
   (let ((widgets (drawn-item-widgets item)))
     (if (or (eq? #f widgets)
@@ -670,7 +803,7 @@ USA.
 
 (define-method drawn-item-expose ((item <vline-item>) widget window area)
   area ;;Ignored.  Assumed clipping already set.
-;;;  (trace "; (Re)Drawing "item" on "widget".\n")
+  (trace "; (Re)Drawing "item" on "widget".\n")
 
   (let ((widgets (drawn-item-widgets item)))
     (if (or (eq? #f widgets)
@@ -727,7 +860,7 @@ USA.
 
 (define-method drawn-item-expose ((item <text-item>) widget window area)
   area ;;Ignored.  Assumed clipping already set.
-;;;  (trace "; (Re)Drawing "item" on "widget".\n")
+  (trace "; (Re)Drawing "item" on "widget".\n")
 
   (let ((widgets (drawn-item-widgets item)))
     (if (or (eq? #f widgets)
@@ -854,7 +987,7 @@ USA.
          unspecific))))
 
 (define-method drawn-item-expose ((item <image-item>) widget window area)
-;;;  (trace "; (Re)Drawing "item" on "widget".\n")
+  (trace "; (Re)Drawing "item" on "widget".\n")
 
   (let ((widgets (drawn-item-widgets item)))
     (if (or (eq? #f widgets)
@@ -901,14 +1034,14 @@ USA.
        (else (ferror "The WHERE argument ("where") must be TOP (or #f)"
                      " or BOTTOM if it is not optional."))))
 
-(define (check-non-negative-fixnum obj)
+(define-integrable (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)
+(define-integrable (check-non-negative-integer obj)
   (if (integer? obj)
       (if (int:negative? obj)
          (ferror "Not a NON-NEGATIVE integer: "obj)
@@ -916,6 +1049,7 @@ USA.
       (ferror "Not a non-negative integer: "obj)))
 
 (define trace? #f)
-(define (trace . objects)
-  (if trace?
-      (apply outf-console objects)))
\ No newline at end of file
+
+(define-syntax trace
+  (syntax-rules ()
+    ((_ . ARGS) (if trace? ((lambda () (outf-console . ARGS)))))))
\ No newline at end of file