From: Olaf Wintermann Date: Sat, 1 Nov 2025 20:18:10 +0000 (+0100) Subject: disable old window ui code X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;p=uwplayer.git disable old window ui code --- diff --git a/application/window.c b/application/window.c index 4fb66ef..8e82cb8 100644 --- a/application/window.c +++ b/application/window.c @@ -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); } diff --git a/ui/cocoa/button.m b/ui/cocoa/button.m index 4a7f259..faa852d 100644 --- a/ui/cocoa/button.m +++ b/ui/cocoa/button.m @@ -29,6 +29,7 @@ #import "button.h" #import "EventData.h" #import "Container.h" +#import "image.h" #import #import @@ -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) { diff --git a/ui/cocoa/image.m b/ui/cocoa/image.m index e00c39a..7adf301 100644 --- a/ui/cocoa/image.m +++ b/ui/cocoa/image.m @@ -30,21 +30,71 @@ 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) }; } diff --git a/ui/common/object.c b/ui/common/object.c index 4c41e28..b041bc9 100644 --- a/ui/common/object.c +++ b/ui/common/object.c @@ -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"); + } } diff --git a/ui/common/object.h b/ui/common/object.h index a899a83..e6dd3c3 100644 --- a/ui/common/object.h +++ b/ui/common/object.h @@ -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); diff --git a/ui/motif/container.c b/ui/motif/container.c index 444bedb..cce99b6 100644 --- a/ui/motif/container.c +++ b/ui/motif/container.c @@ -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 -------------------------- */ diff --git a/ui/motif/container.h b/ui/motif/container.h index 9dd73cc..e6fe422 100644 --- a/ui/motif/container.h +++ b/ui/motif/container.h @@ -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 diff --git a/ui/motif/graphics.c b/ui/motif/graphics.c index fab9930..2863695 100644 --- a/ui/motif/graphics.c +++ b/ui/motif/graphics.c @@ -34,3 +34,87 @@ #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) { + +} diff --git a/ui/motif/graphics.h b/ui/motif/graphics.h index addec59..82b533e 100644 --- a/ui/motif/graphics.h +++ b/ui/motif/graphics.h @@ -35,7 +35,30 @@ #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 diff --git a/ui/motif/label.c b/ui/motif/label.c index 749c9e3..48be003 100644 --- a/ui/motif/label.c +++ b/ui/motif/label.c @@ -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 -------------------------- */ diff --git a/ui/motif/label.h b/ui/motif/label.h index a79dd64..8d7ca0f 100644 --- a/ui/motif/label.h +++ b/ui/motif/label.h @@ -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);