Added scm-layout event handlers and gdk-key support.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Thu, 8 Jul 2010 22:06:07 +0000 (15:06 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Sun, 12 Dec 2010 05:59:08 +0000 (22:59 -0700)
A more complete wrapping eliminates the need for c-includes in the
"Hello, World!" example and scm-layout demo.

* doc/gtk/gtk.texinfo: The FFI syntax is no longer used in hello.scm.

* src/gtk/Tags.sh: Fixed the exuberant ctags commandline to avoid
wiping out the Scheme file extensions list, thus punting *.scm.

* src/gtk/demo.scm: Use new callback and event wrappers.

* src/gtk/gtk-object.scm: Use integrate-operator where a parameter is
referenced multiple times.

(gtk-widget-font): Return a PangoFontDescription alien.

(set-gtk-button-clicked-callback!)
(set-gtk-window-delete-event-callback!): More wrapping, to get
C-callback syntax out of hello.scm and demo.scm.

* src/gtk/gtk.pkg: Added keys.scm.  Export new callback and event
wrappers to (gtk).

* src/gtk/gtk.sf: Added keys.scm.

* src/gtk/gtk-ev.scm: Punt impish delete_event callback from hello.

* src/gtk/hello.scm: Simplify.  Use new wrappers.

* src/gtk/keys.scm: New.

* src/gtk/scm-layout.scm: Punted null-alien in favor of 0.  Added an
"event-handlers" vector per widget.  Provide specific event handler
setters, which can translate from toolkit to Scheme constants, so the
provided handlers do not need C- syntax.

(scm-layout-event-handler): Handle expose events directly.  Lookup the
rest in the event-handlers vector.

doc/gtk/gtk.texinfo
src/gtk/Tags.sh
src/gtk/demo.scm
src/gtk/gtk-ev.scm
src/gtk/gtk-object.scm
src/gtk/gtk.pkg
src/gtk/gtk.sf
src/gtk/hello.scm
src/gtk/keys.scm [new file with mode: 0644]
src/gtk/scm-layout.scm

index 2fd3a63069bc84191c6b364e76d692b0c94d1709..9dfefa14df0e35b85d5cf4c97ce6683dcc540546 100644 (file)
@@ -240,7 +240,6 @@ command lines in the @file{src/gtk} directory of your build tree.
 
 @smallexample
   ../microcode/scheme --library ../lib
-  (load-option 'FFI)
   (load-option 'Gtk)
   (ge '(gtk))
   (load "hello")
index 266b054bf6eeb269e58c6cd492f8a091562d38ac..2f95f74b57c0aeedc1d79a37d3e3f68055a0fa31 100755 (executable)
@@ -3,5 +3,5 @@
 # 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 --langmap=scheme:.cdecl \
+etags gtk-shim.h scmwidget.c.stay --langmap=scheme:+.cdecl \
        `echo *.scm | sed 's/ gtk-const.scm//'` Includes/*.cdecl
index 21227d4125a4f19e62e87d6b9d22e19b61f2a387..c2fc847b87aeb48f0c2d34c598597aad84ab2ebe 100644 (file)
@@ -24,18 +24,17 @@ 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)))
+        (layout1 (demo-layout-new 200 200))
+        (layout2 (demo-layout-new 200 200)))
     (gtk-window-set-title window "scm-layout-demo")
     (gtk-window-set-default-size window 200 400)
+    (set-gtk-window-delete-event-callback!
+     window (lambda () (outf-console "; Closed "window".\n") 0))
     (gtk-container-set-border-width window 10)
     (gtk-container-add scroller1 layout1)
     (gtk-container-add vbox scroller1)
@@ -43,22 +42,14 @@ USA.
     (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-handler layout1 (scm-layout-event-handler layout1)))
 
       (set-scm-layout-drawing! layout2 drawing)
       (set-scm-layout-scroll-pos! layout2 175 150)
-      (set-scm-widget-event!
-       layout2 (demo-event-handler layout2 (scm-layout-event-handler layout2)))
 
       (let ((cursor1 (add-box-item drawing 'BOTTOM))
            (cursor2 (add-box-item drawing 'BOTTOM)))
@@ -70,6 +61,13 @@ USA.
     (outf-console "; Created "layout1" and "layout2"\n"))
   unspecific)
 
+(define (demo-layout-new width height)
+  (let ((layout (scm-layout-new width height)))
+    (set-scm-layout-motion-handler! layout demo-motion-handler)
+    (set-scm-layout-button-release-handler! layout demo-button-release-handler)
+    (set-scm-layout-key-press-handler! layout demo-key-press-handler)
+    layout))
+
 (define (demo-drawing device)
   ;; DEVICE can (must, at the moment) be a scm-layout.
   (let ((drawing (make-demo-drawing device)))
@@ -100,81 +98,64 @@ USA.
   ;; and mouse motion handler.
   (cursor-items define standard initial-value '()))
 
-(define (demo-event-handler widget old-handler)
-  (named-lambda (scm-layout-demo::handle-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 (demo-motion-handler layout window-x window-y)
+  (trace2 ";(demo-motion-handler "layout" "window-x" "window-y")\n")
+  (let* ((drawing (scm-layout-drawing layout))
+        (scroll (scm-layout-on-screen-area layout))
+        (x (int:+ window-x (rect-x scroll)))
+        (y (int:+ window-y (rect-y scroll))))
+    (trace2 "; Pointer moved to ("x","y") in "layout".\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 layout (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 layout x y)))
+  1 ;;Handled.
+  )
+
+(define (demo-button-release-handler layout window-x window-y)
+  (trace2 ";(demo-button-release-handler "layout" "window-x" "window-y")\n")
+  (let* ((drawing (scm-layout-drawing layout))
+        (scroll (scm-layout-on-screen-area layout))
+        (x (int:+ window-x (rect-x scroll)))
+        (y (int:+ window-y (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 layout x y)))
+  1 ;;Handled.
+  )
+
+(define (demo-key-press-handler layout keyval char-bits)
+  (trace2 ";(demo-key-press-handler "layout" "keyval" "char-bits")\n")
+  (if (and (char? keyval) (char=? keyval #\D))
+      (bkpt 'Test)
+      0 ;;NOT handled.
+      ))
 
 (define (start-blinking drawing)
   (create-thread
index b07b20f68e932382c1994ff25b5a6d4524d54daa..1aed2ec0067acaaa6a717d73bd93e36c65b7fa89 100644 (file)
@@ -35,16 +35,6 @@ USA.
     (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))
 
index 2ce5da7208997aae5d1808e379dfcea4eb49e090..23374f29cff65671a3ae0f9f257cbfbcd83f2792 100644 (file)
@@ -75,7 +75,8 @@ USA.
   (let ((alien (gobject-alien (check-gtk-object gtkobject))))
     (C-> alien "GtkObject flags")))
 
-(define-integrable (check-gtk-object object)
+(declare (integrate-operator check-gtk-object))
+(define (check-gtk-object object)
   (if (gtk-object? object) object
       (error:wrong-type-argument object "<gtk-object>" 'check-gtk-object)))
 \f
@@ -154,7 +155,8 @@ USA.
      (C-> alien "GtkAdjustment step_increment")
      (C-> alien "GtkAdjustment page_increment"))))
 
-(define-integrable (check-real object)
+(declare (integrate-operator check-real))
+(define (check-real object)
   (if (real? object) object
       (error:wrong-type-argument object "real number" 'check-real)))
 \f
@@ -214,7 +216,7 @@ USA.
        (desc (make-alien '|PangoFontDescription|)))
     (C-> alien "GtkWidget style" desc)
     (C-> desc "GtkStyle font_desc" desc)
-    (pango-font-description-to-string desc)))
+    desc))
 
 (define (set-gtk-widget-font! widget desc)
   (let ((font (->PangoFontDescription desc)))
@@ -412,11 +414,13 @@ USA.
 (define-integrable (check-gtk-widget-alien object)
   (gobject-alien (check-gtk-widget object)))
 
-(define-integrable (check-gtk-widget object)
+(declare (integrate-operator check-gtk-widget))
+(define (check-gtk-widget object)
   (if (gtk-widget? object) object
       (error:wrong-type-argument object "<gtk-widget>" 'check-gtk-widget)))
 
-(define-integrable (check-gtk-container object)
+(declare (integrate-operator check-gtk-container))
+(define (check-gtk-container object)
   (if (gtk-container? object) object
       (error:wrong-type-argument object "<gtk-container>"
                                 'check-gtk-container)))
@@ -456,6 +460,19 @@ USA.
     (C-call "gtk_button_new" a)
     (if (alien-null? a) (ferror "Could not create button."))
     b))
+
+(declare (integrate-operator check-gtk-button))
+(define (check-gtk-button object)
+  (if (gtk-button? object) object
+      (error:wrong-type-argument object "<gtk-button>" 'check-gtk-button)))
+
+(define (set-gtk-button-clicked-callback! button handler)
+  (let ((b (check-gtk-button button)))
+    (g-signal-connect
+     b (C-callback "clicked")
+     (lambda (GtkButton)
+       GtkButton                       ;ignore
+       (handler)))))
 \f
 
 ;;; GtkVBox
@@ -517,12 +534,14 @@ USA.
        (p (check-scrolled-window-placement placement)))
     (C-call "gtk_scrolled_window_set_placement" (gobject-alien w) p)))
 
-(define-integrable (check-scrolled-window object)
+(declare (integrate-operator check-scrolled-window))
+(define (check-scrolled-window object)
   (if (gtk-scrolled-window? object) object
       (error:wrong-type-argument object "<gtk-scrolled-window>"
                                 'check-scrolled-window)))
 
-(define-integrable (check-scrollbar-policy object)
+(declare (integrate-operator check-scrollbar-policy))
+(define (check-scrollbar-policy object)
   (case object
     ((ALWAYS)  (C-enum "GTK_POLICY_ALWAYS"))
     ((AUTO)    (C-enum "GTK_POLICY_AUTOMATIC"))
@@ -530,7 +549,8 @@ USA.
     (else (error:wrong-type-argument object "symbol: ALWAYS, AUTO or NEVER"
                                     'check-scrollbar-policy))))
 
-(define-integrable (check-scrolled-window-placement object)
+(declare (integrate-operator check-scrolled-window-placement))
+(define (check-scrolled-window-placement object)
   (case object
     ((TOP-LEFT) (C-enum "GTK_CORNER_TOP_LEFT"))
     ((BOTTOM-LEFT) (C-enum "GTK_CORNER_BOTTOM_LEFT"))
@@ -564,14 +584,16 @@ USA.
     (C-call "gtk_window_set_default_size" alien -1 -1)
     window))
 
-(define-integrable (check-window-type type)
+(declare (integrate-operator check-window-type))
+(define (check-window-type type)
   (case type
     ((TOPLEVEL POPUP) type)
     (else
      (error:wrong-type-argument type "symbol: TOPLEVEL or POPUP"
                                'check-window-type))))
 
-(define-integrable (check-gtk-window object)
+(declare (integrate-operator check-gtk-window))
+(define (check-gtk-window object)
   (if (gtk-window? object) object
       (error:wrong-type-argument object "<gtk-window>" 'check-gtk-window)))
 
@@ -613,6 +635,13 @@ USA.
   (let ((alien (gobject-alien (check-gtk-window window))))
     (C-call "gtk_window_present" alien)))
 
+(define (set-gtk-window-delete-event-callback! window handler)
+  (let ((w (check-gtk-window window)))
+    (g-signal-connect
+     w (C-callback "delete_event")
+     (lambda (GtkWidget GdkEvent)
+       GtkWidget GdkEvent              ;ignore
+       (handler)))))
 
 (define trace? #f)
 
index 333a604c6d7aff6f68458f49263ed42b13e2235e..c285c9531ca855137530712b211ac273b2663ea5 100644 (file)
@@ -81,7 +81,9 @@ USA.
          gtk-window-parse-geometry
          gtk-window-resize
          gtk-window-present
+         set-gtk-window-delete-event-callback!
          <gtk-button> gtk-button-new
+         set-gtk-button-clicked-callback!
          <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
@@ -112,6 +114,14 @@ USA.
          scm-layout-on-screen-area set-scm-layout-scroll-pos!
          scm-layout-scroll-step set-scm-layout-scroll-step!
 
+         set-scm-layout-map-handler!
+         set-scm-layout-unmap-handler!
+         set-scm-layout-focus-change-handler!
+         set-scm-layout-visibility-notify-handler!
+         set-scm-layout-key-press-handler!
+         set-scm-layout-motion-handler!
+         set-scm-layout-button-release-handler!
+
          <drawing> make-drawing drawing-widgets
          set-drawing-size! drawing-pick-list
 
@@ -157,6 +167,13 @@ USA.
          pangos->pixels
          pixels->pangos))
 
+(define-package (gtk keys)
+  (parent (gtk))
+  (files "keys")
+  (export (gtk)
+         gdk-key-state->char-bits
+         gdk-keyval->name))
+
 (define-package (gtk thread)
   (parent (runtime thread))
   (files "thread")
@@ -193,7 +210,5 @@ USA.
 (define-package (gtk demo)
   (parent (gtk))
   (files "demo")
-  (import (gtk layout)
-         scm-layout-event-handler)
   (export ()
          scm-layout-demo))
\ No newline at end of file
index e38a2ddeea46c3ee84675033d8b4a0edb901f8c5..33846a1b4b769ac178b68e63cf97aea16017ddc9 100644 (file)
@@ -32,6 +32,7 @@ USA.
   (lambda ()
     (let* ((files.packages
            '(("gtk"        . (gtk))
+             ("keys"       . (gtk keys))
              ("main"       . (gtk main))
              ("gobject"    . (gtk gobject))
              ("gtk-object" . (gtk gtk-object))
@@ -80,7 +81,7 @@ USA.
 
       ;; These core files depend only on the constants behind the C-
       ;; syntax.
-      (sf+ '("gtk" "main" "gobject" "gtk-object" "pango" "scm-widget")
+      (sf+ '("gtk" "keys" "main" "gobject" "gtk-object" "pango" "scm-widget")
           '("gtk-const"))
 
       ;; These files will want the latest rect(angle) and
index e888dc7b7dde6f09248809e78b6bad6514c32b77..debba9b9221ab163c3ad21dcad00b789bbee79f1 100644 (file)
@@ -2,10 +2,6 @@
 
 This is Havoc Pennington's Hello World example from GGAD, wrapped in Scheme. |#
 
-(declare (usual-integrations))
-
-(C-include "gtk")
-
 (define (hello)
   (let ((window (gtk-window-new 'toplevel))
        (button (gtk-button-new))
@@ -15,19 +11,19 @@ This is Havoc Pennington's Hello World example from GGAD, wrapped in Scheme. |#
     (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)
-         w e ;ignore
-         (outf-console ";Bite 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)
-         w ;ignore
-         (let ((text (gtk-label-get-text label)))
-           (gtk-label-set-text
-            label (list->string (reverse! (string->list text)))))
-         unspecific)))
+      (set-gtk-window-delete-event-callback!
+       window
+       (lambda ()
+        (outf-console ";Bite me "(- 2 counter)" times.\n")
+        (set! counter (1+ counter))
+        ;; Three or more is the charm.
+        (if (> counter 2) 0 1)))
+      (set-gtk-button-clicked-callback!
+       button
+       (lambda ()
+        (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/keys.scm b/src/gtk/keys.scm
new file mode 100644 (file)
index 0000000..7189ceb
--- /dev/null
@@ -0,0 +1,919 @@
+#| -*-Scheme-*-
+
+Copyright (C) 2009, 2010  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.
+
+|#
+
+;;;; Gtk Keys
+;;; Package: (gtk keys)
+
+(c-include "gtk")
+
+(define (gdk-key-state->char-bits modifier-state)
+  ;; Given a Gdk modifier-state, returns a bitmap (sum) of
+  ;; char-bit:control, :meta, :super, :hyper.
+  (fix:+
+   (if (zero? (bit-and (C-enum "GDK_CONTROL_MASK") modifier-state))
+       0 char-bit:control)
+   (fix:+
+    (if (zero? (bit-and (C-enum "GDK_META_MASK") modifier-state))
+       0 char-bit:meta)
+    (fix:+
+     (if (zero? (bit-and (C-enum "GDK_SUPER_MASK") modifier-state))
+        0 char-bit:super)
+     (if (zero? (bit-and (C-enum "GDK_HYPER_MASK") modifier-state))
+        0 char-bit:hyper)))))
+
+(define (gdk-keyval->name keyval)
+  (let ((entry
+        (vector-binary-search gtk-key-translation-table
+                              (lambda (u v) (< u v))
+                              (lambda (pair) (car pair))
+                              keyval)))
+    (and entry (cdr entry))))
+
+(define gtk-key-translation-table
+  (sort!
+   (vector
+    (cons (C-enum "GDK_braceleft") 'braceleft)
+    (cons (C-enum "GDK_bar") 'bar)
+    (cons (C-enum "GDK_braceright") 'braceright)
+    (cons (C-enum "GDK_asciitilde") 'asciitilde)
+    (cons (C-enum "GDK_nobreakspace") 'nobreakspace)
+    (cons (C-enum "GDK_exclamdown") 'exclamdown)
+    (cons (C-enum "GDK_cent") 'cent)
+    (cons (C-enum "GDK_sterling") 'sterling)
+    (cons (C-enum "GDK_currency") 'currency)
+    (cons (C-enum "GDK_yen") 'yen)
+    (cons (C-enum "GDK_brokenbar") 'brokenbar)
+    (cons (C-enum "GDK_section") 'section)
+    (cons (C-enum "GDK_diaeresis") 'diaeresis)
+    (cons (C-enum "GDK_copyright") 'copyright)
+    (cons (C-enum "GDK_ordfeminine") 'ordfeminine)
+    (cons (C-enum "GDK_guillemotleft") 'guillemotleft)
+    (cons (C-enum "GDK_notsign") 'notsign)
+    (cons (C-enum "GDK_hyphen") 'hyphen)
+    (cons (C-enum "GDK_registered") 'registered)
+    (cons (C-enum "GDK_macron") 'macron)
+    (cons (C-enum "GDK_degree") 'degree)
+    (cons (C-enum "GDK_plusminus") 'plusminus)
+    (cons (C-enum "GDK_twosuperior") 'twosuperior)
+    (cons (C-enum "GDK_threesuperior") 'threesuperior)
+    (cons (C-enum "GDK_acute") 'acute)
+    (cons (C-enum "GDK_mu") 'mu)
+    (cons (C-enum "GDK_paragraph") 'paragraph)
+    (cons (C-enum "GDK_periodcentered") 'periodcentered)
+    (cons (C-enum "GDK_cedilla") 'cedilla)
+    (cons (C-enum "GDK_onesuperior") 'onesuperior)
+    (cons (C-enum "GDK_masculine") 'masculine)
+    (cons (C-enum "GDK_guillemotright") 'guillemotright)
+    (cons (C-enum "GDK_onequarter") 'onequarter)
+    (cons (C-enum "GDK_onehalf") 'onehalf)
+    (cons (C-enum "GDK_threequarters") 'threequarters)
+    (cons (C-enum "GDK_questiondown") 'questiondown)
+    (cons (C-enum "GDK_Agrave") 'Agrave)
+    (cons (C-enum "GDK_Aacute") 'Aacute)
+    (cons (C-enum "GDK_Acircumflex") 'Acircumflex)
+    (cons (C-enum "GDK_Atilde") 'Atilde)
+    (cons (C-enum "GDK_Adiaeresis") 'Adiaeresis)
+    (cons (C-enum "GDK_Aring") 'Aring)
+    (cons (C-enum "GDK_AE") 'AE)
+    (cons (C-enum "GDK_Ccedilla") 'Ccedilla)
+    (cons (C-enum "GDK_Egrave") 'Egrave)
+    (cons (C-enum "GDK_Eacute") 'Eacute)
+    (cons (C-enum "GDK_Ecircumflex") 'Ecircumflex)
+    (cons (C-enum "GDK_Ediaeresis") 'Ediaeresis)
+    (cons (C-enum "GDK_Igrave") 'Igrave)
+    (cons (C-enum "GDK_Iacute") 'Iacute)
+    (cons (C-enum "GDK_Icircumflex") 'Icircumflex)
+    (cons (C-enum "GDK_Idiaeresis") 'Idiaeresis)
+    (cons (C-enum "GDK_Eth") 'Eth)
+    (cons (C-enum "GDK_Ntilde") 'Ntilde)
+    (cons (C-enum "GDK_Ograve") 'Ograve)
+    (cons (C-enum "GDK_Oacute") 'Oacute)
+    (cons (C-enum "GDK_Ocircumflex") 'Ocircumflex)
+    (cons (C-enum "GDK_Otilde") 'Otilde)
+    (cons (C-enum "GDK_Odiaeresis") 'Odiaeresis)
+    (cons (C-enum "GDK_multiply") 'multiply)
+    (cons (C-enum "GDK_Ooblique") 'Ooblique)
+    (cons (C-enum "GDK_Ugrave") 'Ugrave)
+    (cons (C-enum "GDK_Uacute") 'Uacute)
+    (cons (C-enum "GDK_Ucircumflex") 'Ucircumflex)
+    (cons (C-enum "GDK_Udiaeresis") 'Udiaeresis)
+    (cons (C-enum "GDK_Yacute") 'Yacute)
+    (cons (C-enum "GDK_Thorn") 'Thorn)
+    (cons (C-enum "GDK_ssharp") 'ssharp)
+    (cons (C-enum "GDK_agrave") 'agrave)
+    (cons (C-enum "GDK_aacute") 'aacute)
+    (cons (C-enum "GDK_acircumflex") 'acircumflex)
+    (cons (C-enum "GDK_atilde") 'atilde)
+    (cons (C-enum "GDK_adiaeresis") 'adiaeresis)
+    (cons (C-enum "GDK_aring") 'aring)
+    (cons (C-enum "GDK_ae") 'ae)
+    (cons (C-enum "GDK_ccedilla") 'ccedilla)
+    (cons (C-enum "GDK_egrave") 'egrave)
+    (cons (C-enum "GDK_eacute") 'eacute)
+    (cons (C-enum "GDK_ecircumflex") 'ecircumflex)
+    (cons (C-enum "GDK_ediaeresis") 'ediaeresis)
+    (cons (C-enum "GDK_igrave") 'igrave)
+    (cons (C-enum "GDK_iacute") 'iacute)
+    (cons (C-enum "GDK_icircumflex") 'icircumflex)
+    (cons (C-enum "GDK_idiaeresis") 'idiaeresis)
+    (cons (C-enum "GDK_eth") 'eth)
+    (cons (C-enum "GDK_ntilde") 'ntilde)
+    (cons (C-enum "GDK_ograve") 'ograve)
+    (cons (C-enum "GDK_oacute") 'oacute)
+    (cons (C-enum "GDK_ocircumflex") 'ocircumflex)
+    (cons (C-enum "GDK_otilde") 'otilde)
+    (cons (C-enum "GDK_odiaeresis") 'odiaeresis)
+    (cons (C-enum "GDK_division") 'division)
+    (cons (C-enum "GDK_oslash") 'oslash)
+    (cons (C-enum "GDK_ugrave") 'ugrave)
+    (cons (C-enum "GDK_uacute") 'uacute)
+    (cons (C-enum "GDK_ucircumflex") 'ucircumflex)
+    (cons (C-enum "GDK_udiaeresis") 'udiaeresis)
+    (cons (C-enum "GDK_yacute") 'yacute)
+    (cons (C-enum "GDK_thorn") 'thorn)
+    (cons (C-enum "GDK_ydiaeresis") 'ydiaeresis)
+    (cons (C-enum "GDK_Aogonek") 'Aogonek)
+    (cons (C-enum "GDK_breve") 'breve)
+    (cons (C-enum "GDK_Lstroke") 'Lstroke)
+    (cons (C-enum "GDK_Lcaron") 'Lcaron)
+    (cons (C-enum "GDK_Sacute") 'Sacute)
+    (cons (C-enum "GDK_Scaron") 'Scaron)
+    (cons (C-enum "GDK_Scedilla") 'Scedilla)
+    (cons (C-enum "GDK_Tcaron") 'Tcaron)
+    (cons (C-enum "GDK_Zacute") 'Zacute)
+    (cons (C-enum "GDK_Zcaron") 'Zcaron)
+    (cons (C-enum "GDK_Zabovedot") 'Zabovedot)
+    (cons (C-enum "GDK_aogonek") 'aogonek)
+    (cons (C-enum "GDK_ogonek") 'ogonek)
+    (cons (C-enum "GDK_lstroke") 'lstroke)
+    (cons (C-enum "GDK_lcaron") 'lcaron)
+    (cons (C-enum "GDK_sacute") 'sacute)
+    (cons (C-enum "GDK_caron") 'caron)
+    (cons (C-enum "GDK_scaron") 'scaron)
+    (cons (C-enum "GDK_scedilla") 'scedilla)
+    (cons (C-enum "GDK_tcaron") 'tcaron)
+    (cons (C-enum "GDK_zacute") 'zacute)
+    (cons (C-enum "GDK_doubleacute") 'doubleacute)
+    (cons (C-enum "GDK_zcaron") 'zcaron)
+    (cons (C-enum "GDK_zabovedot") 'zabovedot)
+    (cons (C-enum "GDK_Racute") 'Racute)
+    (cons (C-enum "GDK_Abreve") 'Abreve)
+    (cons (C-enum "GDK_Lacute") 'Lacute)
+    (cons (C-enum "GDK_Cacute") 'Cacute)
+    (cons (C-enum "GDK_Ccaron") 'Ccaron)
+    (cons (C-enum "GDK_Eogonek") 'Eogonek)
+    (cons (C-enum "GDK_Ecaron") 'Ecaron)
+    (cons (C-enum "GDK_Dcaron") 'Dcaron)
+    (cons (C-enum "GDK_Dstroke") 'Dstroke)
+    (cons (C-enum "GDK_Nacute") 'Nacute)
+    (cons (C-enum "GDK_Ncaron") 'Ncaron)
+    (cons (C-enum "GDK_Odoubleacute") 'Odoubleacute)
+    (cons (C-enum "GDK_Rcaron") 'Rcaron)
+    (cons (C-enum "GDK_Uring") 'Uring)
+    (cons (C-enum "GDK_Udoubleacute") 'Udoubleacute)
+    (cons (C-enum "GDK_Tcedilla") 'Tcedilla)
+    (cons (C-enum "GDK_racute") 'racute)
+    (cons (C-enum "GDK_abreve") 'abreve)
+    (cons (C-enum "GDK_lacute") 'lacute)
+    (cons (C-enum "GDK_cacute") 'cacute)
+    (cons (C-enum "GDK_ccaron") 'ccaron)
+    (cons (C-enum "GDK_eogonek") 'eogonek)
+    (cons (C-enum "GDK_ecaron") 'ecaron)
+    (cons (C-enum "GDK_dcaron") 'dcaron)
+    (cons (C-enum "GDK_dstroke") 'dstroke)
+    (cons (C-enum "GDK_nacute") 'nacute)
+    (cons (C-enum "GDK_ncaron") 'ncaron)
+    (cons (C-enum "GDK_odoubleacute") 'odoubleacute)
+    (cons (C-enum "GDK_rcaron") 'rcaron)
+    (cons (C-enum "GDK_uring") 'uring)
+    (cons (C-enum "GDK_udoubleacute") 'udoubleacute)
+    (cons (C-enum "GDK_tcedilla") 'tcedilla)
+    (cons (C-enum "GDK_abovedot") 'abovedot)
+    (cons (C-enum "GDK_Hstroke") 'Hstroke)
+    (cons (C-enum "GDK_Hcircumflex") 'Hcircumflex)
+    (cons (C-enum "GDK_Iabovedot") 'Iabovedot)
+    (cons (C-enum "GDK_Gbreve") 'Gbreve)
+    (cons (C-enum "GDK_Jcircumflex") 'Jcircumflex)
+    (cons (C-enum "GDK_hstroke") 'hstroke)
+    (cons (C-enum "GDK_hcircumflex") 'hcircumflex)
+    (cons (C-enum "GDK_idotless") 'idotless)
+    (cons (C-enum "GDK_gbreve") 'gbreve)
+    (cons (C-enum "GDK_jcircumflex") 'jcircumflex)
+    (cons (C-enum "GDK_Cabovedot") 'Cabovedot)
+    (cons (C-enum "GDK_Ccircumflex") 'Ccircumflex)
+    (cons (C-enum "GDK_Gabovedot") 'Gabovedot)
+    (cons (C-enum "GDK_Gcircumflex") 'Gcircumflex)
+    (cons (C-enum "GDK_Ubreve") 'Ubreve)
+    (cons (C-enum "GDK_Scircumflex") 'Scircumflex)
+    (cons (C-enum "GDK_cabovedot") 'cabovedot)
+    (cons (C-enum "GDK_ccircumflex") 'ccircumflex)
+    (cons (C-enum "GDK_gabovedot") 'gabovedot)
+    (cons (C-enum "GDK_gcircumflex") 'gcircumflex)
+    (cons (C-enum "GDK_ubreve") 'ubreve)
+    (cons (C-enum "GDK_scircumflex") 'scircumflex)
+    (cons (C-enum "GDK_kappa") 'kappa)
+    (cons (C-enum "GDK_Rcedilla") 'Rcedilla)
+    (cons (C-enum "GDK_Itilde") 'Itilde)
+    (cons (C-enum "GDK_Lcedilla") 'Lcedilla)
+    (cons (C-enum "GDK_Emacron") 'Emacron)
+    (cons (C-enum "GDK_Gcedilla") 'Gcedilla)
+    (cons (C-enum "GDK_Tslash") 'Tslash)
+    (cons (C-enum "GDK_rcedilla") 'rcedilla)
+    (cons (C-enum "GDK_itilde") 'itilde)
+    (cons (C-enum "GDK_lcedilla") 'lcedilla)
+    (cons (C-enum "GDK_emacron") 'emacron)
+    (cons (C-enum "GDK_gcedilla") 'gcedilla)
+    (cons (C-enum "GDK_tslash") 'tslash)
+    (cons (C-enum "GDK_ENG") 'ENG)
+    (cons (C-enum "GDK_eng") 'eng)
+    (cons (C-enum "GDK_Amacron") 'Amacron)
+    (cons (C-enum "GDK_Iogonek") 'Iogonek)
+    (cons (C-enum "GDK_Eabovedot") 'Eabovedot)
+    (cons (C-enum "GDK_Imacron") 'Imacron)
+    (cons (C-enum "GDK_Ncedilla") 'Ncedilla)
+    (cons (C-enum "GDK_Omacron") 'Omacron)
+    (cons (C-enum "GDK_Kcedilla") 'Kcedilla)
+    (cons (C-enum "GDK_Uogonek") 'Uogonek)
+    (cons (C-enum "GDK_Utilde") 'Utilde)
+    (cons (C-enum "GDK_Umacron") 'Umacron)
+    (cons (C-enum "GDK_amacron") 'amacron)
+    (cons (C-enum "GDK_iogonek") 'iogonek)
+    (cons (C-enum "GDK_eabovedot") 'eabovedot)
+    (cons (C-enum "GDK_imacron") 'imacron)
+    (cons (C-enum "GDK_ncedilla") 'ncedilla)
+    (cons (C-enum "GDK_omacron") 'omacron)
+    (cons (C-enum "GDK_kcedilla") 'kcedilla)
+    (cons (C-enum "GDK_uogonek") 'uogonek)
+    (cons (C-enum "GDK_utilde") 'utilde)
+    (cons (C-enum "GDK_umacron") 'umacron)
+    (cons (C-enum "GDK_overline") 'overline)
+    (cons (C-enum "GDK_kana_fullstop") 'kana-fullstop)
+    (cons (C-enum "GDK_kana_openingbracket") 'kana-openingbracket)
+    (cons (C-enum "GDK_kana_closingbracket") 'kana-closingbracket)
+    (cons (C-enum "GDK_kana_comma") 'kana-comma)
+    (cons (C-enum "GDK_kana_conjunctive") 'kana-conjunctive)
+    (cons (C-enum "GDK_kana_WO") 'kana-WO)
+    (cons (C-enum "GDK_kana_a") 'kana-a)
+    (cons (C-enum "GDK_kana_i") 'kana-i)
+    (cons (C-enum "GDK_kana_u") 'kana-u)
+    (cons (C-enum "GDK_kana_e") 'kana-e)
+    (cons (C-enum "GDK_kana_o") 'kana-o)
+    (cons (C-enum "GDK_kana_ya") 'kana-ya)
+    (cons (C-enum "GDK_kana_yu") 'kana-yu)
+    (cons (C-enum "GDK_kana_yo") 'kana-yo)
+    (cons (C-enum "GDK_kana_tu") 'kana-tu)
+    (cons (C-enum "GDK_prolongedsound") 'prolongedsound)
+    (cons (C-enum "GDK_kana_A") 'kana-A)
+    (cons (C-enum "GDK_kana_I") 'kana-I)
+    (cons (C-enum "GDK_kana_U") 'kana-U)
+    (cons (C-enum "GDK_kana_E") 'kana-E)
+    (cons (C-enum "GDK_kana_O") 'kana-O)
+    (cons (C-enum "GDK_kana_KA") 'kana-KA)
+    (cons (C-enum "GDK_kana_KI") 'kana-KI)
+    (cons (C-enum "GDK_kana_KU") 'kana-KU)
+    (cons (C-enum "GDK_kana_KE") 'kana-KE)
+    (cons (C-enum "GDK_kana_KO") 'kana-KO)
+    (cons (C-enum "GDK_kana_SA") 'kana-SA)
+    (cons (C-enum "GDK_kana_SHI") 'kana-SHI)
+    (cons (C-enum "GDK_kana_SU") 'kana-SU)
+    (cons (C-enum "GDK_kana_SE") 'kana-SE)
+    (cons (C-enum "GDK_kana_SO") 'kana-SO)
+    (cons (C-enum "GDK_kana_TA") 'kana-TA)
+    (cons (C-enum "GDK_kana_TI") 'kana-TI)
+    (cons (C-enum "GDK_kana_TU") 'kana-TU)
+    (cons (C-enum "GDK_kana_TE") 'kana-TE)
+    (cons (C-enum "GDK_kana_TO") 'kana-TO)
+    (cons (C-enum "GDK_kana_NA") 'kana-NA)
+    (cons (C-enum "GDK_kana_NI") 'kana-NI)
+    (cons (C-enum "GDK_kana_NU") 'kana-NU)
+    (cons (C-enum "GDK_kana_NE") 'kana-NE)
+    (cons (C-enum "GDK_kana_NO") 'kana-NO)
+    (cons (C-enum "GDK_kana_HA") 'kana-HA)
+    (cons (C-enum "GDK_kana_HI") 'kana-HI)
+    (cons (C-enum "GDK_kana_HU") 'kana-HU)
+    (cons (C-enum "GDK_kana_HE") 'kana-HE)
+    (cons (C-enum "GDK_kana_HO") 'kana-HO)
+    (cons (C-enum "GDK_kana_MA") 'kana-MA)
+    (cons (C-enum "GDK_kana_MI") 'kana-MI)
+    (cons (C-enum "GDK_kana_MU") 'kana-MU)
+    (cons (C-enum "GDK_kana_ME") 'kana-ME)
+    (cons (C-enum "GDK_kana_MO") 'kana-MO)
+    (cons (C-enum "GDK_kana_YA") 'kana-YA)
+    (cons (C-enum "GDK_kana_YU") 'kana-YU)
+    (cons (C-enum "GDK_kana_YO") 'kana-YO)
+    (cons (C-enum "GDK_kana_RA") 'kana-RA)
+    (cons (C-enum "GDK_kana_RI") 'kana-RI)
+    (cons (C-enum "GDK_kana_RU") 'kana-RU)
+    (cons (C-enum "GDK_kana_RE") 'kana-RE)
+    (cons (C-enum "GDK_kana_RO") 'kana-RO)
+    (cons (C-enum "GDK_kana_WA") 'kana-WA)
+    (cons (C-enum "GDK_kana_N") 'kana-N)
+    (cons (C-enum "GDK_voicedsound") 'voicedsound)
+    (cons (C-enum "GDK_semivoicedsound") 'semivoicedsound)
+    (cons (C-enum "GDK_Arabic_comma") 'Arabic-comma)
+    (cons (C-enum "GDK_Arabic_semicolon") 'Arabic-semicolon)
+    (cons (C-enum "GDK_Arabic_question_mark") 'Arabic-question-mark)
+    (cons (C-enum "GDK_Arabic_hamza") 'Arabic-hamza)
+    (cons (C-enum "GDK_Arabic_maddaonalef") 'Arabic-maddaonalef)
+    (cons (C-enum "GDK_Arabic_hamzaonalef") 'Arabic-hamzaonalef)
+    (cons (C-enum "GDK_Arabic_hamzaonwaw") 'Arabic-hamzaonwaw)
+    (cons (C-enum "GDK_Arabic_hamzaunderalef") 'Arabic-hamzaunderalef)
+    (cons (C-enum "GDK_Arabic_hamzaonyeh") 'Arabic-hamzaonyeh)
+    (cons (C-enum "GDK_Arabic_alef") 'Arabic-alef)
+    (cons (C-enum "GDK_Arabic_beh") 'Arabic-beh)
+    (cons (C-enum "GDK_Arabic_tehmarbuta") 'Arabic-tehmarbuta)
+    (cons (C-enum "GDK_Arabic_teh") 'Arabic-teh)
+    (cons (C-enum "GDK_Arabic_theh") 'Arabic-theh)
+    (cons (C-enum "GDK_Arabic_jeem") 'Arabic-jeem)
+    (cons (C-enum "GDK_Arabic_hah") 'Arabic-hah)
+    (cons (C-enum "GDK_Arabic_khah") 'Arabic-khah)
+    (cons (C-enum "GDK_Arabic_dal") 'Arabic-dal)
+    (cons (C-enum "GDK_Arabic_thal") 'Arabic-thal)
+    (cons (C-enum "GDK_Arabic_ra") 'Arabic-ra)
+    (cons (C-enum "GDK_Arabic_zain") 'Arabic-zain)
+    (cons (C-enum "GDK_Arabic_seen") 'Arabic-seen)
+    (cons (C-enum "GDK_Arabic_sheen") 'Arabic-sheen)
+    (cons (C-enum "GDK_Arabic_sad") 'Arabic-sad)
+    (cons (C-enum "GDK_Arabic_dad") 'Arabic-dad)
+    (cons (C-enum "GDK_Arabic_tah") 'Arabic-tah)
+    (cons (C-enum "GDK_Arabic_zah") 'Arabic-zah)
+    (cons (C-enum "GDK_Arabic_ain") 'Arabic-ain)
+    (cons (C-enum "GDK_Arabic_ghain") 'Arabic-ghain)
+    (cons (C-enum "GDK_Arabic_tatweel") 'Arabic-tatweel)
+    (cons (C-enum "GDK_Arabic_feh") 'Arabic-feh)
+    (cons (C-enum "GDK_Arabic_qaf") 'Arabic-qaf)
+    (cons (C-enum "GDK_Arabic_kaf") 'Arabic-kaf)
+    (cons (C-enum "GDK_Arabic_lam") 'Arabic-lam)
+    (cons (C-enum "GDK_Arabic_meem") 'Arabic-meem)
+    (cons (C-enum "GDK_Arabic_noon") 'Arabic-noon)
+    (cons (C-enum "GDK_Arabic_heh") 'Arabic-heh)
+    (cons (C-enum "GDK_Arabic_waw") 'Arabic-waw)
+    (cons (C-enum "GDK_Arabic_alefmaksura") 'Arabic-alefmaksura)
+    (cons (C-enum "GDK_Arabic_yeh") 'Arabic-yeh)
+    (cons (C-enum "GDK_Arabic_fathatan") 'Arabic-fathatan)
+    (cons (C-enum "GDK_Arabic_dammatan") 'Arabic-dammatan)
+    (cons (C-enum "GDK_Arabic_kasratan") 'Arabic-kasratan)
+    (cons (C-enum "GDK_Arabic_fatha") 'Arabic-fatha)
+    (cons (C-enum "GDK_Arabic_damma") 'Arabic-damma)
+    (cons (C-enum "GDK_Arabic_kasra") 'Arabic-kasra)
+    (cons (C-enum "GDK_Arabic_shadda") 'Arabic-shadda)
+    (cons (C-enum "GDK_Arabic_sukun") 'Arabic-sukun)
+    (cons (C-enum "GDK_Serbian_dje") 'Serbian-dje)
+    (cons (C-enum "GDK_Macedonia_gje") 'Macedonia-gje)
+    (cons (C-enum "GDK_Cyrillic_io") 'Cyrillic-io)
+    (cons (C-enum "GDK_Ukranian_je") 'Ukranian-je)
+    (cons (C-enum "GDK_Macedonia_dse") 'Macedonia-dse)
+    (cons (C-enum "GDK_Ukranian_i") 'Ukranian-i)
+    (cons (C-enum "GDK_Ukranian_yi") 'Ukranian-yi)
+    (cons (C-enum "GDK_Cyrillic_je") 'Cyrillic-je)
+    (cons (C-enum "GDK_Cyrillic_lje") 'Cyrillic-lje)
+    (cons (C-enum "GDK_Cyrillic_nje") 'Cyrillic-nje)
+    (cons (C-enum "GDK_Serbian_tshe") 'Serbian-tshe)
+    (cons (C-enum "GDK_Macedonia_kje") 'Macedonia-kje)
+    (cons (C-enum "GDK_Byelorussian_shortu") 'Byelorussian-shortu)
+    (cons (C-enum "GDK_Cyrillic_dzhe") 'Cyrillic-dzhe)
+    (cons (C-enum "GDK_numerosign") 'numerosign)
+    (cons (C-enum "GDK_Serbian_DJE") 'Serbian-DJE)
+    (cons (C-enum "GDK_Macedonia_GJE") 'Macedonia-GJE)
+    (cons (C-enum "GDK_Cyrillic_IO") 'Cyrillic-IO)
+    (cons (C-enum "GDK_Ukranian_JE") 'Ukranian-JE)
+    (cons (C-enum "GDK_Macedonia_DSE") 'Macedonia-DSE)
+    (cons (C-enum "GDK_Ukranian_I") 'Ukranian-I)
+    (cons (C-enum "GDK_Ukrainian_YI") 'Ukrainian-YI)
+    (cons (C-enum "GDK_Cyrillic_JE") 'Cyrillic-JE)
+    (cons (C-enum "GDK_Cyrillic_LJE") 'Cyrillic-LJE)
+    (cons (C-enum "GDK_Cyrillic_NJE") 'Cyrillic-NJE)
+    (cons (C-enum "GDK_Serbian_TSHE") 'Serbian-TSHE)
+    (cons (C-enum "GDK_Macedonia_KJE") 'Macedonia-KJE)
+    (cons (C-enum "GDK_Byelorussian_SHORTU") 'Byelorussian-SHORTU)
+    (cons (C-enum "GDK_Cyrillic_DZHE") 'Cyrillic-DZHE)
+    (cons (C-enum "GDK_Cyrillic_yu") 'Cyrillic-yu)
+    (cons (C-enum "GDK_Cyrillic_a") 'Cyrillic-a)
+    (cons (C-enum "GDK_Cyrillic_be") 'Cyrillic-be)
+    (cons (C-enum "GDK_Cyrillic_tse") 'Cyrillic-tse)
+    (cons (C-enum "GDK_Cyrillic_de") 'Cyrillic-de)
+    (cons (C-enum "GDK_Cyrillic_ie") 'Cyrillic-ie)
+    (cons (C-enum "GDK_Cyrillic_ef") 'Cyrillic-ef)
+    (cons (C-enum "GDK_Cyrillic_ghe") 'Cyrillic-ghe)
+    (cons (C-enum "GDK_Cyrillic_ha") 'Cyrillic-ha)
+    (cons (C-enum "GDK_Cyrillic_i") 'Cyrillic-i)
+    (cons (C-enum "GDK_Cyrillic_shorti") 'Cyrillic-shorti)
+    (cons (C-enum "GDK_Cyrillic_ka") 'Cyrillic-ka)
+    (cons (C-enum "GDK_Cyrillic_el") 'Cyrillic-el)
+    (cons (C-enum "GDK_Cyrillic_em") 'Cyrillic-em)
+    (cons (C-enum "GDK_Cyrillic_en") 'Cyrillic-en)
+    (cons (C-enum "GDK_Cyrillic_o") 'Cyrillic-o)
+    (cons (C-enum "GDK_Cyrillic_pe") 'Cyrillic-pe)
+    (cons (C-enum "GDK_Cyrillic_ya") 'Cyrillic-ya)
+    (cons (C-enum "GDK_Cyrillic_er") 'Cyrillic-er)
+    (cons (C-enum "GDK_Cyrillic_es") 'Cyrillic-es)
+    (cons (C-enum "GDK_Cyrillic_te") 'Cyrillic-te)
+    (cons (C-enum "GDK_Cyrillic_u") 'Cyrillic-u)
+    (cons (C-enum "GDK_Cyrillic_zhe") 'Cyrillic-zhe)
+    (cons (C-enum "GDK_Cyrillic_ve") 'Cyrillic-ve)
+    (cons (C-enum "GDK_Cyrillic_softsign") 'Cyrillic-softsign)
+    (cons (C-enum "GDK_Cyrillic_yeru") 'Cyrillic-yeru)
+    (cons (C-enum "GDK_Cyrillic_ze") 'Cyrillic-ze)
+    (cons (C-enum "GDK_Cyrillic_sha") 'Cyrillic-sha)
+    (cons (C-enum "GDK_Cyrillic_e") 'Cyrillic-e)
+    (cons (C-enum "GDK_Cyrillic_shcha") 'Cyrillic-shcha)
+    (cons (C-enum "GDK_Cyrillic_che") 'Cyrillic-che)
+    (cons (C-enum "GDK_Cyrillic_hardsign") 'Cyrillic-hardsign)
+    (cons (C-enum "GDK_Cyrillic_YU") 'Cyrillic-YU)
+    (cons (C-enum "GDK_Cyrillic_A") 'Cyrillic-A)
+    (cons (C-enum "GDK_Cyrillic_BE") 'Cyrillic-BE)
+    (cons (C-enum "GDK_Cyrillic_TSE") 'Cyrillic-TSE)
+    (cons (C-enum "GDK_Cyrillic_DE") 'Cyrillic-DE)
+    (cons (C-enum "GDK_Cyrillic_IE") 'Cyrillic-IE)
+    (cons (C-enum "GDK_Cyrillic_EF") 'Cyrillic-EF)
+    (cons (C-enum "GDK_Cyrillic_GHE") 'Cyrillic-GHE)
+    (cons (C-enum "GDK_Cyrillic_HA") 'Cyrillic-HA)
+    (cons (C-enum "GDK_Cyrillic_I") 'Cyrillic-I)
+    (cons (C-enum "GDK_Cyrillic_SHORTI") 'Cyrillic-SHORTI)
+    (cons (C-enum "GDK_Cyrillic_KA") 'Cyrillic-KA)
+    (cons (C-enum "GDK_Cyrillic_EL") 'Cyrillic-EL)
+    (cons (C-enum "GDK_Cyrillic_EM") 'Cyrillic-EM)
+    (cons (C-enum "GDK_Cyrillic_EN") 'Cyrillic-EN)
+    (cons (C-enum "GDK_Cyrillic_O") 'Cyrillic-O)
+    (cons (C-enum "GDK_Cyrillic_PE") 'Cyrillic-PE)
+    (cons (C-enum "GDK_Cyrillic_YA") 'Cyrillic-YA)
+    (cons (C-enum "GDK_Cyrillic_ER") 'Cyrillic-ER)
+    (cons (C-enum "GDK_Cyrillic_ES") 'Cyrillic-ES)
+    (cons (C-enum "GDK_Cyrillic_TE") 'Cyrillic-TE)
+    (cons (C-enum "GDK_Cyrillic_U") 'Cyrillic-U)
+    (cons (C-enum "GDK_Cyrillic_ZHE") 'Cyrillic-ZHE)
+    (cons (C-enum "GDK_Cyrillic_VE") 'Cyrillic-VE)
+    (cons (C-enum "GDK_Cyrillic_SOFTSIGN") 'Cyrillic-SOFTSIGN)
+    (cons (C-enum "GDK_Cyrillic_YERU") 'Cyrillic-YERU)
+    (cons (C-enum "GDK_Cyrillic_ZE") 'Cyrillic-ZE)
+    (cons (C-enum "GDK_Cyrillic_SHA") 'Cyrillic-SHA)
+    (cons (C-enum "GDK_Cyrillic_E") 'Cyrillic-E)
+    (cons (C-enum "GDK_Cyrillic_SHCHA") 'Cyrillic-SHCHA)
+    (cons (C-enum "GDK_Cyrillic_CHE") 'Cyrillic-CHE)
+    (cons (C-enum "GDK_Cyrillic_HARDSIGN") 'Cyrillic-HARDSIGN)
+    (cons (C-enum "GDK_Greek_ALPHAaccent") 'Greek-ALPHAaccent)
+    (cons (C-enum "GDK_Greek_EPSILONaccent") 'Greek-EPSILONaccent)
+    (cons (C-enum "GDK_Greek_ETAaccent") 'Greek-ETAaccent)
+    (cons (C-enum "GDK_Greek_IOTAaccent") 'Greek-IOTAaccent)
+    (cons (C-enum "GDK_Greek_IOTAdiaeresis") 'Greek-IOTAdiaeresis)
+    (cons (C-enum "GDK_Greek_OMICRONaccent") 'Greek-OMICRONaccent)
+    (cons (C-enum "GDK_Greek_UPSILONaccent") 'Greek-UPSILONaccent)
+    (cons (C-enum "GDK_Greek_UPSILONdieresis") 'Greek-UPSILONdieresis)
+    (cons (C-enum "GDK_Greek_OMEGAaccent") 'Greek-OMEGAaccent)
+    (cons (C-enum "GDK_Greek_accentdieresis") 'Greek-accentdieresis)
+    (cons (C-enum "GDK_Greek_horizbar") 'Greek-horizbar)
+    (cons (C-enum "GDK_Greek_alphaaccent") 'Greek-alphaaccent)
+    (cons (C-enum "GDK_Greek_epsilonaccent") 'Greek-epsilonaccent)
+    (cons (C-enum "GDK_Greek_etaaccent") 'Greek-etaaccent)
+    (cons (C-enum "GDK_Greek_iotaaccent") 'Greek-iotaaccent)
+    (cons (C-enum "GDK_Greek_iotadieresis") 'Greek-iotadieresis)
+    (cons (C-enum "GDK_Greek_iotaaccentdieresis") 'Greek-iotaaccentdieresis)
+    (cons (C-enum "GDK_Greek_omicronaccent") 'Greek-omicronaccent)
+    (cons (C-enum "GDK_Greek_upsilonaccent") 'Greek-upsilonaccent)
+    (cons (C-enum "GDK_Greek_upsilondieresis") 'Greek-upsilondieresis)
+    (cons (C-enum "GDK_Greek_upsilonaccentdieresis") 'Greek-upsilonaccentdieresis)
+    (cons (C-enum "GDK_Greek_omegaaccent") 'Greek-omegaaccent)
+    (cons (C-enum "GDK_Greek_ALPHA") 'Greek-ALPHA)
+    (cons (C-enum "GDK_Greek_BETA") 'Greek-BETA)
+    (cons (C-enum "GDK_Greek_GAMMA") 'Greek-GAMMA)
+    (cons (C-enum "GDK_Greek_DELTA") 'Greek-DELTA)
+    (cons (C-enum "GDK_Greek_EPSILON") 'Greek-EPSILON)
+    (cons (C-enum "GDK_Greek_ZETA") 'Greek-ZETA)
+    (cons (C-enum "GDK_Greek_ETA") 'Greek-ETA)
+    (cons (C-enum "GDK_Greek_THETA") 'Greek-THETA)
+    (cons (C-enum "GDK_Greek_IOTA") 'Greek-IOTA)
+    (cons (C-enum "GDK_Greek_KAPPA") 'Greek-KAPPA)
+    (cons (C-enum "GDK_Greek_LAMBDA") 'Greek-LAMBDA)
+    (cons (C-enum "GDK_Greek_MU") 'Greek-MU)
+    (cons (C-enum "GDK_Greek_NU") 'Greek-NU)
+    (cons (C-enum "GDK_Greek_XI") 'Greek-XI)
+    (cons (C-enum "GDK_Greek_OMICRON") 'Greek-OMICRON)
+    (cons (C-enum "GDK_Greek_PI") 'Greek-PI)
+    (cons (C-enum "GDK_Greek_RHO") 'Greek-RHO)
+    (cons (C-enum "GDK_Greek_SIGMA") 'Greek-SIGMA)
+    (cons (C-enum "GDK_Greek_TAU") 'Greek-TAU)
+    (cons (C-enum "GDK_Greek_UPSILON") 'Greek-UPSILON)
+    (cons (C-enum "GDK_Greek_PHI") 'Greek-PHI)
+    (cons (C-enum "GDK_Greek_CHI") 'Greek-CHI)
+    (cons (C-enum "GDK_Greek_PSI") 'Greek-PSI)
+    (cons (C-enum "GDK_Greek_OMEGA") 'Greek-OMEGA)
+    (cons (C-enum "GDK_Greek_alpha") 'Greek-alpha)
+    (cons (C-enum "GDK_Greek_beta") 'Greek-beta)
+    (cons (C-enum "GDK_Greek_gamma") 'Greek-gamma)
+    (cons (C-enum "GDK_Greek_delta") 'Greek-delta)
+    (cons (C-enum "GDK_Greek_epsilon") 'Greek-epsilon)
+    (cons (C-enum "GDK_Greek_zeta") 'Greek-zeta)
+    (cons (C-enum "GDK_Greek_eta") 'Greek-eta)
+    (cons (C-enum "GDK_Greek_theta") 'Greek-theta)
+    (cons (C-enum "GDK_Greek_iota") 'Greek-iota)
+    (cons (C-enum "GDK_Greek_kappa") 'Greek-kappa)
+    (cons (C-enum "GDK_Greek_lambda") 'Greek-lambda)
+    (cons (C-enum "GDK_Greek_mu") 'Greek-mu)
+    (cons (C-enum "GDK_Greek_nu") 'Greek-nu)
+    (cons (C-enum "GDK_Greek_xi") 'Greek-xi)
+    (cons (C-enum "GDK_Greek_omicron") 'Greek-omicron)
+    (cons (C-enum "GDK_Greek_pi") 'Greek-pi)
+    (cons (C-enum "GDK_Greek_rho") 'Greek-rho)
+    (cons (C-enum "GDK_Greek_sigma") 'Greek-sigma)
+    (cons (C-enum "GDK_Greek_finalsmallsigma") 'Greek-finalsmallsigma)
+    (cons (C-enum "GDK_Greek_tau") 'Greek-tau)
+    (cons (C-enum "GDK_Greek_upsilon") 'Greek-upsilon)
+    (cons (C-enum "GDK_Greek_phi") 'Greek-phi)
+    (cons (C-enum "GDK_Greek_chi") 'Greek-chi)
+    (cons (C-enum "GDK_Greek_psi") 'Greek-psi)
+    (cons (C-enum "GDK_Greek_omega") 'Greek-omega)
+    (cons (C-enum "GDK_leftradical") 'leftradical)
+    (cons (C-enum "GDK_topleftradical") 'topleftradical)
+    (cons (C-enum "GDK_horizconnector") 'horizconnector)
+    (cons (C-enum "GDK_topintegral") 'topintegral)
+    (cons (C-enum "GDK_botintegral") 'botintegral)
+    (cons (C-enum "GDK_vertconnector") 'vertconnector)
+    (cons (C-enum "GDK_topleftsqbracket") 'topleftsqbracket)
+    (cons (C-enum "GDK_botleftsqbracket") 'botleftsqbracket)
+    (cons (C-enum "GDK_toprightsqbracket") 'toprightsqbracket)
+    (cons (C-enum "GDK_botrightsqbracket") 'botrightsqbracket)
+    (cons (C-enum "GDK_topleftparens") 'topleftparens)
+    (cons (C-enum "GDK_botleftparens") 'botleftparens)
+    (cons (C-enum "GDK_toprightparens") 'toprightparens)
+    (cons (C-enum "GDK_botrightparens") 'botrightparens)
+    (cons (C-enum "GDK_leftmiddlecurlybrace") 'leftmiddlecurlybrace)
+    (cons (C-enum "GDK_rightmiddlecurlybrace") 'rightmiddlecurlybrace)
+    (cons (C-enum "GDK_topleftsummation") 'topleftsummation)
+    (cons (C-enum "GDK_botleftsummation") 'botleftsummation)
+    (cons (C-enum "GDK_topvertsummationconnector") 'topvertsummationconnector)
+    (cons (C-enum "GDK_botvertsummationconnector") 'botvertsummationconnector)
+    (cons (C-enum "GDK_toprightsummation") 'toprightsummation)
+    (cons (C-enum "GDK_botrightsummation") 'botrightsummation)
+    (cons (C-enum "GDK_rightmiddlesummation") 'rightmiddlesummation)
+    (cons (C-enum "GDK_lessthanequal") 'lessthanequal)
+    (cons (C-enum "GDK_notequal") 'notequal)
+    (cons (C-enum "GDK_greaterthanequal") 'greaterthanequal)
+    (cons (C-enum "GDK_integral") 'integral)
+    (cons (C-enum "GDK_therefore") 'therefore)
+    (cons (C-enum "GDK_variation") 'variation)
+    (cons (C-enum "GDK_infinity") 'infinity)
+    (cons (C-enum "GDK_nabla") 'nabla)
+    (cons (C-enum "GDK_approximate") 'approximate)
+    (cons (C-enum "GDK_similarequal") 'similarequal)
+    (cons (C-enum "GDK_ifonlyif") 'ifonlyif)
+    (cons (C-enum "GDK_implies") 'implies)
+    (cons (C-enum "GDK_identical") 'identical)
+    (cons (C-enum "GDK_radical") 'radical)
+    (cons (C-enum "GDK_includedin") 'includedin)
+    (cons (C-enum "GDK_includes") 'includes)
+    (cons (C-enum "GDK_intersection") 'intersection)
+    (cons (C-enum "GDK_union") 'union)
+    (cons (C-enum "GDK_logicaland") 'logicaland)
+    (cons (C-enum "GDK_logicalor") 'logicalor)
+    (cons (C-enum "GDK_partialderivative") 'partialderivative)
+    (cons (C-enum "GDK_function") 'function)
+    (cons (C-enum "GDK_leftarrow") 'leftarrow)
+    (cons (C-enum "GDK_uparrow") 'uparrow)
+    (cons (C-enum "GDK_rightarrow") 'rightarrow)
+    (cons (C-enum "GDK_downarrow") 'downarrow)
+    (cons (C-enum "GDK_blank") 'blank)
+    (cons (C-enum "GDK_soliddiamond") 'soliddiamond)
+    (cons (C-enum "GDK_checkerboard") 'checkerboard)
+    (cons (C-enum "GDK_ht") 'ht)
+    (cons (C-enum "GDK_ff") 'ff)
+    (cons (C-enum "GDK_cr") 'cr)
+    (cons (C-enum "GDK_lf") 'lf)
+    (cons (C-enum "GDK_nl") 'nl)
+    (cons (C-enum "GDK_vt") 'vt)
+    (cons (C-enum "GDK_lowrightcorner") 'lowrightcorner)
+    (cons (C-enum "GDK_uprightcorner") 'uprightcorner)
+    (cons (C-enum "GDK_upleftcorner") 'upleftcorner)
+    (cons (C-enum "GDK_lowleftcorner") 'lowleftcorner)
+    (cons (C-enum "GDK_crossinglines") 'crossinglines)
+    (cons (C-enum "GDK_horizlinescan1") 'horizlinescan1)
+    (cons (C-enum "GDK_horizlinescan3") 'horizlinescan3)
+    (cons (C-enum "GDK_horizlinescan5") 'horizlinescan5)
+    (cons (C-enum "GDK_horizlinescan7") 'horizlinescan7)
+    (cons (C-enum "GDK_horizlinescan9") 'horizlinescan9)
+    (cons (C-enum "GDK_leftt") 'leftt)
+    (cons (C-enum "GDK_rightt") 'rightt)
+    (cons (C-enum "GDK_bott") 'bott)
+    (cons (C-enum "GDK_topt") 'topt)
+    (cons (C-enum "GDK_vertbar") 'vertbar)
+    (cons (C-enum "GDK_emspace") 'emspace)
+    (cons (C-enum "GDK_enspace") 'enspace)
+    (cons (C-enum "GDK_em3space") 'em3space)
+    (cons (C-enum "GDK_em4space") 'em4space)
+    (cons (C-enum "GDK_digitspace") 'digitspace)
+    (cons (C-enum "GDK_punctspace") 'punctspace)
+    (cons (C-enum "GDK_thinspace") 'thinspace)
+    (cons (C-enum "GDK_hairspace") 'hairspace)
+    (cons (C-enum "GDK_emdash") 'emdash)
+    (cons (C-enum "GDK_endash") 'endash)
+    (cons (C-enum "GDK_signifblank") 'signifblank)
+    (cons (C-enum "GDK_ellipsis") 'ellipsis)
+    (cons (C-enum "GDK_doubbaselinedot") 'doubbaselinedot)
+    (cons (C-enum "GDK_onethird") 'onethird)
+    (cons (C-enum "GDK_twothirds") 'twothirds)
+    (cons (C-enum "GDK_onefifth") 'onefifth)
+    (cons (C-enum "GDK_twofifths") 'twofifths)
+    (cons (C-enum "GDK_threefifths") 'threefifths)
+    (cons (C-enum "GDK_fourfifths") 'fourfifths)
+    (cons (C-enum "GDK_onesixth") 'onesixth)
+    (cons (C-enum "GDK_fivesixths") 'fivesixths)
+    (cons (C-enum "GDK_careof") 'careof)
+    (cons (C-enum "GDK_figdash") 'figdash)
+    (cons (C-enum "GDK_leftanglebracket") 'leftanglebracket)
+    (cons (C-enum "GDK_decimalpoint") 'decimalpoint)
+    (cons (C-enum "GDK_rightanglebracket") 'rightanglebracket)
+    (cons (C-enum "GDK_marker") 'marker)
+    (cons (C-enum "GDK_oneeighth") 'oneeighth)
+    (cons (C-enum "GDK_threeeighths") 'threeeighths)
+    (cons (C-enum "GDK_fiveeighths") 'fiveeighths)
+    (cons (C-enum "GDK_seveneighths") 'seveneighths)
+    (cons (C-enum "GDK_trademark") 'trademark)
+    (cons (C-enum "GDK_signaturemark") 'signaturemark)
+    (cons (C-enum "GDK_trademarkincircle") 'trademarkincircle)
+    (cons (C-enum "GDK_leftopentriangle") 'leftopentriangle)
+    (cons (C-enum "GDK_rightopentriangle") 'rightopentriangle)
+    (cons (C-enum "GDK_emopencircle") 'emopencircle)
+    (cons (C-enum "GDK_emopenrectangle") 'emopenrectangle)
+    (cons (C-enum "GDK_leftsinglequotemark") 'leftsinglequotemark)
+    (cons (C-enum "GDK_rightsinglequotemark") 'rightsinglequotemark)
+    (cons (C-enum "GDK_leftdoublequotemark") 'leftdoublequotemark)
+    (cons (C-enum "GDK_rightdoublequotemark") 'rightdoublequotemark)
+    (cons (C-enum "GDK_prescription") 'prescription)
+    (cons (C-enum "GDK_minutes") 'minutes)
+    (cons (C-enum "GDK_seconds") 'seconds)
+    (cons (C-enum "GDK_latincross") 'latincross)
+    (cons (C-enum "GDK_hexagram") 'hexagram)
+    (cons (C-enum "GDK_filledrectbullet") 'filledrectbullet)
+    (cons (C-enum "GDK_filledlefttribullet") 'filledlefttribullet)
+    (cons (C-enum "GDK_filledrighttribullet") 'filledrighttribullet)
+    (cons (C-enum "GDK_emfilledcircle") 'emfilledcircle)
+    (cons (C-enum "GDK_emfilledrect") 'emfilledrect)
+    (cons (C-enum "GDK_enopencircbullet") 'enopencircbullet)
+    (cons (C-enum "GDK_enopensquarebullet") 'enopensquarebullet)
+    (cons (C-enum "GDK_openrectbullet") 'openrectbullet)
+    (cons (C-enum "GDK_opentribulletup") 'opentribulletup)
+    (cons (C-enum "GDK_opentribulletdown") 'opentribulletdown)
+    (cons (C-enum "GDK_openstar") 'openstar)
+    (cons (C-enum "GDK_enfilledcircbullet") 'enfilledcircbullet)
+    (cons (C-enum "GDK_enfilledsqbullet") 'enfilledsqbullet)
+    (cons (C-enum "GDK_filledtribulletup") 'filledtribulletup)
+    (cons (C-enum "GDK_filledtribulletdown") 'filledtribulletdown)
+    (cons (C-enum "GDK_leftpointer") 'leftpointer)
+    (cons (C-enum "GDK_rightpointer") 'rightpointer)
+    (cons (C-enum "GDK_club") 'club)
+    (cons (C-enum "GDK_diamond") 'diamond)
+    (cons (C-enum "GDK_heart") 'heart)
+    (cons (C-enum "GDK_maltesecross") 'maltesecross)
+    (cons (C-enum "GDK_dagger") 'dagger)
+    (cons (C-enum "GDK_doubledagger") 'doubledagger)
+    (cons (C-enum "GDK_checkmark") 'checkmark)
+    (cons (C-enum "GDK_ballotcross") 'ballotcross)
+    (cons (C-enum "GDK_musicalsharp") 'musicalsharp)
+    (cons (C-enum "GDK_musicalflat") 'musicalflat)
+    (cons (C-enum "GDK_malesymbol") 'malesymbol)
+    (cons (C-enum "GDK_femalesymbol") 'femalesymbol)
+    (cons (C-enum "GDK_telephone") 'telephone)
+    (cons (C-enum "GDK_telephonerecorder") 'telephonerecorder)
+    (cons (C-enum "GDK_phonographcopyright") 'phonographcopyright)
+    (cons (C-enum "GDK_caret") 'caret)
+    (cons (C-enum "GDK_singlelowquotemark") 'singlelowquotemark)
+    (cons (C-enum "GDK_doublelowquotemark") 'doublelowquotemark)
+    (cons (C-enum "GDK_cursor") 'cursor)
+    (cons (C-enum "GDK_leftcaret") 'leftcaret)
+    (cons (C-enum "GDK_rightcaret") 'rightcaret)
+    (cons (C-enum "GDK_downcaret") 'downcaret)
+    (cons (C-enum "GDK_upcaret") 'upcaret)
+    (cons (C-enum "GDK_overbar") 'overbar)
+    (cons (C-enum "GDK_downtack") 'downtack)
+    (cons (C-enum "GDK_upshoe") 'upshoe)
+    (cons (C-enum "GDK_downstile") 'downstile)
+    (cons (C-enum "GDK_underbar") 'underbar)
+    (cons (C-enum "GDK_jot") 'jot)
+    (cons (C-enum "GDK_quad") 'quad)
+    (cons (C-enum "GDK_uptack") 'uptack)
+    (cons (C-enum "GDK_circle") 'circle)
+    (cons (C-enum "GDK_upstile") 'upstile)
+    (cons (C-enum "GDK_downshoe") 'downshoe)
+    (cons (C-enum "GDK_rightshoe") 'rightshoe)
+    (cons (C-enum "GDK_leftshoe") 'leftshoe)
+    (cons (C-enum "GDK_lefttack") 'lefttack)
+    (cons (C-enum "GDK_righttack") 'righttack)
+    (cons (C-enum "GDK_hebrew_doublelowline") 'hebrew-doublelowline)
+    (cons (C-enum "GDK_hebrew_aleph") 'hebrew-aleph)
+    (cons (C-enum "GDK_hebrew_beth") 'hebrew-beth)
+    (cons (C-enum "GDK_hebrew_gimmel") 'hebrew-gimmel)
+    (cons (C-enum "GDK_hebrew_daleth") 'hebrew-daleth)
+    (cons (C-enum "GDK_hebrew_he") 'hebrew-he)
+    (cons (C-enum "GDK_hebrew_waw") 'hebrew-waw)
+    (cons (C-enum "GDK_hebrew_zayin") 'hebrew-zayin)
+    (cons (C-enum "GDK_hebrew_het") 'hebrew-het)
+    (cons (C-enum "GDK_hebrew_teth") 'hebrew-teth)
+    (cons (C-enum "GDK_hebrew_yod") 'hebrew-yod)
+    (cons (C-enum "GDK_hebrew_finalkaph") 'hebrew-finalkaph)
+    (cons (C-enum "GDK_hebrew_kaph") 'hebrew-kaph)
+    (cons (C-enum "GDK_hebrew_lamed") 'hebrew-lamed)
+    (cons (C-enum "GDK_hebrew_finalmem") 'hebrew-finalmem)
+    (cons (C-enum "GDK_hebrew_mem") 'hebrew-mem)
+    (cons (C-enum "GDK_hebrew_finalnun") 'hebrew-finalnun)
+    (cons (C-enum "GDK_hebrew_nun") 'hebrew-nun)
+    (cons (C-enum "GDK_hebrew_samekh") 'hebrew-samekh)
+    (cons (C-enum "GDK_hebrew_ayin") 'hebrew-ayin)
+    (cons (C-enum "GDK_hebrew_finalpe") 'hebrew-finalpe)
+    (cons (C-enum "GDK_hebrew_pe") 'hebrew-pe)
+    (cons (C-enum "GDK_hebrew_finalzadi") 'hebrew-finalzadi)
+    (cons (C-enum "GDK_hebrew_zadi") 'hebrew-zadi)
+    (cons (C-enum "GDK_hebrew_qoph") 'hebrew-qoph)
+    (cons (C-enum "GDK_hebrew_resh") 'hebrew-resh)
+    (cons (C-enum "GDK_hebrew_shin") 'hebrew-shin)
+    (cons (C-enum "GDK_hebrew_taf") 'hebrew-taf)
+    (cons (C-enum "GDK_BackSpace") 'BackSpace)
+    (cons (C-enum "GDK_Tab") 'Tab)
+    (cons (C-enum "GDK_Linefeed") 'Linefeed)
+    (cons (C-enum "GDK_Clear") 'Clear)
+    (cons (C-enum "GDK_Return") 'Return)
+    (cons (C-enum "GDK_Pause") 'Pause)
+    (cons (C-enum "GDK_Scroll_Lock") 'Scroll-Lock)
+    (cons (C-enum "GDK_Escape") 'Escape)
+    (cons (C-enum "GDK_Multi_key") 'Multi-key)
+    (cons (C-enum "GDK_Kanji") 'Kanji)
+    (cons (C-enum "GDK_Muhenkan") 'Muhenkan)
+    (cons (C-enum "GDK_Henkan") 'Henkan)
+    (cons (C-enum "GDK_Romaji") 'Romaji)
+    (cons (C-enum "GDK_Hiragana") 'Hiragana)
+    (cons (C-enum "GDK_Katakana") 'Katakana)
+    (cons (C-enum "GDK_Hiragana_Katakana") 'Hiragana-Katakana)
+    (cons (C-enum "GDK_Zenkaku") 'Zenkaku)
+    (cons (C-enum "GDK_Hankaku") 'Hankaku)
+    (cons (C-enum "GDK_Zenkaku_Hankaku") 'Zenkaku-Hankaku)
+    (cons (C-enum "GDK_Touroku") 'Touroku)
+    (cons (C-enum "GDK_Massyo") 'Massyo)
+    (cons (C-enum "GDK_Kana_Lock") 'Kana-Lock)
+    (cons (C-enum "GDK_Kana_Shift") 'Kana-Shift)
+    (cons (C-enum "GDK_Eisu_Shift") 'Eisu-Shift)
+    (cons (C-enum "GDK_Eisu_toggle") 'Eisu-toggle)
+    (cons (C-enum "GDK_Home") 'Home)
+    (cons (C-enum "GDK_Left") 'Left)
+    (cons (C-enum "GDK_Up") 'Up)
+    (cons (C-enum "GDK_Right") 'Right)
+    (cons (C-enum "GDK_Down") 'Down)
+    (cons (C-enum "GDK_Prior") 'Prior)
+    (cons (C-enum "GDK_Next") 'Next)
+    (cons (C-enum "GDK_End") 'End)
+    (cons (C-enum "GDK_Begin") 'Begin)
+    (cons (C-enum "GDK_Select") 'Select)
+    (cons (C-enum "GDK_Print") 'Print)
+    (cons (C-enum "GDK_Execute") 'Execute)
+    (cons (C-enum "GDK_Insert") 'Insert)
+    (cons (C-enum "GDK_Undo") 'Undo)
+    (cons (C-enum "GDK_Redo") 'Redo)
+    (cons (C-enum "GDK_Menu") 'Menu)
+    (cons (C-enum "GDK_Find") 'Find)
+    (cons (C-enum "GDK_Cancel") 'Stop) ;originally called Cancel
+    (cons (C-enum "GDK_Help") 'Help)
+    (cons (C-enum "GDK_Break") 'Break)
+    (cons (C-enum "GDK_script_switch") 'script-switch)
+    (cons (C-enum "GDK_Num_Lock") 'Num-Lock)
+    (cons (C-enum "GDK_KP_Space") 'KP-Space)
+    (cons (C-enum "GDK_KP_Tab") 'KP-Tab)
+    (cons (C-enum "GDK_KP_Enter") 'KP-Enter)
+    (cons (C-enum "GDK_KP_F1") 'KP-F1)
+    (cons (C-enum "GDK_KP_F2") 'KP-F2)
+    (cons (C-enum "GDK_KP_F3") 'KP-F3)
+    (cons (C-enum "GDK_KP_F4") 'KP-F4)
+    (cons (C-enum "GDK_KP_Multiply") 'KP-Multiply)
+    (cons (C-enum "GDK_KP_Add") 'KP-Add)
+    (cons (C-enum "GDK_KP_Separator") 'KP-Separator)
+    (cons (C-enum "GDK_KP_Subtract") 'KP-Subtract)
+    (cons (C-enum "GDK_KP_Decimal") 'KP-Decimal)
+    (cons (C-enum "GDK_KP_Divide") 'KP-Divide)
+    (cons (C-enum "GDK_KP_0") 'KP-0)
+    (cons (C-enum "GDK_KP_1") 'KP-1)
+    (cons (C-enum "GDK_KP_2") 'KP-2)
+    (cons (C-enum "GDK_KP_3") 'KP-3)
+    (cons (C-enum "GDK_KP_4") 'KP-4)
+    (cons (C-enum "GDK_KP_5") 'KP-5)
+    (cons (C-enum "GDK_KP_6") 'KP-6)
+    (cons (C-enum "GDK_KP_7") 'KP-7)
+    (cons (C-enum "GDK_KP_8") 'KP-8)
+    (cons (C-enum "GDK_KP_9") 'KP-9)
+    (cons (C-enum "GDK_KP_Equal") 'KP-Equal)
+    (cons (C-enum "GDK_F1") 'F1)
+    (cons (C-enum "GDK_F2") 'F2)
+    (cons (C-enum "GDK_F3") 'F3)
+    (cons (C-enum "GDK_F4") 'F4)
+    (cons (C-enum "GDK_F5") 'F5)
+    (cons (C-enum "GDK_F6") 'F6)
+    (cons (C-enum "GDK_F7") 'F7)
+    (cons (C-enum "GDK_F8") 'F8)
+    (cons (C-enum "GDK_F9") 'F9)
+    (cons (C-enum "GDK_F10") 'F10)
+    (cons (C-enum "GDK_F11") 'F11)
+    (cons (C-enum "GDK_F12") 'F12)
+    (cons (C-enum "GDK_F13") 'F13)
+    (cons (C-enum "GDK_F14") 'F14)
+    (cons (C-enum "GDK_F15") 'F15)
+    (cons (C-enum "GDK_F16") 'F16)
+    (cons (C-enum "GDK_F17") 'F17)
+    (cons (C-enum "GDK_F18") 'F18)
+    (cons (C-enum "GDK_F19") 'F19)
+    (cons (C-enum "GDK_F20") 'F20)
+    (cons (C-enum "GDK_F21") 'F21)
+    (cons (C-enum "GDK_F22") 'F22)
+    (cons (C-enum "GDK_F23") 'F23)
+    (cons (C-enum "GDK_F24") 'F24)
+    (cons (C-enum "GDK_F25") 'F25)
+    (cons (C-enum "GDK_F26") 'F26)
+    (cons (C-enum "GDK_F27") 'F27)
+    (cons (C-enum "GDK_F28") 'F28)
+    (cons (C-enum "GDK_F29") 'F29)
+    (cons (C-enum "GDK_F30") 'F30)
+    (cons (C-enum "GDK_F31") 'F31)
+    (cons (C-enum "GDK_F32") 'F32)
+    (cons (C-enum "GDK_F33") 'F33)
+    (cons (C-enum "GDK_F34") 'F34)
+    (cons (C-enum "GDK_F35") 'F35)
+    (cons (C-enum "GDK_Shift_L") 'Shift-L)
+    (cons (C-enum "GDK_Shift_R") 'Shift-R)
+    (cons (C-enum "GDK_Control_L") 'Control-L)
+    (cons (C-enum "GDK_Control_R") 'Control-R)
+    (cons (C-enum "GDK_Caps_Lock") 'Caps-Lock)
+    (cons (C-enum "GDK_Shift_Lock") 'Shift-Lock)
+    (cons (C-enum "GDK_Meta_L") 'Meta-L)
+    (cons (C-enum "GDK_Meta_R") 'Meta-R)
+    (cons (C-enum "GDK_Alt_L") 'Alt-L)
+    (cons (C-enum "GDK_Alt_R") 'Alt-R)
+    (cons (C-enum "GDK_Super_L") 'Super-L)
+    (cons (C-enum "GDK_Super_R") 'Super-R)
+    (cons (C-enum "GDK_Hyper_L") 'Hyper-L)
+    (cons (C-enum "GDK_Hyper_R") 'Hyper-R)
+    (cons (C-enum "GDK_Delete") 'Delete)
+    (cons (C-enum "GDK_dead_acute") 'mute-acute)
+    (cons (C-enum "GDK_dead_grave") 'mute-grave)
+    (cons (C-enum "GDK_dead_circumflex") 'mute-asciicircum)
+    (cons (C-enum "GDK_dead_diaeresis") 'mute-diaeresis)
+    (cons (C-enum "GDK_dead_tilde") 'mute-asciitilde)
+    (cons (C-enum "GDK_LiraSign") 'lira)
+    ;; '(#x8000BE . guilder)
+    (cons (C-enum "GDK_Ydiaeresis") 'Ydiaeresis)
+    ;; '(#x8000F6 . longminus)
+    ;; '(#x8000FC . block)
+    ;; '(#x80FF48 . hpModelock1)
+    ;; '(#x80FF49 . hpModelock2)
+    ;; '(#x80FF6C . Reset)
+    ;; '(#x80FF6D . System)
+    ;; '(#x80FF6E . User)
+    ;; '(#x80FF6F . ClearLine)
+    ;; '(#x80FF70 . InsertLine)
+    ;; '(#x80FF71 . DeleteLine)
+    ;; '(#x80FF72 . InsertChar)
+    ;; '(#x80FF73 . DeleteChar)
+    ;; '(#x80FF74 . BackTab)
+    ;; '(#x80FF75 . KP-BackTab)
+    ;; '(#x80FF76 . Ext16bit-L)
+    ;; '(#x80FF77 . Ext16bit-R)
+    ;; '(#x84FF02 . osfCopy)
+    ;; '(#x84FF03 . osfCut)
+    ;; '(#x84FF04 . osfPaste)
+    ;; '(#x84FF08 . osfBackSpace)
+    ;; '(#x84FF0B . osfClear)
+    ;; '(#x84FF31 . osfAddMode)
+    ;; '(#x84FF32 . osfPrimaryPaste)
+    ;; '(#x84FF33 . osfQuickPaste)
+    ;; '(#x84FF41 . osfPageUp)
+    ;; '(#x84FF42 . osfPageDown)
+    ;; '(#x84FF44 . osfActivate)
+    ;; '(#x84FF45 . osfMenuBar)
+    ;; '(#x84FF51 . osfLeft)
+    ;; '(#x84FF52 . osfUp)
+    ;; '(#x84FF53 . osfRight)
+    ;; '(#x84FF54 . osfDown)
+    ;; '(#x84FF57 . osfEndLine)
+    ;; '(#x84FF58 . osfBeginLine)
+    ;; '(#x84FF60 . osfSelect)
+    ;; '(#x84FF63 . osfInsert)
+    ;; '(#x84FF65 . osfUndo)
+    ;; '(#x84FF67 . osfMenu)
+    ;; '(#x84FF69 . osfCancel)
+    ;; '(#x84FF6A . osfHelp)
+    ;; '(#x84FFFF . osfDelete)
+    (cons (C-enum "GDK_VoidSymbol") 'VoidSymbol))
+   (lambda (a b) (< (car a) (car b)))))
\ No newline at end of file
index 175492d31f555f1c841dabcdef06b8fc4fa755cd..36edc555b5ae7d06a038216d14492da5693e92be 100644 (file)
@@ -48,15 +48,17 @@ USA.
   (scrollable-area define accessor
                   initializer (lambda () (make-rect 0 0 100 100)))
 
-  ;; Scroll offset and window size (on-screen area).
-  ;; The width and height should match the window geometry.
+  ;; Scroll offset (and window size) in logical device coordinates.
+  ;; (The size should match the window geometry.)
   (on-screen-area define accessor
                  initializer (lambda () (make-rect 0 0)))
 
-  ;; The drawing.
   (drawing define standard
           modifier %set-scm-layout-drawing!
-          initial-value #f))
+          initial-value #f)
+
+  (event-handlers define accessor initializer
+                 (lambda () (make-vector (C-enum "GDK_DAMAGE") #f))))
 
 (define (scm-layout-new width height)
   (let ((w (check-non-negative-integer width))
@@ -268,39 +270,6 @@ USA.
       (adjust-adjustments widget)
       unspecific)))
 
-(define (scm-layout-event-handler widget)
-  (named-lambda (scm-layout-handle-event GtkWidget GdkEvent)
-    (trace2 ";((scm-layout-handle-event "widget") "GtkWidget" "GdkEvent")\n")
-
-    (let ((type (C-> GdkEvent "GdkEvent any type")))
-
-      (cond ((int:= 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 "width"x"height"+"x"+"y
-                               " of "widget".\n")
-                       (drawing-expose drawing widget window
-                                       (make-rect (int:+ x offx) (int:+ y offy)
-                                                  width height)))))))
-
-           (else
-            (trace "; "(C-enum "GdkEventType" type)" on "widget"\n"))))
-    1 ;;TRUE -- "handled" -- done.
-    ))
-
 (define (scm-layout-set-scroll-adjustments widget)
   (named-lambda (scm-layout::set-scroll-adjustments
                 GtkWidget hGtkAdjustment vGtkAdjustment)
@@ -395,6 +364,142 @@ USA.
                               page-size step-incr page-incr)))))
 \f
 
+;;;; Event Handlers
+
+(define (scm-layout-event-handler layout)
+  (named-lambda (scm-layout-handle-event GtkWidget GdkEvent)
+    (trace2 ";((scm-layout-handle-event "layout") "GtkWidget" "GdkEvent")\n")
+
+    (let ((type (C-> GdkEvent "GdkEvent any type")))
+      (if (int:= 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 layout))
+               (widget-window (scm-layout-window layout)))
+           (cond ((not (alien=? window widget-window))
+                  (trace "; Expose a strange window "window
+                         " (not "widget-window").\n"))
+                 (drawing
+                  (let* ((scroll (scm-layout-on-screen-area layout))
+                         (offx (rect-x scroll))
+                         (offy (rect-y scroll)))
+                    (trace "; Expose area "width"x"height"+"x"+"y
+                           " of "layout".\n")
+                    (drawing-expose drawing layout window
+                                    (make-rect (int:+ x offx) (int:+ y offy)
+                                               width height)))))
+           1 ;;TRUE -- "handled" -- done.
+           )
+         (let ((handler (vector-ref (scm-layout-event-handlers layout) type)))
+           (if handler
+               (handler GtkWidget GdkEvent)
+               ;; Unhandled
+               0))))))
+
+(define (set-scm-layout-map-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 1)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_MAP")
+     (named-lambda (scm-layout-unmap-handler GtkWidget GdkEvent)
+       GtkWidget GdkEvent                      ;ignore
+       (handler layout)))))
+
+(define (set-scm-layout-unmap-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 1)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_UNMAP")
+     (named-lambda (scm-layout-unmap-handler GtkWidget GdkEvent)
+       GtkWidget GdkEvent                      ;ignore
+       (handler layout)))))
+
+(define (set-scm-layout-focus-change-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 2)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_FOCUS_CHANGE")
+     (named-lambda (scm-layout-unmap-handler GtkWidget GdkEvent)
+       GtkWidget                       ;ignore
+       (let ((in? (not (zero? (C-> GdkEvent "GdkEventFocus in")))))
+        (handler layout in?))))))
+
+(define (set-scm-layout-visibility-notify-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 2)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_VISIBILITY_NOTIFY")
+     (named-lambda (scm-layout-visibility-notify-handler GtkWidget GdkEvent)
+       GtkWidget                       ;ignore
+       (let ((state (C-> GdkEvent "GdkEventVisibility state")))
+        (handler
+         layout
+         (cond
+          ((int:= state (C-enum "GDK_VISIBILITY_UNOBSCURED")) 'VISIBLE)
+          ((int:= state (C-enum "GDK_VISIBILITY_PARTIAL")) 'PARTIALLY-OBSCURED)
+          ((int:= state (C-enum "GDK_VISIBILITY_FULLY_OBSCURED")) 'OBSCURED)
+          (else (C-enum "GdkVisibilityState" state)))))))))
+
+(define (set-scm-layout-key-press-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 3)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_KEY_PRESS")
+     (named-lambda (scm-layout-key-press-handler GtkWidget GdkEvent)
+       GtkWidget                       ;ignore
+       (let ((alien (C-> GdkEvent "GdkEvent key string"))
+            (length (C-> GdkEvent "GdkEvent key length"))
+            (state (C-> GdkEvent "GdkEvent key state"))
+            (keyval (C-> GdkEvent "GdkEvent key keyval")))
+        (let ((string (c-peek-cstring alien))
+              (char-bits (gdk-key-state->char-bits state)))
+          (if (zero? (string-length string))
+              (cond ((int:= length 1)
+                     (handler layout #\NUL char-bits))
+                    ((int:= length 0)
+                     (handler layout (gdk-keyval->name keyval) char-bits))
+                    (else (error "Unexpected length in GdkEventKey.")))
+              (let ((l (string-length string)))
+                (let loop ((i 0))
+                  (if (int:< i l)
+                      (if (zero? (handler layout
+                                          (string-ref string i) char-bits))
+                          0 ;;NOT handled.
+                          (loop (int:1+ i)))
+                      1 ;;Handled.
+                      ))))))))))
+
+(define (set-scm-layout-motion-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 3)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_MOTION_NOTIFY")
+     (named-lambda (scm-layout-motion-handler GtkWidget GdkEvent)
+       GtkWidget                       ;ignore
+       (let ((handled?
+             (handler layout
+                      (floor->exact (C-> GdkEvent "GdkEventMotion x"))
+                      (floor->exact (C-> GdkEvent "GdkEventMotion y")))))
+        (C-call "gdk_window_get_pointer" #f
+                (C-> GdkEvent "GdkEventMotion window") 0 0 0)
+        handled?)))))
+
+(define (set-scm-layout-button-release-handler! layout handler)
+  (let ((handler (check-procedure-arity handler 3)))
+    (vector-set!
+     (scm-layout-event-handlers layout) (C-enum "GDK_BUTTON_RELEASE")
+     (named-lambda (scm-layout-button-release-handler GtkWidget GdkEvent)
+       GtkWidget                       ;ignore
+       (let ((x (floor->exact (C-> GdkEvent "GdkEventButton x")))
+            (y (floor->exact (C-> GdkEvent "GdkEventButton y"))))
+        (handler layout x y))))))
+
+(define-integrable (check-procedure-arity object arity)
+  (cond ((not (procedure? object))
+        (error:wrong-type-argument object "procedure" 'check-procedure-arity))
+       ((not (procedure-arity-valid? object arity))
+        (error:bad-range-argument object 'check-procedure-arity))
+       (else object)))
+\f
+
 ;;;; Drawings
 
 (define-class (<drawing> (constructor () 1))
@@ -624,7 +729,7 @@ USA.
                (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
+                   0 alien 0 ;area widget detail
                    (int:- (rect-x area) scroll-x)
                    (int:- (rect-y area) scroll-y)
                    (rect-width area)
@@ -689,7 +794,7 @@ USA.
                (area (drawn-item-area item)))
            (C-call "gtk_paint_hline"
                    style window state
-                   null-alien alien null-alien ;area widget detail
+                   0 alien 0 ;area widget detail
                    (int:- (rect-min-x area) scroll-x)
                    (int:- (rect-max-x area) scroll-x)
                    (int:- (rect-y area) scroll-y)))))))
@@ -722,7 +827,7 @@ USA.
                (area (drawn-item-area item)))
            (C-call "gtk_paint_vline"
                    style window state
-                   null-alien alien null-alien ;area widget detail
+                   0 alien 0 ;area widget detail
                    (int:- (rect-min-y area) scroll-y)
                    (int:- (rect-max-y area) scroll-y)
                    (int:- (rect-x area) scroll-x)))))))
@@ -781,7 +886,7 @@ USA.
            (if (not (alien-null? layout))
                (C-call "gtk_paint_layout"
                        style window state 1
-                       null-alien alien null-alien ;area widget detail
+                       0 alien 0 ;area widget detail
                        (int:- (rect-x area) scroll-x)
                        (int:- (rect-y area) scroll-y)
                        layout)))))))
@@ -796,7 +901,7 @@ USA.
        (begin
          (C-call "pango_layout_set_text" layout text -1)))
     (let ((log-extent (pango-rectangle))
-         (ink-extent null-alien))
+         (ink-extent 0))
       (C-call "pango_layout_get_pixel_extents" layout ink-extent log-extent)
 
       (without-interrupts
@@ -820,7 +925,7 @@ USA.
                (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))
+                                index-alien 0))
                (begin
                  (free index-alien)
                  #f)