commit bfef1588df48be6266fdc3f4aa29c5a1e2846d5d
parent c8a658f8bc6d00f3b2a5072d9f9049fdafac3c83
Author: Tomas Hlavaty <tom@logand.com>
Date: Wed, 28 Aug 2019 08:07:10 +0200
content added
Diffstat:
A | glade-example.glade | | | 293 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | glade-example.l | | | 25 | +++++++++++++++++++++++++ |
A | gtk-example.l | | | 28 | ++++++++++++++++++++++++++++ |
A | gtk-gl-teapot.l | | | 160 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | gtk-mandelbrot.l | | | 169 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | gtk-server.cfg | | | 1610 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | gtk.l | | | 32 | ++++++++++++++++++++++++++++++++ |
7 files changed, 2317 insertions(+), 0 deletions(-)
diff --git a/glade-example.glade b/glade-example.glade
@@ -0,0 +1,293 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="window">
+ <property name="height_request">300</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Designed with Glade</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">12</property>
+ <property name="n_columns">11</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Bestand</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu1">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="nieuw1">
+ <property name="visible">True</property>
+ <property name="label">gtk-new</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="openen1">
+ <property name="visible">True</property>
+ <property name="label">gtk-open</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="opslaan1">
+ <property name="visible">True</property>
+ <property name="label">gtk-save</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="opslaan_als1">
+ <property name="visible">True</property>
+ <property name="label">gtk-save-as</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="afsluiten1">
+ <property name="visible">True</property>
+ <property name="label">gtk-quit</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Be_werken</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu2">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="knippen1">
+ <property name="visible">True</property>
+ <property name="label">gtk-cut</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="kopiƫren1">
+ <property name="visible">True</property>
+ <property name="label">gtk-copy</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="plakken1">
+ <property name="visible">True</property>
+ <property name="label">gtk-paste</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="verwijderen1">
+ <property name="visible">True</property>
+ <property name="label">gtk-delete</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Beel_d</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu3">
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Hulp</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu4">
+
+ <child>
+ <widget class="GtkMenuItem" id="info1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">In_fo</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">11</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">You don't need Gnome to run glade. Get it at: glade.gnome.org</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_FILL</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"></property>
+ <property name="y_options">expand</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes">Enter some text here</property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkStatusbar" id="statusbar1">
+ <property name="visible">True</property>
+ <property name="has_resize_grip">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">11</property>
+ <property name="top_attach">11</property>
+ <property name="bottom_attach">12</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="exit_button">
+ <property name="width_request">35</property>
+ <property name="height_request">45</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Exit</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">11</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">expand</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="print_button">
+ <property name="width_request">35</property>
+ <property name="height_request">45</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Print</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">11</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">expand</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/glade-example.l b/glade-example.l
@@ -0,0 +1,25 @@
+# picoLisp + gtk-server example
+# 26feb2009 Tomas Hlavaty
+# $ ~/picolisp/p glade-example.l -bye
+# requires http://logand.com/gtk/gtk.l
+
+(load "gtk.l")
+
+(gtk_init 'NULL 'NULL)
+(glade_init)
+(setq X (glade_xml_new "glade-example.glade" 'NULL 'NULL))
+(glade_xml_signal_autoconnect X)
+(and (glade_xml_get_widget X 'window)
+ (gtk_server_connect @ 'delete-event 'window) )
+(and (glade_xml_get_widget X 'exit_button)
+ (gtk_server_connect @ 'clicked 'exit_button) )
+(and (glade_xml_get_widget X 'print_button)
+ (gtk_server_connect @ 'clicked 'print_button) )
+(setq E (glade_xml_get_widget X 'entry))
+(let V 0
+ (until (prog
+ (setq V (gtk_server_callback 'wait))
+ (or (= V 'exit_button) (= V 'window)) )
+ (when (= V 'print_button)
+ (prinl (gtk_entry_get_text E)) ) ) )
+(gtk_exit 0)
diff --git a/gtk-example.l b/gtk-example.l
@@ -0,0 +1,28 @@
+# picoLisp + gtk-server example
+# 26feb2009 Tomas Hlavaty
+# $ ~/picolisp/p gtk-example.l -bye
+# requires http://logand.com/gtk/gtk.l
+
+(load "gtk.l")
+
+(gtk_init 'NULL 'NULL)
+(setq W (gtk_window_new 0))
+(gtk_window_set_title W "This is a title")
+(gtk_window_set_default_size W 100 100)
+(gtk_window_set_position W 1)
+(setq G (gtk_table_new 30 30 1))
+(gtk_container_add W G)
+(setq B1 (gtk_button_new_with_label "Exit"))
+(gtk_table_attach_defaults G B1 17 28 20 25)
+(setq B2 (gtk_button_new_with_label "Print text"))
+(gtk_table_attach_defaults G B2 2 13 20 25)
+(setq E (gtk_entry_new))
+(gtk_table_attach_defaults G E 2 28 5 15)
+(gtk_widget_show_all W)
+(let V 0
+ (until (prog
+ (setq V (gtk_server_callback 'wait))
+ (or (= V B1) (= V W)) )
+ (when (= V B2)
+ (prinl "Contents: " (gtk_entry_get_text E)) ) ) )
+(gtk_exit 0)
diff --git a/gtk-gl-teapot.l b/gtk-gl-teapot.l
@@ -0,0 +1,160 @@
+# picoLisp + gtk-server example
+# 26feb2009 Tomas Hlavaty
+# $ ~/picolisp/p gtk-gl-teapot.l -bye
+# requires http://logand.com/gtk/gtk.l
+# based on http://www.allbasic.info/forum/index.php?topic=173.0;wap2
+
+(load "gtk.l")
+
+(setq *Scl 6)
+
+# /usr/include/gtkglext-1.0/gdk/gdkglconfig.h
+(def 'GDK_GL_MODE_RGB 0)
+(def 'GDK_GL_MODE_RGBA 0)
+(def 'GDK_GL_MODE_INDEX 1)
+(def 'GDK_GL_MODE_SINGLE 0)
+(def 'GDK_GL_MODE_DOUBLE 2)
+(def 'GDK_GL_MODE_STEREO 4)
+(def 'GDK_GL_MODE_ALPHA 8)
+(def 'GDK_GL_MODE_DEPTH 16)
+(def 'GDK_GL_MODE_STENCIL 32)
+(def 'GDK_GL_MODE_ACCUM 64)
+(def 'GDK_GL_MODE_MULTISAMPLE 128)
+
+(def 'GDK_GL_RGBA_TYPE (hex "8014"))
+(def 'GDK_GL_COLOR_INDEX_TYPE (hex "0x8015"))
+
+(in "/usr/include/GL/gl.h"
+ (until (eof)
+ (when (match '("#" "d" "e" "f" "i" "n" "e" " " @A "0" "x" @B) (line))
+ (let N (intern (pack (clip @A)))
+ (def N (hex (pack @B))) ) ) ) )
+
+(de bitmap_text @
+ #(for C (chop S)
+ # (glutBitmapCharacter GLUT_BITMAP_HELVETICA_18 C))
+ )
+
+(de stroke_text (S)
+ #(for C (chop S)
+ # (glutStrokeCharacter GLUT_STROKE_ROMAN C) )
+ )
+
+(de idle ()
+ (expose) )
+
+(de press ()
+ # keyb = gtk_server_key()
+ # UNTIL EVENT = win OR keyb = ESCAPE
+ (prinl 'press) )
+
+(de expose ()
+ # Setup the drawing area
+ (setq GLCONTEXT (gtk_widget_get_gl_context DA))
+ (setq GLDRAWABLE (gtk_widget_get_gl_window DA))
+ (gdk_gl_drawable_gl_begin GLDRAWABLE GLCONTEXT)
+ # Define clearing color
+ (glClearColor "0.5" "1.0" "1.0" 0)
+ # Clear screen
+ (glClear (| GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT))
+ # Enable shading, depth and lighting
+ (glShadeModel GL_SMOOTH)
+ (glEnable GL_DEPTH_TEST)
+ (glEnable GL_LIGHTING)
+ (glEnable GL_LIGHT0)
+ # Setup lighting
+ (glLightfv GL_LIGHT0 GL_POSITION "AAAAQAAAAEAAAADBAAAAAA==")
+ (glLightfv GL_LIGHT0 GL_DIFFUSE "AACAPwAAgD8AAIA/AACAPw==")
+ (glLightfv GL_LIGHT0 GL_AMBIENT "mpkZPpqZGT6amRk+")
+ (glLightfv GL_LIGHT0 GL_SPECULAR "AACAPwAAgD8AAIA/AACAPw==")
+ # Setup reflected color of object
+ (glMaterialfv GL_FRONT GL_AMBIENT_AND_DIFFUSE "zczMPTMzMz/NzMw9AAAAPw==")
+ # Make sure we see the model
+ (glMatrixMode GL_MODELVIEW)
+ # Save current matrix
+ (glPushMatrix)
+#(glMatrixMode GL_PROJECTION)
+#(glLoadIdentity)
+ # Rotate
+ (glRotatef ROTX 0 1.0 0)
+ (glRotatef ROTY 1.0 0 0)
+ # Dump rotated image
+ (glutSolidTeapot "0.5") #SIZE)
+ # Undo the last rotation
+ (glLoadIdentity)
+ # Setup reflected color of font
+ (glMaterialfv GL_FRONT GL_AMBIENT_AND_DIFFUSE "AACAP83MzD4AAIA/AAAAAA==")
+ # Determine position of bitmapped text
+ (glRasterPos2f 0 -0.8)
+ # Draw some bitmapped text
+ (bitmap_text "OpenGL demo with Scriptbasic")
+ # Setup reflected color of font
+ (glMaterialfv GL_FRONT GL_AMBIENT_AND_DIFFUSE "AAAAAAAAAAAAAIA/AAAAAA==")
+ # Determine position of STROKED text -> drawed so translate
+ (glTranslatef -0.9 0.8 0)
+ # Setup scaling -> stroked characters are large, make smaller
+ (glScalef 0.0005 0.0006 0)
+ # Draw some stroked text
+ (stroke_text "Using GTK-server with GtkGlExt!")
+ # Now put back the matrix
+ (glPopMatrix)
+ # Now swap buffers and draw
+ (gdk_gl_drawable_swap_buffers GLDRAWABLE)
+ (gdk_gl_drawable_gl_end GLDRAWABLE) )
+
+(de rotate ()
+ (setq ROTX (+ ROTX 3))
+ (setq ROTY (+ ROTY 2))
+ (when (< 359 ROTX)
+ (setq ROTX 0) )
+ (when (< ROTX 0)
+ (setq ROTX 360) )
+ (when (< 359 ROTY)
+ (setq ROTY 0) )
+ (when (< ROTY 0)
+ (setq ROTY 360) ) )
+
+(de mainLoop @
+ (let E 0 # TODO dispatch events automatically
+ (until (prog
+ (setq E (gtk_server_callback 'wait))
+ (or (= E 'Exit_Prog) (= E W)) )
+ (rotate)
+ (case E
+ (idle (idle))
+ (press (press))
+ (expose (expose)) )
+ ) )
+ (gtk_exit 0) )
+
+# main
+(gtk_init 'NULL 'NULL)
+(gtk_gl_init 'NULL 'NULL)
+(glutInit 'NULL 'NULL)
+# Window
+(setq W (gtk_window_new 0))
+(gtk_window_set_default_size W 640 480)
+(gtk_window_set_title W "This is a teapot demo with picoLisp")
+(gtk_window_set_position W 1)
+# Signal every 100 msecs
+(gtk_server_connect W 'show 'idle)
+(gtk_server_timeout 75 W 'show)
+(gtk_server_connect W 'key-press-event 'press)
+# Drawing area
+(setq DA (gtk_drawing_area_new))
+(gtk_container_add W DA)
+(gtk_widget_set_gl_capability DA
+ (gdk_gl_config_new_by_mode
+ (| GDK_GL_MODE_RGB GDK_GL_MODE_DOUBLE GDK_GL_MODE_DEPTH) )
+ 'NULL 1 GDK_GL_RGBA_TYPE )
+(gtk_server_connect DA 'expose-event 'expose)
+(gtk_widget_show_all W)
+# Initialize variables
+(setq GLUT_BITMAP_HELVETICA_18 (glutBitmapHelvetica18))
+(setq GLUT_STROKE_ROMAN (glutStrokeRoman))
+(setq ROTX 0)
+(setq ROTY 330)
+(setq SIZE 0.5)
+# go
+(mainLoop)
+#gtk_server_exit()
diff --git a/gtk-mandelbrot.l b/gtk-mandelbrot.l
@@ -0,0 +1,169 @@
+# picoLisp + gtk-server example
+# 26feb2009 Tomas Hlavaty
+# $ ~/picolisp/p gtk-mandelbrot.l -bye
+# requires http://logand.com/gtk/gtk.l
+# based on http://www.turtle.dds.nl/newlisp/fractal.lsp
+
+(load "gtk.l")
+
+# Callback to exit program
+(de Exit_Prog ()
+ (gtk_exit 0) )
+
+# Callback to clear canvas
+(de Clear_Canvas ()
+ (gdk_color_parse "#ffffff" COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_rectangle PIX GC 1 0 0 450 265)
+ (gdk_color_parse "#000000" COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_layout PIX GC 120 240 LAYOUT)
+ (gtk_widget_queue_draw IMAGE) )
+
+(setq *Scl 6)
+
+# TODO based on http://logand.com/picoWiki/mandelbrot
+(de mandelbrotPoint (X Y N)
+ (let (X0 X Y0 Y I 0)
+ (while (and (< I N)
+ (<= (+ (*/ X X 1.0) (*/ Y Y 1.0)) 4.0) )
+ (let (Xx (+ X0 (- (*/ X X 1.0) (*/ Y Y 1.0)))
+ Yy (+ Y0 (*/ 2 X Y 1.0)) )
+ (setq X Xx Y Yy) )
+ (inc 'I) )
+ I ) )
+
+(de mandelbrot (X Y Sx Sy W H C)
+ (let (N (- C 1)
+ X1 (- X (/ Sx 2))
+ Y1 (- Y (/ Sy 2)) )
+ (for (J 0 (< J H) (inc J))
+ (for (I 0 (< I W) (inc I))
+ (let (X (+ X1 (*/ I Sx W))
+ Y (+ Y1 (*/ J Sy H)) )
+ (pixel I J (mandelbrotPoint X Y N) C) ) )
+ (row) ) ) )
+
+(de Draw_Fractal ()
+ # Tell drawing is starting
+ (gdk_color_parse "#000000" COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_layout PIX GC 10 240 START)
+ (gtk_widget_queue_draw IMAGE)
+ # draw the fractal
+ (mandelbrot -0.5 0 3.0 2.0 300 265 100)
+ # Wipe wait text
+ (gdk_color_parse "#ffffff" COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_rectangle PIX GC 1 10 240 120 25)
+ # Tell drawing is ready
+ (gdk_color_parse "#000000" COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_layout PIX GC 10 240 READY)
+ (gtk_widget_queue_draw IMAGE) )
+
+(de pix (X Y C)
+ (gdk_color_parse C COLOR)
+ (gdk_gc_set_rgb_fg_color GC COLOR)
+ (gdk_draw_point PIX GC X Y) )
+
+(de bw (N C)
+ (let V (*/ 255 N C)
+ (pack "#"
+ (pad 2 (hex V))
+ (pad 2 (hex V))
+ (pad 2 (hex V)) ) ) )
+
+(de pixel (X Y N C)
+ (let L '("#800000" "#800080" "#8000FF" "#808000"
+ "#808080" "#8080FF" "#80FF00" "#80FF80"
+ "#80FFFF" "#FF0000" "#FF0080" "#FF00FF"
+ "#FF8000" "#FF8080" "#FF80FF" "#FFFF00" )
+ (if (< N (- C 1))
+ (pix X Y (nth L (+ (*/ 15 N (- C 1)) 1) 1))
+# (pix I J (bw (rand 0 (- C 1)) C))
+# (pix I J (bw N C))
+ (pix X Y "#000000") ) ) )
+
+(de row ()
+ (gtk_widget_queue_draw IMAGE)
+ (gtk_main_iteration) )
+
+(de mainLoop @
+ (let E 0 # TODO dispatch events automatically
+ (until (prog
+ (setq E (gtk_server_callback 'wait))
+ (or (= E 'Exit_Prog) (= E WIN)) )
+ (case E
+ (Draw_Fractal (Draw_Fractal))
+ (Clear_Canvas (Clear_Canvas)) )
+ ) )
+ (gtk_exit 0)
+ (wait 200) ) # TODO remove this fix Could not delete FIFO. ERROR
+
+# Window
+(gtk_init 0 0)
+(set 'WIN (gtk_window_new 0))
+(gtk_window_set_title WIN "picoLisp fractal")
+(gtk_widget_set_size_request WIN 300 300)
+(gtk_window_set_position WIN 1)
+(gtk_window_set_resizable WIN 0)
+(gtk_server_connect WIN 'delete-event 'Exit_Prog)
+# Create widget to display image
+(set 'IMAGE (gtk_image_new))
+# Create eventbox to catch mouseclick
+(set 'EBOX (gtk_event_box_new))
+(gtk_container_add EBOX IMAGE)
+# Separator
+(set 'SEP (gtk_hseparator_new))
+# Action button
+(set 'ACTION_BUTTON (gtk_button_new_with_label "Draw!"))
+(gtk_widget_set_size_request ACTION_BUTTON 75 30)
+(gtk_server_connect ACTION_BUTTON 'clicked 'Draw_Fractal)
+# Clear button
+(set 'CLEAR_BUTTON (gtk_button_new_with_label "Clear"))
+(gtk_widget_set_size_request CLEAR_BUTTON 75 30)
+(gtk_server_connect CLEAR_BUTTON 'clicked 'Clear_Canvas)
+# Exit button
+(set 'EXIT_BUTTON (gtk_button_new_with_label "Exit"))
+(gtk_widget_set_size_request EXIT_BUTTON 75 30)
+(gtk_server_connect EXIT_BUTTON 'clicked 'Exit_Prog)
+# Now arrange widgets on window using boxes
+(set 'HBOX (gtk_hbox_new 0 0))
+(gtk_box_pack_start HBOX CLEAR_BUTTON 0 0 1)
+(gtk_box_pack_start HBOX ACTION_BUTTON 0 0 1)
+(gtk_box_pack_end HBOX EXIT_BUTTON 0 0 1)
+(set 'VBOX (gtk_vbox_new 0 0))
+(gtk_box_pack_start VBOX EBOX 0 0 1)
+(gtk_box_pack_start VBOX SEP 0 0 1)
+(gtk_box_pack_end VBOX HBOX 0 0 1)
+(gtk_container_add WIN VBOX)
+# Show all widgets
+(gtk_widget_show_all WIN)
+# Create the pixmap
+(set 'GDKWIN (gtk_widget_get_parent_window IMAGE))
+(set 'PIX (gdk_pixmap_new GDKWIN 300 265 -1))
+(set 'GC (gdk_gc_new PIX))
+(gtk_image_set_from_pixmap IMAGE PIX 0)
+# Allocate memory with some random widget for GdkColor
+(set 'COLOR (gtk_frame_new 'NULL))
+# Now set foreground and backgroundcolors to WHITE
+(gdk_color_parse "#ffffff" COLOR)
+(gdk_gc_set_rgb_bg_color GC COLOR)
+(gdk_gc_set_rgb_fg_color GC COLOR)
+# Clear the complete pixmap with WHITE
+(gdk_draw_rectangle PIX GC 1 0 0 300 265)
+# Set color to BLACK
+(gdk_color_parse "#000000" COLOR)
+(gdk_gc_set_rgb_fg_color GC COLOR)
+# Put some text on the canvas
+(set 'LAYOUT
+(gtk_widget_create_pango_layout IMAGE "Draw a fractal with picoLisp!") )
+(gdk_draw_layout PIX GC 120 240 LAYOUT)
+# Define start and finishing text
+(set 'START (gtk_widget_create_pango_layout IMAGE "Please wait..."))
+(set 'READY (gtk_widget_create_pango_layout IMAGE "Drawing ready."))
+# Update the IMAGE widget with the pixmap
+(gtk_widget_queue_draw IMAGE)
+#(gtk_main)
+(mainLoop)
diff --git a/gtk-server.cfg b/gtk-server.cfg
@@ -0,0 +1,1610 @@
+#
+# This is an EXAMPLE config file containing API calls used by the GTK-server.
+#
+# When developing your own application, feel free to change any of the
+# definitions below to your needs. Per application you can use an individual
+# configfile. Just put the GTK-server configfile in the same directory as your
+# client script, as the GTK-server will look there first.
+#
+# Do you want to add more GTK functions? Please consult the GTK documentation
+# at http://www.gtk.org/api/.
+#
+# The layout of this file is explained in the man-page:
+#
+# man gtk-server.cfg
+#
+#
+# Happy GUIfying!
+# Peter van Eerten
+#
+#---------------------------------------------------------------------------
+#
+# Only when the gtk-server binary does not contain the GTK libs, these
+# settings must be activated. For a static binary this is not necessary.
+#
+# Unix/BSD/Linux
+#
+# GTK1 backend
+# LIB_NAME = libgtk.so, libgdk.so, libglib.so, libglade.so
+#
+# GTK2 backend
+LIB_NAME = libgtk-x11-2.0.so, libgdk-x11-2.0.so, libglib-2.0.so, libgobject-2.0.so
+LIB_NAME = libatk-1.0.so, libpango-1.0.so, libgdk_pixbuf_xlib-2.0.so
+#
+# Glade
+LIB_NAME = libglade-2.0.so
+#
+# GtkGlarea, GtkGlExt
+LIB_NAME = libgtkgl-2.0.so, libgtkglext-x11-1.0.so, libgdkglext-x11-1.0.so
+#
+# Joy, GL and GLUT can be imported also!
+LIB_NAME = libglut.so, libGL.so
+#
+# Mozilla
+LIB_NAME = libgtkembedmoz.so
+#
+# XForms backend
+LIB_NAME = libforms.so, libflimage.so, libformsGL.so
+#
+# Optionally, define a signalnumber to send to the client
+# program when the GTK-server exits. See also 'man 7 signal'.
+# Examples: SIGQUIT (3) SIGKILL (9) SIGUSR1 (10)
+# SIGPIPE (13) SIGTERM (15)
+#
+# EXIT_SIGNAL = 10
+#
+# Directory where to put the logfile if logging is enabled.
+LOG_FILE = /tmp
+#
+# We can include an additional configfile here.
+#
+# INCLUDE = /etc/gtk-extra.cfg
+#
+#---------------------------------------------------------------------------
+#
+# Windows
+#
+# GTK1 backend:
+# LIB_NAME = libgtk-0.dll, libgdk-0.dll, libglib-2.0-0.dll, libglade.dll
+#
+# GTK2 backend:
+# LIB_NAME = libgtk-win32-2.0-0.dll, libgdk-win32-2.0-0.dll, libglib-2.0-0.dll
+# LIB_NAME = libgobject-2.0-0.dll, libatk-1.0-0.dll, libpango-1.0-0.dll, libgdk_pixbuf-2.0-0.dll
+# LIB_NAME = libglade-2.0-0.dll
+#
+# Directory where to put the logfile if logging is enabled.
+# In Windows, also use a slash forward (/) to separate directory's!
+# LOG_FILE = c:
+#
+#---------------------------------------------------------------------------
+#
+## API name, callback signal type, return value, amount of arguments, arg1, arg2...
+#
+# GTK_WINDOW
+#
+FUNCTION_NAME = gtk_window_new, delete-event, WIDGET, 1, LONG
+FUNCTION_NAME = gtk_window_set_title, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_window_get_title, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_window_set_default_size, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_window_set_position, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_window_set_resizable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_window_set_transient_for, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_window_set_modal, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_window_maximize, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_message_dialog_new, response, WIDGET, 5, WIDGET, LONG, LONG, LONG, STRING
+FUNCTION_NAME = gtk_message_dialog_new_with_markup, response, WIDGET, 5, WIDGET, LONG, LONG, LONG, STRING
+FUNCTION_NAME = gtk_window_set_icon_from_file, NONE, BOOL, 3, WIDGET, STRING, NULL
+FUNCTION_NAME = gtk_window_set_keep_above, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_window_set_keep_below, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_about_dialog_set_version, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_window_set_policy, NONE, NONE, 4, WIDGET, LONG, LONG, LONG
+FUNCTION_NAME = gtk_window_fullscreen, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_window_unfullscreen, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_window_set_icon_name, NONE, NONE, 2, WIDGET, STRING
+#
+# Containers
+#
+FUNCTION_NAME = gtk_table_new, NONE, WIDGET, 3, LONG, LONG, BOOL
+FUNCTION_NAME = gtk_table_attach_defaults, NONE, NONE, 6, WIDGET, WIDGET, LONG, LONG, LONG, LONG
+FUNCTION_NAME = gtk_container_add, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_container_remove, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_container_set_border_width, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_hbox_new, NONE, WIDGET, 2, BOOL, LONG
+FUNCTION_NAME = gtk_vbox_new, NONE, WIDGET, 2, BOOL, LONG
+FUNCTION_NAME = gtk_box_pack_start, NONE, NONE, 5, WIDGET, WIDGET, BOOL, BOOL, LONG
+FUNCTION_NAME = gtk_box_pack_end, NONE, NONE, 5, WIDGET, WIDGET, BOOL, BOOL, LONG
+FUNCTION_NAME = gtk_box_pack_start_defaults, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_box_pack_end_defaults, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_box_set_spacing, NONE, NONE, 2, WIDGET, LONG
+#
+# GTK_BUTTON
+#
+FUNCTION_NAME = gtk_button_new, clicked, WIDGET, 0
+FUNCTION_NAME = gtk_button_new_with_label, clicked, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_button_new_from_stock, clicked, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_button_new_with_mnemonic, clicked, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_button_set_use_stock, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_button_set_label, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_button_set_relief, NONE, NONE, 2, WIDGET, LONG
+#
+# GTK_TOGGLE
+#
+FUNCTION_NAME = gtk_toggle_button_new, clicked, WIDGET, 0
+FUNCTION_NAME = gtk_toggle_button_new_with_label, clicked, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_toggle_button_get_active, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_toggle_button_set_active, NONE, NONE, 2, WIDGET, BOOL
+#
+# GTK_CHECK_BUTTON
+#
+FUNCTION_NAME = gtk_check_button_new_with_label, clicked, WIDGET, 1, STRING
+#
+# GTK_ENTRY
+#
+FUNCTION_NAME = gtk_entry_new, activate, WIDGET, 0
+FUNCTION_NAME = gtk_entry_get_text, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_entry_set_text, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_entry_set_visibility, NONE, NONE, 2, WIDGET, BOOL
+#
+# GTK_EDITABLE
+#
+FUNCTION_NAME = gtk_editable_delete_text, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_editable_get_chars, NONE, STRING, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_editable_set_editable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_editable_select_region, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_editable_set_position, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_editable_get_position, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_editable_get_selection_bounds, NONE, BOOL, 3, WIDGET, PTR_LONG, PTR_LONG
+FUNCTION_NAME = gtk_editable_insert_text, NONE, NONE, 4, WIDGET, STRING, LONG, PTR_LONG
+#
+# GTK_TEXT_VIEW related(GTK2.x)
+#
+FUNCTION_NAME = gtk_text_buffer_new, NONE, WIDGET, 1, NULL
+FUNCTION_NAME = gtk_text_buffer_set_text, NONE, NONE, 3, WIDGET, STRING, LONG
+FUNCTION_NAME = gtk_text_buffer_insert_at_cursor, NONE, NONE, 3, WIDGET, STRING, LONG
+FUNCTION_NAME = gtk_text_buffer_get_insert, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_start_iter, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_end_iter, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_bounds, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_selection_bounds, NONE, BOOL, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_iter_at_offset, NONE, NONE, 3, WIDGET, WIDGET, LONG
+FUNCTION_NAME = gtk_text_buffer_get_text, NONE, STRING, 4, WIDGET, WIDGET, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_buffer_insert, NONE, NONE, 4, WIDGET, WIDGET, STRING, LONG
+FUNCTION_NAME = gtk_text_buffer_create_tag, NONE, WIDGET, 5, WIDGET, STRING, STRING, LONG, NULL
+FUNCTION_NAME = gtk_text_buffer_insert_with_tags_by_name, NONE, NONE, 8, WIDGET, WIDGET, STRING, LONG, STRING, STRING, STRING, NULL
+FUNCTION_NAME = gtk_text_buffer_apply_tag_by_name, NONE, NONE, 4, WIDGET, STRING, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_remove_tag_by_name, NONE, NONE, 4, WIDGET, STRING, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_remove_all_tags, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_tag_table, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_text_buffer_select_range, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_selection_bound, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_line_count, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_text_buffer_create_mark, NONE, WIDGET, 4, WIDGET, STRING, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_buffer_get_iter_at_mark, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_get_iter_at_line, NONE, NONE, 3, WIDGET, WIDGET, LONG
+FUNCTION_NAME = gtk_text_buffer_delete, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_delete_mark, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_delete_mark_by_name, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_text_buffer_place_cursor, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_copy_clipboard, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_buffer_cut_clipboard, NONE, NONE, 3, WIDGET, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_buffer_paste_clipboard, NONE, NONE, 4, WIDGET, WIDGET, NULL, BOOL
+FUNCTION_NAME = gtk_scrolled_window_new, NONE, WIDGET, 2, NULL, NULL
+FUNCTION_NAME = gtk_scrolled_window_set_policy, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_scrolled_window_set_shadow_type, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_scrolled_window_add_with_viewport, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_scrolled_window_get_hadjustment, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_scrolled_window_get_vadjustment, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_scrolled_window_set_hadjustment, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_scrolled_window_set_vadjustment, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_scrolled_window_set_placement, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_view_new_with_buffer, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_text_view_set_wrap_mode, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_view_set_editable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_view_set_border_window_size, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_text_view_move_mark_onscreen, NONE, BOOL, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_view_scroll_to_mark, NONE, NONE, 6, WIDGET, WIDGET, DOUBLE, BOOL, DOUBLE, DOUBLE
+FUNCTION_NAME = gtk_text_view_scroll_mark_onscreen, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_view_set_pixels_inside_wrap, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_view_get_pixels_inside_wrap, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_text_view_set_pixels_above_lines, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_view_get_pixels_above_lines, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_text_view_set_cursor_visible, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_view_window_to_buffer_coords, NONE, NONE, 6, WIDGET, LONG, LONG, LONG, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_iter_forward_search, NONE, BOOL, 6, WIDGET, STRING, LONG, WIDGET, WIDGET, NULL
+FUNCTION_NAME = gtk_text_iter_forward_visible_cursor_position, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_text_iter_forward_to_line_end, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_text_iter_set_line, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_iter_set_line_offset, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_iter_set_line_index, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_iter_get_text, NONE, STRING, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_text_iter_get_line, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_text_view_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_text_view_get_buffer, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_text_tag_table_remove, NONE, NONE, 2, WIDGET, WIDGET
+#
+# GTK_TEXT
+#
+FUNCTION_NAME = gtk_text_new, NONE, WIDGET, 2, NULL, NULL
+FUNCTION_NAME = gtk_text_set_editable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_insert, NONE, NONE, 6, WIDGET, NULL, NULL, NULL, STRING, LONG
+FUNCTION_NAME = gtk_text_set_adjustments, NONE, NONE, 3, WIDGET, NULL, WIDGET
+FUNCTION_NAME = gtk_text_get_length, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_text_set_word_wrap, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_text_backward_delete, NONE, BOOL, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_forward_delete, NONE, BOOL, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_text_set_point, NONE, NONE, 2, WIDGET, LONG
+#
+# GDK functions and drawing stuff
+#
+FUNCTION_NAME = gdk_font_load, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = gdk_pixmap_new, NONE, WIDGET, 4, WIDGET, LONG, LONG, LONG
+FUNCTION_NAME = gdk_pixmap_unref, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gdk_pixmap_create_from_xpm, NONE, WIDGET, 4, WIDGET, NULL, NULL, STRING
+FUNCTION_NAME = gdk_pixmap_colormap_create_from_xpm, NONE, WIDGET, 5, NULL, WIDGET, NULL, NULL, STRING
+FUNCTION_NAME = gdk_draw_rectangle, NONE, NONE, 7, WIDGET, WIDGET, BOOL, LONG, LONG, LONG, LONG
+FUNCTION_NAME = gdk_draw_arc, NONE, NONE, 9, WIDGET, WIDGET, BOOL, LONG, LONG, LONG, LONG, LONG, LONG
+FUNCTION_NAME = gdk_draw_line, NONE, NONE, 6, WIDGET, WIDGET, LONG, LONG, LONG, LONG
+FUNCTION_NAME = gdk_draw_point, NONE, NONE, 4, WIDGET, WIDGET, LONG, LONG
+FUNCTION_NAME = gdk_draw_layout, NONE, NONE, 5, WIDGET, WIDGET, LONG, LONG, WIDGET
+FUNCTION_NAME = gdk_draw_layout_with_colors, NONE, NONE, 7, WIDGET, WIDGET, LONG, LONG, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gdk_draw_drawable, NONE, NONE, 9, WIDGET, WIDGET, WIDGET, LONG, LONG, LONG, LONG, LONG, LONG
+FUNCTION_NAME = gdk_gc_new, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gdk_gc_set_rgb_fg_color, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_gc_set_rgb_bg_color, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_gc_set_foreground, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_gc_set_background, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_gc_set_colormap, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_color_alloc, NONE, LONG, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_color_parse, NONE, NONE, 2, STRING, WIDGET
+FUNCTION_NAME = gdk_colormap_get_system, NONE, WIDGET, 0
+FUNCTION_NAME = gdk_colormap_alloc_color, NONE, BOOL, 4, WIDGET, WIDGET, BOOL, BOOL
+FUNCTION_NAME = gdk_get_default_root_window, NONE, WIDGET, 0
+FUNCTION_NAME = gdk_rgb_find_color, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_drawable_set_colormap, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_drawable_get_size, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gdk_keymap_translate_keyboard_state, NONE, BOOL, 8, NULL, LONG, LONG, LONG, WIDGET, NULL, NULL, NULL
+FUNCTION_NAME = gdk_window_process_all_updates, NONE, NONE, 0
+FUNCTION_NAME = gdk_window_freeze_updates, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gdk_window_thaw_updates, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gdk_window_get_geometry, NONE, NONE, 6, WIDGET, NULL, NULL, WIDGET, STRING, NULL
+FUNCTION_NAME = gdk_screen_get_default, NONE, WIDGET, 0
+FUNCTION_NAME = gdk_screen_get_width, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gdk_screen_get_height, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gdk_screen_width, NONE, LONG, 0
+FUNCTION_NAME = gdk_screen_height, NONE, LONG, 0
+FUNCTION_NAME = gdk_flush, NONE, NONE, 0
+FUNCTION_NAME = gdk_init, NONE, NONE, 2, NULL, NULL
+FUNCTION_NAME = gdk_display_get_default, NONE, WIDGET, 0
+FUNCTION_NAME = gdk_display_get_pointer, NONE, NONE, 5, WIDGET, NULL, WIDGET, WIDGET, NULL
+FUNCTION_NAME = gdk_cursor_new, NONE, WIDGET, 1, LONG
+FUNCTION_NAME = gdk_window_set_cursor, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_window_get_pointer, NONE, WIDGET, 4, WIDGET, PTR_LONG, PTR_LONG, PTR_WIDGET
+#
+# GTK functions for drawings
+#
+FUNCTION_NAME = gtk_image_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_image_new_from_pixmap, NONE, WIDGET, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_image_set_from_pixbuf, NONE, WIDGET, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_image_set_from_pixmap, NONE, NONE, 3, WIDGET, WIDGET, NULL
+FUNCTION_NAME = gtk_image_set, NONE, NONE, 3, WIDGET, WIDGET, NULL
+FUNCTION_NAME = gtk_image_set_from_file, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_image_new_from_file, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_image_new_from_stock, NONE, WIDGET, 2, STRING, LONG
+FUNCTION_NAME = gtk_pixmap_new, NONE, WIDGET, 2, WIDGET, NULL
+FUNCTION_NAME = gtk_drawing_area_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_widget_queue_draw, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_get_colormap, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_widget_get_parent_window, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_widget_create_pango_layout, NONE, WIDGET, 2, WIDGET, STRING
+#
+# GTK_SCROLLBARS
+#
+FUNCTION_NAME = gtk_vscrollbar_new, NONE, WIDGET, 1, WIDGET
+#
+# GTK_LABEL
+#
+FUNCTION_NAME = gtk_label_new, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_label_set_text, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_label_get_text, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_label_set_line_wrap, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_label_set_selectable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_label_set_use_markup, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_label_set_justify, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_label_get_width_chars, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_label_get_max_width_chars, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_label_set_markup_with_mnemonic, NONE, NONE, 2, WIDGET, STRING
+#
+# GTK_FRAME
+#
+FUNCTION_NAME = gtk_frame_new, NONE, WIDGET, 1, NULL
+FUNCTION_NAME = gtk_frame_set_label_align, NONE, NONE, 3, WIDGET, FLOAT, FLOAT
+FUNCTION_NAME = gtk_frame_set_label, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_frame_get_label, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_aspect_frame_new, NONE, WIDGET, 5, STRING, FLOAT, FLOAT, FLOAT, BOOL
+FUNCTION_NAME = gtk_aspect_frame_set, NONE, NONE, 5, WIDGET, FLOAT, FLOAT, FLOAT, BOOL
+#
+# GTK_RADIO_BUTTON
+#
+FUNCTION_NAME = gtk_radio_button_new, clicked, WIDGET, 1, NULL
+FUNCTION_NAME = gtk_radio_button_new_with_label, clicked, WIDGET, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_radio_button_new_from_widget, clicked, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_radio_button_new_with_label_from_widget, clicked, WIDGET, 2, WIDGET, STRING
+#
+# GTK_NOTEBOOK
+#
+FUNCTION_NAME = gtk_notebook_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_notebook_set_tab_pos, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_popup_enable, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_notebook_popup_disable, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_notebook_get_n_pages, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_notebook_get_nth_page, NONE, WIDGET, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_append_page, NONE, LONG, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_notebook_insert_page, NONE, LONG, 4, WIDGET, WIDGET, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_remove_page, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_get_current_page, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_notebook_get_menu_label, NONE, WIDGET, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_notebook_set_page, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_set_current_page, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_set_tab_label_text, NONE, NONE, 3, WIDGET, WIDGET, STRING
+FUNCTION_NAME = gtk_notebook_set_scrollable, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_notebook_set_tab_reorderable, NONE, NONE, 3, WIDGET, WIDGET, BOOL
+#
+# GTK_ADJUSTMENT
+#
+FUNCTION_NAME = gtk_adjustment_new, NONE, WIDGET, 6, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE
+FUNCTION_NAME = gtk_adjustment_get_value, NONE, DOUBLE, 1, WIDGET
+FUNCTION_NAME = gtk_adjustment_set_value, NONE, NONE, 2, WIDGET, DOUBLE
+FUNCTION_NAME = gtk_adjustment_clamp_page, NONE, NONE, 3, WIDGET, DOUBLE, DOUBLE
+#
+# GTK_RANGE
+#
+FUNCTION_NAME = gtk_range_get_adjustment, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_range_get_value, NONE, DOUBLE, 1, WIDGET
+FUNCTION_NAME = gtk_range_set_value, NONE, NONE, 2, WIDGET, DOUBLE
+#
+# GTK_SCALE
+#
+FUNCTION_NAME = gtk_scale_set_draw_value, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_scale_set_value_pos, NONE, NONE, 2, WIDGET, LONG
+#
+# GTK_HSCALE
+#
+FUNCTION_NAME = gtk_hscale_new, value-changed, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_hscale_new_with_range, value-changed, WIDGET, 3, DOUBLE, DOUBLE, DOUBLE
+#
+# GTK_VSCALE
+#
+FUNCTION_NAME = gtk_vscale_new_with_range, value-changed, WIDGET, 3, DOUBLE, DOUBLE, DOUBLE
+#
+# GTK_SPIN
+#
+FUNCTION_NAME = gtk_spin_button_new, NONE, WIDGET, 3, WIDGET, DOUBLE, LONG
+FUNCTION_NAME = gtk_spin_button_new_with_range, NONE, WIDGET, 3, DOUBLE, DOUBLE, DOUBLE
+FUNCTION_NAME = gtk_spin_button_get_value_as_int, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_spin_button_get_value, NONE, FLOAT, 1, WIDGET
+FUNCTION_NAME = gtk_spin_button_set_wrap, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_spin_button_set_value, NONE, NONE, 2, WIDGET, DOUBLE
+#
+# GTK_ARROW
+#
+FUNCTION_NAME = gtk_arrow_new, NONE, WIDGET, 2, LONG, LONG
+#
+# File selector
+#
+FUNCTION_NAME = gtk_file_chooser_dialog_new, NONE, WIDGET, 8, STRING, WIDGET, LONG, STRING, LONG, STRING, LONG, NULL
+FUNCTION_NAME = gtk_file_chooser_widget_new, NONE, WIDGET, 1, LONG
+FUNCTION_NAME = gtk_dialog_run, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_file_chooser_get_filename, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_file_chooser_get_uri, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_file_chooser_get_current_folder, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_file_chooser_set_filename, NONE, BOOL, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_file_filter_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_file_filter_add_pattern, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_file_filter_set_name, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_file_chooser_add_filter, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_file_chooser_set_select_multiple, NONE, NONE, 2, WIDGET, BOOL
+#
+# FONT selector
+#
+FUNCTION_NAME = gtk_font_selection_dialog_new, button-press-event, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_font_selection_dialog_get_font_name, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_font_selection_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_font_selection_get_font_name, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = gtk_font_selection_set_font_name, NONE, BOOL, 2, WIDGET, STRING
+#
+# Color selections
+#
+FUNCTION_NAME = gtk_color_selection_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_color_selection_set_has_opacity_control, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_color_selection_set_current_color, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_color_selection_get_current_color, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_color_selection_set_color, NONE, NONE, 2, WIDGET, STRING
+#
+# Menubar
+#
+FUNCTION_NAME = gtk_menu_bar_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_menu_shell_append, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_menu_item_new, activate, WIDGET, 0
+FUNCTION_NAME = gtk_menu_item_new_with_label, activate, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_menu_item_new_with_mnemonic, activate, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_tearoff_menu_item_new, activate, WIDGET, 0
+FUNCTION_NAME = gtk_separator_menu_item_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_menu_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_menu_set_title, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_menu_item_set_right_justified, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_menu_item_set_submenu, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_check_menu_item_new_with_label, activate, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_check_menu_item_new_with_mnemonic, activate, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_check_menu_item_get_active, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_check_menu_item_set_active, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_menu_popup, NONE, NONE, 7, WIDGET, NULL, NULL, NULL, NULL, LONG, LONG
+#
+# GTK_PROGRESS_BAR
+#
+FUNCTION_NAME = gtk_progress_bar_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_progress_bar_set_text, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_progress_bar_set_fraction, NONE, NONE, 2, WIDGET, DOUBLE
+FUNCTION_NAME = gtk_progress_bar_pulse, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_progress_bar_set_pulse_step, NONE, NONE, 2, WIDGET, DOUBLE
+FUNCTION_NAME = gtk_progress_configure, NONE, NONE, 4, WIDGET, DOUBLE, DOUBLE, DOUBLE
+FUNCTION_NAME = gtk_progress_set_value, NONE, NONE, 2, WIDGET, DOUBLE
+#
+# GTK_STATUS_BAR
+#
+FUNCTION_NAME = gtk_statusbar_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_statusbar_get_context_id, NONE, LONG, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_statusbar_push, NONE, LONG, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = gtk_statusbar_pop, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_statusbar_remove, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_statusbar_set_has_resize_grip, NONE, NONE, 2, WIDGET, BOOL
+#
+# EVENT_BOX
+#
+FUNCTION_NAME = gtk_event_box_new, NONE, WIDGET, 0
+#
+# COMBO BOX - only with GTK 2.4.x or higher
+#
+FUNCTION_NAME = gtk_combo_box_new_text, changed, WIDGET, 0
+FUNCTION_NAME = gtk_combo_box_append_text, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_combo_box_insert_text, NONE, NONE, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = gtk_combo_box_prepend_text, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_combo_box_remove_text, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_combo_box_get_active, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gtk_combo_box_set_active, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_combo_box_get_active_text, NONE, STRING, 1, WIDGET
+#
+# SEPARATORS
+#
+FUNCTION_NAME = gtk_vseparator_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_hseparator_new, NONE, WIDGET, 0
+#
+# Clipboards
+#
+FUNCTION_NAME = gtk_editable_copy_clipboard, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_editable_cut_clipboard, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_editable_paste_clipboard, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gdk_atom_intern, NONE, WIDGET, 2, STRING, LONG
+FUNCTION_NAME = gtk_clipboard_get, NONE, WIDGET, 1, LONG
+FUNCTION_NAME = gtk_clipboard_set_text, NONE, NONE, 3, WIDGET, STRING, LONG
+FUNCTION_NAME = gtk_clipboard_wait_for_text, NONE, STRING, 1, WIDGET
+#
+# CLists (GTK 1.x, obsolete in GTK2)
+#
+FUNCTION_NAME = gtk_clist_new, select-row, WIDGET, 1, LONG
+FUNCTION_NAME = gtk_clist_set_column_title, NONE, NONE, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = gtk_clist_column_titles_show, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_clist_append, NONE, LONG, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_clist_set_text, NONE, NONE, 4, WIDGET, LONG, LONG, STRING
+#
+# GTK fixed
+#
+FUNCTION_NAME = gtk_fixed_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_fixed_put, NONE, NONE, 4, WIDGET, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_fixed_move, NONE, NONE, 4, WIDGET, WIDGET, LONG, LONG
+#
+# Lists (GTK2.x) defined for 1 column with strings
+# Redefine with 'gtk_server_redefine' if necessary
+#
+FUNCTION_NAME = gtk_list_store_new, NONE, WIDGET, 2, LONG, LONG
+FUNCTION_NAME = gtk_list_store_append, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_list_store_set, NONE, NONE, 5, WIDGET, WIDGET, LONG, STRING, LONG
+FUNCTION_NAME = gtk_list_store_set_value, NONE, NONE, 4, WIDGET, WIDGET, LONG, STRING
+FUNCTION_NAME = gtk_list_store_clear, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_list_store_remove, NONE, BOOL, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_list_store_move_before, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_list_store_move_after, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_list_store_insert, NONE, NONE, 3, WIDGET, WIDGET, LONG
+FUNCTION_NAME = gtk_list_store_insert_with_values, NONE, NONE, 6, WIDGET, WIDGET, LONG, LONG, STRING, LONG
+FUNCTION_NAME = gtk_cell_renderer_text_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_tree_view_new_with_model, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_tree_view_column_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_tree_view_column_new_with_attributes, clicked, WIDGET, 5, STRING, WIDGET, STRING, LONG, NULL
+FUNCTION_NAME = gtk_tree_view_column_pack_start, NONE, NONE, 3, WIDGET, WIDGET, BOOL
+FUNCTION_NAME = gtk_tree_view_append_column, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_view_set_headers_visible, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_tree_view_set_headers_clickable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_tree_view_get_selection, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_tree_view_get_hadjustment, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_tree_view_get_vadjustment, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_tree_view_column_set_resizable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_tree_view_column_set_clickable, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_tree_view_scroll_to_cell, NONE, NONE, 6, WIDGET, WIDGET, WIDGET, BOOL, FLOAT, FLOAT
+FUNCTION_NAME = gtk_tree_view_set_grid_lines, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_tree_selection_get_selected, NONE, BOOL, 3, WIDGET, NULL, WIDGET
+FUNCTION_NAME = gtk_tree_selection_get_tree_view, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_tree_selection_select_iter, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_selection_select_path, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_selection_path_is_selected, NONE, BOOL, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_selection_set_mode, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_tree_model_get, NONE, NONE, 5, WIDGET, WIDGET, LONG, PTR_STRING, LONG
+FUNCTION_NAME = gtk_tree_model_get_iter, NONE, BOOL, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_model_get_string_from_iter, NONE, STRING, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_model_get_iter_first, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_tree_path_new_from_string, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_tree_path_free, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_tree_path_prev, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_tree_path_next, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_tree_sortable_set_sort_column_id, NONE, NONE, 3, WIDGET, LONG, LONG
+#
+# Expander widget
+#
+FUNCTION_NAME = gtk_expander_new, activate, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_expander_new_with_mnemonic, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = gtk_expander_set_expanded, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_expander_get_expanded, NONE, BOOL, 1, WIDGET
+FUNCTION_NAME = gtk_expander_set_spacing, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = gtk_expander_get_spacing, NONE, LONG, 1, WIDGET
+#
+# Tooltips
+# Note: for these to work, you will need a widget which can process events, so
+# you may need to add an GtkEvent as the parent of some widgets
+FUNCTION_NAME = gtk_tooltips_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_tooltips_enable, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_tooltips_disable, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_tooltips_set_tip, NONE, NONE, 4, WIDGET, WIDGET, STRING, STRING
+FUNCTION_NAME = gtk_tooltips_force_window, NONE, NONE, 1, WIDGET
+#
+# Calendar
+#
+FUNCTION_NAME = gtk_calendar_get_date, NONE, NONE, 4, WIDGET, LONG, LONG, LONG
+#
+# General GTK routines
+#
+FUNCTION_NAME = gtk_init, NONE, NONE, 2, NULL, NULL
+FUNCTION_NAME = gtk_widget_show, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_show_all, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_realize, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_unrealize, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_hide, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_destroy, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_grab_focus, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_widget_set_size_request, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_widget_size_request, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_widget_set_usize, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_widget_modify_base, NONE, NONE, 3, WIDGET, LONG, WIDGET
+FUNCTION_NAME = gtk_widget_modify_text, NONE, NONE, 3, WIDGET, LONG, WIDGET
+FUNCTION_NAME = gtk_widget_modify_bg, NONE, NONE, 3, WIDGET, LONG, WIDGET
+FUNCTION_NAME = gtk_widget_modify_fg, NONE, NONE, 3, WIDGET, LONG, WIDGET
+FUNCTION_NAME = gtk_widget_modify_font, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = gtk_widget_set_sensitive, NONE, NONE, 2, WIDGET, BOOL
+FUNCTION_NAME = gtk_settings_get_default, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_widget_get_parent, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_misc_set_alignment, NONE, NONE, 3, WIDGET, FLOAT, FLOAT
+FUNCTION_NAME = gtk_main, NONE, NONE, 0
+FUNCTION_NAME = gtk_main_iteration, NONE, BOOL, 0
+FUNCTION_NAME = gtk_main_iteration_do, NONE, BOOL, 1, BOOL
+FUNCTION_NAME = gtk_events_pending, NONE, BOOL, 0
+FUNCTION_NAME = gtk_exit, NONE, NONE, 1, LONG
+FUNCTION_NAME = gtk_main_quit, NONE, NONE, 0
+FUNCTION_NAME = gtk_rc_parse, NONE, NONE, 1, STRING
+FUNCTION_NAME = gtk_rc_parse_string, NONE, NONE, 1, STRING
+FUNCTION_NAME = gtk_rc_reparse_all, NONE, BOOL, 0
+FUNCTION_NAME = gtk_rc_reset_styles, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gtk_rc_add_default_file, NONE, NONE, 1, STRING
+FUNCTION_NAME = gtk_widget_set_name, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_check_version, NONE, STRING, 3, LONG, LONG, LONG
+FUNCTION_NAME = gtk_drag_source_set, NONE, NONE, 5, WIDGET, LONG, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_drag_dest_set, NONE, NONE, 5, WIDGET, LONG, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_drag_finish, NONE, NONE, 4, WIDGET, BOOL, BOOL, LONG
+FUNCTION_NAME = gtk_drag_set_icon_stock, NONE, NONE, 4, WIDGET, STRING, LONG, LONG
+FUNCTION_NAME = gtk_get_current_event_time, NONE, LONG, 0
+FUNCTION_NAME = gtk_widget_get_size_request, NONE, NONE, 3, WIDGET, WIDGET, WIDGET
+FUNCTION_NAME = gtk_signal_emit_by_name, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_invisible_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_target_list_new, NONE, WIDGET, 2, NULL, LONG
+FUNCTION_NAME = gtk_target_list_add, NONE, NONE, 4, WIDGET, WIDGET, LONG, LONG
+FUNCTION_NAME = gtk_target_table_new_from_list, NONE, WIDGET, 2, WIDGET, WIDGET
+#
+# Some GDK_PIXBUF functions
+#
+FUNCTION_NAME = gdk_pixbuf_new_from_file, NONE, WIDGET, 2, STRING, NULL
+FUNCTION_NAME = gdk_pixbuf_new_from_file_at_size, NONE, WIDGET, 4, STRING, LONG, LONG, NULL
+FUNCTION_NAME = gdk_pixbuf_new_from_file_at_scale, NONE, WIDGET, 5, STRING, LONG, LONG, BOOL, NULL
+FUNCTION_NAME = gdk_pixbuf_rotate_simple, NONE, WIDGET, 2, WIDGET, LONG
+FUNCTION_NAME = gdk_pixbuf_get_height, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gdk_pixbuf_get_width, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = gdk_pixbuf_scale_simple, NONE, WIDGET, 4, WIDGET, LONG, LONG, LONG
+#
+# GLIB functions
+#
+FUNCTION_NAME = g_object_unref, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = g_object_get, NONE, NONE, 4, WIDGET, STRING, PTR_STRING, NULL
+FUNCTION_NAME = g_object_set, NONE, NONE, 4, WIDGET, STRING, LONG, NULL
+FUNCTION_NAME = g_locale_to_utf8, NONE, STRING, 5, STRING, LONG, NULL, NULL, NULL
+FUNCTION_NAME = g_locale_from_utf8, NONE, STRING, 5, STRING, LONG, NULL, NULL, NULL
+FUNCTION_NAME = g_free, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = g_printf, NONE, NONE, 2, STRING, WIDGET
+FUNCTION_NAME = g_io_channel_unix_new, NONE, WIDGET, 1, LONG
+FUNCTION_NAME = g_io_channel_read_line_string, NONE, LONG, 4, WIDGET, STRING, NULL, NULL
+#
+# Pango
+#
+FUNCTION_NAME = pango_font_description_from_string, NONE, WIDGET, 1, STRING
+FUNCTION_NAME = pango_font_description_free, NONE, NONE, 1, WIDGET
+#
+# The internal functions (not necessary but sometimes handy for language bindings like newLisp)
+#
+FUNCTION_NAME = gtk_server_version, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_ffi, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_callback, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_callback_value, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_connect, NONE, STRING, 3, STRING, STRING, STRING
+FUNCTION_NAME = gtk_server_connect_after, NONE, STRING, 3, STRING, STRING, STRING
+FUNCTION_NAME = gtk_server_disconnect, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_enable_c_string_escaping, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_disable_c_string_escaping, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_set_c_string_escaping, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_mouse, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_define, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_redefine, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_timeout, NONE, STRING, 3, STRING, STRING, STRING
+FUNCTION_NAME = gtk_server_timeout_remove, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_echo, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_cfg, NONE, STRING, 1, STRING
+FUNCTION_NAME = gtk_server_exit, NONE, NONE, 0
+FUNCTION_NAME = gtk_server_pid, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_key, NONE, STRING, 0
+FUNCTION_NAME = gtk_server_macro, NONE, STRING, 2, STRING, STRING
+FUNCTION_NAME = gtk_server_opaque, NONE, STRING, 0
+#
+# Some Glade functions
+#
+FUNCTION_NAME = glade_init, NONE, NONE, 0
+FUNCTION_NAME = glade_xml_new_from_buffer, NONE, WIDGET, 4, STRING, LONG, NULL, NULL
+FUNCTION_NAME = glade_xml_new, NONE, WIDGET, 3, STRING, NULL, NULL
+FUNCTION_NAME = glade_xml_signal_autoconnect, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = glade_xml_get_widget, NONE, WIDGET, 2, WIDGET, STRING
+#
+# GTKMOZEMBED from Mozilla
+#
+FUNCTION_NAME = gtk_moz_embed_new, NONE, WIDGET, 0
+FUNCTION_NAME = gtk_moz_embed_set_comp_path, NONE, NONE, 1, STRING
+FUNCTION_NAME = gtk_moz_embed_set_profile_path, NONE, NONE, 2, STRING, STRING
+FUNCTION_NAME = gtk_moz_embed_load_url, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = gtk_moz_embed_open_stream, NONE, NONE, 3, WIDGET, STRING, STRING
+FUNCTION_NAME = gtk_moz_embed_append_data, NONE, NONE, 3, WIDGET, STRING, LONG
+#
+# GtkGlExt & GLUT & GL
+#
+FUNCTION_NAME = gtk_gl_init, NONE, NONE, 2, NULL, NULL
+FUNCTION_NAME = gtk_widget_set_gl_capability, NONE, BOOL, 5, WIDGET, WIDGET, WIDGET, BOOL, LONG
+FUNCTION_NAME = gdk_gl_config_new_by_mode, NONE, WIDGET, 1, LONG
+FUNCTION_NAME = gtk_widget_get_gl_context, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gtk_widget_get_gl_window, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = gdk_gl_drawable_gl_begin, NONE, BOOL, 2, WIDGET, WIDGET
+FUNCTION_NAME = gdk_gl_drawable_gl_end, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = gdk_gl_drawable_swap_buffers, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = glutInit, NONE, NONE, 2, PTR_LONG, PTR_STRING
+FUNCTION_NAME = glutSolidTeapot, NONE, NONE, 1, DOUBLE
+FUNCTION_NAME = glutSwapBuffers, NONE, NONE, 0
+FUNCTION_NAME = glutBitmapCharacter, NONE, NONE, 2, LONG, LONG
+FUNCTION_NAME = glutBitmap9By15, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmap8By13, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmapTimesRoman10, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmapTimesRoman24, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmapHelvetica10, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmapHelvetica12, NONE, ADDRESS, 0
+FUNCTION_NAME = glutBitmapHelvetica18, NONE, ADDRESS, 0
+FUNCTION_NAME = glutStrokeCharacter, NONE, NONE, 2, LONG, LONG
+FUNCTION_NAME = glutStrokeRoman, NONE, ADDRESS, 0
+FUNCTION_NAME = glutStrokeMonoRoman, NONE, ADDRESS, 0
+FUNCTION_NAME = glClearColor, NONE, NONE, 4, FLOAT, FLOAT, FLOAT, FLOAT
+FUNCTION_NAME = glClear, NONE, NONE, 1, LONG
+FUNCTION_NAME = glEnable, NONE, NONE, 1, LONG
+FUNCTION_NAME = glShadeModel, NONE, NONE, 1, LONG
+FUNCTION_NAME = glLightfv, NONE, NONE, 3, LONG, LONG, BASE64
+FUNCTION_NAME = glMaterialfv, NONE, NONE, 3, LONG, LONG, BASE64
+FUNCTION_NAME = glMatrixMode, NONE, NONE, 1, LONG
+FUNCTION_NAME = glPushMatrix, NONE, NONE, 0
+FUNCTION_NAME = glPopMatrix, NONE, NONE, 0
+FUNCTION_NAME = glFlush, NONE, NONE, 0
+FUNCTION_NAME = glRotatef, NONE, NONE, 4, FLOAT, FLOAT, FLOAT, FLOAT
+FUNCTION_NAME = glLoadIdentity, NONE, NONE, 0
+FUNCTION_NAME = glRasterPos2f, NONE, NONE, 2, FLOAT, FLOAT
+FUNCTION_NAME = glTranslatef, NONE, NONE, 2, FLOAT, FLOAT
+FUNCTION_NAME = glScalef, NONE, NONE, 3, FLOAT, FLOAT, FLOAT
+FUNCTION_NAME = glViewport, NONE, NONE, 4, LONG, LONG, LONG, LONG
+#
+#---------------------------------------------------------------------------
+#
+# XForms calls
+#
+FUNCTION_NAME = fl_bgn_form, NONE, WIDGET, 3, LONG, LONG, LONG
+FUNCTION_NAME = fl_end_form, NONE, NONE, 0
+FUNCTION_NAME = fl_show_form, NONE, NONE, 4, WIDGET, LONG, LONG, STRING
+FUNCTION_NAME = fl_prepare_form_window, NONE, NONE, 4, WIDGET, LONG, LONG, STRING
+FUNCTION_NAME = fl_show_form_window, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_set_form_position, NONE, NONE, 3, WIDGET, LONG, LONG
+#
+FUNCTION_NAME = fl_add_box, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+#
+FUNCTION_NAME = fl_add_button, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_set_button, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = fl_get_button, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = fl_add_checkbutton, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_add_roundbutton, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_add_round3dbutton, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+#
+FUNCTION_NAME = fl_add_slider, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_set_slider_value, NONE, NONE, 2, WIDGET, DOUBLE
+FUNCTION_NAME = fl_set_slider_bounds, NONE, NONE, 3, WIDGET, DOUBLE, DOUBLE
+FUNCTION_NAME = fl_get_slider_value, NONE, FLOAT, 1, WIDGET
+FUNCTION_NAME = fl_add_valslider, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_set_slider_step, NONE, NONE, 2, WIDGET, DOUBLE
+FUNCTION_NAME = fl_set_slider_precision, NONE, NONE, 2, WIDGET, LONG
+#
+FUNCTION_NAME = fl_add_text, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+#
+FUNCTION_NAME = fl_add_input, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_set_input, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = fl_set_input_color, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = fl_get_input, NONE, STRING, 1, WIDGET
+#
+FUNCTION_NAME = fl_add_frame, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_add_labelframe, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+#
+FUNCTION_NAME = fl_add_choice, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_clear_choice, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_addto_choice, NONE, LONG, 2, WIDGET, STRING
+FUNCTION_NAME = fl_delete_choice, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = fl_replace_choice, NONE, NONE, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = fl_get_choice, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = fl_get_choice_text, NONE, STRING, 1, WIDGET
+FUNCTION_NAME = fl_get_choice_item_text, NONE, STRING, 2, WIDGET, LONG
+FUNCTION_NAME = fl_get_choice_maxitems, NONE, LONG, 1, WIDGET
+#
+FUNCTION_NAME = fl_add_browser, NONE, WIDGET, 6, LONG, LONG, LONG, LONG, LONG, STRING
+FUNCTION_NAME = fl_clear_browser, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_add_browser_line, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = fl_addto_browser, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = fl_addto_browser_chars, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = fl_insert_browser_line, NONE, NONE, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = fl_delete_browser_line, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = fl_replace_browser_line, NONE, NONE, 3, WIDGET, LONG, STRING
+FUNCTION_NAME = fl_get_browser_line, NONE, STRING, 2, WIDGET, LONG
+FUNCTION_NAME = fl_get_browser, NONE, LONG, 1, WIDGET
+FUNCTION_NAME = fl_select_browser_line, NONE, NONE, 2, WIDGET, LONG
+#
+FUNCTION_NAME = fl_deactivate_object, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_activate_object, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_set_icm_color, NONE, NONE, 4, LONG, LONG, LONG, LONG
+FUNCTION_NAME = fl_set_focus_object, NONE, NONE, 2, WIDGET, WIDGET
+FUNCTION_NAME = fl_get_focus_object, NONE, WIDGET, 1, WIDGET
+FUNCTION_NAME = fl_bgn_group, NONE, WIDGET, 0
+FUNCTION_NAME = fl_end_group, NONE, WIDGET, 0
+FUNCTION_NAME = fl_addto_group, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_show_message, NONE, NONE, 3, STRING, STRING, STRING
+FUNCTION_NAME = fl_hide_object, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_show_object, NONE, NONE, 1, WIDGET
+FUNCTION_NAME = fl_set_object_color, NONE, NONE, 3, WIDGET, LONG, LONG
+FUNCTION_NAME = fl_set_object_lsize, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = fl_set_object_lcol, NONE, NONE, 2, WIDGET, LONG
+FUNCTION_NAME = fl_set_object_label, NONE, NONE, 2, WIDGET, STRING
+FUNCTION_NAME = fl_set_font_name, NONE, LONG, 2, LONG, STRING
+FUNCTION_NAME = fl_set_idle_delta, NONE, NONE, 1, LONG
+FUNCTION_NAME = fl_finish, NONE, NONE, 0
+#
+#---------------------------------------------------------------------------
+#
+# We can also define macro objects. Check 'man gtk-server.cfg' for details
+# on programming macros. They provide a convenient way to group many
+# GTK functions and can be used from every client language.
+#
+# The macros below are the beginnings of the Highlevel Universal GUI (HUG).
+#
+# Also check the demoscript 'hug.ksh' in the demo-gtk directory.
+#
+# GPL, (c) PvE.
+#---------------------------------------------------------------------------
+#
+# HHHHHHHHH HHHHHHHHHUUUUUUUU UUUUUUUU GGGGGGGGGGGGG
+# H:::::::H H:::::::HU::::::U U::::::U GGG::::::::::::G
+# H:::::::H H:::::::HU::::::U U::::::U GG:::::::::::::::G
+# HH::::::H H::::::HHUU:::::U U:::::UU G:::::GGGGGGGG::::G
+# H:::::H H:::::H U:::::U U:::::U G:::::G GGGGGG
+# H:::::H H:::::H U:::::D D:::::UG:::::G
+# H::::::HHHHH::::::H U:::::D D:::::UG:::::G
+# H:::::::::::::::::H U:::::D D:::::UG:::::G GGGGGGGGGG
+# H:::::::::::::::::H U:::::D D:::::UG:::::G G::::::::G
+# H::::::HHHHH::::::H U:::::D D:::::UG:::::G GGGGG::::G
+# H:::::H H:::::H U:::::D D:::::UG:::::G G::::G
+# H:::::H H:::::H U::::::U U::::::U G:::::G G::::G
+# HH::::::H H::::::HH U:::::::UUU:::::::U G:::::GGGGGGGG::::G
+# H:::::::H H:::::::H UU:::::::::::::UU GG:::::::::::::::G
+# H:::::::H H:::::::H UU:::::::::UU GGG::::::GGG:::G
+# HHHHHHHHH HHHHHHHHH UUUUUUUUU GGGGGG GGGG
+#
+# ...TO BE CONTINUED...
+#---------------------------------------------------------------------------
+#
+# Define a new window:
+# u_window "title" xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_window
+
+# If the variable $window has a value, skip the gtk_init
+$window BNE 2
+
+gtk_init
+
+$window : gtk_window_new 0
+gtk_window_set_title $window $1
+gtk_window_set_position $window 1
+gtk_widget_set_size_request $window $2 $3
+gtk_widget_set_name $window $window
+gtk_widget_show $window
+
+RETURN $window
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define a grid:
+# u_grid parent xres yres
+#
+#---------------------------------------------------------------------------
+
+MACRO u_grid
+
+$grid : gtk_table_new $2 $3 1
+gtk_container_add $1 $grid
+gtk_widget_show $grid
+
+RETURN $grid
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define button:
+# u_button "label" xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_button
+
+$button : gtk_button_new_with_label $1
+gtk_widget_set_size_request $button $2 $3
+gtk_widget_set_name $button $button
+gtk_widget_show $button
+
+RETURN $button
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define checkbutton:
+# u_check "label" xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_check
+
+$check : gtk_check_button_new_with_label $1
+gtk_widget_set_size_request $check $2 $3
+gtk_widget_set_name $check $check
+gtk_widget_show $check
+
+RETURN $check
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define radiobutton:
+# u_radio "label" xsize ysize group
+#
+#---------------------------------------------------------------------------
+
+MACRO u_radio
+
+$radio : gtk_radio_button_new_with_label_from_widget $4 $1
+gtk_widget_set_size_request $radio $2 $3
+gtk_widget_set_name $radio $radio
+gtk_widget_show $radio
+
+RETURN $radio
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define text entry:
+# u_entry xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_entry
+
+$entry : gtk_entry_new
+gtk_widget_set_size_request $entry $1 $2
+gtk_widget_set_name $entry $entry
+gtk_widget_show $entry
+
+RETURN $entry
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define password entry:
+# u_password xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_password
+
+$password : gtk_entry_new
+gtk_widget_set_size_request $password $1 $2
+gtk_entry_set_visibility $password 0
+gtk_widget_set_name $password $password
+gtk_widget_show $password
+
+RETURN $password
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define label:
+# u_label "text" xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_label
+
+$label : gtk_label_new $1
+gtk_widget_set_size_request $label $2 $3
+gtk_widget_set_name $label $label
+gtk_widget_show $label
+
+RETURN $label
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define droplist:
+# u_combo "text1" xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_combo
+
+$combo : gtk_combo_box_new_text
+gtk_combo_box_append_text $combo $1
+gtk_combo_box_set_active $combo 0
+gtk_widget_set_size_request $combo $2 $3
+gtk_widget_set_name $combo $combo
+gtk_widget_show $combo
+
+RETURN $combo
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define horizontal separator:
+# u_hseparator xsize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_hseparator
+
+$hseparator : gtk_hseparator_new
+gtk_widget_set_size_request $hseparator $1 0
+gtk_widget_set_name $hseparator $hseparator
+gtk_widget_show $hseparator
+
+RETURN $hseparator
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define vertical separator:
+# u_vseparator xsize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_vseparator
+
+$vseparator : gtk_vseparator_new
+gtk_widget_set_size_request $vseparator 0 $1
+gtk_widget_set_name $hseparator $vseparator
+gtk_widget_show $vseparator
+
+RETURN $vseparator
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define frame:
+# u_frame text xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_frame
+
+$frame : gtk_frame_new
+gtk_frame_set_label $frame $1
+gtk_widget_set_size_request $frame $2 $3
+gtk_widget_set_name $frame $frame
+gtk_widget_show $frame
+
+RETURN $frame
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define multiline text:
+# u_text xsize ysize
+#
+#---------------------------------------------------------------------------
+
+MACRO u_text
+
+$text : gtk_text_new
+gtk_widget_set_size_request $text $1 $2
+gtk_text_set_word_wrap $text 1
+gtk_text_set_editable $text 1
+gtk_widget_set_name $text $text
+gtk_widget_show $text
+
+RETURN $text
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define a dialog:
+# u_dialog "title" "text" xsize ysize
+# the "exit" event means button was clicked
+#---------------------------------------------------------------------------
+
+MACRO u_dialog
+
+$window : u_window $1 $3 $4
+
+$table : gtk_table_new 10 10 1
+gtk_container_add $window $table
+
+$label : gtk_label_new $2
+gtk_table_attach_defaults $table $label 2 9 2 4
+
+$button : gtk_button_new_with_label "OK"
+gtk_table_attach_defaults $table $button 3 7 7 9
+gtk_server_connect $button clicked exit
+
+gtk_widget_show_all $window
+
+RETURN $window
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define canvas:
+# u_canvas xsize ysize (only 1 canvas per application)
+#
+#---------------------------------------------------------------------------
+
+MACRO u_canvas
+
+$image BNE 12
+
+$image : gtk_image_new
+gtk_widget_show $image
+gtk_server_redefine gdk_pixmap_new NONE WIDGET 4 NULL LONG LONG LONG
+$pix : gdk_pixmap_new 0 $1 $2 24
+$context : gdk_gc_new $pix
+gtk_image_set_from_pixmap $image $pix 0
+# color with a 'k' because the 'c' is used by 'context'
+$kolor : gtk_server_opaque
+gdk_color_parse "#ffffff" $kolor
+gdk_gc_set_rgb_bg_color $context $kolor
+gdk_gc_set_rgb_fg_color $context $kolor
+gdk_draw_rectangle $pix $context 1 0 0 $1 $2
+gtk_widget_queue_draw $image
+
+RETURN $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define circle:
+# u_circle color xcoord ycoord xsize ysize full
+#
+#---------------------------------------------------------------------------
+
+MACRO u_circle
+
+$kolor : gtk_server_macro u_canvas kolor
+
+$kolor BEQ 8
+
+gdk_color_parse $1 $kolor
+$context : gtk_server_macro u_canvas context
+gdk_gc_set_rgb_fg_color $context $kolor
+$pix : gtk_server_macro u_canvas pix
+gdk_draw_arc $pix $context $6 $2 $3 $4 $5 0 23040
+$image : gtk_server_macro u_canvas image
+gtk_widget_queue_draw $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define pixel:
+# u_pixel color xcoord ycoord
+#
+#---------------------------------------------------------------------------
+
+MACRO u_pixel
+
+$kolor : gtk_server_macro u_canvas kolor
+
+$kolor BEQ 8
+
+gdk_color_parse $1 $kolor
+$context : gtk_server_macro u_canvas context
+gdk_gc_set_rgb_fg_color $context $kolor
+$pix : gtk_server_macro u_canvas pix
+gdk_draw_point $pix $context $2 $3
+$image : gtk_server_macro u_canvas image
+gtk_widget_queue_draw $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define line:
+# u_line color xstart ystart xend yend
+#
+#---------------------------------------------------------------------------
+
+MACRO u_line
+
+$kolor : gtk_server_macro u_canvas kolor
+
+$kolor BEQ 8
+
+gdk_color_parse $1 $kolor
+$context : gtk_server_macro u_canvas context
+gdk_gc_set_rgb_fg_color $context $kolor
+$pix : gtk_server_macro u_canvas pix
+gdk_draw_line $pix $context $2 $3 $4 $5
+$image : gtk_server_macro u_canvas image
+gtk_widget_queue_draw $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define rectangle:
+# u_square color xcoord ycoord xsize ysize full
+#
+#---------------------------------------------------------------------------
+
+MACRO u_square
+
+$kolor : gtk_server_macro u_canvas kolor
+
+$kolor BEQ 8
+
+gdk_color_parse $1 $kolor
+$context : gtk_server_macro u_canvas context
+gdk_gc_set_rgb_fg_color $context $kolor
+$pix : gtk_server_macro u_canvas pix
+gdk_draw_rectangle $pix $context $6 $2 $3 $4 $5
+$image : gtk_server_macro u_canvas image
+gtk_widget_queue_draw $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define text on canvas:
+# u_out "text" fgcolor bgcolor xcoord ycoord
+#
+#---------------------------------------------------------------------------
+
+MACRO u_out
+
+$kolor : gtk_server_macro u_canvas kolor
+
+$kolor BEQ 11
+
+gdk_color_parse $2 $kolor
+$context : gtk_server_macro u_canvas context
+$pix : gtk_server_macro u_canvas pix
+$image : gtk_server_macro u_canvas image
+$layout : gtk_widget_create_pango_layout $image $1
+
+$back : gtk_server_opaque
+gdk_color_parse $3 $back
+gdk_draw_layout_with_colors $pix $context $4 $5 $layout $kolor $back
+g_free $back
+
+gtk_widget_queue_draw $image
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD attach:
+# u_attach grid widget x1 x2 y1 y2
+#
+#---------------------------------------------------------------------------
+
+MACRO u_attach
+
+gtk_table_attach_defaults $1 $2 $3 $4 $5 $6
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD bgcolor:
+# u_bgcolor widget <color state> <color state> ...
+#
+# color: for example "#00FF00" or "Red"
+#
+# 0 = GTK_STATE_NORMAL
+# 1 = GTK_STATE_ACTIVE
+# 2 = GTK_STATE_PRELIGHT
+# 3 = GTK_STATE_SELECTED
+# 4 = GTK_STATE_INSENSITIVE
+#
+#---------------------------------------------------------------------------
+
+MACRO u_bgcolor
+
+$opaque : gtk_server_opaque
+gdk_color_parse $2 $opaque
+gtk_widget_modify_bg $1 0 $opaque
+g_free $opaque
+
+$3 BEQ 20
+
+$opaque : gtk_server_opaque
+gdk_color_parse $3 $opaque
+gtk_widget_modify_bg $1 1 $opaque
+g_free $opaque
+
+$4 BEQ 15
+
+$opaque : gtk_server_opaque
+gdk_color_parse $4 $opaque
+gtk_widget_modify_bg $1 2 $opaque
+g_free $opaque
+
+$5 BEQ 10
+
+$opaque : gtk_server_opaque
+gdk_color_parse $5 $opaque
+gtk_widget_modify_bg $1 3 $opaque
+g_free $opaque
+
+$6 BEQ 5
+
+$opaque : gtk_server_opaque
+gdk_color_parse $6 $opaque
+gtk_widget_modify_bg $1 4 $opaque
+g_free $opaque
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD fgcolor:
+# u_fgcolor widget <color state> <color state> ...
+#
+# color: for example "#00FF00"
+#
+# 0 = GTK_STATE_NORMAL
+# 1 = GTK_STATE_ACTIVE
+# 2 = GTK_STATE_PRELIGHT
+# 3 = GTK_STATE_SELECTED
+# 4 = GTK_STATE_INSENSITIVE
+#
+#---------------------------------------------------------------------------
+
+MACRO u_fgcolor
+
+$opaque : gtk_server_opaque
+gdk_color_parse $2 $opaque
+gtk_widget_modify_fg $1 0 $opaque
+g_free $opaque
+
+$3 BEQ 20
+
+$opaque : gtk_server_opaque
+gdk_color_parse $3 $opaque
+gtk_widget_modify_fg $1 1 $opaque
+g_free $opaque
+
+$4 BEQ 15
+
+$opaque : gtk_server_opaque
+gdk_color_parse $4 $opaque
+gtk_widget_modify_fg $1 2 $opaque
+g_free $opaque
+
+$5 BEQ 10
+
+$opaque : gtk_server_opaque
+gdk_color_parse $5 $opaque
+gtk_widget_modify_fg $1 3 $opaque
+g_free $opaque
+
+$6 BEQ 5
+
+$opaque : gtk_server_opaque
+gdk_color_parse $6 $opaque
+gtk_widget_modify_fg $1 4 $opaque
+g_free $opaque
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD textcolor:
+# u_textcolor widget <color state> <color state> ...
+#
+# color: for example "#00FF00"
+#
+# 0 = GTK_STATE_NORMAL
+# 1 = GTK_STATE_ACTIVE
+# 2 = GTK_STATE_PRELIGHT
+# 3 = GTK_STATE_SELECTED
+# 4 = GTK_STATE_INSENSITIVE
+#
+#---------------------------------------------------------------------------
+
+MACRO u_textcolor
+
+$opaque : gtk_server_opaque
+gdk_color_parse $2 $opaque
+gtk_widget_modify_text $1 0 $opaque
+g_free $opaque
+
+$3 BEQ 20
+
+$opaque : gtk_server_opaque
+gdk_color_parse $3 $opaque
+gtk_widget_modify_text $1 1 $opaque
+g_free $opaque
+
+$4 BEQ 15
+
+$opaque : gtk_server_opaque
+gdk_color_parse $4 $opaque
+gtk_widget_modify_text $1 2 $opaque
+g_free $opaque
+
+$5 BEQ 10
+
+$opaque : gtk_server_opaque
+gdk_color_parse $5 $opaque
+gtk_widget_modify_text $1 3 $opaque
+g_free $opaque
+
+$6 BEQ 5
+
+$opaque : gtk_server_opaque
+gdk_color_parse $6 $opaque
+gtk_widget_modify_text $1 4 $opaque
+g_free $opaque
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD basecolor:
+# u_basecolor widget <color state> <color state> ...
+#
+# color: for example "#00FF00"
+#
+# 0 = GTK_STATE_NORMAL
+# 1 = GTK_STATE_ACTIVE
+# 2 = GTK_STATE_PRELIGHT
+# 3 = GTK_STATE_SELECTED
+# 4 = GTK_STATE_INSENSITIVE
+#
+#---------------------------------------------------------------------------
+
+MACRO u_basecolor
+
+$opaque : gtk_server_opaque
+gdk_color_parse $2 $opaque
+gtk_widget_modify_base $1 0 $opaque
+g_free $opaque
+
+$3 BEQ 20
+
+$opaque : gtk_server_opaque
+gdk_color_parse $3 $opaque
+gtk_widget_modify_base $1 1 $opaque
+g_free $opaque
+
+$4 BEQ 15
+
+$opaque : gtk_server_opaque
+gdk_color_parse $4 $opaque
+gtk_widget_modify_base $1 2 $opaque
+g_free $opaque
+
+$5 BEQ 10
+
+$opaque : gtk_server_opaque
+gdk_color_parse $5 $opaque
+gtk_widget_modify_base $1 3 $opaque
+g_free $opaque
+
+$6 BEQ 5
+
+$opaque : gtk_server_opaque
+gdk_color_parse $6 $opaque
+gtk_widget_modify_base $1 4 $opaque
+g_free $opaque
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD font:
+# u_font widget font (for example "Arial 15", "Luxi Mono 12")
+#
+#---------------------------------------------------------------------------
+
+MACRO u_font
+
+$desc : pango_font_description_from_string $2
+gtk_widget_modify_font $1 $desc
+pango_font_description_free $desc
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD disable:
+# u_disable widget
+#
+#---------------------------------------------------------------------------
+
+MACRO u_disable
+
+gtk_widget_set_sensitive $1 0
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD enable:
+# u_enable widget
+#
+#---------------------------------------------------------------------------
+
+MACRO u_enable
+
+gtk_widget_set_sensitive $1 1
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD hide:
+# u_hide widget
+#
+#---------------------------------------------------------------------------
+
+MACRO u_hide
+
+gtk_widget_hide $1
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD show:
+# u_show widget
+#
+#---------------------------------------------------------------------------
+
+MACRO u_show
+
+gtk_widget_show $1
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD focus:
+# u_focus widget
+#
+#---------------------------------------------------------------------------
+
+MACRO u_focus
+
+gtk_widget_grab_focus $1
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD event:
+# u_event <optional async>
+#
+#---------------------------------------------------------------------------
+
+MACRO u_event
+
+$1 BNE 4
+
+$event : gtk_server_callback wait
+BRA 2
+
+$event : gtk_server_callback update
+
+RETURN $event
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Define METHOD end:
+# u_end
+#
+#---------------------------------------------------------------------------
+
+MACRO u_end
+
+gtk_server_exit
+
+ENDMACRO
+
+#---------------------------------------------------------------------------
+#
+# Connect a glade UI:
+# glade-ui "filename"
+#
+#---------------------------------------------------------------------------
+
+MACRO glade-ui
+
+gtk_init
+glade_init
+$xml : glade_xml_new $1 NULL NULL
+glade_xml_signal_autoconnect $xml
+
+RETURN $xml
+
+ENDMACRO
diff --git a/gtk.l b/gtk.l
@@ -0,0 +1,32 @@
+# picoLisp + gtk-server wrapper
+# 26feb2009 Tomas Hlavaty
+# 26feb2009 minor fix by Peter van Eerten
+# available from http://logand.com/gtk/gtk.l
+
+(def '*GtkServer "gtk-server")
+
+(de gtk @
+ (out *GtkFifo
+ (while (args)
+ (prin " ")
+ (let A (next)
+ (if (str? A)
+ (prin "'" A "'")
+ (prin A) ) ) )
+ (prinl)
+ (flush) )
+ (in *GtkFifo
+ (line T) ) )
+
+(de gtkCfg ()
+ (in "gtk-server.cfg"
+ (until (eof)
+ (let L (line)
+ (when (match '("F" "U" "N" @A "=" @B "," @C) L)
+ (let N (intern (pack (clip @B)))
+ (def N (fill '(@ (pass gtk 'N)) 'N)) ) ) ) ) ) )
+
+(gtkCfg)
+(def '*GtkFifo (tmp "gtk.fifo"))
+(call *GtkServer (pack "-fifo=" *GtkFifo) "-detach")
+(push1 '*Bye (list 'kill (format (gtk_server_pid))))