summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Andrieu <oandrieu@gmail.com>2003-12-03 22:17:52 +0000
committerOlivier Andrieu <oandrieu@gmail.com>2003-12-03 22:17:52 +0000
commitebdc8d9d06f2271f8fa96b655c15a28080a443a1 (patch)
treefde269c4645cb9e63645b446c1c062abf6e21cd3
parentbd880a0c73e0b4a9a5f0b9191449659d0eec956c (diff)
support redraw signal of GtkCairo
-rw-r--r--.cvsignore6
-rw-r--r--src/ocairo_gtkcairo.ml19
-rw-r--r--src/ocairo_gtkcairo.mli11
-rw-r--r--test/cube.ml61
4 files changed, 60 insertions, 37 deletions
diff --git a/.cvsignore b/.cvsignore
new file mode 100644
index 0000000..58b6f75
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,6 @@
+aclocal.m4
+autom4te.cache
+config.log
+config.make
+config.status
+configure
diff --git a/src/ocairo_gtkcairo.ml b/src/ocairo_gtkcairo.ml
index 77e290f..f7f8732 100644
--- a/src/ocairo_gtkcairo.ml
+++ b/src/ocairo_gtkcairo.ml
@@ -6,10 +6,27 @@ let init = gtkcairo_init ()
external get_cairo : [>`gtkcairo] Gtk.obj -> Cairo.t = "ml_cairo_gtkcairo_get_cairo"
+let redraw_sig = {
+ GtkSignal.name = "redraw" ;
+ GtkSignal.classe = `gtkcairo ;
+ GtkSignal.marshaller =
+ let m = GtkSignal.marshal1 Gobject.Data.pointer "GtkCairo::redraw" in
+ fun cb ->
+ m (function
+ | None -> raise Gpointer.Null
+ | Some cairo -> cb (Obj.magic cairo : Cairo.t)) }
+
+class cairo_signals obj =
+ object (self)
+ inherit GObj.widget_signals_impl obj
+ method redraw = self#connect redraw_sig
+ end
+
class cairo obj =
object
- inherit GObj.widget_full (obj : [> gtkcairo] Gtk.obj)
+ inherit GObj.widget (obj : [> gtkcairo] Gtk.obj)
+ method connect = new cairo_signals obj
method event = new GObj.event_ops obj
method cairo = new Ocairo.cairo (get_cairo obj)
method queue_draw =
diff --git a/src/ocairo_gtkcairo.mli b/src/ocairo_gtkcairo.mli
index e329dac..239f84b 100644
--- a/src/ocairo_gtkcairo.mli
+++ b/src/ocairo_gtkcairo.mli
@@ -1,14 +1,21 @@
type gtkcairo = [Gtk.widget | `gtkcairo]
-val init : unit
external get_cairo : [> `gtkcairo ] Gtk.obj -> Cairo.t
= "ml_cairo_gtkcairo_get_cairo"
+class cairo_signals :
+ [> gtkcairo ] Gtk.obj ->
+ object
+ inherit GObj.widget_signals
+ method redraw : callback:(Cairo.t -> unit) -> GtkSignal.id
+ end
+
class cairo :
([> gtkcairo ] as 'a) Gtk.obj ->
object
- inherit GObj.widget_full
+ inherit GObj.widget
val obj : 'a Gtk.obj
+ method connect : cairo_signals
method event : GObj.event_ops
method cairo : Ocairo.cairo
method queue_draw : unit
diff --git a/test/cube.ml b/test/cube.ml
index c8b7f2c..8584dd6 100644
--- a/test/cube.ml
+++ b/test/cube.ml
@@ -1,33 +1,23 @@
let animate_rotate_step = 0.05
let animate_frame_delay = 40
let rotate_max = 8. *. atan 1.
-let box_size = 100
-let margin = 20
+let initial_size = 200
-let setup_transform cr =
+let redraw w range c =
+ let { Gtk.width = width ; Gtk.height = height } =
+ w#misc#allocation in
+ let cr = new Ocairo.cairo c in
+ let box_size = float (width + height) /. 6. in
cr#default_matrix ;
- let off = float (box_size + margin) in
- cr#translate off off
-
-let expose_cb c _ =
- let cr = c#cairo in
- cr#rectangle 0. 0. (float box_size) (float box_size) ;
+ let off = float width /. 2. in
+ cr#translate off off ;
+ cr#rotate range#adjustment#value ;
+ cr#rectangle (~-. box_size) (~-. box_size) box_size box_size ;
cr#set_rgb_color 1. 1. 1. ;
- cr#fill ;
- false
+ cr#fill
-let setup packing =
- let size = 2 * box_size + margin in
- let c = Ocairo_gtkcairo.cairo ~width:size ~height:size ~packing () in
- setup_transform c#cairo ;
- c#event#connect#after#expose (expose_cb c) ;
- c
-
-let slider_changed range c () =
- let cr = c#cairo in
- setup_transform cr ;
- cr#rotate range#adjustment#value ;
- c#queue_draw
+let slider_changed cr () =
+ cr#queue_draw
let animate_step range () =
let nv = range#adjustment#value +. animate_rotate_step in
@@ -39,12 +29,12 @@ let animate_toggled button range =
fun () ->
match !timeout with
| None when button#active ->
- let id =
- Glib.Timeout.add animate_frame_delay
- (animate_step range) in
- timeout := Some id
+ timeout := Some (
+ Glib.Timeout.add animate_frame_delay
+ (animate_step range))
| Some id when not button#active ->
- Glib.Timeout.remove id
+ Glib.Timeout.remove id ;
+ timeout := None
| _ -> ()
@@ -56,20 +46,23 @@ let main =
let b = GPack.vbox ~spacing:6 ~border_width:12
~packing:w#add () in
- let f = GBin.frame ~shadow_type:`IN ~packing:b#pack () in
-
- let cairo = setup f#add in
+ let f = GBin.frame ~shadow_type:`IN
+ ~packing:(b#pack ~expand:true ~fill:true) () in
+ let cairo = Ocairo_gtkcairo.cairo
+ ~width:initial_size ~height:initial_size
+ ~packing:f#add () in
let slider = GRange.scale `HORIZONTAL
~draw_value:false ~packing:b#pack () in
slider#adjustment#set_bounds
~lower:0. ~upper:rotate_max
~step_incr:animate_rotate_step () ;
- slider#connect#value_changed
- (slider_changed slider cairo) ;
-
let button = GButton.check_button ~label:"Animate"
~packing:b#pack () in
+
+ cairo#connect#redraw (redraw cairo slider) ;
+ slider#connect#value_changed
+ (slider_changed cairo) ;
button#connect#toggled (animate_toggled button slider) ;
w#show () ;