Module GUtil

module GUtil: sig .. end

Utility classes for programming with GTK objects

val print_widget : Format.formatter -> #GObj.widget -> unit
A nice function to use with #install_printer

The memo class provides an easy way to remember the real class of a widget. Insert all widgets of class in one single t memo, and you can then recover their original ML object with #find.
class [< get_oid : int; .. >] memo : unit -> object .. end

The ML signal mechanism

It allows one to add GTK-like signals to arbitrary objects.
val next_callback_id : unit ->
class ['a] signal : unit -> object .. end

As with GTK signals, you can use GtkSignal.stop_emit inside a callback to prevent other callbacks from being called.
class virtual ml_signals : ( -> bool) list -> object .. end

class virtual add_ml_signals : 'a Gtk.obj -> ( -> bool) list -> object .. end

To add ML signals to a LablGTK object:
   class mywidget_signals obj ~mysignal1 ~mysignal2 = object
     inherit somewidget_signals obj
     inherit add_ml_signals obj [mysignal1#disconnect; mysignal2#disconnect]
     method mysignal1 = mysignal1#connect ~after
     method mysignal2 = mysignal2#connect ~after

   class mywidget obj = object (self)
     inherit somewidget obj
     val mysignal1 = new signal obj
     val mysignal2 = new signal obj
     method connect = new mywidget_signals obj ~mysignal1 ~mysignal2
     method call1 = mysignal1#call
     method call2 = mysignal2#call
You can also add ML signals to an arbitrary object; just inherit from ml_signals in place of widget_signals+add_ml_signals.
  class mysignals ~mysignal1 ~mysignal2 = object
     inherit ml_signals [mysignal1#disconnect; mysignal2#disconnect]
     method mysignal1 = mysignal1#connect ~after
     method mysignal2 = mysignal2#connect ~after

Propagating state modifications

The variable class provides an easy way to propagate state modifications. A new variable is created by new variable init. The #set method just calls the set signal, which by default only calls real_set. real_set sets the variable and calls changed when needed. Deep equality is used to compare values, but check is only done if there are callbacks for changed.
class ['a] variable_signals : set:'a signal -> changed:'a signal -> object .. end

class ['a] variable : 'a -> object .. end