--- /dev/null
+(* $Id$ *)
+
+open Gtk
+
+type id
+type ('a,'b) t =
+ { name: string;
+ marshaller: ('b -> GtkArgv.t -> GtkArgv.data list -> unit) }
+
+val stop_emit : unit -> unit
+ (* Call [stop_emit ()] in a callback to prohibit further handling
+ of the current signal invocation, by calling [emit_stop_by_name].
+ Be careful about where you use it, since the concept of current
+ signal may be tricky. *)
+
+val connect :
+ sgn:('a, 'b) t -> callback:'b -> ?after:bool -> 'a obj -> id
+ (* You may use [stop_emit] inside the callback *)
+
+external disconnect : 'a obj -> id -> unit
+ = "ml_gtk_signal_disconnect"
+external emit_stop_by_name : 'a obj -> name:string -> unit
+ = "ml_gtk_signal_emit_stop_by_name"
+ (* Unsafe: use [stop_emit] instead. *)
+external handler_block : 'a obj -> id -> unit
+ = "ml_gtk_signal_handler_block"
+external handler_unblock : 'a obj -> id -> unit
+ = "ml_gtk_signal_handler_unblock"
+
+(* Some marshaller functions, to build signals *)
+val marshal_unit : (unit -> unit) -> GtkArgv.t -> GtkArgv.data list -> unit
+val marshal_int : (int -> unit) -> GtkArgv.t -> GtkArgv.data list -> unit
+
+(* Emitter functions *)
+val emit :
+ 'a obj -> sgn:('a, 'b) t -> emitter:('a obj -> name:string -> 'b) -> 'b
+val emit_unit : 'a obj -> sgn:('a, unit -> unit) t -> unit
+val emit_int : 'a obj -> sgn:('a, int -> unit) t -> int -> unit
+
+(* Internal functions. *)
+val enter_callback : (unit -> unit) ref
+val exit_callback : (unit -> unit) ref
+type saved_state
+val push_callback : unit -> saved_state
+val pop_callback : saved_state -> bool