Blame frx/frx_synth.ml

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file LICENSE found in the OCaml source tree.          *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(* Some notion of synthetic events *)
Packit bd2e5d
open Camltk
Packit bd2e5d
open Widget
Packit bd2e5d
open Protocol
Packit bd2e5d
Packit bd2e5d
(* To each event is associated a table of (widget, callback) *)
Packit bd2e5d
let events = Hashtbl.create 37
Packit bd2e5d
Packit bd2e5d
(* Notes:
Packit bd2e5d
 *   "cascading" events (on the same event) are not supported
Packit bd2e5d
 *   Only one binding active at a time for each event on each widget.
Packit bd2e5d
 *)
Packit bd2e5d
Packit bd2e5d
(* Get the callback table associated with <name>. Initializes if required *)
Packit bd2e5d
let get_event name =
Packit bd2e5d
  try Hashtbl.find events name
Packit bd2e5d
  with
Packit bd2e5d
    Not_found ->
Packit bd2e5d
      let h = Hashtbl.create 37 in
Packit bd2e5d
       Hashtbl.add events name h;
Packit bd2e5d
       (* Initialize the callback invocation mechanism, based on
Packit bd2e5d
          variable trace
Packit bd2e5d
        *)
Packit bd2e5d
       let var = "camltk_events(" ^ name ^")" in
Packit bd2e5d
       let tkvar = Textvariable.coerce var in
Packit bd2e5d
       let rec set () =
Packit bd2e5d
         Textvariable.handle tkvar
Packit bd2e5d
         (fun () ->
Packit bd2e5d
            begin match Textvariable.get tkvar with
Packit bd2e5d
              "all" -> (* Invoke all callbacks *)
Packit bd2e5d
                Hashtbl.iter
Packit bd2e5d
                  (fun p f ->
Packit bd2e5d
                     try
Packit bd2e5d
                      f (cTKtoCAMLwidget p)
Packit bd2e5d
                     with _ -> ())
Packit bd2e5d
                  h
Packit bd2e5d
            | p -> (* Invoke callback for p *)
Packit bd2e5d
                try
Packit bd2e5d
                  let w = cTKtoCAMLwidget p
Packit bd2e5d
                  and f = Hashtbl.find h p in
Packit bd2e5d
                    f w
Packit bd2e5d
                with
Packit bd2e5d
                  _ -> ()
Packit bd2e5d
            end;
Packit bd2e5d
            set ()(* reactivate the callback *)
Packit bd2e5d
            ) in
Packit bd2e5d
       set();
Packit bd2e5d
       h
Packit bd2e5d
Packit bd2e5d
(* Remove binding for event <name> on widget <w> *)
Packit bd2e5d
let remove w name =
Packit bd2e5d
  Hashtbl.remove (get_event name) (Widget.name w)
Packit bd2e5d
Packit bd2e5d
(* Adds <f> as callback for widget <w> on event <name> *)
Packit bd2e5d
let bind w name f =
Packit bd2e5d
  remove w name;
Packit bd2e5d
  Hashtbl.add (get_event name) (Widget.name w) f
Packit bd2e5d
Packit bd2e5d
(* Sends event <name> to all widgets *)
Packit bd2e5d
let broadcast name =
Packit bd2e5d
  Textvariable.set (Textvariable.coerce ("camltk_events(" ^ name ^")")) "all"
Packit bd2e5d
Packit bd2e5d
(* Sends event <name> to widget <w> *)
Packit bd2e5d
let send name w =
Packit bd2e5d
  Textvariable.set (Textvariable.coerce ("camltk_events(" ^ name ^")"))
Packit bd2e5d
                   (Widget.name w)
Packit bd2e5d
Packit bd2e5d
(* Remove all callbacks associated to widget <w> *)
Packit bd2e5d
let remove_callbacks w =
Packit bd2e5d
  Hashtbl.iter (fun _ h -> Hashtbl.remove h (Widget.name w)) events
Packit bd2e5d
Packit bd2e5d
let _ =
Packit bd2e5d
  add_destroy_hook remove_callbacks