]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/ml_gdk.c
Initial revision
[helm.git] / helm / DEVEL / lablgtk / lablgtk_20000829-0.1.0 / ml_gdk.c
diff --git a/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/ml_gdk.c b/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/ml_gdk.c
new file mode 100644 (file)
index 0000000..9ab1c1e
--- /dev/null
@@ -0,0 +1,522 @@
+/* $Id$ */
+
+#include <string.h>
+#include <gdk/gdk.h>
+#ifdef _WIN32
+#include <gdk/win32/gdkwin32.h>
+#else
+#include <gdk/gdkx.h>
+#endif
+#include <caml/mlvalues.h>
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/callback.h>
+
+#include "wrappers.h"
+#include "ml_glib.h"
+#include "ml_gdk.h"
+#include "gdk_tags.h"
+
+void ml_raise_gdk (const char *errmsg)
+{
+  static value * exn = NULL;
+  if (exn == NULL)
+      exn = caml_named_value ("gdkerror");
+  raise_with_string (*exn, (char*)errmsg);
+}
+
+#include "gdk_tags.c"
+
+Make_OptFlags_val (GdkModifier_val)
+Make_Flags_val (Event_mask_val)
+
+#define Make_test(conv) \
+value ml_test_##conv (value mask, value test) \
+{ return Val_bool (conv(mask) & Int_val(test)); }
+
+Make_test(GdkModifier_val)
+
+/* Colormap */
+
+Make_Val_final_pointer (GdkColormap, gdk_colormap_ref, gdk_colormap_unref, 0)
+ML_0 (gdk_colormap_get_system, Val_GdkColormap)
+
+/* Screen geometry */
+ML_0 (gdk_screen_width, Val_int)
+ML_0 (gdk_screen_height, Val_int)
+
+/* Visual */
+value ml_gdk_visual_get_best (value depth, value type)
+{
+     GdkVisual *vis;
+     if (type == Val_unit)
+          if (depth == Val_unit) vis = gdk_visual_get_best ();
+          else vis = gdk_visual_get_best_with_depth (Int_val(Field(depth,0)));
+     else
+          if (depth == Val_unit)
+               vis = gdk_visual_get_best_with_type
+                    (GdkVisualType_val(Field(type,0)));
+          else vis = gdk_visual_get_best_with_both
+                    (Int_val(Field(depth,0)),GdkVisualType_val(Field(type,0)));
+     if (!vis) ml_raise_gdk("Gdk.Visual.get_best");
+     return Val_GdkVisual(vis);
+}
+
+Make_Extractor (GdkVisual,GdkVisual_val,type,Val_gdkVisualType)
+Make_Extractor (GdkVisual,GdkVisual_val,depth,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,red_mask,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,red_shift,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,red_prec,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,green_mask,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,green_shift,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,green_prec,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,blue_mask,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,blue_shift,Val_int)
+Make_Extractor (GdkVisual,GdkVisual_val,blue_prec,Val_int)
+
+/* Image */
+
+Make_Val_final_pointer (GdkImage, Ignore, gdk_image_destroy, 0)
+GdkImage *GdkImage_val(value val)
+{
+    if (!Field(val,1)) ml_raise_gdk ("attempt to use destroyed GdkImage");
+    return (GdkImage*)(Field(val,1));
+}
+value ml_gdk_image_destroy (value val)
+{
+    if (Field(val,1)) gdk_image_destroy((GdkImage*)(Field(val,1)));
+    Field(val,1) = NULL;
+    return Val_unit;
+}
+ML_4 (gdk_image_new_bitmap, GdkVisual_val, String_val, Int_val, Int_val,
+      Val_GdkImage)
+ML_4 (gdk_image_new, GdkImageType_val, GdkVisual_val, Int_val, Int_val,
+      Val_GdkImage)
+ML_5 (gdk_image_get, GdkWindow_val, Int_val, Int_val, Int_val, Int_val,
+      Val_GdkImage)
+ML_4 (gdk_image_put_pixel, GdkImage_val, Int_val, Int_val, Int_val, Unit)
+ML_3 (gdk_image_get_pixel, GdkImage_val, Int_val, Int_val, Val_int)
+
+/* Color */
+
+ML_2 (gdk_colormap_new, GdkVisual_val, Bool_val, Val_GdkColormap)
+
+value ml_gdk_color_white (value cmap)
+{
+    GdkColor color;
+    gdk_color_white (GdkColormap_val(cmap), &color);
+    return Val_copy(color);
+}
+    
+value ml_gdk_color_black (value cmap)
+{
+    GdkColor color;
+    gdk_color_black (GdkColormap_val(cmap), &color);
+    return Val_copy(color);
+}
+
+value ml_gdk_color_parse (char *spec)
+{
+    GdkColor color;
+    if (!gdk_color_parse (spec, &color))
+       ml_raise_gdk ("color_parse");
+    return Val_copy(color);
+}
+
+ML_2 (gdk_color_alloc, GdkColormap_val, GdkColor_val, Val_bool)
+
+value ml_GdkColor (value red, value green, value blue)
+{
+    GdkColor color;
+    color.red = Int_val(red);
+    color.green = Int_val(green);
+    color.blue = Int_val(blue);
+    color.pixel = 0;
+    return Val_copy(color);
+}
+
+Make_Extractor (GdkColor, GdkColor_val, red, Val_int)
+Make_Extractor (GdkColor, GdkColor_val, green, Val_int)
+Make_Extractor (GdkColor, GdkColor_val, blue, Val_int)
+Make_Extractor (GdkColor, GdkColor_val, pixel, Val_int)
+
+/* Rectangle */
+
+value ml_GdkRectangle (value x, value y, value width, value height)
+{
+    GdkRectangle rectangle;
+    rectangle.x = Int_val(x);
+    rectangle.y = Int_val(y);
+    rectangle.width = Int_val(width);
+    rectangle.height = Int_val(height);
+    return Val_copy(rectangle);
+}
+
+Make_Extractor (GdkRectangle, GdkRectangle_val, x, Val_int)
+Make_Extractor (GdkRectangle, GdkRectangle_val, y, Val_int)
+Make_Extractor (GdkRectangle, GdkRectangle_val, width, Val_int)
+Make_Extractor (GdkRectangle, GdkRectangle_val, height, Val_int)
+
+/* Window */
+
+Make_Val_final_pointer (GdkWindow, gdk_window_ref, gdk_window_unref, 0)
+Make_Extractor (gdk_visual_get, GdkVisual_val, depth, Val_int)
+ML_1 (gdk_window_get_visual, GdkWindow_val, Val_GdkVisual)
+ML_3 (gdk_window_set_back_pixmap, GdkWindow_val, GdkPixmap_val, Int_val, Unit)
+ML_1 (gdk_window_clear, GdkWindow_val, Unit)
+ML_0 (GDK_ROOT_PARENT, Val_GdkWindow)
+ML_1 (gdk_window_get_parent, GdkWindow_val, Val_GdkWindow)
+ML_1 (GDK_WINDOW_XWINDOW, GdkWindow_val, Val_XID)
+value ml_gdk_window_get_position (value window)
+{
+  int x, y;
+  value ret;
+
+  gdk_window_get_position (GdkWindow_val(window), &x, &y);
+  
+  ret = alloc_small (2,0);
+  Field(ret,0) = Val_int(x);
+  Field(ret,1) = Val_int(y);
+  return ret;
+}
+
+value ml_gdk_window_get_size (value window)
+{
+  int x, y;
+  value ret;
+
+  gdk_window_get_size (GdkWindow_val(window), &x, &y);
+  
+  ret = alloc_small (2,0);
+  Field(ret,0) = Val_int(x);
+  Field(ret,1) = Val_int(y);
+  return ret;
+}
+
+/* Cursor */
+
+ML_1 (gdk_cursor_new, GdkCursorType_val, Val_GdkCursor)
+ML_6 (gdk_cursor_new_from_pixmap, GdkPixmap_val, GdkPixmap_val,
+      GdkColor_val, GdkColor_val, Int_val, Int_val, Val_GdkCursor)
+ML_bc6 (ml_gdk_cursor_new_from_pixmap)
+ML_1 (gdk_cursor_destroy, GdkCursor_val, Unit)
+
+/* Pixmap */
+
+Make_Val_final_pointer (GdkPixmap, gdk_pixmap_ref, gdk_pixmap_unref, 0)
+Make_Val_final_pointer (GdkBitmap, gdk_bitmap_ref, gdk_bitmap_unref, 0)
+Make_Val_final_pointer_ext (GdkPixmap, _no_ref, Ignore, gdk_pixmap_unref, 20)
+Make_Val_final_pointer_ext (GdkBitmap, _no_ref, Ignore, gdk_bitmap_unref, 20)
+ML_4 (gdk_pixmap_new, GdkWindow_val, Int_val, Int_val, Int_val,
+      Val_GdkPixmap_no_ref)
+ML_4 (gdk_bitmap_create_from_data, GdkWindow_val,
+      String_val, Int_val, Int_val, Val_GdkBitmap_no_ref)
+ML_7 (gdk_pixmap_create_from_data, GdkWindow_val, String_val,
+      Int_val, Int_val, Int_val, GdkColor_val, GdkColor_val,
+      Val_GdkPixmap_no_ref)
+ML_bc7 (ml_gdk_pixmap_create_from_data)
+
+value ml_gdk_pixmap_colormap_create_from_xpm
+       (value window, value colormap, value transparent, char *filename)
+{
+    CAMLparam0();
+    GdkBitmap *mask;
+    CAMLlocal2(vpixmap, vmask);
+    value ret;
+
+    vpixmap = Val_GdkPixmap_no_ref
+       (gdk_pixmap_colormap_create_from_xpm
+        (GdkWindow_val(window), Option_val(colormap,GdkColormap_val,NULL),
+         &mask, Option_val(transparent,GdkColor_val,NULL), filename));
+    vmask = Val_GdkBitmap_no_ref (mask);
+
+    ret = alloc_small (2,0);
+    Field(ret,0) = vpixmap;
+    Field(ret,1) = vmask;
+    CAMLreturn(ret);
+}
+
+value ml_gdk_pixmap_colormap_create_from_xpm_d
+       (value window, value colormap, value transparent, char **data)
+{
+    CAMLparam0();
+    GdkBitmap *mask;
+    CAMLlocal2(vpixmap, vmask);
+    value ret;
+
+    vpixmap = Val_GdkPixmap_no_ref
+       (gdk_pixmap_colormap_create_from_xpm_d
+        (GdkWindow_val(window), Option_val(colormap,GdkColormap_val,NULL),
+         &mask, Option_val(transparent,GdkColor_val,NULL), data));
+    vmask = Val_GdkBitmap_no_ref (mask);
+
+    ret = alloc_small (2, 0);
+    Field(ret,0) = vpixmap;
+    Field(ret,1) = vmask;
+    CAMLreturn(ret);
+}
+
+/* Font */
+
+Make_Val_final_pointer (GdkFont, gdk_font_ref, gdk_font_unref, 0)
+Make_Val_final_pointer_ext (GdkFont, _no_ref, Ignore, gdk_font_unref, 20)
+ML_1 (gdk_font_load, String_val, Val_GdkFont_no_ref)
+ML_1 (gdk_fontset_load, String_val, Val_GdkFont_no_ref)
+ML_2 (gdk_string_width, GdkFont_val, String_val, Val_int)
+ML_2 (gdk_char_width, GdkFont_val, (gchar)Long_val, Val_int)
+ML_2 (gdk_string_height, GdkFont_val, String_val, Val_int)
+ML_2 (gdk_char_height, GdkFont_val, (gchar)Long_val, Val_int)
+ML_2 (gdk_string_measure, GdkFont_val, String_val, Val_int)
+ML_2 (gdk_char_measure, GdkFont_val, (char)Long_val, Val_int)
+Make_Extractor (GdkFont, GdkFont_val, type, Val_gdkFontType)
+Make_Extractor (GdkFont, GdkFont_val, ascent, Val_int)
+Make_Extractor (GdkFont, GdkFont_val, descent, Val_int)
+
+/* Region */
+
+#define PointArray_val(val) ((GdkPoint*)&Field(val,1))
+#define PointArrayLen_val(val) Int_val(Field(val,0))
+Make_Val_final_pointer (GdkRegion, Ignore, gdk_region_destroy, 0)
+GdkRegion *GdkRegion_val(value val)
+{
+    if (!Field(val,1)) ml_raise_gdk ("attempt to use destroyed GdkRegion");
+    return (GdkRegion*)(Field(val,1));
+}
+value ml_gdk_region_destroy (value val)
+{
+    if (Field(val,1)) gdk_region_destroy((GdkRegion*)(Field(val,1)));
+    Field(val,1) = NULL;
+    return Val_unit;
+}
+ML_0 (gdk_region_new, Val_GdkRegion)
+ML_2 (gdk_region_polygon, Insert(PointArray_val(arg1)) PointArrayLen_val,
+      GdkFillRule_val, Val_GdkRegion)
+ML_2 (gdk_regions_intersect, GdkRegion_val, GdkRegion_val, Val_GdkRegion)
+ML_2 (gdk_regions_union, GdkRegion_val, GdkRegion_val, Val_GdkRegion)
+ML_2 (gdk_regions_subtract, GdkRegion_val, GdkRegion_val, Val_GdkRegion)
+ML_2 (gdk_regions_xor, GdkRegion_val, GdkRegion_val, Val_GdkRegion)
+ML_2 (gdk_region_union_with_rect, GdkRegion_val, GdkRectangle_val,
+      Val_GdkRegion)
+ML_3 (gdk_region_offset, GdkRegion_val, Int_val, Int_val, Unit)
+ML_3 (gdk_region_shrink, GdkRegion_val, Int_val, Int_val, Unit)
+ML_1 (gdk_region_empty, GdkRegion_val, Val_bool)
+ML_2 (gdk_region_equal, GdkRegion_val, GdkRegion_val, Val_bool)
+ML_3 (gdk_region_point_in, GdkRegion_val, Int_val, Int_val, Val_bool)
+ML_2 (gdk_region_rect_in, GdkRegion_val, GdkRectangle_val, Val_gdkOverlapType)
+ML_2 (gdk_region_get_clipbox, GdkRegion_val, GdkRectangle_val, Unit)
+
+
+/* GC */
+
+Make_Val_final_pointer (GdkGC, gdk_gc_ref, gdk_gc_unref, 0)
+Make_Val_final_pointer_ext (GdkGC, _no_ref, Ignore, gdk_gc_unref, 20)
+ML_1 (gdk_gc_new, GdkWindow_val, Val_GdkGC_no_ref)
+ML_2 (gdk_gc_set_foreground, GdkGC_val, GdkColor_val, Unit)
+ML_2 (gdk_gc_set_background, GdkGC_val, GdkColor_val, Unit)
+ML_2 (gdk_gc_set_font, GdkGC_val, GdkFont_val, Unit)
+ML_2 (gdk_gc_set_function, GdkGC_val, GdkFunction_val, Unit)
+ML_2 (gdk_gc_set_fill, GdkGC_val, GdkFill_val, Unit)
+ML_2 (gdk_gc_set_tile, GdkGC_val, GdkPixmap_val, Unit)
+ML_2 (gdk_gc_set_stipple, GdkGC_val, GdkPixmap_val, Unit)
+ML_3 (gdk_gc_set_ts_origin, GdkGC_val, Int_val, Int_val, Unit)
+ML_3 (gdk_gc_set_clip_origin, GdkGC_val, Int_val, Int_val, Unit)
+ML_2 (gdk_gc_set_clip_mask, GdkGC_val, GdkBitmap_val, Unit)
+ML_2 (gdk_gc_set_clip_rectangle, GdkGC_val, GdkRectangle_val, Unit)
+ML_2 (gdk_gc_set_clip_region, GdkGC_val, GdkRegion_val, Unit)
+ML_2 (gdk_gc_set_subwindow, GdkGC_val, GdkSubwindowMode_val, Unit)
+ML_2 (gdk_gc_set_exposures, GdkGC_val, Bool_val, Unit)
+ML_5 (gdk_gc_set_line_attributes, GdkGC_val, Int_val, GdkLineStyle_val,
+      GdkCapStyle_val, GdkJoinStyle_val, Unit)
+ML_2 (gdk_gc_copy, GdkGC_val, GdkGC_val, Unit)
+value ml_gdk_gc_get_values (value gc)
+{
+    CAMLparam0();
+    GdkGCValues values;
+    int i;
+    CAMLlocal2(ret, tmp);
+
+    gdk_gc_get_values (GdkGC_val(gc), &values);
+    ret = alloc (18, 0);
+    tmp = Val_copy(values.foreground); Store_field(ret, 0, tmp);
+    tmp = Val_copy(values.background); Store_field(ret, 1, tmp);
+    if (values.font) {
+        tmp = ml_some(Val_GdkFont(values.font));
+        Store_field(ret, 2, tmp);
+    }
+    Field(ret,3) = Val_gdkFunction(values.function);
+    Field(ret,4) = Val_gdkFill(values.fill);
+    if (values.tile) {
+        tmp = ml_some(Val_GdkPixmap(values.tile));
+        Store_field(ret, 5, tmp);
+    }
+    if (values.tile) {
+        tmp = ml_some(Val_GdkPixmap(values.stipple));
+        Store_field(ret, 6, tmp);
+    }
+    if (values.tile) {
+        tmp = ml_some(Val_GdkPixmap(values.clip_mask));
+        Store_field(ret, 7, tmp);
+    }
+    Field(ret,8) = Val_gdkSubwindowMode(values.subwindow_mode);
+    Field(ret,9) = Val_int(values.ts_x_origin);
+    Field(ret,10) = Val_int(values.ts_y_origin);
+    Field(ret,11) = Val_int(values.clip_x_origin);
+    Field(ret,12) = Val_int(values.clip_y_origin);
+    Field(ret,13) = Val_bool(values.graphics_exposures);
+    Field(ret,14) = Val_int(values.line_width);
+    Field(ret,15) = Val_gdkLineStyle(values.line_style);
+    Field(ret,16) = Val_gdkCapStyle(values.cap_style);
+    Field(ret,17) = Val_gdkJoinStyle(values.join_style);
+    CAMLreturn(ret);
+}
+
+/* Draw */
+
+value ml_point_array_new (value len)
+{
+    value ret = alloc (1 + Wosize_asize(Int_val(len)*sizeof(GdkPoint)),
+                      Abstract_tag);
+    Field(ret,0) = len;
+    return ret;
+}
+value ml_point_array_set (value arr, value pos, value x, value y)
+{
+    GdkPoint *pt = PointArray_val(arr) + Int_val(pos);
+    pt->x = Int_val(x);
+    pt->y = Int_val(y);
+    return Val_unit;
+}
+
+ML_4 (gdk_draw_point, GdkDrawable_val, GdkGC_val, Int_val, Int_val, Unit)
+ML_6 (gdk_draw_line, GdkDrawable_val, GdkGC_val, Int_val, Int_val,
+      Int_val, Int_val, Unit)
+ML_bc6 (ml_gdk_draw_line)
+ML_7 (gdk_draw_rectangle, GdkDrawable_val, GdkGC_val, Bool_val,
+      Int_val, Int_val, Int_val, Int_val, Unit)
+ML_bc7 (ml_gdk_draw_rectangle)
+ML_9 (gdk_draw_arc, GdkDrawable_val, GdkGC_val, Bool_val, Int_val, Int_val,
+      Int_val, Int_val, Int_val, Int_val, Unit)
+ML_bc9 (ml_gdk_draw_arc)
+ML_4 (gdk_draw_polygon, GdkDrawable_val, GdkGC_val, Bool_val,
+      Insert(PointArray_val(arg4)) PointArrayLen_val, Unit)
+ML_6 (gdk_draw_string, GdkDrawable_val, GdkFont_val, GdkGC_val, Int_val, Int_val, String_val, Unit)
+ML_bc6 (ml_gdk_draw_string)
+
+ML_9 (gdk_draw_image, GdkDrawable_val, GdkGC_val, GdkImage_val, Int_val, Int_val, Int_val, Int_val, Int_val, Int_val, Unit)
+ML_bc9 (ml_gdk_draw_image)
+
+/* RGB */
+
+ML_0 (gdk_rgb_init, Unit)
+ML_0 (gdk_rgb_get_visual, Val_GdkVisual)
+ML_0 (gdk_rgb_get_cmap, Val_GdkColormap)
+
+/* Events */
+
+/* Have a major collection every 1000 events */
+Make_Val_final_pointer (GdkEvent, Ignore, gdk_event_free, 1)
+ML_1 (gdk_event_copy, GdkEvent_val, Val_GdkEvent)
+
+value ml_gdk_event_new (value event_type)
+{
+    GdkEvent event;
+    memset (&event, 0, sizeof(GdkEvent));
+    event.type = GdkEventType_val(event_type);
+    event.any.send_event = TRUE;
+    return Val_copy(event);
+}
+
+#define GdkEvent_arg(type) (GdkEvent##type*)GdkEvent_val
+
+Make_Extractor (GdkEventAny, GdkEvent_arg(Any), type, Val_gdkEventType)
+Make_Extractor (GdkEventAny, GdkEvent_arg(Any), window, Val_GdkWindow)
+Make_Extractor (GdkEventAny, GdkEvent_arg(Any), send_event, Val_bool)
+Make_Setter (gdk_event_set, GdkEvent_arg(Any), GdkEventType_val, type)
+Make_Setter (gdk_event_set, GdkEvent_arg(Any), GdkWindow_val, window)
+
+Make_Extractor (GdkEventExpose, GdkEvent_arg(Expose), area, Val_copy)
+Make_Extractor (GdkEventExpose, GdkEvent_arg(Expose), count, Val_int)
+
+Make_Extractor (GdkEventVisibility, GdkEvent_arg(Visibility), state,
+               Val_gdkVisibilityState)
+
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), time, Val_int)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), x, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), y, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), pressure, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), xtilt, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), ytilt, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), state, Val_int)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), is_hint, Val_int)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), source, Val_gdkInputSource)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), deviceid, Val_int)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), x_root, copy_double)
+Make_Extractor (GdkEventMotion, GdkEvent_arg(Motion), y_root, copy_double)
+
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), time, Val_int)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), x, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), y, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), pressure, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), xtilt, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), ytilt, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), state, Val_int)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), button, Val_int)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), source, Val_gdkInputSource)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), deviceid, Val_int)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), x_root, copy_double)
+Make_Extractor (GdkEventButton, GdkEvent_arg(Button), y_root, copy_double)
+
+Make_Setter (gdk_event_button_set, GdkEvent_arg(Button), Int_val, button)
+
+Make_Extractor (GdkEventKey, GdkEvent_arg(Key), time, Val_int)
+Make_Extractor (GdkEventKey, GdkEvent_arg(Key), state, Val_int)
+Make_Extractor (GdkEventKey, GdkEvent_arg(Key), keyval, Val_int)
+Make_Extractor (GdkEventKey, GdkEvent_arg(Key), string, Val_string)
+
+Make_Extractor (GdkEventCrossing, GdkEvent_arg(Crossing), subwindow,
+               Val_GdkWindow)
+Make_Extractor (GdkEventCrossing, GdkEvent_arg(Crossing), detail,
+               Val_gdkNotifyType)
+
+Make_Extractor (GdkEventFocus, GdkEvent_arg(Focus), in, Val_int)
+
+Make_Extractor (GdkEventConfigure, GdkEvent_arg(Configure), x, Val_int)
+Make_Extractor (GdkEventConfigure, GdkEvent_arg(Configure), y, Val_int)
+Make_Extractor (GdkEventConfigure, GdkEvent_arg(Configure), width, Val_int)
+Make_Extractor (GdkEventConfigure, GdkEvent_arg(Configure), height, Val_int)
+
+Make_Extractor (GdkEventProperty, GdkEvent_arg(Property), atom, Val_int)
+Make_Extractor (GdkEventProperty, GdkEvent_arg(Property), time, Val_int)
+Make_Extractor (GdkEventProperty, GdkEvent_arg(Property), state, Val_int)
+
+Make_Extractor (GdkEventSelection, GdkEvent_arg(Selection), selection, Val_int)
+Make_Extractor (GdkEventSelection, GdkEvent_arg(Selection), target, Val_int)
+Make_Extractor (GdkEventSelection, GdkEvent_arg(Selection), property, Val_int)
+Make_Extractor (GdkEventSelection, GdkEvent_arg(Selection), requestor, Val_int)
+Make_Extractor (GdkEventSelection, GdkEvent_arg(Selection), time, Val_int)
+
+Make_Extractor (GdkEventProximity, GdkEvent_arg(Proximity), time, Val_int)
+Make_Extractor (GdkEventProximity, GdkEvent_arg(Proximity), source,
+               Val_gdkInputSource)
+Make_Extractor (GdkEventProximity, GdkEvent_arg(Proximity), deviceid, Val_int)
+
+/* DnD */
+Make_Val_final_pointer (GdkDragContext, gdk_drag_context_ref, gdk_drag_context_unref, 0)
+Make_Flags_val (GdkDragAction_val)
+ML_3 (gdk_drag_status, GdkDragContext_val, Flags_GdkDragAction_val, Int_val, Unit)
+Make_Extractor (GdkDragContext, GdkDragContext_val, suggested_action, Val_gdkDragAction)
+value val_int(gpointer i)
+{
+  return Val_int (GPOINTER_TO_INT(i));
+}
+value ml_GdkDragContext_targets (value c)
+{
+  GList *t;
+
+  t = (GdkDragContext_val(c))->targets;
+  return Val_GList (t, val_int);
+}
+
+/* Misc */
+ML_0 (gdk_flush, Unit)
+ML_0 (gdk_beep, Unit)