sig
  type widget = {
    repaint : Gctx.gctx -> unit;
    handle : Gctx.gctx -> Gctx.event -> unit;
    size : unit -> Gctx.dimension;
  }
  val space : Gctx.dimension -> Widget.widget
  val border : Widget.widget -> Widget.widget
  val hpair : Widget.widget -> Widget.widget -> Widget.widget
  val vpair : Widget.widget -> Widget.widget -> Widget.widget
  val vlist : Widget.widget list -> Widget.widget
  val hlist : Widget.widget list -> Widget.widget
  type label_controller = {
    get_label : unit -> string;
    set_label : string -> unit;
  }
  val label : string -> Widget.widget * Widget.label_controller
  type event_listener = Gctx.gctx -> Gctx.event -> unit
  val mouseclick_listener : (unit -> unit) -> Widget.event_listener
  type notifier_controller = {
    add_event_listener : Widget.event_listener -> unit;
  }
  val notifier : Widget.widget -> Widget.widget * Widget.notifier_controller
  val button :
    string ->
    Widget.widget * Widget.label_controller * Widget.notifier_controller
  val canvas :
    Gctx.dimension ->
    (Gctx.gctx -> unit) -> Widget.widget * Widget.notifier_controller
  type 'a value_controller = {
    add_change_listener : ('-> unit) -> unit;
    get_value : unit -> 'a;
    set_value : '-> unit;
  }
  val checkbox :
    bool -> string -> Widget.widget * bool Widget.value_controller
end