--- a/ui/motif/container.c Sun Oct 19 21:20:08 2025 +0200 +++ b/ui/motif/container.c Mon Nov 10 21:52:51 2025 +0100 @@ -227,6 +227,96 @@ 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 -------------------------- */