Mon, 17 Nov 2025 11:28:47 +0100
implement grid margin (Motif)
| application/main.c | file | annotate | diff | comparison | revisions | |
| ui/motif/Grid.c | file | annotate | diff | comparison | revisions | |
| ui/motif/Grid.h | file | annotate | diff | comparison | revisions | |
| ui/motif/container.c | file | annotate | diff | comparison | revisions | |
| ui/motif/container.h | file | annotate | diff | comparison | revisions |
--- a/application/main.c Mon Nov 17 08:27:03 2025 +0100 +++ b/application/main.c Mon Nov 17 11:28:47 2025 +0100 @@ -1017,6 +1017,20 @@ ui_spinbox(obj, .varname = "num"); } } + + ui_tab(obj, "Tab 5") { + ui_grid(obj, .margin = 0, .columnspacing = 10, .rowspacing = 10) { + ui_button(obj, .label = "Button"); + ui_button(obj, .label = "Button"); + ui_button(obj, .label = "Button"); + ui_newline(obj); + + for(int i=0;i<10;i++) { + ui_button(obj, .label = "Margin", .margin_left = 2*i); + ui_newline(obj); + } + } + } }
--- a/ui/motif/Grid.c Mon Nov 17 08:27:03 2025 +0100 +++ b/ui/motif/Grid.c Mon Nov 17 11:28:47 2025 +0100 @@ -75,12 +75,42 @@ (XtPointer) 0 }, { - gridMargin, - gridMargin, + gridPaddingLeft, + gridPaddingLeft, + XmRDimension, + sizeof (Dimension), + XtOffsetOf( GridRec, + mywidget.padding_left), + XmRImmediate, + (XtPointer) 0 + }, + { + gridPaddingRight, + gridPaddingRight, XmRDimension, sizeof (Dimension), XtOffsetOf( GridRec, - mywidget.margin), + mywidget.padding_right), + XmRImmediate, + (XtPointer) 0 + }, + { + gridPaddingTop, + gridPaddingTop, + XmRDimension, + sizeof (Dimension), + XtOffsetOf( GridRec, + mywidget.padding_top), + XmRImmediate, + (XtPointer) 0 + }, + { + gridPaddingBottom, + gridPaddingBottom, + XmRDimension, + sizeof (Dimension), + XtOffsetOf( GridRec, + mywidget.padding_bottom), XmRImmediate, (XtPointer) 0 } @@ -406,8 +436,8 @@ GridDef *rows = calloc(nrows, sizeof(GridDef)); int num_cols_expanding = 0; int num_rows_expanding = 0; - int req_width = 0; - int req_height = 0; + int req_width = w->mywidget.padding_left + w->mywidget.padding_right; + int req_height = w->mywidget.padding_top + w->mywidget.padding_bottom; //printf("container width: %d\n", (int)w->core.width); @@ -428,6 +458,8 @@ if(constraints->grid.pref_width < constraints->grid.min_width) { constraints->grid.pref_width = constraints->grid.min_width; } + int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right; + int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom; if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) { continue; @@ -489,12 +521,12 @@ span_width = last_col->size; } - int diff = constraints->grid.pref_width - span_width; + int diff = elm_width - span_width; if(diff > 0) { last_col->size += diff; } - } else if(constraints->grid.pref_width > col->size) { - col->size = constraints->grid.pref_width; + } else if(elm_width > col->size) { + col->size = elm_width; } // row size if(constraints->grid.rowspan > 1) { @@ -505,12 +537,12 @@ span_height = last_row->size; } - int diff = constraints->grid.pref_height - span_height; + int diff = elm_height - span_height; if(diff > 0) { last_row->size += diff; } - } else if(constraints->grid.pref_height > row->size) { - row->size = constraints->grid.pref_height; + } else if(elm_height > row->size) { + row->size = elm_height; } } span_max = 50000; // not sure if this is unreasonable low or high @@ -574,7 +606,7 @@ hexpand = width_diff / num_cols_expanding; hexpand2 = width_diff-hexpand*num_cols_expanding; } - int x = 0; + int x = w->mywidget.padding_left; for(int i=0;i<ncols;i++) { cols[i].pos = x; if(cols[i].expand) { @@ -592,7 +624,7 @@ vexpand = height_diff / num_rows_expanding; vexpand2 = height_diff-vexpand*num_rows_expanding; } - int y = 0; + int y = w->mywidget.padding_bottom; for(int i=0;i<nrows;i++) { rows[i].pos = y; if(rows[i].expand) { @@ -608,8 +640,8 @@ GridConstraintRec *constraints = child->core.constraints; GridDef c = cols[constraints->grid.x]; GridDef r = rows[constraints->grid.y]; - int x = c.pos; - int y = r.pos; + int x = c.pos + constraints->grid.margin_left; + int y = r.pos + constraints->grid.margin_top; int width = constraints->grid.pref_width; int height = constraints->grid.pref_height; if(constraints->grid.hfill) {
--- a/ui/motif/Grid.h Mon Nov 17 08:27:03 2025 +0100 +++ b/ui/motif/Grid.h Mon Nov 17 11:28:47 2025 +0100 @@ -42,8 +42,11 @@ // resources #define gridColumnSpacing "gridColumnSpacing" -#define gridRowSpacing "gridRowSpacing" -#define gridMargin "gridMargin" +#define gridRowSpacing "gridRowSpacing" +#define gridPaddingLeft "gridPaddingLeft" +#define gridPaddingRight "gridPaddingRight" +#define gridPaddingTop "gridPaddingTop" +#define gridPaddingBottom "gridPaddingBottom" // constraints #define gridColumn "gridColumn" @@ -81,15 +84,14 @@ typedef struct GridPart { - int margin_left; - int margin_right; - int margin_top; - int margin_bottom; + int padding_left; + int padding_right; + int padding_top; + int padding_bottom; int max_col; int max_row; Dimension columnspacing; Dimension rowspacing; - Dimension margin; Boolean sizerequest; } GridPart;
--- a/ui/motif/container.c Mon Nov 17 08:27:03 2025 +0100 +++ b/ui/motif/container.c Mon Nov 17 11:28:47 2025 +0100 @@ -55,6 +55,18 @@ container->add(container, widget); } +void ui_container_apply_grid_margin( + Arg *args, + int *n, + int margin_left, int margin_right, int margin_top, int margin_bottom) +{ + int c = *n; + XtSetArg(args[c], gridMarginLeft, margin_left); c++; + XtSetArg(args[c], gridMarginRight, margin_right); c++; + XtSetArg(args[c], gridMarginTop, margin_top); c++; + XtSetArg(args[c], gridMarginBottom, margin_bottom); c++; + *n = c; +} /* ---------------------------- Box Container ---------------------------- */ @@ -102,7 +114,7 @@ } static Widget ui_box_container_prepare(UiBoxContainer *box, UiLayout *layout, Arg *args, int *n) { - int a = *n; + ui_container_apply_grid_margin(args, n, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); box->n++; return box->container.widget; } @@ -151,7 +163,10 @@ UiLayout layout = UI_ARGS2LAYOUT(args); Widget parent = ui_container_prepare(ctn, &layout, xargs, &n); - XtSetArg(xargs[n], gridMargin, args->margin); n++; + XtSetArg(xargs[n], gridPaddingLeft, 10); n++; + XtSetArg(xargs[n], gridPaddingRight, 10); n++; + XtSetArg(xargs[n], gridPaddingTop, 10); n++; + XtSetArg(xargs[n], gridPaddingBottom, 10); n++; XtSetArg(xargs[n], gridColumnSpacing, args->columnspacing); n++; XtSetArg(xargs[n], gridRowSpacing, args->rowspacing); n++; Widget grid = XtCreateManagedWidget(args->name ? args->name : "gridcontainer", gridClass, parent, xargs, n); @@ -218,6 +233,7 @@ } *n = a; + ui_container_apply_grid_margin(args, n, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom); return ctn->widget; }
--- a/ui/motif/container.h Mon Nov 17 08:27:03 2025 +0100 +++ b/ui/motif/container.h Mon Nov 17 11:28:47 2025 +0100 @@ -129,6 +129,10 @@ Widget ui_container_prepare(UiContainerPrivate *container, UiLayout *layout, Arg *args, int *n); void ui_container_add(UiContainerPrivate *container, Widget widget); +void ui_container_apply_grid_margin( + Arg *args, + int *n, + int margin_left, int margin_right, int margin_top, int margin_bottom); void ui_motif_tabview_select(UiMotifTabView *tabview, int tab); void ui_motif_tabview_add_tab(UiMotifTabView *tabview, int index, const char *name, Widget child);