|
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
|