ui/motif/window.c

changeset 100
d2bd73d28ff1
parent 29
3fc287f06305
--- a/ui/motif/window.c	Fri Nov 29 22:21:36 2024 +0100
+++ b/ui/motif/window.c	Thu Dec 12 20:01:43 2024 +0100
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright 2014 Olaf Wintermann. All rights reserved.
+ * Copyright 2024 Olaf Wintermann. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -36,6 +36,8 @@
 #include "../ui/window.h"
 #include "../common/context.h"
 
+#include "Grid.h"
+
 #include <cx/mempool.h>
 
 static int nwindows = 0;
@@ -45,17 +47,7 @@
 
 static void window_close_handler(Widget window, void *udata, void *cdata) {
     UiObject *obj = udata;
-    UiEvent ev;
-    ev.window = obj->window;
-    ev.document = obj->ctx->document;
-    ev.obj = obj;
-    ev.eventdata = NULL;
-    ev.intval = 0;
-    
-    if(obj->ctx->close_callback) {
-        obj->ctx->close_callback(&ev, obj->ctx->close_data);
-    }
-    // TODO: free UiObject
+    uic_object_destroy(obj);
     
     nwindows--;
     if(nwindows == 0) {
@@ -63,7 +55,8 @@
     }
 }
 
-static UiObject* create_window(char *title, void *window_data, UiBool simple) {
+
+static UiObject* create_window(const char *title, void *window_data, Boolean simple) {
     CxMempool *mp = cxBasicMempoolCreate(256);
     const CxAllocator *a = mp->allocator;
     UiObject *obj = cxCalloc(a, 1, sizeof(UiObject));
@@ -72,23 +65,20 @@
     
     Arg args[16];
     int n = 0;
-    
-    XtSetArg(args[0], XmNtitle, title);
-    //XtSetArg(args[1], XmNbaseWidth, window_default_width);
-    //XtSetArg(args[2], XmNbaseHeight, window_default_height);
-    XtSetArg(args[1], XmNminWidth, 100);
-    XtSetArg(args[2], XmNminHeight, 50);
-    XtSetArg(args[3], XmNwidth, window_default_width);
-    XtSetArg(args[4], XmNheight, window_default_height);
+    XtSetArg(args[n], XmNtitle, title); n++;
+    XtSetArg(args[n], XmNminWidth, 100); n++;
+    XtSetArg(args[n], XmNminHeight, 50); n++;
+    XtSetArg(args[n], XmNwidth, window_default_width); n++;
+    XtSetArg(args[n], XmNheight, window_default_height); n++;
     
     Widget toplevel = XtAppCreateShell(
-            "Test123",
-            "abc",
+            ui_appname(),
+            "mainwindow",
             //applicationShellWidgetClass,
             vendorShellWidgetClass,
-            ui_get_display(),
+            ui_motif_get_display(),
             args,
-            5);
+            n);
     
     Atom wm_delete_window;
     wm_delete_window = XmInternAtom(
@@ -101,111 +91,30 @@
             window_close_handler,
             obj);
     
-    // TODO: use callback
-    ui_set_active_window(toplevel);
-    
     Widget window = XtVaCreateManagedWidget(
             title,
             xmMainWindowWidgetClass,
             toplevel,
             NULL);
-    obj->widget = window;
-    Widget form = XtVaCreateManagedWidget(
-            "window_form",
-            xmFormWidgetClass,
-            window,
-            NULL);
-    Widget toolbar = NULL;
     
-    if(!simple) {
-        ui_create_menubar(obj);
-        toolbar = ui_create_toolbar(obj, form);
-    }
-    
-    // window content
-    XtSetArg(args[0], XmNshadowType, XmSHADOW_ETCHED_OUT);
-    XtSetArg(args[1], XmNshadowThickness, 0);
-    XtSetArg(args[2], XmNleftAttachment, XmATTACH_FORM);
-    XtSetArg(args[3], XmNrightAttachment, XmATTACH_FORM);
-    XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM);
-    if(toolbar) {
-        XtSetArg(args[5], XmNtopAttachment, XmATTACH_WIDGET);
-        XtSetArg(args[6], XmNtopWidget, toolbar);
-        n = 7;
-    } else {
-        XtSetArg(args[5], XmNtopAttachment, XmATTACH_FORM);
-        n = 6;
-    }
-    Widget frame = XmCreateFrame(form, "content_frame", args, n);
+    // content frame
+    n = 0;
+    Widget frame = XmCreateFrame(window, "window_frame", args, n);
     XtManageChild(frame);
     
-    Widget content_form = XmCreateForm(frame, "content_form", NULL, 0);
-    XtManageChild(content_form);
-    obj->container = ui_box_container(obj, content_form, 0, 0, UI_BOX_VERTICAL);
+    Widget vbox = XtCreateManagedWidget("window_vbox", gridClass, frame, NULL, 0);
+    UiContainerX *container = ui_box_container(obj, vbox, UI_BOX_VERTICAL);
+    uic_object_push_container(obj, container);
     
-    XtManageChild(form);
-      
     obj->widget = toplevel;
     nwindows++;
     return obj;
-}
+} 
 
-UiObject* ui_window(char *title, void *window_data) {
+UiObject* ui_window(const char *title, void *window_data) {
     return create_window(title, window_data, FALSE);
 }
 
-UiObject* ui_simplewindow(char *title, void *window_data) {
+UiObject* ui_simple_window(const char *title, void *window_data) {
     return create_window(title, window_data, TRUE);
 }
-
-void ui_close(UiObject *obj) {
-    XtDestroyWidget(obj->widget);
-    window_close_handler(obj->widget, obj, NULL);
-}
-
-typedef struct FileDialogData {
-    int  running;
-    char *file;
-} FileDialogData;
-
-static void filedialog_select(
-        Widget widget,
-        FileDialogData *data,
-        XmFileSelectionBoxCallbackStruct *selection)
-{
-    char *path = NULL;
-    XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &path);
-    data->running = 0;
-    data->file = strdup(path);
-    XtFree(path);
-    XtUnmanageChild(widget);
-}
-
-static void filedialog_cancel(
-        Widget widget,
-        FileDialogData *data,
-        XmFileSelectionBoxCallbackStruct *selection)
-
-{
-    data->running = 0;
-    XtUnmanageChild(widget);
-}
-
-char* ui_openfiledialog(UiObject *obj) {
-    Widget dialog = XmCreateFileSelectionDialog(obj->widget, "openfiledialog", NULL, 0);
-    XtManageChild(dialog);
-    
-    FileDialogData data;
-    data.running = 1;
-    data.file = NULL;
-    
-    XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)filedialog_select, &data);
-    XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)filedialog_cancel, &data);
-    
-    ui_secondary_event_loop(&data.running);
-    return data.file;
-}
-
-char* ui_savefiledialog(UiObject *obj) {
-    return ui_openfiledialog(obj);
-}

mercurial