(* $Id$ *) open Gaux open Gdk type color = [ | `COLOR of Color.t | `WHITE | `BLACK | `NAME of string | `RGB of int * int * int ] let default_colormap = GtkBase.Widget.get_default_colormap let color ?(colormap = default_colormap ()) (c : color) = match c with | `COLOR col -> col | #Gdk.Color.spec as def -> Color.alloc ~colormap def type optcolor = [ | `COLOR of Color.t | `WHITE | `BLACK | `NAME of string | `RGB of int * int * int | `DEFAULT ] let optcolor ?colormap (c : optcolor) = match c with | `DEFAULT -> None | #color as c -> Some (color ?colormap c) class ['a] drawable ?(colormap = default_colormap ()) w = object (self) val colormap = colormap val gc = GC.create w val w : 'a Gdk.drawable = w method color = color ~colormap method set_foreground col = GC.set_foreground gc (self#color col) method set_background col = GC.set_background gc (self#color col) method gc_values = GC.get_values gc method set_clip_region region = GC.set_clip_region gc region method set_line_attributes ?width ?style ?cap ?join () = let v = GC.get_values gc in GC.set_line_attributes gc ~width:(default v.GC.line_width ~opt:width) ~style:(default v.GC.line_style ~opt:style) ~cap:(default v.GC.cap_style ~opt:cap) ~join:(default v.GC.join_style ~opt:join) method point = Draw.point w gc method line = Draw.line w gc method rectangle = Draw.rectangle w gc method arc = Draw.arc w gc method polygon ?filled l = Draw.polygon w gc ?filled l method string s = Draw.string w gc ~string:s method image ~width ~height ?(xsrc=0) ?(ysrc=0) ?(xdest=0) ?(ydest=0) image = Draw.image w gc ~image ~width ~height ~xsrc ~ysrc ~xdest ~ydest end class pixmap ?colormap ?mask pm = object inherit [[`pixmap]] drawable ?colormap pm as pixmap val bitmap = may_map mask ~f: begin fun x -> let mask = new drawable x in mask#set_foreground `WHITE; mask end val mask : Gdk.bitmap option = mask method pixmap = w method mask = mask method set_line_attributes ?width ?style ?cap ?join () = pixmap#set_line_attributes ?width ?style ?cap ?join (); may bitmap ~f:(fun m -> m#set_line_attributes ?width ?style ?cap ?join ()) method point ~x ~y = pixmap#point ~x ~y; may bitmap ~f:(fun m -> m#point ~x ~y) method line ~x ~y ~x:x' ~y:y' = pixmap#line ~x ~y ~x:x' ~y:y'; may bitmap ~f:(fun m -> m#line ~x ~y ~x:x' ~y:y') method rectangle ~x ~y ~width ~height ?filled () = pixmap#rectangle ~x ~y ~width ~height ?filled (); may bitmap ~f:(fun m -> m#rectangle ~x ~y ~width ~height ?filled ()) method arc ~x ~y ~width ~height ?filled ?start ?angle () = pixmap#arc ~x ~y ~width ~height ?filled ?start ?angle (); may bitmap ~f:(fun m -> m#arc ~x ~y ~width ~height ?filled ?start ?angle ()); method polygon ?filled l = pixmap#polygon ?filled l; may bitmap ~f:(fun m -> m#polygon ?filled l) method string s ~font ~x ~y = pixmap#string s ~font ~x ~y; may bitmap ~f:(fun m -> m#string s ~font ~x ~y) end class type misc_ops = object method allocation : Gtk.rectangle method colormap : colormap method draw : Rectangle.t option -> unit method hide : unit -> unit method hide_all : unit -> unit method intersect : Rectangle.t -> Rectangle.t option method pointer : int * int method realize : unit -> unit method set_app_paintable : bool -> unit method set_geometry : ?x:int -> ?y:int -> ?width:int -> ?height:int -> unit -> unit method show : unit -> unit method unmap : unit -> unit method unparent : unit -> unit method unrealize : unit -> unit method visible : bool method visual : visual method visual_depth : int method window : window end let pixmap ~(window : < misc : #misc_ops; .. >) ~width ~height ?(mask=false) () = window#misc#realize (); let window = try window#misc#window with Gpointer.Null -> failwith "GDraw.pixmap : no window" and depth = window#misc#visual_depth and colormap = window#misc#colormap in let mask = if not mask then None else let bm = Bitmap.create window ~width ~height in let mask = new drawable bm in mask#set_foreground `BLACK; mask#rectangle ~x:0 ~y:0 ~width ~height ~filled:true (); Some bm in new pixmap (Pixmap.create window ~width ~height ~depth) ~colormap ?mask let pixmap_from_xpm ~window ~file ?colormap ?transparent () = window#misc#realize (); let window = try window#misc#window with Gpointer.Null -> failwith "GDraw.pixmap_from_xpm : no window" in let pm, mask = try Pixmap.create_from_xpm window ~file ?colormap ?transparent:(may_map transparent ~f:(fun c -> color c)) with Gpointer.Null -> invalid_arg ("GDraw.pixmap_from_xpm : " ^ file) in new pixmap pm ?colormap ~mask let pixmap_from_xpm_d ~window ~data ?colormap ?transparent () = window#misc#realize (); let window = try window#misc#window with Gpointer.Null -> failwith "GDraw.pixmap_from_xpm_d : no window" in let pm, mask = Pixmap.create_from_xpm_d window ~data ?colormap ?transparent:(may_map transparent ~f:(fun c -> color c)) in new pixmap pm ?colormap ~mask class drag_context context = object val context = context method status ?(time=0) act = DnD.drag_status context act ~time method suggested_action = DnD.drag_context_suggested_action context method targets = DnD.drag_context_targets context end