From e3655d5d9f49e325bda4c9cf99d579bc89355a14 Mon Sep 17 00:00:00 2001 From: Jedidiah Barber Date: Fri, 29 Nov 2024 18:45:33 +1300 Subject: Improved Ada API for Fl_Ask --- doc/fl_ask.html | 185 ++++++++++++++++-- src/c_fl_ask.cpp | 140 ++++++++++++++ src/c_fl_ask.h | 49 +++++ src/c_fl_dialog.cpp | 87 --------- src/c_fl_dialog.h | 35 ---- src/fltk-asks.adb | 525 +++++++++++++++++++++++++++++++++++++++++----------- src/fltk-asks.ads | 119 ++++++++++-- 7 files changed, 873 insertions(+), 267 deletions(-) create mode 100644 src/c_fl_ask.cpp create mode 100644 src/c_fl_ask.h delete mode 100644 src/c_fl_dialog.cpp delete mode 100644 src/c_fl_dialog.h diff --git a/doc/fl_ask.html b/doc/fl_ask.html index 4a2578c..078c7c8 100644 --- a/doc/fl_ask.html +++ b/doc/fl_ask.html @@ -38,7 +38,17 @@   - Choice + Confirm_Result + + + +   + Choice_Result + + + +   + Extended_Choice_Result @@ -51,6 +61,104 @@ RGB_Int + +   + File_Chooser_Callback + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Attributes
+static void (*Fl::error)(const char *, ...) = ::error;
+
See FLTK.Errors
+static void (*Fl::fatal)(const char *, ...) = ::fatal;
+
See FLTK.Errors
+const char * fl_cancel = "Cancel";
+
+function Get_Cancel_String
+    return String;
+
+procedure Set_Cancel_String
+       (Value : in String);
+
+const char * fl_close = "Close";
+
+function Get_Close_String
+    return String;
+
+procedure Set_Close_String
+       (Value : in String);
+
+const char * fl_no = "No";
+
+function Get_No_String
+    return String;
+
+procedure Set_No_String
+       (Value : in String);
+
+const char * fl_ok = "OK";
+
+function Get_OK_String
+    return String;
+
+procedure Set_OK_String
+       (Value : in String);
+
+const char * fl_yes = "Yes";
+
+function Get_Yes_String
+    return String;
+
+procedure Set_Yes_String
+       (Value : in String);
+
+static void (*Fl::warning)(const char *, ...) = ::warning;
+
See FLTK.Errors
@@ -72,7 +180,7 @@ procedure Alert
 int fl_ask(const char *fmt,...);
 
-Present but disabled due to fl_ask being deprecated +Deprecated @@ -81,24 +189,54 @@ void fl_beep(int type);
 procedure Beep
-       (Kind : in Beep_Kind);
+       (Kind : in Beep_Kind := Default_Beep);
+
+ + + +
+int fl_choice(const char *fmt, const char *b0, const char *b1,
+    const char *b2, ...);
+
+
+function Choice
+       (Message, Button1 : in String)
+    return Choice_Result;
+
+function Choice
+       (Message, Button1, Button2 : in String)
+    return Choice_Result;
+
+function Choice
+       (Message, Button1, Button2, Button3 : in String)
+    return Choice_Result;
 
-int fl_choice(const char *fmt, const char *b0, const char *b1, const char *b2,...);
+int fl_choice_n(const char *fmt, const char *b0, const char *b1,
+    const char *b2, ...);
 
-function Three_Way_Choice
+function Extended_Choice
+       (Message, Button1 : in String)
+    return Extended_Choice_Result;
+
+function Extended_Choice
+       (Message, Button1, Button2 : in String)
+    return Extended_Choice_Result;
+
+function Extended_Choice
        (Message, Button1, Button2, Button3 : in String)
-    return Choice;
+    return Extended_Choice_Result;
 
-int fl_color_chooser(const char *name, double &r, double &g, double &b, int cmode);
+int fl_color_chooser(const char *name, double &r, double &g,
+    double &b, int cmode);
 
 function Color_Chooser
@@ -106,13 +244,14 @@ function Color_Chooser
         R, G, B : in out RGB_Float;
         Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
             FLTK.Widgets.Groups.Color_Choosers.RGB)
-    return Boolean;
+    return Confirm_Result;
 
-int fl_color_chooser(const char *name, uchar &r, uchar &g, uchar &b, int cmode);
+int fl_color_chooser(const char *name, uchar &r, uchar &g,
+    uchar &b, int cmode);
 
 function Color_Chooser
@@ -120,13 +259,14 @@ function Color_Chooser
         R, G, B : in out RGB_Int;
         Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
             FLTK.Widgets.Groups.Color_Choosers.RGB)
-    return Boolean;
+    return Confirm_Result;
 
-char * fl_dir_chooser(const char *message, const char *fname, int relative);
+char * fl_dir_chooser(const char *message, const char *fname,
+    int relative);
 
 function Dir_Chooser
@@ -138,7 +278,8 @@ function Dir_Chooser
 
   
 
-char * fl_file_chooser(const char *message, const char *pat, const char *fname, int relative);
+char * fl_file_chooser(const char *message, const char *pat,
+    const char *fname, int relative);
 
 function File_Chooser
@@ -152,19 +293,25 @@ function File_Chooser
 
 void fl_file_chooser_callback(void(*cb)(const char *));
 
-  +
+procedure Set_File_Chooser_Callback
+       (Func : in File_Chooser_Callback);
+
 void fl_file_chooser_ok_label(const char *l);
 
-  +
+procedure Set_File_Chooser_OK_String
+       (Value : in String);
+
-const char * fl_input(const char *fmt, const char *defstr,...);
+const char * fl_input(const char *fmt, const char *defstr, ...);
 
 function Text_Input
@@ -176,7 +323,7 @@ function Text_Input
 
   
 
-void fl_message(const char *fmt,...);
+void fl_message(const char *fmt, ...);
 
 procedure Message_Box
@@ -200,7 +347,7 @@ procedure Set_Message_Font
 void fl_message_hotspot(int enable);
 
-procedure Set_Hotspot
+procedure Set_Message_Hotspot
        (To : in Boolean);
 
@@ -210,7 +357,7 @@ procedure Set_Hotspot int fl_message_hotspot(void);
-function Get_Hotspot
+function Get_Message_Hotspot
     return Boolean;
 
@@ -247,7 +394,7 @@ procedure Set_Message_Title_Default
-const char * fl_password(const char *fmt, const char *defstr,...);
+const char * fl_password(const char *fmt, const char *defstr, ...);
 
 function Password
diff --git a/src/c_fl_ask.cpp b/src/c_fl_ask.cpp
new file mode 100644
index 0000000..20af2e3
--- /dev/null
+++ b/src/c_fl_ask.cpp
@@ -0,0 +1,140 @@
+
+
+//  Programmed by Jedidiah Barber
+//  Released into the public domain
+
+
+#include 
+#include 
+#include 
+#include "c_fl_ask.h"
+
+
+
+
+const char * fl_ask_get_cancel() {
+    return fl_cancel;
+}
+
+void fl_ask_set_cancel(const char * v) {
+    fl_cancel = v;
+}
+
+const char * fl_ask_get_close() {
+    return fl_close;
+}
+
+void fl_ask_set_close(const char * v) {
+    fl_close = v;
+}
+
+const char * fl_ask_get_no() {
+    return fl_no;
+}
+
+void fl_ask_set_no(const char * v) {
+    fl_no = v;
+}
+
+const char * fl_ask_get_ok() {
+    return fl_ok;
+}
+
+void fl_ask_set_ok(const char * v) {
+    fl_ok = v;
+}
+
+const char * fl_ask_get_yes() {
+    return fl_yes;
+}
+
+void fl_ask_set_yes(const char * v) {
+    fl_yes = v;
+}
+
+
+
+
+void fl_ask_alert(const char * m) {
+    fl_alert(m);
+}
+
+void fl_ask_beep(int b) {
+    fl_beep(b);
+}
+
+int fl_ask_choice(const char * m, const char * a, const char * b, const char * c) {
+    return fl_choice(m, a, b, c);
+}
+
+int fl_ask_choice_n(const char * m, const char * a, const char * b, const char * c) {
+    return fl_choice_n(m, a, b, c);
+}
+
+const char * fl_ask_input(const char * m, const char * d) {
+    return fl_input(m, d);
+}
+
+void fl_ask_message(const char * m) {
+    fl_message(m);
+}
+
+const char * fl_ask_password(const char * m, const char * d) {
+    return fl_password(m, d);
+}
+
+
+
+
+int fl_ask_color_chooser(const char * n, double & r, double & g, double & b, int m) {
+    return fl_color_chooser(n, r, g, b, m);
+}
+
+int fl_ask_color_chooser2(const char * n, uchar & r, uchar & g, uchar & b, int m) {
+    return fl_color_chooser(n, r, g, b, m);
+}
+
+char * fl_ask_dir_chooser(const char * m, const char * d, int r) {
+    return fl_dir_chooser(m, d, r);
+}
+
+char * fl_ask_file_chooser(const char * m, const char * p, const char * d, int r) {
+    return fl_file_chooser(m, p, d, r);
+}
+
+void fl_ask_file_chooser_callback(void(*cb)(const char *)) {
+    fl_file_chooser_callback(cb);
+}
+
+void fl_ask_file_chooser_ok_label(const char *l) {
+    fl_file_chooser_ok_label(l);
+}
+
+
+
+
+int fl_ask_get_message_hotspot(void) {
+    return fl_message_hotspot();
+}
+
+void fl_ask_set_message_hotspot(int v) {
+    fl_message_hotspot(v);
+}
+
+void fl_ask_message_font(int f, int s) {
+    fl_message_font(f, s);
+}
+
+void * fl_ask_message_icon(void) {
+    return fl_message_icon();
+}
+
+void fl_ask_message_title(const char * t) {
+    fl_message_title(t);
+}
+
+void fl_ask_message_title_default(const char * t) {
+    fl_message_title_default(t);
+}
+
+
diff --git a/src/c_fl_ask.h b/src/c_fl_ask.h
new file mode 100644
index 0000000..c1845b2
--- /dev/null
+++ b/src/c_fl_ask.h
@@ -0,0 +1,49 @@
+
+
+//  Programmed by Jedidiah Barber
+//  Released into the public domain
+
+
+#ifndef FL_ASK_GUARD
+#define FL_ASK_GUARD
+
+
+extern "C" const char * fl_ask_get_cancel();
+extern "C" void fl_ask_set_cancel(const char * v);
+extern "C" const char * fl_ask_get_close();
+extern "C" void fl_ask_set_close(const char * v);
+extern "C" const char * fl_ask_get_no();
+extern "C" void fl_ask_set_no(const char * v);
+extern "C" const char * fl_ask_get_ok();
+extern "C" void fl_ask_set_ok(const char * v);
+extern "C" const char * fl_ask_get_yes();
+extern "C" void fl_ask_set_yes(const char * v);
+
+
+extern "C" void fl_ask_alert(const char * m);
+extern "C" void fl_ask_beep(int b);
+extern "C" int fl_ask_choice(const char * m, const char * a, const char * b, const char * c);
+extern "C" int fl_ask_choice_n(const char * m, const char * a, const char * b, const char * c);
+extern "C" const char * fl_ask_input(const char * m, const char * d);
+extern "C" void fl_ask_message(const char * m);
+extern "C" const char * fl_ask_password(const char * m, const char * d);
+
+
+extern "C" int fl_ask_color_chooser(const char * n, double & r, double & g, double & b, int m);
+extern "C" int fl_ask_color_chooser2(const char * n, uchar & r, uchar & g, uchar & b, int m);
+extern "C" char * fl_ask_dir_chooser(const char * m, const char * d, int r);
+extern "C" char * fl_ask_file_chooser(const char * m, const char * p, const char * d, int r);
+extern "C" void fl_ask_file_chooser_callback(void(*cb)(const char *));
+extern "C" void fl_ask_file_chooser_ok_label(const char *l);
+
+
+extern "C" int fl_ask_get_message_hotspot(void);
+extern "C" void fl_ask_set_message_hotspot(int v);
+extern "C" void fl_ask_message_font(int f, int s);
+extern "C" void * fl_ask_message_icon(void);
+extern "C" void fl_ask_message_title(const char * t);
+extern "C" void fl_ask_message_title_default(const char * t);
+
+
+#endif
+
diff --git a/src/c_fl_dialog.cpp b/src/c_fl_dialog.cpp
deleted file mode 100644
index f46145a..0000000
--- a/src/c_fl_dialog.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-//  Programmed by Jedidiah Barber
-//  Released into the public domain
-
-
-#include 
-#include 
-#include 
-#include "c_fl_dialog.h"
-
-
-void dialog_fl_alert(const char * m) {
-    fl_alert(m);
-}
-
-//int dialog_fl_ask(const char * m) {
-//    return fl_ask(m);
-//}
-
-void dialog_fl_beep(int b) {
-    fl_beep(b);
-}
-
-int dialog_fl_choice(const char * m, const char * a, const char * b, const char * c) {
-    return fl_choice(m, a, b, c);
-}
-
-const char * dialog_fl_input(const char * m, const char * d) {
-    return fl_input(m, d);
-}
-
-void dialog_fl_message(const char * m) {
-    fl_message(m);
-}
-
-const char * dialog_fl_password(const char * m, const char * d) {
-    return fl_password(m, d);
-}
-
-
-
-
-int dialog_fl_color_chooser(const char * n, double & r, double & g, double & b, int m) {
-    return fl_color_chooser(n, r, g, b, m);
-}
-
-int dialog_fl_color_chooser2(const char * n, uchar & r, uchar & g, uchar & b, int m) {
-    return fl_color_chooser(n, r, g, b, m);
-}
-
-char * dialog_fl_dir_chooser(const char * m, const char * d, int r) {
-    return fl_dir_chooser(m, d, r);
-}
-
-char * dialog_fl_file_chooser(const char * m, const char * p, const char * d, int r) {
-    return fl_file_chooser(m, p, d, r);
-}
-
-
-
-
-int dialog_fl_get_message_hotspot(void) {
-    return fl_message_hotspot();
-}
-
-void dialog_fl_set_message_hotspot(int v) {
-    fl_message_hotspot(v);
-}
-
-void dialog_fl_message_font(int f, int s) {
-    fl_message_font(f, s);
-}
-
-void * dialog_fl_message_icon(void) {
-    return fl_message_icon();
-}
-
-void dialog_fl_message_title(const char * t) {
-    fl_message_title(t);
-}
-
-void dialog_fl_message_title_default(const char * t) {
-    fl_message_title_default(t);
-}
-
-
diff --git a/src/c_fl_dialog.h b/src/c_fl_dialog.h
deleted file mode 100644
index 3991249..0000000
--- a/src/c_fl_dialog.h
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-//  Programmed by Jedidiah Barber
-//  Released into the public domain
-
-
-#ifndef FL_DIALOG_GUARD
-#define FL_DIALOG_GUARD
-
-
-extern "C" void dialog_fl_alert(const char * m);
-//extern "C" int dialog_fl_ask(const char * m);
-extern "C" void dialog_fl_beep(int b);
-extern "C" int dialog_fl_choice(const char * m, const char * a, const char * b, const char * c);
-extern "C" const char * dialog_fl_input(const char * m, const char * d);
-extern "C" void dialog_fl_message(const char * m);
-extern "C" const char * dialog_fl_password(const char * m, const char * d);
-
-
-extern "C" int dialog_fl_color_chooser(const char * n, double & r, double & g, double & b, int m);
-extern "C" int dialog_fl_color_chooser2(const char * n, uchar & r, uchar & g, uchar & b, int m);
-extern "C" char * dialog_fl_dir_chooser(const char * m, const char * d, int r);
-extern "C" char * dialog_fl_file_chooser(const char * m, const char * p, const char * d, int r);
-
-
-extern "C" int dialog_fl_get_message_hotspot(void);
-extern "C" void dialog_fl_set_message_hotspot(int v);
-extern "C" void dialog_fl_message_font(int f, int s);
-extern "C" void * dialog_fl_message_icon(void);
-extern "C" void dialog_fl_message_title(const char * t);
-extern "C" void dialog_fl_message_title_default(const char * t);
-
-
-#endif
-
diff --git a/src/fltk-asks.adb b/src/fltk-asks.adb
index 880c4c8..2a70358 100644
--- a/src/fltk-asks.adb
+++ b/src/fltk-asks.adb
@@ -17,148 +17,427 @@ use type
 package body FLTK.Asks is
 
 
-    procedure dialog_fl_alert
-           (M : in Interfaces.C.char_array);
-    pragma Import (C, dialog_fl_alert, "dialog_fl_alert");
-    pragma Inline (dialog_fl_alert);
+    ------------------------
+    --  Functions From C  --
+    ------------------------
+
+    function fl_ask_get_cancel
+        return Interfaces.C.Strings.chars_ptr;
+    pragma Import (C, fl_ask_get_cancel, "fl_ask_get_cancel");
+    pragma Inline (fl_ask_get_cancel);
+
+    procedure fl_ask_set_cancel
+           (V : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_set_cancel, "fl_ask_set_cancel");
+    pragma Inline (fl_ask_set_cancel);
+
+    function fl_ask_get_close
+        return Interfaces.C.Strings.chars_ptr;
+    pragma Import (C, fl_ask_get_close, "fl_ask_get_close");
+    pragma Inline (fl_ask_get_close);
+
+    procedure fl_ask_set_close
+           (V : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_set_close, "fl_ask_set_close");
+    pragma Inline (fl_ask_set_close);
+
+    function fl_ask_get_no
+        return Interfaces.C.Strings.chars_ptr;
+    pragma Import (C, fl_ask_get_no, "fl_ask_get_no");
+    pragma Inline (fl_ask_get_no);
+
+    procedure fl_ask_set_no
+           (V : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_set_no, "fl_ask_set_no");
+    pragma Inline (fl_ask_set_no);
+
+    function fl_ask_get_ok
+        return Interfaces.C.Strings.chars_ptr;
+    pragma Import (C, fl_ask_get_ok, "fl_ask_get_ok");
+    pragma Inline (fl_ask_get_ok);
+
+    procedure fl_ask_set_ok
+           (V : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_set_ok, "fl_ask_set_ok");
+    pragma Inline (fl_ask_set_ok);
+
+    function fl_ask_get_yes
+        return Interfaces.C.Strings.chars_ptr;
+    pragma Import (C, fl_ask_get_yes, "fl_ask_get_yes");
+    pragma Inline (fl_ask_get_yes);
+
+    procedure fl_ask_set_yes
+           (V : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_set_yes, "fl_ask_set_yes");
+    pragma Inline (fl_ask_set_yes);
+
+
 
-    --  function dialog_fl_ask
-    --         (M : in Interfaces.C.char_array)
-    --      return Interfaces.C.int;
-    --  pragma Import (C, dialog_fl_ask, "dialog_fl_ask");
-    --  pragma Inline (dialog_fl_ask);
 
-    procedure dialog_fl_beep
+    procedure fl_ask_alert
+           (M : in Interfaces.C.char_array);
+    pragma Import (C, fl_ask_alert, "fl_ask_alert");
+    pragma Inline (fl_ask_alert);
+
+    procedure fl_ask_beep
            (B : in Interfaces.C.int);
-    pragma Import (C, dialog_fl_beep, "dialog_fl_beep");
-    pragma Inline (dialog_fl_beep);
+    pragma Import (C, fl_ask_beep, "fl_ask_beep");
+    pragma Inline (fl_ask_beep);
+
+    function fl_ask_choice
+           (M, A : in Interfaces.C.char_array;
+            B, C : in Interfaces.C.Strings.chars_ptr)
+        return Interfaces.C.int;
+    pragma Import (C, fl_ask_choice, "fl_ask_choice");
+    pragma Inline (fl_ask_choice);
 
-    function dialog_fl_choice
-           (M, A, B, C : in Interfaces.C.char_array)
+    function fl_ask_choice_n
+           (M, A : in Interfaces.C.char_array;
+            B, C : in Interfaces.C.Strings.chars_ptr)
         return Interfaces.C.int;
-    pragma Import (C, dialog_fl_choice, "dialog_fl_choice");
-    pragma Inline (dialog_fl_choice);
+    pragma Import (C, fl_ask_choice_n, "fl_ask_choice_n");
+    pragma Inline (fl_ask_choice_n);
 
-    function dialog_fl_input
+    function fl_ask_input
            (M, D : in Interfaces.C.char_array)
         return Interfaces.C.Strings.chars_ptr;
-    pragma Import (C, dialog_fl_input, "dialog_fl_input");
-    pragma Inline (dialog_fl_input);
+    pragma Import (C, fl_ask_input, "fl_ask_input");
+    pragma Inline (fl_ask_input);
 
-    procedure dialog_fl_message
+    procedure fl_ask_message
            (M : in Interfaces.C.char_array);
-    pragma Import (C, dialog_fl_message, "dialog_fl_message");
-    pragma Inline (dialog_fl_message);
+    pragma Import (C, fl_ask_message, "fl_ask_message");
+    pragma Inline (fl_ask_message);
 
-    function dialog_fl_password
+    function fl_ask_password
            (M, D : in Interfaces.C.char_array)
         return Interfaces.C.Strings.chars_ptr;
-    pragma Import (C, dialog_fl_password, "dialog_fl_password");
-    pragma Inline (dialog_fl_password);
+    pragma Import (C, fl_ask_password, "fl_ask_password");
+    pragma Inline (fl_ask_password);
 
 
 
 
-    function dialog_fl_color_chooser
+    function fl_ask_color_chooser
            (N       : in     Interfaces.C.char_array;
             R, G, B : in out Interfaces.C.double;
             M       : in     Interfaces.C.int)
         return Interfaces.C.int;
-    pragma Import (C, dialog_fl_color_chooser, "dialog_fl_color_chooser");
-    pragma Inline (dialog_fl_color_chooser);
+    pragma Import (C, fl_ask_color_chooser, "fl_ask_color_chooser");
+    pragma Inline (fl_ask_color_chooser);
 
-    function dialog_fl_color_chooser2
+    function fl_ask_color_chooser2
            (N       : in     Interfaces.C.char_array;
             R, G, B : in out Interfaces.C.unsigned_char;
             M       : in     Interfaces.C.int)
         return Interfaces.C.int;
-    pragma Import (C, dialog_fl_color_chooser2, "dialog_fl_color_chooser2");
-    pragma Inline (dialog_fl_color_chooser2);
+    pragma Import (C, fl_ask_color_chooser2, "fl_ask_color_chooser2");
+    pragma Inline (fl_ask_color_chooser2);
 
-    function dialog_fl_dir_chooser
+    function fl_ask_dir_chooser
            (M, D : in Interfaces.C.char_array;
             R    : in Interfaces.C.int)
         return Interfaces.C.Strings.chars_ptr;
-    pragma Import (C, dialog_fl_dir_chooser, "dialog_fl_dir_chooser");
-    pragma Inline (dialog_fl_dir_chooser);
+    pragma Import (C, fl_ask_dir_chooser, "fl_ask_dir_chooser");
+    pragma Inline (fl_ask_dir_chooser);
 
-    function dialog_fl_file_chooser
+    function fl_ask_file_chooser
            (M, P, D : in Interfaces.C.char_array;
             R       : in Interfaces.C.int)
         return Interfaces.C.Strings.chars_ptr;
-    pragma Import (C, dialog_fl_file_chooser, "dialog_fl_file_chooser");
-    pragma Inline (dialog_fl_file_chooser);
+    pragma Import (C, fl_ask_file_chooser, "fl_ask_file_chooser");
+    pragma Inline (fl_ask_file_chooser);
+
+    procedure fl_ask_file_chooser_callback
+           (CB : in Storage.Integer_Address);
+    pragma Import (C, fl_ask_file_chooser_callback, "fl_ask_file_chooser_callback");
+    pragma Inline (fl_ask_file_chooser_callback);
 
+    procedure fl_ask_file_chooser_ok_label
+           (L : in Interfaces.C.Strings.chars_ptr);
+    pragma Import (C, fl_ask_file_chooser_ok_label, "fl_ask_file_chooser_ok_label");
+    pragma Inline (fl_ask_file_chooser_ok_label);
 
 
 
-    function dialog_fl_get_message_hotspot
+
+    function fl_ask_get_message_hotspot
         return Interfaces.C.int;
-    pragma Import (C, dialog_fl_get_message_hotspot, "dialog_fl_get_message_hotspot");
-    pragma Inline (dialog_fl_get_message_hotspot);
+    pragma Import (C, fl_ask_get_message_hotspot, "fl_ask_get_message_hotspot");
+    pragma Inline (fl_ask_get_message_hotspot);
 
-    procedure dialog_fl_set_message_hotspot
+    procedure fl_ask_set_message_hotspot
            (V : in Interfaces.C.int);
-    pragma Import (C, dialog_fl_set_message_hotspot, "dialog_fl_set_message_hotspot");
-    pragma Inline (dialog_fl_set_message_hotspot);
+    pragma Import (C, fl_ask_set_message_hotspot, "fl_ask_set_message_hotspot");
+    pragma Inline (fl_ask_set_message_hotspot);
 
-    procedure dialog_fl_message_font
+    procedure fl_ask_message_font
            (F, S : in Interfaces.C.int);
-    pragma Import (C, dialog_fl_message_font, "dialog_fl_message_font");
-    pragma Inline (dialog_fl_message_font);
+    pragma Import (C, fl_ask_message_font, "fl_ask_message_font");
+    pragma Inline (fl_ask_message_font);
 
-    function dialog_fl_message_icon
+    function fl_ask_message_icon
         return Storage.Integer_Address;
-    pragma Import (C, dialog_fl_message_icon, "dialog_fl_message_icon");
-    pragma Inline (dialog_fl_message_icon);
+    pragma Import (C, fl_ask_message_icon, "fl_ask_message_icon");
+    pragma Inline (fl_ask_message_icon);
 
-    procedure dialog_fl_message_title
+    procedure fl_ask_message_title
            (T : in Interfaces.C.char_array);
-    pragma Import (C, dialog_fl_message_title, "dialog_fl_message_title");
-    pragma Inline (dialog_fl_message_title);
+    pragma Import (C, fl_ask_message_title, "fl_ask_message_title");
+    pragma Inline (fl_ask_message_title);
 
-    procedure dialog_fl_message_title_default
+    procedure fl_ask_message_title_default
            (T : in Interfaces.C.char_array);
-    pragma Import (C, dialog_fl_message_title_default, "dialog_fl_message_title_default");
-    pragma Inline (dialog_fl_message_title_default);
+    pragma Import (C, fl_ask_message_title_default, "fl_ask_message_title_default");
+    pragma Inline (fl_ask_message_title_default);
+
+
+
+
+    ---------------------
+    --  Callback Hook  --
+    ---------------------
 
+    procedure File_Chooser_Callback_Hook
+           (C_Str : in Interfaces.C.Strings.chars_ptr);
 
+    pragma Convention (C, File_Chooser_Callback_Hook);
 
+    procedure File_Chooser_Callback_Hook
+           (C_Str : in Interfaces.C.Strings.chars_ptr) is
+    begin
+        if Chooser_Func /= null then
+            Chooser_Func (Interfaces.C.Strings.Value (C_Str));
+        end if;
+    end File_Chooser_Callback_Hook;
+
+
+
+
+    ---------------
+    --  Cleanup  --
+    ---------------
+
+    procedure Finalize
+           (This : in out Dialog_String_Final_Controller)
+    is
+        use Interfaces.C.Strings;
+    begin
+        Free (Cancel_Str);
+        Free (Close_Str);
+        Free (No_Str);
+        Free (OK_Str);
+        Free (Yes_Str);
+        Free (Chooser_OK_Str);
+    end Finalize;
+
+
+
+
+    ------------------
+    --  Attributes  --
+    ------------------
+
+    function Get_Cancel_String
+        return String is
+    begin
+        return Interfaces.C.Strings.Value (fl_ask_get_cancel);
+    end Get_Cancel_String;
+
+
+    procedure Set_Cancel_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (Cancel_Str);
+        Cancel_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_set_cancel (Cancel_Str);
+    end Set_Cancel_String;
+
+
+    function Get_Close_String
+        return String is
+    begin
+        return Interfaces.C.Strings.Value (fl_ask_get_close);
+    end Get_Close_String;
+
+
+    procedure Set_Close_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (Close_Str);
+        Close_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_set_close (Close_Str);
+    end Set_Close_String;
+
+
+    function Get_No_String
+        return String is
+    begin
+        return Interfaces.C.Strings.Value (fl_ask_get_no);
+    end Get_No_String;
+
+
+    procedure Set_No_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (No_Str);
+        No_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_set_no (No_Str);
+    end Set_No_String;
+
+
+    function Get_OK_String
+        return String is
+    begin
+        return Interfaces.C.Strings.Value (fl_ask_get_ok);
+    end Get_OK_String;
+
+
+    procedure Set_OK_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (OK_Str);
+        OK_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_set_ok (OK_Str);
+    end Set_OK_String;
+
+
+    function Get_Yes_String
+        return String is
+    begin
+        return Interfaces.C.Strings.Value (fl_ask_get_yes);
+    end Get_Yes_String;
+
+
+    procedure Set_Yes_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (Yes_Str);
+        Yes_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_set_yes (Yes_Str);
+    end Set_Yes_String;
+
+
+
+
+    ----------------------
+    --  Common Dialogs  --
+    ----------------------
 
     procedure Alert
            (Message : String) is
     begin
-        dialog_fl_alert (Interfaces.C.To_C (Message));
+        fl_ask_alert (Interfaces.C.To_C (Message));
     end Alert;
 
 
-    --  function Ask
-    --         (Message : in String)
-    --      return Boolean is
-    --  begin
-    --      return dialog_fl_ask (Interfaces.C.To_C (Message)) /= 0;
-    --  end Ask;
-
-
     procedure Beep
-           (Kind : in Beep_Kind) is
+           (Kind : in Beep_Kind := Default_Beep) is
     begin
-        dialog_fl_beep (Beep_Kind'Pos (Kind));
+        fl_ask_beep (Beep_Kind'Pos (Kind));
     end Beep;
 
 
-    function Three_Way_Choice
+    function Choice
+           (Message, Button1 : in String)
+        return Choice_Result
+    is
+        Result : Interfaces.C.int := fl_ask_choice
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.Null_Ptr,
+            Interfaces.C.Strings.Null_Ptr);
+    begin
+        return Choice_Result'Val (Result);
+    end Choice;
+
+
+    function Choice
+           (Message, Button1, Button2 : in String)
+        return Choice_Result
+    is
+        Str2 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button2);
+        Result : Interfaces.C.int := fl_ask_choice
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.To_Chars_Ptr (Str2'Unchecked_Access),
+            Interfaces.C.Strings.Null_Ptr);
+    begin
+        return Choice_Result'Val (Result);
+    end Choice;
+
+
+    function Choice
            (Message, Button1, Button2, Button3 : in String)
-        return Choice
+        return Choice_Result
     is
-        Result : Interfaces.C.int := dialog_fl_choice
-               (Interfaces.C.To_C (Message),
-                Interfaces.C.To_C (Button1),
-                Interfaces.C.To_C (Button2),
-                Interfaces.C.To_C (Button3));
+        Str2 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button2);
+        Str3 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button3);
+        Result : Interfaces.C.int := fl_ask_choice
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.To_Chars_Ptr (Str2'Unchecked_Access),
+            Interfaces.C.Strings.To_Chars_Ptr (Str3'Unchecked_Access));
+    begin
+        return Choice_Result'Val (Result);
+    end Choice;
+
+
+    function Extended_Choice
+           (Message, Button1 : in String)
+        return Extended_Choice_Result
+    is
+        Result : Interfaces.C.int := fl_ask_choice_n
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.Null_Ptr,
+            Interfaces.C.Strings.Null_Ptr);
     begin
-        return Choice'Val (Result);
-    end Three_Way_Choice;
+        case Result is
+        when -3 .. -1 => return Extended_Choice_Result'Val (Result + 6);
+        when  0 ..  2 => return Extended_Choice_Result'Val (Result);
+        when others   => raise Program_Error;
+        end case;
+    end Extended_Choice;
+
+
+    function Extended_Choice
+           (Message, Button1, Button2 : in String)
+        return Extended_Choice_Result
+    is
+        Str2 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button2);
+        Result : Interfaces.C.int := fl_ask_choice_n
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.To_Chars_Ptr (Str2'Unchecked_Access),
+            Interfaces.C.Strings.Null_Ptr);
+    begin
+        case Result is
+        when -3 .. -1 => return Extended_Choice_Result'Val (Result + 6);
+        when  0 ..  2 => return Extended_Choice_Result'Val (Result);
+        when others   => raise Program_Error;
+        end case;
+    end Extended_Choice;
+
+
+    function Extended_Choice
+           (Message, Button1, Button2, Button3 : in String)
+        return Extended_Choice_Result
+    is
+        Str2 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button2);
+        Str3 : aliased Interfaces.C.char_array := Interfaces.C.To_C (Button3);
+        Result : Interfaces.C.int := fl_ask_choice_n
+           (Interfaces.C.To_C (Message),
+            Interfaces.C.To_C (Button1),
+            Interfaces.C.Strings.To_Chars_Ptr (Str2'Unchecked_Access),
+            Interfaces.C.Strings.To_Chars_Ptr (Str3'Unchecked_Access));
+    begin
+        case Result is
+        when -3 .. -1 => return Extended_Choice_Result'Val (Result + 6);
+        when  0 ..  2 => return Extended_Choice_Result'Val (Result);
+        when others   => raise Program_Error;
+        end case;
+    end Extended_Choice;
 
 
     function Text_Input
@@ -166,11 +445,11 @@ package body FLTK.Asks is
             Default : in String := "")
         return String
     is
-        Result : Interfaces.C.Strings.chars_ptr := dialog_fl_input
+        Result : Interfaces.C.Strings.chars_ptr := fl_ask_input
                (Interfaces.C.To_C (Message),
                 Interfaces.C.To_C (Default));
     begin
-        --  string does not need dealloc
+        --  Result does not need dealloc
         if Result = Interfaces.C.Strings.Null_Ptr then
             return "";
         else
@@ -182,7 +461,7 @@ package body FLTK.Asks is
     procedure Message_Box
            (Message : in String) is
     begin
-        dialog_fl_message (Interfaces.C.To_C (Message));
+        fl_ask_message (Interfaces.C.To_C (Message));
     end Message_Box;
 
 
@@ -191,11 +470,11 @@ package body FLTK.Asks is
             Default : in String := "")
         return String
     is
-        Result : Interfaces.C.Strings.chars_ptr := dialog_fl_password
+        Result : Interfaces.C.Strings.chars_ptr := fl_ask_password
                (Interfaces.C.To_C (Message),
                 Interfaces.C.To_C (Default));
     begin
-        --  string does not need dealloc
+        --  Result does not need dealloc
         if Result = Interfaces.C.Strings.Null_Ptr then
             return "";
         else
@@ -211,19 +490,25 @@ package body FLTK.Asks is
             R, G, B : in out RGB_Float;
             Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
                 FLTK.Widgets.Groups.Color_Choosers.RGB)
-        return Boolean
+        return Confirm_Result
     is
         C_R : Interfaces.C.double := Interfaces.C.double (R);
         C_G : Interfaces.C.double := Interfaces.C.double (G);
         C_B : Interfaces.C.double := Interfaces.C.double (B);
         M : Interfaces.C.int := FLTK.Widgets.Groups.Color_Choosers.Color_Mode'Pos (Mode);
-        Result : Boolean := dialog_fl_color_chooser
-                (Interfaces.C.To_C (Title), C_R, C_G, C_B, M) /= 0;
+        Result : Interfaces.C.int := fl_ask_color_chooser
+            (Interfaces.C.To_C (Title), C_R, C_G, C_B, M);
     begin
-        R := RGB_Float (C_R);
-        G := RGB_Float (C_G);
-        B := RGB_Float (C_B);
-        return Result;
+        if Result = 1 then
+            R := RGB_Float (C_R);
+            G := RGB_Float (C_G);
+            B := RGB_Float (C_B);
+            return Confirm;
+        elsif Result = 0 then
+            return Cancel;
+        else
+            raise Program_Error;
+        end if;
     end Color_Chooser;
 
 
@@ -232,19 +517,25 @@ package body FLTK.Asks is
             R, G, B : in out RGB_Int;
             Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
                 FLTK.Widgets.Groups.Color_Choosers.RGB)
-        return Boolean
+        return Confirm_Result
     is
         C_R : Interfaces.C.unsigned_char := Interfaces.C.unsigned_char (R);
         C_G : Interfaces.C.unsigned_char := Interfaces.C.unsigned_char (G);
         C_B : Interfaces.C.unsigned_char := Interfaces.C.unsigned_char (B);
         M : Interfaces.C.int := FLTK.Widgets.Groups.Color_Choosers.Color_Mode'Pos (Mode);
-        Result : Boolean := dialog_fl_color_chooser2
-               (Interfaces.C.To_C (Title), C_R, C_G, C_B, M) /= 0;
+        Result : Interfaces.C.int := fl_ask_color_chooser2
+               (Interfaces.C.To_C (Title), C_R, C_G, C_B, M);
     begin
-        R := RGB_Int (C_R);
-        G := RGB_Int (C_G);
-        B := RGB_Int (C_B);
-        return Result;
+        if Result = 1 then
+            R := RGB_Int (C_R);
+            G := RGB_Int (C_G);
+            B := RGB_Int (C_B);
+            return Confirm;
+        elsif Result = 0 then
+            return Cancel;
+        else
+            raise Program_Error;
+        end if;
     end Color_Chooser;
 
 
@@ -253,12 +544,12 @@ package body FLTK.Asks is
             Relative         : in Boolean := False)
         return String
     is
-        Result : Interfaces.C.Strings.chars_ptr := dialog_fl_dir_chooser
+        Result : Interfaces.C.Strings.chars_ptr := fl_ask_dir_chooser
                (Interfaces.C.To_C (Message),
                 Interfaces.C.To_C (Default),
                 Boolean'Pos (Relative));
     begin
-        --  I'm... fairly sure the string does not need dealloc?
+        --  Result does not need dealloc
         if Result = Interfaces.C.Strings.Null_Ptr then
             return "";
         else
@@ -272,13 +563,13 @@ package body FLTK.Asks is
             Relative                         : in Boolean := False)
         return String
     is
-        Result : Interfaces.C.Strings.chars_ptr := dialog_fl_file_chooser
+        Result : Interfaces.C.Strings.chars_ptr := fl_ask_file_chooser
                (Interfaces.C.To_C (Message),
                 Interfaces.C.To_C (Filter_Pattern),
                 Interfaces.C.To_C (Default),
                 Boolean'Pos (Relative));
     begin
-        --  I'm... fairly sure the string does not need dealloc?
+        --  Result does not need dealloc
         if Result = Interfaces.C.Strings.Null_Ptr then
             return "";
         else
@@ -287,27 +578,43 @@ package body FLTK.Asks is
     end File_Chooser;
 
 
+    procedure Set_File_Chooser_Callback
+           (Func : in File_Chooser_Callback) is
+    begin
+        Chooser_Func := Func;
+    end Set_File_Chooser_Callback;
 
 
-    function Get_Hotspot
+    procedure Set_File_Chooser_OK_String
+           (Value : in String) is
+    begin
+        Interfaces.C.Strings.Free (Chooser_OK_Str);
+        Chooser_OK_Str := Interfaces.C.Strings.New_String (Value);
+        fl_ask_file_chooser_ok_label (Chooser_OK_Str);
+    end Set_File_Chooser_OK_String;
+
+
+
+
+    function Get_Message_Hotspot
         return Boolean is
     begin
-        return dialog_fl_get_message_hotspot /= 0;
-    end Get_Hotspot;
+        return fl_ask_get_message_hotspot /= 0;
+    end Get_Message_Hotspot;
 
 
-    procedure Set_Hotspot
+    procedure Set_Message_Hotspot
            (To : in Boolean) is
     begin
-        dialog_fl_set_message_hotspot (Boolean'Pos (To));
-    end Set_Hotspot;
+        fl_ask_set_message_hotspot (Boolean'Pos (To));
+    end Set_Message_Hotspot;
 
 
     procedure Set_Message_Font
            (Font : in Font_Kind;
             Size : in Font_Size) is
     begin
-        dialog_fl_message_font (Font_Kind'Pos (Font), Interfaces.C.int (Size));
+        fl_ask_message_font (Font_Kind'Pos (Font), Interfaces.C.int (Size));
     end Set_Message_Font;
 
 
@@ -321,14 +628,14 @@ package body FLTK.Asks is
     procedure Set_Message_Title
            (To : in String) is
     begin
-        dialog_fl_message_title (Interfaces.C.To_C (To));
+        fl_ask_message_title (Interfaces.C.To_C (To));
     end Set_Message_Title;
 
 
     procedure Set_Message_Title_Default
            (To : in String) is
     begin
-        dialog_fl_message_title_default (Interfaces.C.To_C (To));
+        fl_ask_message_title_default (Interfaces.C.To_C (To));
     end Set_Message_Title_Default;
 
 
@@ -337,9 +644,11 @@ package body FLTK.Asks is
 begin
 
 
-    Wrapper (Icon_Box).Void_Ptr := dialog_fl_message_icon;
+    Wrapper (Icon_Box).Void_Ptr := fl_ask_message_icon;
     Wrapper (Icon_Box).Needs_Dealloc := False;
 
+    fl_ask_file_chooser_callback (Storage.To_Integer (File_Chooser_Callback_Hook'Address));
+
 
 end FLTK.Asks;
 
diff --git a/src/fltk-asks.ads b/src/fltk-asks.ads
index cfe0522..fc6e150 100644
--- a/src/fltk-asks.ads
+++ b/src/fltk-asks.ads
@@ -9,6 +9,11 @@ with
     FLTK.Widgets.Boxes,
     FLTK.Widgets.Groups.Color_Choosers;
 
+private with
+
+    Ada.Finalization,
+    Interfaces.C.Strings;
+
 
 package FLTK.Asks is
 
@@ -17,28 +22,84 @@ package FLTK.Asks is
        (Default_Beep, Message_Beep, Error_Beep,
         Question_Beep, Password_Beep, Notification_Beep);
 
-    type Choice is (First, Second, Third);
+    type Confirm_Result is (Cancel, Confirm);
+
+    type Choice_Result is (First, Second, Third);
+
+    type Extended_Choice_Result is (First, Second, Third, Blocked, Closed, Escaped);
 
     type RGB_Float is new Long_Float range 0.0 .. 1.0;
 
     type RGB_Int is mod 256;
 
+    type File_Chooser_Callback is access procedure
+           (Item : in String);
+
+
+
+
+    function Get_Cancel_String
+        return String;
+
+    procedure Set_Cancel_String
+           (Value : in String);
+
+    function Get_Close_String
+        return String;
+
+    procedure Set_Close_String
+           (Value : in String);
+
+    function Get_No_String
+        return String;
+
+    procedure Set_No_String
+           (Value : in String);
+
+    function Get_OK_String
+        return String;
+
+    procedure Set_OK_String
+           (Value : in String);
+
+    function Get_Yes_String
+        return String;
+
+    procedure Set_Yes_String
+           (Value : in String);
+
 
 
 
     procedure Alert
            (Message : String);
 
-    --  function Ask
-    --         (Message : in String)
-    --      return Boolean;
-
     procedure Beep
-           (Kind : in Beep_Kind);
+           (Kind : in Beep_Kind := Default_Beep);
 
-    function Three_Way_Choice
+    function Choice
+           (Message, Button1 : in String)
+        return Choice_Result;
+
+    function Choice
+           (Message, Button1, Button2 : in String)
+        return Choice_Result;
+
+    function Choice
            (Message, Button1, Button2, Button3 : in String)
-        return Choice;
+        return Choice_Result;
+
+    function Extended_Choice
+           (Message, Button1 : in String)
+        return Extended_Choice_Result;
+
+    function Extended_Choice
+           (Message, Button1, Button2 : in String)
+        return Extended_Choice_Result;
+
+    function Extended_Choice
+           (Message, Button1, Button2, Button3 : in String)
+        return Extended_Choice_Result;
 
     function Text_Input
            (Message : in String;
@@ -61,14 +122,14 @@ package FLTK.Asks is
             R, G, B : in out RGB_Float;
             Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
                 FLTK.Widgets.Groups.Color_Choosers.RGB)
-        return Boolean;
+        return Confirm_Result;
 
     function Color_Chooser
            (Title   : in     String;
             R, G, B : in out RGB_Int;
             Mode    : in     FLTK.Widgets.Groups.Color_Choosers.Color_Mode :=
                 FLTK.Widgets.Groups.Color_Choosers.RGB)
-        return Boolean;
+        return Confirm_Result;
 
     function Dir_Chooser
            (Message, Default : in String;
@@ -80,13 +141,19 @@ package FLTK.Asks is
             Relative                         : in Boolean := False)
         return String;
 
+    procedure Set_File_Chooser_Callback
+           (Func : in File_Chooser_Callback);
 
+    procedure Set_File_Chooser_OK_String
+           (Value : in String);
 
 
-    function Get_Hotspot
+
+
+    function Get_Message_Hotspot
         return Boolean;
 
-    procedure Set_Hotspot
+    procedure Set_Message_Hotspot
            (To : in Boolean);
 
     procedure Set_Message_Font
@@ -109,29 +176,45 @@ private
     Icon_Box : aliased FLTK.Widgets.Boxes.Box;
 
 
+    Cancel_Str, Close_Str, No_Str, OK_Str, Yes_Str : Interfaces.C.Strings.chars_ptr;
+
+    Chooser_OK_Str : Interfaces.C.Strings.chars_ptr;
+    Chooser_Func   : File_Chooser_Callback;
 
 
+    pragma Inline (Get_Cancel_String);
+    pragma Inline (Get_Close_String);
+    pragma Inline (Get_No_String);
+    pragma Inline (Get_OK_String);
+    pragma Inline (Get_Yes_String);
+
     pragma Inline (Alert);
-    --  pragma Inline (Ask);
     pragma Inline (Beep);
-    pragma Inline (Three_Way_Choice);
     pragma Inline (Text_Input);
     pragma Inline (Message_Box);
     pragma Inline (Password);
 
-
     pragma Inline (Color_Chooser);
     pragma Inline (Dir_Chooser);
     pragma Inline (File_Chooser);
+    pragma Inline (Set_File_Chooser_Callback);
 
-
-    pragma Inline (Get_Hotspot);
-    pragma Inline (Set_Hotspot);
+    pragma Inline (Get_Message_Hotspot);
+    pragma Inline (Set_Message_Hotspot);
     pragma Inline (Set_Message_Font);
     pragma Inline (Get_Message_Icon);
     pragma Inline (Set_Message_Title);
     pragma Inline (Set_Message_Title_Default);
 
 
+    --  Needed to ensure chars_ptr storage is properly cleaned up
+    type Dialog_String_Final_Controller is new Ada.Finalization.Controlled with null record;
+
+    overriding procedure Finalize
+           (This : in out Dialog_String_Final_Controller);
+
+    Cleanup : Dialog_String_Final_Controller;
+
+
 end FLTK.Asks;
 
-- 
cgit