--- /dev/null
+(* $Id$ *)
+
+open Gaux
+
+type colormap
+type visual
+type region
+type gc
+type 'a drawable
+type window = [`window] drawable
+type pixmap = [`pixmap] drawable
+type bitmap = [`bitmap] drawable
+type font
+type image
+type atom = int
+type keysym = int
+type 'a event
+type drag_context
+type cursor
+type xid = int32
+
+exception Error of string
+let _ = Callback.register_exception "gdkerror" (Error"")
+
+module Tags = struct
+ type event_type =
+ [ `NOTHING|`DELETE|`DESTROY|`EXPOSE|`MOTION_NOTIFY|`BUTTON_PRESS
+ |`TWO_BUTTON_PRESS|`THREE_BUTTON_PRESS
+ |`BUTTON_RELEASE|`KEY_PRESS
+ |`KEY_RELEASE|`ENTER_NOTIFY|`LEAVE_NOTIFY|`FOCUS_CHANGE
+ |`CONFIGURE|`MAP|`UNMAP|`PROPERTY_NOTIFY|`SELECTION_CLEAR
+ |`SELECTION_REQUEST|`SELECTION_NOTIFY|`PROXIMITY_IN
+ |`PROXIMITY_OUT|`DRAG_ENTER|`DRAG_LEAVE|`DRAG_MOTION|`DRAG_STATUS
+ |`DROP_START|`DROP_FINISHED|`CLIENT_EVENT|`VISIBILITY_NOTIFY
+ |`NO_EXPOSE ]
+
+ type event_mask =
+ [ `EXPOSURE
+ |`POINTER_MOTION|`POINTER_MOTION_HINT
+ |`BUTTON_MOTION|`BUTTON1_MOTION|`BUTTON2_MOTION|`BUTTON3_MOTION
+ |`BUTTON_PRESS|`BUTTON_RELEASE
+ |`KEY_PRESS|`KEY_RELEASE
+ |`ENTER_NOTIFY|`LEAVE_NOTIFY|`FOCUS_CHANGE
+ |`STRUCTURE|`PROPERTY_CHANGE|`VISIBILITY_NOTIFY
+ |`PROXIMITY_IN|`PROXIMITY_OUT|`SUBSTRUCTURE
+ |`ALL_EVENTS ]
+
+ type extension_events =
+ [ `NONE|`ALL|`CURSOR ]
+
+ type visibility_state =
+ [ `UNOBSCURED|`PARTIAL|`FULLY_OBSCURED ]
+
+ type input_source =
+ [ `MOUSE|`PEN|`ERASER|`CURSOR ]
+
+ type notify_type =
+ [ `ANCESTOR|`VIRTUAL|`INFERIOR|`NONLINEAR|`NONLINEAR_VIRTUAL|`UNKNOWN ]
+
+ type crossing_mode =
+ [ `NORMAL|`GRAB|`UNGRAB ]
+
+ type modifier =
+ [ `SHIFT|`LOCK|`CONTROL|`MOD1|`MOD2|`MOD3|`MOD4|`MOD5|`BUTTON1
+ |`BUTTON2|`BUTTON3|`BUTTON4|`BUTTON5 ]
+
+ type drag_action =
+ [ `DEFAULT|`COPY|`MOVE|`LINK|`PRIVATE|`ASK ]
+
+end
+open Tags
+
+module Convert = struct
+ external test_modifier : modifier -> int -> bool
+ = "ml_test_GdkModifier_val"
+ let modifier i =
+ List.filter [`SHIFT;`LOCK;`CONTROL;`MOD1;`MOD2;`MOD3;`MOD4;`MOD5;
+ `BUTTON1;`BUTTON2;`BUTTON3;`BUTTON4;`BUTTON5]
+ ~f:(fun m -> test_modifier m i)
+end
+
+module Screen = struct
+ external width : unit -> int = "ml_gdk_screen_width"
+ external height : unit -> int = "ml_gdk_screen_height"
+end
+
+module Visual = struct
+ type visual_type =
+ [ `STATIC_GRAY|`GRAYSCALE|`STATIC_COLOR
+ |`PSEUDO_COLOR|`TRUE_COLOR|`DIRECT_COLOR ]
+
+ external get_best : ?depth:int -> ?kind:visual_type -> unit -> visual
+ = "ml_gdk_visual_get_best"
+ external get_type : visual -> visual_type = "ml_GdkVisual_type"
+ external depth : visual -> int = "ml_GdkVisual_depth"
+ external red_mask : visual -> int = "ml_GdkVisual_red_mask"
+ external red_shift : visual -> int = "ml_GdkVisual_red_shift"
+ external red_prec : visual -> int = "ml_GdkVisual_red_prec"
+ external green_mask : visual -> int = "ml_GdkVisual_green_mask"
+ external green_shift : visual -> int = "ml_GdkVisual_green_shift"
+ external green_prec : visual -> int = "ml_GdkVisual_green_prec"
+ external blue_mask : visual -> int = "ml_GdkVisual_blue_mask"
+ external blue_shift : visual -> int = "ml_GdkVisual_blue_shift"
+ external blue_prec : visual -> int = "ml_GdkVisual_blue_prec"
+end
+
+module Image = struct
+ type image_type =
+ [ `NORMAL|`SHARED|`FASTEST ]
+
+ external create_bitmap : visual: visual -> data: string ->
+ width: int -> height: int -> image
+ = "ml_gdk_image_new_bitmap"
+ external create : kind: image_type -> visual: visual ->
+ width: int -> height: int -> image
+ = "ml_gdk_image_new"
+ external get :
+ 'a drawable -> x: int -> y: int -> width: int -> height: int -> image
+ = "ml_gdk_image_get"
+ external put_pixel : image -> x: int -> y: int -> pixel: int -> unit
+ = "ml_gdk_image_put_pixel"
+ external get_pixel : image -> x: int -> y: int -> int
+ = "ml_gdk_image_get_pixel"
+ external destroy : image -> unit
+ = "ml_gdk_image_destroy"
+end
+
+module Color = struct
+ type t
+
+ external color_white : colormap -> t = "ml_gdk_color_white"
+ external color_black : colormap -> t = "ml_gdk_color_black"
+ external color_parse : string -> t = "ml_gdk_color_parse"
+ external color_alloc : colormap -> t -> bool = "ml_gdk_color_alloc"
+ external color_create : red:int -> green:int -> blue:int -> t
+ = "ml_GdkColor"
+
+ external get_system_colormap : unit -> colormap
+ = "ml_gdk_colormap_get_system"
+ external colormap_new : visual -> privat:bool -> colormap
+ = "ml_gdk_colormap_new"
+ let get_colormap ?(privat=false) vis = colormap_new vis ~privat
+
+ type spec = [ `BLACK | `NAME of string | `RGB of int * int * int | `WHITE]
+ let color_alloc ~colormap color =
+ if not (color_alloc colormap color) then raise (Error"Color.alloc");
+ color
+ let alloc ~colormap color =
+ match color with
+ `WHITE -> color_white colormap
+ | `BLACK -> color_black colormap
+ | `NAME s -> color_alloc ~colormap (color_parse s)
+ | `RGB (red,green,blue) ->
+ color_alloc ~colormap (color_create ~red ~green ~blue)
+
+ external red : t -> int = "ml_GdkColor_red"
+ external blue : t -> int = "ml_GdkColor_blue"
+ external green : t -> int = "ml_GdkColor_green"
+ external pixel : t -> int = "ml_GdkColor_pixel"
+end
+
+module Rectangle = struct
+ type t
+ external create : x:int -> y:int -> width:int -> height:int -> t
+ = "ml_GdkRectangle"
+ external x : t -> int = "ml_GdkRectangle_x"
+ external y : t -> int = "ml_GdkRectangle_y"
+ external width : t -> int = "ml_GdkRectangle_width"
+ external height : t -> int = "ml_GdkRectangle_height"
+end
+
+module Window = struct
+ type background_pixmap = [ `NONE | `PARENT_RELATIVE | `PIXMAP of pixmap]
+ external visual_depth : visual -> int = "ml_gdk_visual_get_depth"
+ external get_visual : window -> visual = "ml_gdk_window_get_visual"
+ external get_parent : window -> window = "ml_gdk_window_get_parent"
+ external get_size : window -> int * int = "ml_gdk_window_get_size"
+ external get_position : window -> int * int =
+ "ml_gdk_window_get_position"
+ external root_parent : unit -> window = "ml_GDK_ROOT_PARENT"
+ external set_back_pixmap : window -> pixmap -> int -> unit =
+ "ml_gdk_window_set_back_pixmap"
+ external clear : window -> unit = "ml_gdk_window_clear"
+ external get_xwindow : window -> xid = "ml_GDK_WINDOW_XWINDOW"
+
+ let set_back_pixmap w pix =
+ let null_pixmap = (Obj.magic Gpointer.boxed_null : pixmap) in
+ match pix with
+ `NONE -> set_back_pixmap w null_pixmap 0
+ | `PARENT_RELATIVE -> set_back_pixmap w null_pixmap 1
+ | `PIXMAP(pixmap) -> set_back_pixmap w pixmap 0
+ (* anything OK, Maybe... *)
+end
+
+module PointArray = struct
+ type t = { len: int}
+ external create : len:int -> t = "ml_point_array_new"
+ external set : t -> pos:int -> x:int -> y:int -> unit = "ml_point_array_set"
+ let set arr ~pos =
+ if pos < 0 || pos >= arr.len then invalid_arg "PointArray.set";
+ set arr ~pos
+end
+
+module Region = struct
+ type gdkFillRule = [ `EVEN_ODD_RULE|`WINDING_RULE ]
+ type gdkOverlapType = [ `IN|`OUT|`PART ]
+ external create : unit -> region = "ml_gdk_region_new"
+ external destroy : region -> unit = "ml_gdk_region_destroy"
+ external polygon : PointArray.t -> gdkFillRule -> region
+ = "ml_gdk_region_polygon"
+ let polygon l =
+ let len = List.length l in
+ let arr = PointArray.create ~len in
+ List.fold_left l ~init:0
+ ~f:(fun pos (x,y) -> PointArray.set arr ~pos ~x ~y; pos+1);
+ polygon arr
+ external intersect : region -> region -> region
+ = "ml_gdk_regions_intersect"
+ external union : region -> region -> region
+ = "ml_gdk_regions_union"
+ external subtract : region -> region -> region
+ = "ml_gdk_regions_subtract"
+ external xor : region -> region -> region
+ = "ml_gdk_regions_xor"
+ external union_with_rect : region -> Rectangle.t -> region
+ = "ml_gdk_region_union_with_rect"
+ external offset : region -> x:int -> y:int -> unit = "ml_gdk_region_offset"
+ external shrink : region -> x:int -> y:int -> unit = "ml_gdk_region_shrink"
+ external empty : region -> bool = "ml_gdk_region_empty"
+ external equal : region -> region -> bool = "ml_gdk_region_equal"
+ external point_in : region -> x:int -> y:int -> bool
+ = "ml_gdk_region_point_in"
+ external rect_in : region -> Rectangle.t -> gdkOverlapType
+ = "ml_gdk_region_rect_in"
+ external get_clipbox : region -> Rectangle.t -> unit
+ = "ml_gdk_region_get_clipbox"
+end
+
+
+module GC = struct
+ type gdkFunction = [ `COPY|`INVERT|`XOR ]
+ type gdkFill = [ `SOLID|`TILED|`STIPPLED|`OPAQUE_STIPPLED ]
+ type gdkSubwindowMode = [ `CLIP_BY_CHILDREN|`INCLUDE_INFERIORS ]
+ type gdkLineStyle = [ `SOLID|`ON_OFF_DASH|`DOUBLE_DASH ]
+ type gdkCapStyle = [ `NOT_LAST|`BUTT|`ROUND|`PROJECTING ]
+ type gdkJoinStyle = [ `MITER|`ROUND|`BEVEL ]
+ external create : 'a drawable -> gc = "ml_gdk_gc_new"
+ external set_foreground : gc -> Color.t -> unit = "ml_gdk_gc_set_foreground"
+ external set_background : gc -> Color.t -> unit = "ml_gdk_gc_set_background"
+ external set_font : gc -> font -> unit = "ml_gdk_gc_set_font"
+ external set_function : gc -> gdkFunction -> unit = "ml_gdk_gc_set_function"
+ external set_fill : gc -> gdkFill -> unit = "ml_gdk_gc_set_fill"
+ external set_tile : gc -> pixmap -> unit = "ml_gdk_gc_set_tile"
+ external set_stipple : gc -> pixmap -> unit = "ml_gdk_gc_set_stipple"
+ external set_ts_origin : gc -> x:int -> y:int -> unit
+ = "ml_gdk_gc_set_ts_origin"
+ external set_clip_origin : gc -> x:int -> y:int -> unit
+ = "ml_gdk_gc_set_clip_origin"
+ external set_clip_mask : gc -> bitmap -> unit = "ml_gdk_gc_set_clip_mask"
+ external set_clip_rectangle : gc -> Rectangle.t -> unit
+ = "ml_gdk_gc_set_clip_rectangle"
+ external set_clip_region : gc -> region -> unit = "ml_gdk_gc_set_clip_region"
+ external set_subwindow : gc -> gdkSubwindowMode -> unit
+ = "ml_gdk_gc_set_subwindow"
+ external set_exposures : gc -> bool -> unit = "ml_gdk_gc_set_exposures"
+ external set_line_attributes :
+ gc -> width:int -> style:gdkLineStyle -> cap:gdkCapStyle ->
+ join:gdkJoinStyle -> unit
+ = "ml_gdk_gc_set_line_attributes"
+ external copy : dst:gc -> gc -> unit = "ml_gdk_gc_copy"
+ type values = {
+ foreground : Color.t;
+ background : Color.t;
+ font : font option;
+ fonction : gdkFunction;
+ fill : gdkFill;
+ tile : pixmap option;
+ stipple : pixmap option;
+ clip_mask : bitmap option;
+ subwindow_mode : gdkSubwindowMode;
+ ts_x_origin : int;
+ ts_y_origin : int;
+ clip_x_origin : int;
+ clip_y_origin : int;
+ graphics_exposures : bool;
+ line_width : int;
+ line_style : gdkLineStyle;
+ cap_style : gdkCapStyle;
+ join_style : gdkJoinStyle;
+ }
+ external get_values : gc -> values = "ml_gdk_gc_get_values"
+end
+
+module Pixmap = struct
+ external create : window -> width:int -> height:int -> depth:int -> pixmap
+ = "ml_gdk_pixmap_new"
+ external create_from_data :
+ window -> string -> width:int -> height:int -> depth:int ->
+ fg:Color.t -> bg:Color.t -> pixmap
+ = "ml_gdk_pixmap_create_from_data_bc" "ml_gk_pixmap_create_from_data"
+ external create_from_xpm :
+ window -> ?colormap:colormap -> ?transparent:Color.t ->
+ file:string -> pixmap * bitmap
+ = "ml_gdk_pixmap_colormap_create_from_xpm"
+ external create_from_xpm_d :
+ window -> ?colormap:colormap -> ?transparent:Color.t ->
+ data:string array -> pixmap * bitmap
+ = "ml_gdk_pixmap_colormap_create_from_xpm_d"
+end
+
+module Bitmap = struct
+ let create : window -> width:int -> height:int -> bitmap =
+ Obj.magic (Pixmap.create ~depth:1)
+ external create_from_data :
+ window -> string -> width:int -> height:int -> bitmap
+ = "ml_gdk_bitmap_create_from_data"
+end
+
+module Font = struct
+ external load : string -> font = "ml_gdk_font_load"
+ external load_fontset : string -> font = "ml_gdk_fontset_load"
+ external string_width : font -> string -> int = "ml_gdk_string_width"
+ external char_width : font -> char -> int = "ml_gdk_char_width"
+ external string_height : font -> string -> int = "ml_gdk_string_height"
+ external char_height : font -> char -> int = "ml_gdk_char_height"
+ external string_measure : font -> string -> int = "ml_gdk_string_measure"
+ external char_measure : font -> char -> int = "ml_gdk_char_measure"
+ external get_type : font -> [`FONT | `FONTSET] = "ml_GdkFont_type"
+ external ascent : font -> int = "ml_GdkFont_ascent"
+ external descent : font -> int = "ml_GdkFont_descent"
+end
+
+module Draw = struct
+ external point : 'a drawable -> gc -> x:int -> y:int -> unit
+ = "ml_gdk_draw_point"
+ external line : 'a drawable -> gc -> x:int -> y:int -> x:int -> y:int -> unit
+ = "ml_gdk_draw_line_bc" "ml_gdk_draw_line"
+ external rectangle :
+ 'a drawable -> gc ->
+ filled:bool -> x:int -> y:int -> width:int -> height:int -> unit
+ = "ml_gdk_draw_rectangle_bc" "ml_gdk_draw_rectangle"
+ let rectangle w gc ~x ~y ~width ~height ?(filled=false) () =
+ rectangle w gc ~x ~y ~width ~height ~filled
+ external arc :
+ 'a drawable -> gc -> filled:bool -> x:int -> y:int ->
+ width:int -> height:int -> start:int -> angle:int -> unit
+ = "ml_gdk_draw_arc_bc" "ml_gdk_draw_arc"
+ let arc w gc ~x ~y ~width ~height ?(filled=false) ?(start=0.)
+ ?(angle=360.) () =
+ arc w gc ~x ~y ~width ~height ~filled
+ ~start:(truncate(start *. 64.))
+ ~angle:(truncate(angle *. 64.))
+ external polygon : 'a drawable -> gc -> filled:bool -> PointArray.t -> unit
+ = "ml_gdk_draw_polygon"
+ let polygon w gc ?(filled=false) l =
+ let len = List.length l in
+ let arr = PointArray.create ~len in
+ List.fold_left l ~init:0
+ ~f:(fun pos (x,y) -> PointArray.set arr ~pos ~x ~y; pos+1);
+ polygon w gc ~filled arr
+ external string : 'a drawable -> font: font -> gc -> x: int -> y: int ->
+ string: string -> unit
+ = "ml_gdk_draw_string_bc" "ml_gdk_draw_string"
+ external image : 'a drawable -> gc -> image: image ->
+ xsrc: int -> ysrc: int -> xdest: int -> ydest: int ->
+ width: int -> height: int -> unit
+ = "ml_gdk_draw_image_bc" "ml_gdk_draw_image"
+end
+
+module Rgb = struct
+ external init : unit -> unit = "ml_gdk_rgb_init"
+ external get_visual : unit -> visual = "ml_gdk_rgb_get_visual"
+ external get_cmap : unit -> colormap = "ml_gdk_rgb_get_cmap"
+end
+
+module DnD = struct
+ external drag_status : drag_context -> drag_action list -> time:int -> unit
+ = "ml_gdk_drag_status"
+ external drag_context_suggested_action : drag_context -> drag_action
+ = "ml_GdkDragContext_suggested_action"
+ external drag_context_targets : drag_context -> atom list
+ = "ml_GdkDragContext_targets"
+end
+
+module Truecolor = struct
+ (* Truecolor quick color query *)
+
+ type visual_shift_prec = {
+ red_shift : int;
+ red_prec : int;
+ green_shift : int;
+ green_prec : int;
+ blue_shift : int;
+ blue_prec : int
+ }
+
+ let shift_prec visual = {
+ red_shift = Visual.red_shift visual;
+ red_prec = Visual.red_prec visual;
+ green_shift = Visual.green_shift visual;
+ green_prec = Visual.green_prec visual;
+ blue_shift = Visual.blue_shift visual;
+ blue_prec = Visual.blue_prec visual;
+ }
+
+ let color_creator visual =
+ match Visual.get_type visual with
+ `TRUE_COLOR | `DIRECT_COLOR ->
+ let shift_prec = shift_prec visual in
+ Format.eprintf "red : %d %d, "
+ shift_prec.red_shift shift_prec.red_prec;
+ Format.eprintf "green : %d %d, "
+ shift_prec.green_shift shift_prec.green_prec;
+ Format.eprintf "blue : %d %d"
+ shift_prec.blue_shift shift_prec.blue_prec;
+ Format.pp_print_newline Format.err_formatter ();
+ let red_lsr = 16 - shift_prec.red_prec
+ and green_lsr = 16 - shift_prec.green_prec
+ and blue_lsr = 16 - shift_prec.blue_prec in
+ fun ~red: red ~green: green ~blue: blue ->
+ (((red lsr red_lsr) lsl shift_prec.red_shift) lor
+ ((green lsr green_lsr) lsl shift_prec.green_shift) lor
+ ((blue lsr blue_lsr) lsl shift_prec.blue_shift))
+ | _ -> raise (Invalid_argument "Gdk.Truecolor.color_creator")
+
+ let color_parser visual =
+ match Visual.get_type visual with
+ `TRUE_COLOR | `DIRECT_COLOR ->
+ let shift_prec = shift_prec visual in
+ let red_lsr = 16 - shift_prec.red_prec
+ and green_lsr = 16 - shift_prec.green_prec
+ and blue_lsr = 16 - shift_prec.blue_prec in
+ let mask = 1 lsl 16 - 1 in
+ fun pixel ->
+ ((pixel lsr shift_prec.red_shift) lsl red_lsr) land mask,
+ ((pixel lsr shift_prec.green_shift) lsl green_lsr) land mask,
+ ((pixel lsr shift_prec.blue_shift) lsl blue_lsr) land mask
+ | _ -> raise (Invalid_argument "Gdk.Truecolor.color_parser")
+end
+
+module X = struct
+ (* X related functions *)
+ external flush : unit -> unit
+ = "ml_gdk_flush"
+ external beep : unit -> unit
+ = "ml_gdk_beep"
+end
+
+module Cursor = struct
+ type cursor_type = [
+ | `X_CURSOR
+ | `ARROW
+ | `BASED_ARROW_DOWN
+ | `BASED_ARROW_UP
+ | `BOAT
+ | `BOGOSITY
+ | `BOTTOM_LEFT_CORNER
+ | `BOTTOM_RIGHT_CORNER
+ | `BOTTOM_SIDE
+ | `BOTTOM_TEE
+ | `BOX_SPIRAL
+ | `CENTER_PTR
+ | `CIRCLE
+ | `CLOCK
+ | `COFFEE_MUG
+ | `CROSS
+ | `CROSS_REVERSE
+ | `CROSSHAIR
+ | `DIAMOND_CROSS
+ | `DOT
+ | `DOTBOX
+ | `DOUBLE_ARROW
+ | `DRAFT_LARGE
+ | `DRAFT_SMALL
+ | `DRAPED_BOX
+ | `EXCHANGE
+ | `FLEUR
+ | `GOBBLER
+ | `GUMBY
+ | `HAND1
+ | `HAND2
+ | `HEART
+ | `ICON
+ | `IRON_CROSS
+ | `LEFT_PTR
+ | `LEFT_SIDE
+ | `LEFT_TEE
+ | `LEFTBUTTON
+ | `LL_ANGLE
+ | `LR_ANGLE
+ | `MAN
+ | `MIDDLEBUTTON
+ | `MOUSE
+ | `PENCIL
+ | `PIRATE
+ | `PLUS
+ | `QUESTION_ARROW
+ | `RIGHT_PTR
+ | `RIGHT_SIDE
+ | `RIGHT_TEE
+ | `RIGHTBUTTON
+ | `RTL_LOGO
+ | `SAILBOAT
+ | `SB_DOWN_ARROW
+ | `SB_H_DOUBLE_ARROW
+ | `SB_LEFT_ARROW
+ | `SB_RIGHT_ARROW
+ | `SB_UP_ARROW
+ | `SB_V_DOUBLE_ARROW
+ | `SHUTTLE
+ | `SIZING
+ | `SPIDER
+ | `SPRAYCAN
+ | `STAR
+ | `TARGET
+ | `TCROSS
+ | `TOP_LEFT_ARROW
+ | `TOP_LEFT_CORNER
+ | `TOP_RIGHT_CORNER
+ | `TOP_SIDE
+ | `TOP_TEE
+ | `TREK
+ | `UL_ANGLE
+ | `UMBRELLA
+ | `UR_ANGLE
+ | `WATCH
+ | `XTERM
+ ]
+ external create : cursor_type -> cursor = "ml_gdk_cursor_new"
+ external create_from_pixmap :
+ pixmap -> mask:bitmap ->
+ fg:Color.t -> bg:Color.t -> x:int -> y:int -> cursor
+ = "ml_gdk_cursor_new_from_pixmap_bc" "ml_gdk_cursor_new_from_pixmap"
+ external destroy : cursor -> unit = "ml_gdk_cursor_destroy"
+end