+let ask_text ~(gui:#gui) ?(title = "") ?(msg = "") ?(multiline = false) () =
+ let dialog = gui#newTextDialog () in
+ dialog#textDialog#set_title title;
+ dialog#textDialogLabel#set_label msg;
+ let result = ref None in
+ let return r =
+ result := r;
+ dialog#textDialog#destroy ();
+ GMain.Main.quit ()
+ in
+ ignore (dialog#textDialog#event#connect#delete (fun _ -> true));
+ if multiline then begin (* multiline input required: use a TextView widget *)
+ let win =
+ GBin.scrolled_window ~width:400 ~height:150 ~hpolicy:`NEVER
+ ~vpolicy:`ALWAYS ~packing:dialog#textDialogVBox#add ()
+ in
+ let view = GText.view ~wrap_mode:`CHAR ~packing:win#add () in
+ ignore (dialog#textDialogOkButton#connect#clicked (fun _ ->
+ return (Some (view#buffer#get_text ()))))
+ end else begin (* monoline input required: use a TextEntry widget *)
+ let entry = GEdit.entry ~packing:dialog#textDialogVBox#add () in
+ ignore (dialog#textDialogOkButton#connect#clicked (fun _ ->
+ return (Some entry#text)))
+ end;
+ ignore (dialog#textDialogCancelButton#connect#clicked (fun _ -> return None));
+ dialog#textDialog#show ();
+ GtkThread.main ();
+ (match !result with None -> raise Cancel | Some r -> r)
+