(* $Id$ *) open Gaux open Gtk type visual_options = [ | `USE_GL | `BUFFER_SIZE of int | `LEVEL of int | `RGBA | `DOUBLEBUFFER | `STEREO | `AUX_BUFFERS of int | `RED_SIZE of int | `GREEN_SIZE of int | `BLUE_SIZE of int | `ALPHA_SIZE of int | `DEPTH_SIZE of int | `STENCIL_SIZE of int | `ACCUM_GREEN_SIZE of int | `ACCUM_ALPHA_SIZE of int ] type gl_area = [`widget|`drawing|`glarea] module Raw = struct external create : visual_options list -> share:[>`glarea] optobj -> gl_area obj = "ml_gtk_gl_area_new" external swap_buffers : [>`glarea] obj -> unit = "ml_gtk_gl_area_swapbuffers" external make_current : [>`glarea] obj -> bool = "ml_gtk_gl_area_make_current" end class area_signals obj = object (connect) inherit GObj.widget_signals obj method display ~callback = (new GObj.event_signals ~after obj)#expose ~callback: begin fun ev -> if GdkEvent.Expose.count ev = 0 then if Raw.make_current obj then callback () else prerr_endline "GlGtk-WARNING **: could not make current"; true end method reshape ~callback = (new GObj.event_signals ~after obj)#configure ~callback: begin fun ev -> if Raw.make_current obj then begin callback ~width:(GdkEvent.Configure.width ev) ~height:(GdkEvent.Configure.height ev) end else prerr_endline "GlGtk-WARNING **: could not make current"; true end method realize ~callback = let connect = new GObj.misc_signals ~after (GtkBase.Widget.coerce obj) in connect#realize ~callback: begin fun ev -> if Raw.make_current obj then callback () else prerr_endline "GlGtk-WARNING **: could not make current" end end class area obj = object (self) inherit GObj.widget (obj : gl_area obj) method as_area = obj method event = new GObj.event_ops obj method connect = new area_signals obj method set_size = GtkMisc.DrawingArea.size obj method swap_buffers () = Raw.swap_buffers obj method make_current () = if not (Raw.make_current obj) then raise (Gl.GLerror "make_current") end let area options ?share ?(width=0) ?(height=0) ?packing ?show () = let share = match share with Some (x : area) -> Some x#as_area | None -> None in let w = Raw.create options ~share:(Gpointer.optboxed share) in if width <> 0 || height <> 0 then GtkMisc.DrawingArea.size w ~width ~height; GtkBase.Widget.add_events w [`EXPOSURE]; GObj.pack_return (new area w) ~packing ~show