dialog functions should use arg pointers

Sun, 20 Jul 2025 17:42:11 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 20 Jul 2025 17:42:11 +0200
changeset 675
b612026b060b
parent 674
51670b0bc625
child 676
f0eea815c5ff

dialog functions should use arg pointers

ui/common/args.c file | annotate | diff | comparison | revisions
ui/common/args.h file | annotate | diff | comparison | revisions
ui/gtk/window.c file | annotate | diff | comparison | revisions
ui/ui/window.h file | annotate | diff | comparison | revisions
--- a/ui/common/args.c	Sun Jul 20 14:04:19 2025 +0200
+++ b/ui/common/args.c	Sun Jul 20 17:42:11 2025 +0200
@@ -33,6 +33,156 @@
 
 #include "../ui/container.h"
 
+
+/* ---------------------------- UiDialogArgs ---------------------------- */
+
+UiDialogArgs* ui_dialog_args_new(void) {
+    UiDialogArgs *args = malloc(sizeof(UiDialogArgs));
+    memset(args, 0, sizeof(UiDialogArgs));
+    return args;
+}
+
+void ui_dialog_args_set_title(UiDialogArgs *args, const char *title) {
+    args->title = strdup(title);
+}
+
+void ui_dialog_args_set_content(UiDialogArgs *args, const char *str) {
+    args->content = strdup(str);
+}
+
+void ui_dialog_args_set_button1_label(UiDialogArgs *args, const char *label) {
+    args->button1_label = strdup(label);
+}
+
+void ui_dialog_args_set_button2_label(UiDialogArgs *args, const char *label) {
+    args->button2_label = strdup(label);
+}
+
+void ui_dialog_args_set_closebutton_label(UiDialogArgs *args, const char *label) {
+    args->closebutton_label = strdup(label);
+}
+
+void ui_dialog_args_set_input_value(UiDialogArgs *args, const char *value) {
+    args->input_value = strdup(value);
+}
+
+void ui_dialog_args_set_input(UiDialogArgs *args, UiBool input) {
+    args->input = input;
+}
+
+void ui_dialog_args_set_password(UiDialogArgs *args, UiBool password) {
+    args->password = password;
+}
+
+void ui_dialog_args_set_result(UiDialogArgs *args, ui_callback cb) {
+    args->result = cb;
+}
+
+void ui_dialog_args_set_resultdata(UiDialogArgs *args, void *userdata) {
+    args->resultdata = userdata;
+}
+
+void ui_dialog_args_free(UiDialogArgs *args) {
+    free((void*)args->title);
+    free((void*)args->button1_label);
+    free((void*)args->button2_label);
+    free((void*)args->content);
+    free((void*)args->closebutton_label);
+    free((void*)args->input_value);
+    free(args);
+}
+
+
+/* -------------------------- UiDialogWindowArgs -------------------------- */
+
+UiDialogWindowArgs* ui_dialogwindow_args_new(void) {
+    UiDialogWindowArgs *args = malloc(sizeof(UiDialogWindowArgs));
+    memset(args, 0, sizeof(UiDialogWindowArgs));
+    return args;
+}
+
+void ui_dialogwindow_args_set_modal(UiDialogWindowArgs *args, UiTri value) {
+    args->modal = value;
+}
+
+void ui_dialogwindow_args_set_titlebar_buttons(UiDialogWindowArgs *args, UiTri value) {
+    args->titlebar_buttons = value;
+}
+
+void ui_dialogwindow_args_set_show_closebutton(UiDialogWindowArgs *args, UiTri value) {
+    args->show_closebutton = value;
+}
+
+void ui_dialogwindow_args_set_title(UiDialogWindowArgs *args, const char *title) {
+    args->title = strdup(title);
+}
+
+void ui_dialogwindow_args_set_lbutton1(UiDialogWindowArgs *args, const char *label) {
+    args->lbutton1 = strdup(label);
+}
+
+void ui_dialogwindow_args_set_lbutton2(UiDialogWindowArgs *args, const char *label) {
+    args->lbutton2 = strdup(label);
+}
+
+void ui_dialogwindow_args_set_rbutton3(UiDialogWindowArgs *args, const char *label) {
+    args->rbutton3 = strdup(label);
+}
+
+void ui_dialogwindow_args_set_rbutton4(UiDialogWindowArgs *args, const char *label) {
+    args->rbutton4 = strdup(label);
+}
+
+void ui_dialogwindow_args_set_lbutton1_states(UiDialogWindowArgs *args, const int *states) {
+    // TODO
+}
+
+void ui_dialogwindow_args_set_lbutton2_states(UiDialogWindowArgs *args, const int *states) {
+    // TODO
+}
+
+void ui_dialogwindow_args_set_rbutton3_states(UiDialogWindowArgs *args, const int *states) {
+    // TODO
+}
+
+void ui_dialogwindow_args_set_rbutton4_states(UiDialogWindowArgs *args, const int *states) {
+    // TODO
+}
+
+void ui_dialogwindow_args_set_default_button(UiDialogWindowArgs *args, int button) {
+    args->default_button = button;
+}
+
+void ui_dialogwindow_args_set_width(UiDialogWindowArgs *args, int width) {
+    args->width = width;
+}
+
+void ui_dialogwindow_args_set_height(UiDialogWindowArgs *args, int height) {
+    args->height = height;
+}
+
+void ui_dialogwindow_args_set_onclick(UiDialogWindowArgs *args, ui_callback cb) {
+    args->onclick = cb;
+}
+
+void ui_dialogwindow_args_set_onclickdata(UiDialogWindowArgs *args, void *userdata) {
+    args->onclickdata = userdata;
+}
+
+void ui_dialogwindow_args_free(UiDialogWindowArgs *args) {
+    free((void*)args->title);
+    free((void*)args->lbutton1);
+    free((void*)args->lbutton2);
+    free((void*)args->rbutton3);
+    free((void*)args->rbutton4);
+    free((void*)args->lbutton1_groups);
+    free((void*)args->lbutton2_groups);
+    free((void*)args->rbutton3_groups);
+    free((void*)args->rbutton4_groups);
+    free(args);
+}
+
+
 /* ---------------------------- UiMenuItemArgs ---------------------------- */
 
 UiMenuItemArgs* ui_menuitem_args_new(void) {
--- a/ui/common/args.h	Sun Jul 20 14:04:19 2025 +0200
+++ b/ui/common/args.h	Sun Jul 20 17:42:11 2025 +0200
@@ -29,6 +29,7 @@
 #ifndef UIC_ARGS_H
 #define UIC_ARGS_H
 
+#include "../ui/window.h"
 #include "../ui/container.h"
 #include "../ui/display.h"
 #include "../ui/button.h"
@@ -42,6 +43,38 @@
 extern "C" {
 #endif
 
+UIEXPORT UiDialogArgs* ui_dialog_args_new(void);
+UIEXPORT void ui_dialog_args_set_title(UiDialogArgs *args, const char *title);
+UIEXPORT void ui_dialog_args_set_content(UiDialogArgs *args, const char *str);
+UIEXPORT void ui_dialog_args_set_button1_label(UiDialogArgs *args, const char *label);
+UIEXPORT void ui_dialog_args_set_button2_label(UiDialogArgs *args, const char *label);
+UIEXPORT void ui_dialog_args_set_closebutton_label(UiDialogArgs *args, const char *label);
+UIEXPORT void ui_dialog_args_set_input_value(UiDialogArgs *args, const char *value);
+UIEXPORT void ui_dialog_args_set_input(UiDialogArgs *args, UiBool input);
+UIEXPORT void ui_dialog_args_set_password(UiDialogArgs *args, UiBool password);
+UIEXPORT void ui_dialog_args_set_result(UiDialogArgs *args, ui_callback cb);
+UIEXPORT void ui_dialog_args_set_resultdata(UiDialogArgs *args, void *userdata);
+UIEXPORT void ui_dialog_args_free(UiDialogArgs *args);
+
+UIEXPORT UiDialogWindowArgs* ui_dialogwindow_args_new(void);
+UIEXPORT void ui_dialogwindow_args_set_modal(UiDialogWindowArgs *args, UiTri value);
+UIEXPORT void ui_dialogwindow_args_set_titlebar_buttons(UiDialogWindowArgs *args, UiTri value);
+UIEXPORT void ui_dialogwindow_args_set_show_closebutton(UiDialogWindowArgs *args, UiTri value);
+UIEXPORT void ui_dialogwindow_args_set_title(UiDialogWindowArgs *args, const char *title);
+UIEXPORT void ui_dialogwindow_args_set_lbutton1(UiDialogWindowArgs *args, const char *label);
+UIEXPORT void ui_dialogwindow_args_set_lbutton2(UiDialogWindowArgs *args, const char *label);
+UIEXPORT void ui_dialogwindow_args_set_rbutton3(UiDialogWindowArgs *args, const char *label);
+UIEXPORT void ui_dialogwindow_args_set_rbutton4(UiDialogWindowArgs *args, const char *label);
+UIEXPORT void ui_dialogwindow_args_set_lbutton1_states(UiDialogWindowArgs *args, const int *states);
+UIEXPORT void ui_dialogwindow_args_set_lbutton2_states(UiDialogWindowArgs *args, const int *states);
+UIEXPORT void ui_dialogwindow_args_set_rbutton3_states(UiDialogWindowArgs *args, const int *states);
+UIEXPORT void ui_dialogwindow_args_set_rbutton4_states(UiDialogWindowArgs *args, const int *states);
+UIEXPORT void ui_dialogwindow_args_set_default_button(UiDialogWindowArgs *args, int button);
+UIEXPORT void ui_dialogwindow_args_set_width(UiDialogWindowArgs *args, int width);
+UIEXPORT void ui_dialogwindow_args_set_height(UiDialogWindowArgs *args, int height);
+UIEXPORT void ui_dialogwindow_args_set_onclick(UiDialogWindowArgs *args, ui_callback cb);
+UIEXPORT void ui_dialogwindow_args_set_onclickdata(UiDialogWindowArgs *args, void *userdata);
+UIEXPORT void ui_dialogwindow_args_free(UiDialogWindowArgs *args);
     
 UIEXPORT UiMenuItemArgs* ui_menuitem_args_new(void);
 UIEXPORT void ui_menuitem_args_set_label(UiMenuItemArgs *args, const char *label);
--- a/ui/gtk/window.c	Sun Jul 20 14:04:19 2025 +0200
+++ b/ui/gtk/window.c	Sun Jul 20 17:42:11 2025 +0200
@@ -333,35 +333,35 @@
     }
 }
 
-void ui_dialog_create(UiObject *parent, UiDialogArgs args) {
-    AdwDialog *dialog = adw_alert_dialog_new(args.title, args.content);
+void ui_dialog_create(UiObject *parent, UiDialogArgs *args) {
+    AdwDialog *dialog = adw_alert_dialog_new(args->title, args->content);
     UiEventData *event = malloc(sizeof(UiEventData));
-    event->callback = args.result;
-    event->userdata = args.resultdata;
+    event->callback = args->result;
+    event->userdata = args->resultdata;
     event->customdata = NULL;
     event->customint = 0;
     event->value = 0;
     event->obj = parent;
     
-    if(args.button1_label) {
-        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn1", args.button1_label);
+    if(args->button1_label) {
+        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn1", args->button1_label);
     }
-    if(args.button2_label) {
-        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn2", args.button2_label);
+    if(args->button2_label) {
+        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn2", args->button2_label);
     }
-    if(args.closebutton_label) {
-        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "close", args.closebutton_label);
+    if(args->closebutton_label) {
+        adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "close", args->closebutton_label);
         adw_alert_dialog_set_close_response(ADW_ALERT_DIALOG(dialog), "close");
     }
     
     GtkWidget *entry = NULL;
-    if(args.input || args.password) {
+    if(args->input || args->password) {
         entry = gtk_entry_new();
-        if(args.password) {
+        if(args->password) {
             gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
         }
-        if(args.input_value) {
-            ENTRY_SET_TEXT(entry, args.input_value);
+        if(args->input_value) {
+            ENTRY_SET_TEXT(entry, args->input_value);
         }
         adw_alert_dialog_set_extra_child(ADW_ALERT_DIALOG(dialog), entry);
         event->customdata = entry;
@@ -416,41 +416,41 @@
     gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
     
     GtkWidget *dialog_w = GTK_WIDGET(dialog);
-    if(args.title) {
-        gtk_window_set_title(GTK_WINDOW(dialog), args.title);
+    if(args->title) {
+        gtk_window_set_title(GTK_WINDOW(dialog), args->title);
     }
-    if(args.button1_label) {
-        gtk_dialog_add_button(dialog, args.button1_label, 1);
+    if(args->button1_label) {
+        gtk_dialog_add_button(dialog, args->button1_label, 1);
     }
-    if(args.button2_label) {
-        gtk_dialog_add_button(dialog, args.button2_label, 2);
+    if(args->button2_label) {
+        gtk_dialog_add_button(dialog, args->button2_label, 2);
     }
-    if(args.closebutton_label) {
-        gtk_dialog_add_button(dialog, args.closebutton_label, 0);
+    if(args->closebutton_label) {
+        gtk_dialog_add_button(dialog, args->closebutton_label, 0);
     }
     
     GtkWidget *content_area = gtk_dialog_get_content_area(dialog);
-    if(args.content) {
-        GtkWidget *label = gtk_label_new(args.content);
+    if(args->content) {
+        GtkWidget *label = gtk_label_new(args->content);
         BOX_ADD(content_area, label);
     }
     
     GtkWidget *textfield = NULL;
-    if(args.input || args.password) {
+    if(args->input || args->password) {
         textfield = gtk_entry_new();
-        if(args.password) {
+        if(args->password) {
             gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE);
         }
-        if(args.input_value) {
-            ENTRY_SET_TEXT(textfield, args.input_value);
+        if(args->input_value) {
+            ENTRY_SET_TEXT(textfield, args->input_value);
         }
         BOX_ADD(content_area, textfield);
     }
     
     UiEventData *event = malloc(sizeof(UiEventData));
     event->obj = parent;
-    event->callback = args.result;
-    event->userdata = args.resultdata;
+    event->callback = args->result;
+    event->userdata = args->resultdata;
     event->value = 0;
     event->customdata = textfield;
     
@@ -749,18 +749,18 @@
 
 
 
-UiObject* ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs args) {
+UiObject* ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
     GtkWidget *dialog = DIALOG_NEW();
-    if(args.width > 0 || args.height > 0) {
+    if(args->width > 0 || args->height > 0) {
         gtk_window_set_default_size(
                 GTK_WINDOW(dialog),
-                args.width,
-                args.height);
+                args->width,
+                args->height);
     }
     
     
     gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent->widget));
-    if(args.modal != UI_OFF) {
+    if(args->modal != UI_OFF) {
         gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
     }
     
@@ -770,15 +770,15 @@
     obj->destroy = ui_window_widget_destroy;
     nwindows++;
     
-    if(args.title != NULL) {
-        gtk_window_set_title(GTK_WINDOW(dialog), args.title);
+    if(args->title != NULL) {
+        gtk_window_set_title(GTK_WINDOW(dialog), args->title);
     }
     
 #if ! GTK_CHECK_VERSION(4, 10, 0)
     UiEventData *event = malloc(sizeof(UiEventData));
     event->obj = obj;
-    event->userdata = args.onclickdata;
-    event->callback = args.onclick;
+    event->userdata = args->onclickdata;
+    event->callback = args->onclick;
     event->value = 0;
     event->customdata = NULL;
 
@@ -816,44 +816,44 @@
     
     GtkWidget *content_vbox = ui_gtk_vbox_new(0);
     obj->container = ui_box_container(obj, content_vbox, UI_CONTAINER_VBOX);
-    if(args.lbutton1 || args.lbutton2 || args.rbutton3 || args.rbutton4) {
+    if(args->lbutton1 || args->lbutton2 || args->rbutton3 || args->rbutton4) {
 #if GTK_CHECK_VERSION(3, 10, 0)
-        if(args.titlebar_buttons != UI_OFF) {
+        if(args->titlebar_buttons != UI_OFF) {
             GtkWidget *headerbar = gtk_header_bar_new();
             gtk_window_set_titlebar(GTK_WINDOW(dialog), headerbar);
-            if(args.show_closebutton == UI_OFF) {
+            if(args->show_closebutton == UI_OFF) {
                 HEADERBAR_SHOW_CLOSEBUTTON(headerbar, FALSE);
             }
             
-            if(args.lbutton1) {
-                GtkWidget *button = ui_create_button(obj, args.lbutton1, NULL, args.onclick, args.onclickdata, 1, args.default_button == 1);
+            if(args->lbutton1) {
+                GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
                 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
-                if(args.default_button == 1) {
+                if(args->default_button == 1) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                     DEFAULT_BUTTON(dialog, button);
                 }
             }
-            if(args.lbutton2) {
-                GtkWidget *button = ui_create_button(obj, args.lbutton2, NULL, args.onclick, args.onclickdata, 2, args.default_button == 2);
+            if(args->lbutton2) {
+                GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
                 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
-                if(args.default_button == 2) {
+                if(args->default_button == 2) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                     DEFAULT_BUTTON(dialog, button);
                 }
             }
             
-            if(args.rbutton4) {
-                GtkWidget *button = ui_create_button(obj, args.rbutton4, NULL, args.onclick, args.onclickdata, 4, args.default_button == 4);
+            if(args->rbutton4) {
+                GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
                 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
-                if(args.default_button == 4) {
+                if(args->default_button == 4) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                     DEFAULT_BUTTON(dialog, button);
                 }
             }
-            if(args.rbutton3) {
-                GtkWidget *button = ui_create_button(obj, args.rbutton3, NULL, args.onclick, args.onclickdata, 3, args.default_button == 3);
+            if(args->rbutton3) {
+                GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
                 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
-                if(args.default_button == 3) {
+                if(args->default_button == 3) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                     DEFAULT_BUTTON(dialog, button);
                 }
@@ -871,18 +871,18 @@
         GtkWidget *widget = ui_box_set_margin(grid, 16);
         gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE); 
         
-        if(args.lbutton1) {
-            GtkWidget *button = ui_create_button(obj, args.lbutton1, NULL, args.onclick, args.onclickdata, 1, args.default_button == 1);
+        if(args->lbutton1) {
+            GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
             gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1);
-            if(args.default_button == 1) {
+            if(args->default_button == 1) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                 DEFAULT_BUTTON(dialog, button);
             }
         }
-        if(args.lbutton2) {
-            GtkWidget *button = ui_create_button(obj, args.lbutton2, NULL, args.onclick, args.onclickdata, 2, args.default_button == 2);
+        if(args->lbutton2) {
+            GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
             gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1);
-            if(args.default_button == 2) {
+            if(args->default_button == 2) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                 DEFAULT_BUTTON(dialog, button);
             }
@@ -890,18 +890,18 @@
         GtkWidget *space = gtk_label_new(NULL);
         gtk_widget_set_hexpand(space, TRUE);
         gtk_grid_attach(GTK_GRID(grid), space, 2, 0, 1, 1);
-        if(args.rbutton3) {
-            GtkWidget *button = ui_create_button(obj, args.rbutton3, NULL, args.onclick, args.onclickdata, 3, args.default_button == 3);
+        if(args->rbutton3) {
+            GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
             gtk_grid_attach(GTK_GRID(grid), button, 3, 0, 1, 1);
-            if(args.default_button == 3) {
+            if(args->default_button == 3) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                 DEFAULT_BUTTON(dialog, button);
             }
         }
-        if(args.rbutton4) {
-            GtkWidget *button = ui_create_button(obj, args.rbutton4, NULL, args.onclick, args.onclickdata, 4, args.default_button == 4);
+        if(args->rbutton4) {
+            GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
             gtk_grid_attach(GTK_GRID(grid), button, 4, 0, 1, 1);
-            if(args.default_button == 4) {
+            if(args->default_button == 4) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
                 DEFAULT_BUTTON(dialog, button);
             }
--- a/ui/ui/window.h	Sun Jul 20 14:04:19 2025 +0200
+++ b/ui/ui/window.h	Sun Jul 20 17:42:11 2025 +0200
@@ -75,16 +75,16 @@
 UIEXPORT UiObject *ui_window(const char *title, void *window_data);
 UIEXPORT UiObject *ui_sidebar_window(const char *title, void *window_data);
 UIEXPORT UiObject *ui_simple_window(const char *title, void *window_data);
-UIEXPORT UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs args);
+UIEXPORT UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args);
 
-#define ui_dialog_window(parent, ...) ui_dialog_window_create(parent, (UiDialogWindowArgs){ __VA_ARGS__ });
-#define ui_dialog_window0(parent) ui_dialog_window_create(parent, (UiDialogWindowArgs){ 0 });
+#define ui_dialog_window(parent, ...) ui_dialog_window_create(parent, &(UiDialogWindowArgs){ __VA_ARGS__ });
+#define ui_dialog_window0(parent) ui_dialog_window_create(parent, &(UiDialogWindowArgs){ 0 });
 
 UIEXPORT void ui_window_size(UiObject *obj, int width, int height);
 
-#define ui_dialog(parent, ...) ui_dialog_create(parent, (UiDialogArgs){ __VA_ARGS__ } )
+#define ui_dialog(parent, ...) ui_dialog_create(parent, &(UiDialogArgs){ __VA_ARGS__ } )
 
-UIEXPORT void ui_dialog_create(UiObject *parent, UiDialogArgs args);
+UIEXPORT void ui_dialog_create(UiObject *parent, UiDialogArgs *args);
 
 UIEXPORT void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata);
 UIEXPORT void ui_savefiledialog(UiObject *obj, const char *name, ui_callback file_selected_callback, void *cbdata);

mercurial