ui/motif/window.c

changeset 925
df27741d02b5
parent 924
6c6e97e06009
child 926
32b16cbca280
--- a/ui/motif/window.c	Sat Nov 22 18:40:24 2025 +0100
+++ b/ui/motif/window.c	Sun Nov 23 08:35:40 2025 +0100
@@ -37,6 +37,7 @@
 #include "../common/context.h"
 
 #include "Grid.h"
+#include "Fsb.h"
 
 #include <cx/mempool.h>
 
@@ -142,3 +143,72 @@
 UiObject* ui_simple_window(const char *title, void *window_data) {
     return create_window(title, window_data, TRUE);
 }
+
+static void filedialog_event(UiEventData *event, int result, UiFileList flist) {
+    UiEvent evt;
+    evt.obj = event->obj;
+    evt.document = evt.obj->ctx->document;
+    evt.window = evt.obj->window;
+    evt.intval = result;
+    
+    evt.eventdata = &flist;
+    evt.eventdatatype = UI_EVENT_DATA_FILE_LIST;
+    
+    if(event->callback) {
+        event->callback(&evt, event->userdata);
+    }
+}
+
+static void filedialog_select(
+        Widget widget,
+        UiEventData *data,
+        XmFileSelectionBoxCallbackStruct *selection)
+{
+    UiFileList flist;
+    
+    char *value = NULL;
+    XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &value);
+    flist.files = &value;
+    flist.nfiles = 1;
+    
+    filedialog_event(data, 1, flist);
+    
+    XtFree(value);
+    
+    XtUnmanageChild(widget);
+    XtDestroyWidget(widget);
+}
+
+static void filedialog_cancel(
+        Widget widget,
+        UiEventData *data,
+        XmFileSelectionBoxCallbackStruct *selection)
+{
+    UiFileList flist;
+    flist.files = NULL;
+    flist.nfiles = 0;
+    filedialog_event(data, 0, flist);
+    
+    XtUnmanageChild(widget);
+    XtDestroyWidget(widget);
+}
+
+void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) {
+    Widget dialog = XnCreateFileSelectionDialog(obj->widget, "dialog", NULL, 0);
+    
+    UiEventData *data = malloc(sizeof(UiEventData));
+    memset(data, 0, sizeof(UiEventData));
+    data->obj = obj;
+    data->callback = file_selected_callback;
+    data->userdata = cbdata;
+    
+    XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)filedialog_select, data);
+    XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)filedialog_cancel, data);
+    //XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc)filedialog_help, wd);
+    
+    XtManageChild(dialog);
+}
+
+void ui_savefiledialog(UiObject *obj, const char *name, ui_callback file_selected_callback, void *cbdata) {
+    
+}

mercurial