]> uap-core.de Git - uwplayer.git/commitdiff
disable old window ui code
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 1 Nov 2025 20:18:10 +0000 (21:18 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 1 Nov 2025 20:18:10 +0000 (21:18 +0100)
application/window.c
ui/cocoa/button.m
ui/cocoa/image.m
ui/common/object.c
ui/common/object.h
ui/motif/container.c
ui/motif/container.h
ui/motif/graphics.c
ui/motif/graphics.h
ui/motif/label.c
ui/motif/label.h

index 4fb66ef69018c351f059abfecb46edb73cd92b45..8e82cb82011c2269a00854fe2f361773cb807789 100644 (file)
@@ -311,6 +311,7 @@ MainWindow* WindowCreate(Display *display) {
 #endif
     }
       
+    /*
     // toplevel window
     n = 0;
     XtSetArg(args[n], XmNtitle, APP_NAME); n++;
@@ -383,10 +384,11 @@ MainWindow* WindowCreate(Display *display) {
     XtAddEventHandler(window->player_widget, PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask |
                  EnterWindowMask | KeyPressMask | KeyReleaseMask |
                   LeaveWindowMask, FALSE, playerEH, window);
+    */
     
      
     // get F keycode
-    keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F"));
+    keycodeF = XKeysymToKeycode(XtDisplay(obj->widget), XStringToKeysym("F"));
     
     
     PlayListInit(window);
@@ -401,7 +403,7 @@ MainWindow* GetMainWindow(void) {
 }
 
 void WindowShow(MainWindow *win) {
-    XtRealizeWidget(win->window);
+    //XtRealizeWidget(win->window);
     ui_show(win->obj);
 }
 
index 4a7f25995f73afd42214f116b452feaba458e828..faa852d9e1d72eb45ee5605fc1bf94d5aed5aaec 100644 (file)
@@ -29,6 +29,7 @@
 #import "button.h"
 #import "EventData.h"
 #import "Container.h"
+#import "image.h"
 #import <objc/runtime.h>
 
 #import <cx/buffer.h>
@@ -41,6 +42,9 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
         NSString *label = [[NSString alloc] initWithUTF8String:args->label];
         button.title = label;
     }
+    if(args->icon) {
+        button.image = ui_cocoa_named_icon(args->icon);;
+    }
     
     if(args->onclick) {
         EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
@@ -72,6 +76,9 @@ UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonTyp
         NSString *label = [[NSString alloc] initWithUTF8String:args->label];
         button.title = label;
     }
+    if(args->icon) {
+        button.image = ui_cocoa_named_icon(args->icon);
+    }
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
index e00c39ad77a041db82051c42b568246774d214a3..7adf301892dd2313f09eb445cdf49d11534dfdb8 100644 (file)
 
 static NSDictionary *standardIconNames;
 
+#define UI_ICON_ENTRY(x) @#x : x
+
 void ui_icon_init(void) {
     standardIconNames = @{
-        @"NSImageNameActionTemplate": NSImageNameActionTemplate,
-        @"NSImageNameAddTemplate": NSImageNameAddTemplate,
-        @"NSImageNameAdvanced": NSImageNameAdvanced,
-        @"NSImageNameApplicationIcon": NSImageNameApplicationIcon,
-        @"NSImageNameBluetoothTemplate": NSImageNameBluetoothTemplate,
-        @"NSImageNameBonjour": NSImageNameBonjour,
-        @"NSImageNameBookmarksTemplate": NSImageNameBookmarksTemplate,
-        @"NSImageNameCaution": NSImageNameCaution,
-        // TODO
-        @"NSImageNameRefreshTemplate": NSImageNameRefreshTemplate,
-        @"NSImageNameFolder": NSImageNameFolder,
-        @"NSImageNameGoForwardTemplate": NSImageNameGoForwardTemplate,
-        @"NSImageNameGoBackTemplate": NSImageNameGoBackTemplate
+        UI_ICON_ENTRY(NSImageNameAddTemplate),
+        UI_ICON_ENTRY(NSImageNameBluetoothTemplate),
+        UI_ICON_ENTRY(NSImageNameBonjour),
+        UI_ICON_ENTRY(NSImageNameBookmarksTemplate),
+        UI_ICON_ENTRY(NSImageNameCaution),
+        UI_ICON_ENTRY(NSImageNameComputer),
+        UI_ICON_ENTRY(NSImageNameEnterFullScreenTemplate),
+        UI_ICON_ENTRY(NSImageNameExitFullScreenTemplate),
+        UI_ICON_ENTRY(NSImageNameFolder),
+        UI_ICON_ENTRY(NSImageNameFolderBurnable),
+        UI_ICON_ENTRY(NSImageNameFolderSmart),
+        UI_ICON_ENTRY(NSImageNameFollowLinkFreestandingTemplate),
+        UI_ICON_ENTRY(NSImageNameHomeTemplate),
+        UI_ICON_ENTRY(NSImageNameIChatTheaterTemplate),
+        UI_ICON_ENTRY(NSImageNameLockLockedTemplate),
+        UI_ICON_ENTRY(NSImageNameLockUnlockedTemplate),
+        UI_ICON_ENTRY(NSImageNameNetwork),
+        UI_ICON_ENTRY(NSImageNamePathTemplate),
+        UI_ICON_ENTRY(NSImageNameQuickLookTemplate),
+        UI_ICON_ENTRY(NSImageNameRefreshFreestandingTemplate),
+        UI_ICON_ENTRY(NSImageNameRefreshTemplate),
+        UI_ICON_ENTRY(NSImageNameRemoveTemplate),
+        UI_ICON_ENTRY(NSImageNameRevealFreestandingTemplate),
+        UI_ICON_ENTRY(NSImageNameShareTemplate),
+        UI_ICON_ENTRY(NSImageNameSlideshowTemplate),
+        UI_ICON_ENTRY(NSImageNameStatusAvailable),
+        UI_ICON_ENTRY(NSImageNameStatusNone),
+        UI_ICON_ENTRY(NSImageNameStatusPartiallyAvailable),
+        UI_ICON_ENTRY(NSImageNameStatusUnavailable),
+        UI_ICON_ENTRY(NSImageNameStopProgressFreestandingTemplate),
+        UI_ICON_ENTRY(NSImageNameStopProgressTemplate),
+        UI_ICON_ENTRY(NSImageNameTrashEmpty),
+        UI_ICON_ENTRY(NSImageNameTrashFull),
+        UI_ICON_ENTRY(NSImageNameActionTemplate),
+        UI_ICON_ENTRY(NSImageNameSmartBadgeTemplate),
+        UI_ICON_ENTRY(NSImageNameIconViewTemplate),
+        UI_ICON_ENTRY(NSImageNameListViewTemplate),
+        UI_ICON_ENTRY(NSImageNameColumnViewTemplate),
+        UI_ICON_ENTRY(NSImageNameFlowViewTemplate),
+        UI_ICON_ENTRY(NSImageNameInvalidDataFreestandingTemplate),
+        UI_ICON_ENTRY(NSImageNameGoForwardTemplate),
+        UI_ICON_ENTRY(NSImageNameGoBackTemplate),
+        UI_ICON_ENTRY(NSImageNameGoRightTemplate),
+        UI_ICON_ENTRY(NSImageNameGoLeftTemplate),
+        UI_ICON_ENTRY(NSImageNameRightFacingTriangleTemplate),
+        UI_ICON_ENTRY(NSImageNameLeftFacingTriangleTemplate),
+        UI_ICON_ENTRY(NSImageNameMobileMe),
+        UI_ICON_ENTRY(NSImageNameMultipleDocuments),
+        UI_ICON_ENTRY(NSImageNameUserAccounts),
+        UI_ICON_ENTRY(NSImageNamePreferencesGeneral),
+        UI_ICON_ENTRY(NSImageNameAdvanced),
+        UI_ICON_ENTRY(NSImageNameInfo),
+        UI_ICON_ENTRY(NSImageNameFontPanel),
+        UI_ICON_ENTRY(NSImageNameColorPanel),
+        UI_ICON_ENTRY(NSImageNameUser),
+        UI_ICON_ENTRY(NSImageNameUserGroup),
+        UI_ICON_ENTRY(NSImageNameEveryone),
+        UI_ICON_ENTRY(NSImageNameUserGuest),
+        UI_ICON_ENTRY(NSImageNameMenuOnStateTemplate),
+        UI_ICON_ENTRY(NSImageNameMenuMixedStateTemplate),
+        UI_ICON_ENTRY(NSImageNameApplicationIcon)
     };
 }
 
index 4c41e28ea2d2630af32cc74bc5a267bc8c78e8e0..b041bc9b22b4bf25c07902cc2b753d07d51a97fe 100644 (file)
@@ -144,4 +144,29 @@ void uic_object_pop_container(UiObject *toplevel) {
     } else {
         toplevel->container_begin = NULL;
     }
+    
+    // TODO: free container?
+}
+
+/*
+ * This might look like a weird function, but in case a container creates a
+ * sub-container, 2 container objects are added to the list, however we want
+ * only one container, otherwise ui_container_finish() would not work
+ */
+void uic_object_remove_second_last_container(UiObject *toplevel) {
+    if(toplevel->container_end && toplevel->container_end->prev) {
+        UiContainerX *end = toplevel->container_end;
+        UiContainerX *rm = toplevel->container_end->prev;
+        
+        end->prev = rm->prev;
+        if(rm->prev) {
+            rm->prev->next = end;
+        } else {
+            toplevel->container_begin = end;
+        }
+        
+        // TODO: free container?
+    } else {
+        fprintf(stderr, "Error: uic_object_remove_second_last_container expected at least 2 containers\n");
+    }
 }
index a899a8346b41eaa3a032efad37b3962bbfbd88eb..e6dd3c3e2ddf8c2aaf63316766455d534e2c400e 100644 (file)
@@ -51,6 +51,7 @@ UiObject* uic_ctx_object_new(UiContext *ctx, UIWIDGET widget);
 
 void uic_object_push_container(UiObject *toplevel, UiContainerX *newcontainer);
 void uic_object_pop_container(UiObject *toplevel);
+void uic_object_remove_second_last_container(UiObject *toplevel);
 
 
 
index 444bedbc19d6fade55fd6d3f456cffe80d4eca83..cce99b6960f0ed2aeef7112879035624110a7bc7 100644 (file)
@@ -227,6 +227,96 @@ void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget) {
     grid->container.container.newline = FALSE;
 }
 
+/* -------------------------- Frame Container -------------------------- */
+
+UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
+    Arg xargs[16];
+    int n = 0;
+    
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
+    
+    char *name = args->name ? (char*)args->name : "frame";
+    Widget frame = XmCreateFrame(parent, name, xargs, 6);
+    XtManageChild(frame);
+    ui_container_add(ctn, frame);
+    
+    if(args->label) {
+        XmString s = XmStringCreateLocalized((char*)args->label);
+        n = 0;
+        XtSetArg(xargs[n], XmNlabelString, s); n++;
+        XtSetArg(xargs[n], XmNchildType, XmFRAME_TITLE_CHILD); n++;
+        Widget label = XmCreateLabel(frame, "frame_label", xargs, n);
+        XtManageChild(label);
+        XmStringFree(s);
+    }
+    
+    UiContainerX *container = ui_frame_container(obj, frame);
+    uic_object_push_container(obj, container);
+    
+    UiContainerArgs sub_args = {
+        .spacing = args->spacing,
+        .columnspacing = args->columnspacing,
+        .rowspacing = args->rowspacing
+    };
+    switch(args->subcontainer) {
+        default: break;
+        case UI_CONTAINER_VBOX: {
+            ui_vbox_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+        case UI_CONTAINER_HBOX: {
+            ui_hbox_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+        case UI_CONTAINER_GRID: {
+            ui_grid_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+    }
+    
+    
+    return frame;
+}
+
+UiContainerX* ui_frame_container(UiObject *obj, Widget frame) {
+    UiContainerPrivate *ctn = ui_malloc(obj->ctx, sizeof(UiContainerPrivate));
+    memset(ctn, 0, sizeof(UiContainerPrivate));
+    ctn->prepare = ui_frame_container_prepare;
+    ctn->add = ui_frame_container_add;
+    ctn->widget = frame;
+    return (UiContainerX*)ctn;
+}
+
+Widget ui_frame_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
+    int a = *n;
+    XtSetArg(args[a], XmNchildType, XmFRAME_WORKAREA_CHILD);
+    *n = a+1;
+    return ctn->widget;
+}
+
+void ui_frame_container_add(UiContainerPrivate *ctn, Widget widget) {
+    // NOOP
+}
+
+/* -------------------------- SplitPane -------------------------- */
+
+UIWIDGET ui_splitpane_create(UiObject *obj, UiSplitPaneArgs *args, int orientation) {
+    return NULL; // TODO
+}
+
+UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
+    return ui_splitpane_create(obj, args, XmHORIZONTAL);
+}
+
+UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
+    return ui_splitpane_create(obj, args, XmVERTICAL);
+}
 
 /* -------------------------- TabView Container -------------------------- */
 
index 9dd73cc806e0adcbc0893f400d03d92df1ffd6cd..e6fe42203a6e5031ab5bac1ec280769905866e8c 100644 (file)
@@ -156,6 +156,10 @@ UiContainerX* ui_grid_container(
 Widget ui_grid_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
 void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget);
 
+UiContainerX* ui_frame_container(UiObject *obj, Widget frame);
+Widget ui_frame_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
+void ui_frame_container_add(UiContainerPrivate *ctn, Widget widget);
+
 #ifdef __cplusplus
 }
 #endif
index fab993067fd2a78dd5bf08485cc1097ca8100772..2863695cbcdd9b90e665d9fbebad8647571c7a46 100644 (file)
 #include "graphics.h"
 
 #include "container.h"
+
+UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) {
+    Arg xargs[16];
+    int n = 0;
+    
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
+    char *name = args->name ? (char*)args->name : "drawingarea";
+    
+    Widget widget = XmCreateDrawingArea(parent, name, xargs, n);
+    XtManageChild(widget);
+    ui_container_add(ctn, widget);
+    
+    UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea));
+    drawingarea->obj = obj;
+    drawingarea->draw = args->draw;
+    drawingarea->drawdata = args->drawdata;
+    drawingarea->onclick = args->onclick;
+    drawingarea->onclickdata = args->onclickdata;
+    drawingarea->onmotion = args->onmotion;
+    drawingarea->onmotiondata = args->onmotiondata;
+    drawingarea->gc = NULL;
+    
+    XtAddCallback(
+                widget,
+                XmNdestroyCallback,
+                (XtCallbackProc)ui_drawingarea_destroy,
+                drawingarea);
+    XtAddCallback(
+                widget,
+                XmNexposeCallback,
+                (XtCallbackProc)ui_drawingarea_expose,
+                drawingarea);
+    
+    return widget;
+}
+
+void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d) {
+    if(drawingarea->gc) {
+        XFreeGC(XtDisplay(w), drawingarea->gc);
+    }
+    free(drawingarea);
+}
+
+void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d) {
+    Display *dp = XtDisplay(w);
+    
+    if(!drawingarea->gc) {
+        XGCValues gcvals;
+        gcvals.foreground = BlackPixelOfScreen(XtScreen(w));
+        drawingarea->gc = XCreateGC(dp, XtWindow(w), (GCForeground), &gcvals);
+    }
+    
+    if(drawingarea->draw) {
+        UiEvent event;
+        event.obj = drawingarea->obj;
+        event.window = event.obj->window;
+        event.document = event.obj->ctx->document;
+        event.eventdata = NULL;
+        event.eventdatatype = 0;
+        event.intval = 0;
+        event.set = 0;
+        
+        UiXlibGraphics g;
+        g.g.width = w->core.width;
+        g.g.height = w->core.height;
+        g.widget = w;
+        g.display = dp;
+        g.colormap = w->core.colormap;
+        g.gc = drawingarea->gc;
+        
+        drawingarea->draw(&event, (UiGraphics*)&g, drawingarea->drawdata);
+    }
+}
+
+void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) {
+    
+}
+
+void ui_drawingarea_redraw(UIWIDGET drawingarea) {
+    
+}
index addec590efecd5b0ef256c6f2b9a6dbb7f96f738..82b533ebf6bb5309af2cae3ce9838cf69f5f7d24 100644 (file)
 #ifdef __cplusplus
 extern "C" {
 #endif
+    
+typedef struct UiDrawingArea {
+    UiObject *obj;
+    ui_drawfunc draw;
+    void *drawdata;
+    ui_callback onclick;
+    void *onclickdata;
+    ui_callback onmotion;
+    void *onmotiondata;
+    
+    GC gc;
+} UiDrawingArea;
 
+typedef struct UiXlibGraphics {
+    UiGraphics g;
+    Display    *display;
+    Widget     widget;
+    Colormap   colormap;
+    GC         gc;
+} UiXlibGraphics;
+
+void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d);
+
+void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d);
 
 
 #ifdef __cplusplus
index 749c9e3eff9aebf3ad19c2fef8d66a30db1952ca..48be0034e0dcc834abc5162507cea062fd7f4dc2 100644 (file)
@@ -47,17 +47,34 @@ static UIWIDGET label_create(UiObject *obj, UiLabelArgs *args, int align) {
     
     XtSetArg(xargs[n], XmNalignment, align); n++;
     XmString label = NULL;
-    if(args->label) {
-        label = XmStringCreateLocalized((char*)args->label);
-        XtSetArg(xargs[n], XmNlabelString, label); n++;
+    char *lbl = (char*)args->label;
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
+    if(var) {
+        UiString *s = var->value;
+        lbl = s->value.ptr;    
+    }
+    
+    if(lbl) {
+        label = XmStringCreateLocalized(lbl); 
+    } else {
+        label = XmStringCreateLocalized("");
     }
     
+    XtSetArg(xargs[n], XmNlabelString, label); n++;
     char *name = args->name ? (char*)args->name : "label";
     Widget w = XmCreateLabel(parent, name, xargs, n);
     XtManageChild(w);
     ui_container_add(ctn, w);
       
     XmStringFree(label);
+    
+    if(var) {
+        UiString *s = var->value;
+        s->obj = w;
+        s->get = ui_label_get;
+        s->set = ui_label_set;
+    }
+    
     return w;
 } 
 
@@ -73,6 +90,36 @@ UIWIDGET ui_rlabel_create(UiObject* obj, UiLabelArgs *args) {
     return label_create(obj, args, XmALIGNMENT_END);
 }
 
+char* ui_label_get(UiString *s) {
+    if(s->value.free) {
+        s->value.free(s->value.ptr);
+        s->value.free = NULL;
+        s->value.ptr = NULL;
+    }
+    Widget w = s->obj;
+    XmString s1 = NULL;
+    XtVaGetValues(w, XmNlabelString, &s1, NULL);
+    if(s1) {
+        char *value;
+        if(XmStringGetLtoR(s1, XmFONTLIST_DEFAULT_TAG, &value)) {
+            s->value.ptr = value;
+            s->value.free = (cx_destructor_func)XtFree;
+        }
+    }
+    return s->value.ptr;
+}
+
+void ui_label_set(UiString *s, const char *str) {
+    if(s->value.free) {
+        s->value.free(s->value.ptr);
+        s->value.free = NULL;
+        s->value.ptr = NULL;
+    }
+    Widget w = s->obj;
+    XmString s1 = XmStringCreateLocalized(str ? (char*)str : "");
+    XtVaSetValues(w, XmNlabelString, s1, NULL);
+    XmStringFree(s1);
+}
 
 /* -------------------------- progressbar/spiner -------------------------- */
 
index a79dd64555aacc0209996021af209265f7af348b..8d7ca0feb75c73f92b3e428781893a382c470d55 100644 (file)
@@ -46,6 +46,8 @@ typedef struct UiProgressBar {
     Pixel color;
 } UiProgressBar;
 
+char* ui_label_get(UiString *s);
+void ui_label_set(UiString *s, const char *str);
 
 double ui_progressbar_get(UiDouble *d);
 void ui_progressbar_set(UiDouble *d, double value);