(* $Id$ *) open Gtk type t (* if you modify this type modify widget_info_array in ml_gtk.c in accordance *) type object_type = | OBJECT | WIDGET | MISC | LABEL | ACCELLABEL | TIPSQUERY | ARROW | IMAGE | PIXMAP | CONTAINER | BIN | ALIGNMENT | FRAME | ASPECTFRAME | BUTTON | TOGGLEBUTTON | CHECKBUTTON | RADIOBUTTON | OPTIONMENU | ITEM | MENUITEM | CHECKMENUITEM | RADIOMENUITEM | TEAROFFMENUITEM | LISTITEM | TREEITEM | WINDOW | COLORSELECTIONDIALOG | DIALOG | INPUTDIALOG | FILESELECTION | FONTSELECTIONDIALOG | PLUG | EVENTBOX | HANDLEBOX | SCROLLEDWINDOW | VIEWPORT | BOX | BUTTONBOX | HBUTTONBOX | VBUTTONBOX | VBOX | COLORSELECTION | GAMMACURVE | HBOX | COMBO | STATUSBAR | CLIST | CTREE | FIXED | NOTEBOOK | FONTSELECTION | PANED | HPANED | VPANED | LAYOUT | LIST | MENUSHELL | MENUBAR | MENU | PACKER | SOCKET | TABLE | TOOLBAR | TREE | CALENDAR | DRAWINGAREA | CURVE | EDITABLE | ENTRY | SPINBUTTON | TEXT | RULER | HRULER | VRULER | RANGE | SCALE | HSCALE | VSCALE | SCROLLBAR | HSCROLLBAR | VSCROLLBAR | SEPARATOR | HSEPARATOR | VSEPARATOR | PREVIEW | PROGRESS | PROGRESSBAR | DATA | ADJUSTMENT | TOOLTIPS | ITEMFACTORY external set_ml_class_init : (t -> unit) -> unit = "set_ml_class_init" external signal_new : string -> int -> t -> object_type -> int -> int = "ml_gtk_signal_new" external object_class_add_signals : t -> int array -> int -> unit = "ml_gtk_object_class_add_signals" external type_unique : name:string -> parent:object_type -> nsignals:int -> gtk_type = "ml_gtk_type_unique" external type_new : gtk_type -> unit obj = "ml_gtk_type_new" open GtkSignal let make_new_widget ~name ~parent ~(signals : ('a, unit -> unit) GtkSignal.t list) = let nsignals = List.length signals in let new_type = type_unique ~name ~parent ~nsignals in let signal_num_array = Array.create nsignals 0 in let class_init_func classe = List.fold_left signals ~init:0 ~f: (fun i signal -> signal_num_array.(i) <- signal_new signal.name 1 classe parent i; i+1); object_class_add_signals classe signal_num_array nsignals in new_type, (fun () -> set_ml_class_init class_init_func; type_new new_type) (* , signal_num_array *)