commit - d7667be892b6c39aa9a1f7ff16e3ee996a9b0b0b
commit + 5a91456705cbad9b60a5a8bdb2e2d312139f1b9a
blob - 23726f477429dbcce18c8e990451b9de4f169f21
blob + 456d9eb5f774977bd662cccd0aaec64462564ce3
--- aui.h
+++ aui.h
unsigned int row;
unsigned int columnspan;
unsigned int rowspan;
- unsigned int ipadx; /* Internal padding X */
- unsigned int ipady; /* Internal padding Y */
- unsigned int padx;
- unsigned int pady;
+ unsigned char sticky;
};
-struct aui_rowpar {
+struct aui_gridconfigure {
unsigned int minsize;
- unsigned char weight; /* Minimum is 1 */
- unsigned char uniform;
- unsigned int pad;
+ unsigned char weight;
};
-struct aui_columnpar {
- unsigned int minsize;
- unsigned char weight; /* Minimum is 1 */
- unsigned char uniform;
- unsigned int pad;
-};
-
struct aui_widget;
struct aui_window;
struct aui_frame;
/*
* Grid container operations
*/
-int aui_rowconfigure(struct aui_widget *, struct aui_rowpar *);
-int aui_columnconfigure(struct aui_widget *, struct aui_columnpar *);
+int aui_rowconfigure(struct aui_widget *, int, struct aui_gridconfigure *);
+int aui_columnconfigure(struct aui_widget *, int, struct aui_gridconfigure *);
#define AUI_CANVAS_RECTANGLE 0
#define AUI_CANVAS_ARC 1
blob - 27247026aac62a520238719eea0fa73522bf1522
blob + 3351733279b5a3765dab3eea8876a9cc1319ffb8
--- aui_run.3
+++ aui_run.3
-.Dd $Mdocdate: July 14 2026$
+.Dd $Mdocdate: July 30 2026$
.Dt AUI_RUN 3
.Os
.Sh NAME
.Fn aui_getgridpar "struct aui_widget * widget"
.Ft int
.Fn aui_getpackpar "struct aui_widget * widget"
+.Ft int
+.Fn aui_columnconfigure "struct aui_widget * widget" "int index" "struct aui_gridconfigure * config"
+.Ft int
+.Fn aui_rowconfigure "struct aui_widget * widget" "int index" "struct aui_gridconfigure * config"
.Sh DESCRIPTION
Assides for windows, every widget must take a container in order to be
created. The containers can be a window or a frame. Once a widget is
blob - b831bfede94fa9091f932ac551253007c170c259
blob + 610f28e9e1c67ac1f9af5dd6eaccd5f57aca9962
--- layout.c
+++ layout.c
.row = 0,
.columnspan = 1,
.rowspan = 1,
- .ipadx = 0,
- .ipady = 0,
- .padx = 0,
- .pady = 0
};
-static struct aui_rowpar default_rowconfigure = {
+static struct aui_gridconfigure default_gridconfigure = {
.minsize = 0,
.weight = 0,
- .uniform = 0,
- .pad = 0,
};
-static struct aui_columnpar default_columnconfigure = {
- .minsize = 0,
- .weight = 0,
- .uniform = 0,
- .pad = 0,
-};
-
static int
can_add(struct aui_widget *widget, enum aui_layout_type type)
{
grid(struct aui_widget *widget)
{
struct aui_container *con = (struct aui_container *)widget;
- uint8_t *rmap = con->row_maps;
- uint8_t *cmap = con->col_maps;
+ unsigned int column_weights = 0;
+ unsigned int row_weights = 0;
struct aui_widget *child;
+ unsigned int height = 0;
+ unsigned int width = 0;
+ int extra_w, extra_h;
unsigned int *rsize = con->row_sizes;
unsigned int *csize = con->col_sizes;
-
- memset(con->row_maps, 0, sizeof(*con->row_maps) * con->grid_size[1]);
- memset(con->col_maps, 0, sizeof(*con->col_maps) * con->grid_size[0]);
-
- memset(con->row_sizes, 0, sizeof(*con->row_sizes) * con->grid_size[1]);
- memset(con->col_sizes, 0, sizeof(*con->col_sizes) * con->grid_size[0]);
-
- TAILQ_FOREACH(child, &widget->queue, entries) {
- if (child->mapped == 0)
- continue;
-
- struct aui_geometry min = child->ops->get_min_size(child);
-
- rmap[child->gridpar.row] = 1;
- cmap[child->gridpar.column] = 1;
-
- rsize[child->gridpar.row] = (rsize[child->gridpar.row] < min.height) ?
- min.height : rsize[child->gridpar.row];
-
- csize[child->gridpar.column] = (csize[child->gridpar.column] < min.width) ?
- min.width : csize[child->gridpar.column];
- }
-
unsigned int *rpos = con->row_pos;
unsigned int *cpos = con->col_pos;
- unsigned int rowdt = 0;
- unsigned int coldt = 0;
+ memset(rsize, 0, sizeof(*rsize) * con->grid_size[1]);
+ memset(csize, 0, sizeof(*csize) * con->grid_size[0]);
- for (int r = 0; r < con->grid_size[1]; r++) {
- rpos[r] = rowdt;
- rowdt = (rmap[r] == 1) ? rowdt + rsize[r] : rowdt;
+ memset(cpos, 0, sizeof(*cpos) * con->grid_size[0]);
+ memset(rpos, 0, sizeof(*rpos) * con->grid_size[1]);
+
+ /*
+ * Setting up the minimum dimensions and getting the
+ * extra space for distribution.
+ */
+ for (int i = 0; i < con->grid_size[0]; i++) {
+ column_weights += con->columnconfigure[i].weight;
+ csize[i] = con->columnconfigure[i].minsize;
+ width += csize[i];
}
- for (int c = 0; c < con->grid_size[0]; c++) {
- cpos[c] = coldt;
- coldt = (cmap[c] == 1) ? coldt + csize[c] : coldt;
+ for (int i = 0; i < con->grid_size[1]; i++) {
+ row_weights += con->rowconfigure[i].weight;
+ rsize[i] = con->rowconfigure[i].minsize;
+ height += rsize[i];
}
TAILQ_FOREACH(child, &widget->queue, entries) {
continue;
struct aui_geometry min = child->ops->get_min_size(child);
- struct aui_geometry geom = { 0 };
- struct aui_gridpar *gpar = &child->gridpar;
+ int column = child->gridpar.column;
+ int row = child->gridpar.row;
- int cspan = (gpar->column + gpar->columnspan) <= con->grid_size[0] ?
- gpar->columnspan - 1: con->grid_size[0] - gpar->column - 1;
+ if (min.width > csize[column] && con->columnconfigure[column].weight == 0) {
+ width += min.width - csize[column];
+ csize[column] = min.width;
+ }
- int rspan = (gpar->row + gpar->rowspan) <= con->grid_size[1] ?
- gpar->rowspan - 1: con->grid_size[1] - gpar->row - 1;
+ if (min.height > rsize[row] && con->rowconfigure[row].weight == 0) {
+ height += min.height - rsize[row];
+ rsize[row] = min.height;
+ }
+ }
+ extra_w = (widget->geom.width - width);
+ extra_h = (widget->geom.height - height);
- int dx = (csize[child->gridpar.column] - min.width);
- int dy = (rsize[child->gridpar.row] - min.height);
+ if (extra_w < 0) extra_w = 0;
+ if (extra_h < 0) extra_h = 0;
- int width = min.width;
- int height = min.height;
+ /*
+ * Extra space distribution depending on constraints
+ */
+ if (extra_w > 0 && column_weights > 0) {
+ for (int i = 0; i < con->grid_size[0]; i++) {
+ csize[i] += con->columnconfigure[i].weight * extra_w / column_weights;
+ }
+ }
- for (int i = gpar->column; i < gpar->column + cspan; i++)
- width += csize[i];
+ if (extra_h > 0 && row_weights > 0) {
+ for (int i = 0; i < con->grid_size[1]; i++) {
+ rsize[i] += con->rowconfigure[i].weight * extra_h / row_weights;
+ }
+ }
- for (int i = gpar->row; i < gpar->row + rspan; i++)
- height += rsize[i];
+ /*
+ * Setting up positions by accumulating occupied cells
+ */
+ for (int i = 0; i < con->grid_size[1]; i++) {
+ if (i == 0) {
+ rpos[i] = rsize[i];
+ continue;
+ }
- geom.x = widget->geom.x + cpos[child->gridpar.column] + dx / 2;
- geom.y = widget->geom.y + rpos[child->gridpar.row] + dy / 2;
- geom.width = width;
- geom.height = height;
+ rpos[i] = rsize[i] + rpos[i - 1];
+ }
+ for (int i = 0; i < con->grid_size[0]; i++) {
+ if (i == 0) {
+ cpos[i] = csize[i];
+ continue;
+ }
+
+ cpos[i] = csize[i] + cpos[i - 1];
+ }
+
+ TAILQ_FOREACH(child, &widget->queue, entries) {
+ if (child->mapped == 0)
+ continue;
+
+ unsigned int cspan = child->gridpar.columnspan;
+ unsigned int rspan = child->gridpar.rowspan;
+ unsigned int column = child->gridpar.column;
+ unsigned int row = child->gridpar.row;
+ struct aui_geometry geom;
+
+ geom.width = csize[column];
+ geom.height = rsize[row];
+
+ if (cspan > 1) {
+ geom.width = cpos[column + cspan - 1];
+ if (column > 0) geom.width -= cpos[column - 1];
+ }
+
+ if (rspan > 1) {
+ geom.height = rpos[row + rspan - 1];
+
+ if (row > 0) geom.height -= rpos[row - 1];
+ }
+
+ geom.x = widget->geom.x + cpos[column + cspan - 1] - geom.width;
+ geom.y = widget->geom.y + rpos[row + rspan - 1] - geom.height;
+
child->ops->set_geometry(child, &geom);
}
unsigned int *csizes;
unsigned int *rpos;
unsigned int *cpos;
+ unsigned int nrow;
+ unsigned int ncol;
uint8_t *rmaps;
uint8_t *cmaps;
widget->mapped = 1;
con->map_count++;
+ nrow = con->grid_size[1];
+ ncol = con->grid_size[0];
+
con->grid_size[0] = (con->grid_size[0] > (par->column + par->columnspan)) ?
con->grid_size[0] : (par->column + par->columnspan);
con->grid_size[1] = (con->grid_size[1] > (par->row + par->rowspan)) ?
con->grid_size[1] : (par->row + par->rowspan);
- rmaps = reallocarray(con->row_maps, con->grid_size[1], sizeof(*con->row_maps));
- if (rmaps == NULL) {
- fprintf(stderr, "libaui: failed to allocate row maps\n");
- return -1;
- }
- con->row_maps = rmaps;
+ if (nrow < con->grid_size[1]) {
+ struct aui_gridconfigure *ptr = reallocarray(con->rowconfigure,
+ con->grid_size[1], sizeof(*con->rowconfigure));
- cmaps = reallocarray(con->col_maps, con->grid_size[0], sizeof(*con->col_maps));
- if (cmaps == NULL) {
- fprintf(stderr, "libaui: failed to allocate col maps\n");
- return -1;
+ for (int i = nrow; i < con->grid_size[1]; i++)
+ memcpy(&ptr[i], &default_gridconfigure, sizeof(default_gridconfigure));
+
+ con->rowconfigure = ptr;
}
- con->col_maps = cmaps;
+ if (ncol < con->grid_size[0]) {
+ struct aui_gridconfigure *ptr = reallocarray(con->columnconfigure,
+ con->grid_size[0], sizeof(*con->columnconfigure));
+ for (int i = ncol; i < con->grid_size[0]; i++)
+ memcpy(&ptr[i], &default_gridconfigure, sizeof(default_gridconfigure));
+
+ con->columnconfigure = ptr;
+ }
+
rsizes = reallocarray(con->row_sizes, con->grid_size[1], sizeof(*con->row_sizes));
if (rsizes == NULL) {
fprintf(stderr, "libaui: failed to allocated row sizes\n");
*par = widget->gridpar;
return 0;
}
+
+int
+aui_rowconfigure(struct aui_widget *widget, int row, struct aui_gridconfigure *config)
+{
+ struct aui_container *con = (struct aui_container *)widget;
+
+ if (config == NULL)
+ config = &default_gridconfigure;
+
+ if (row > con->grid_size[1]) {
+ fprintf(stderr, "libaui: cannot configure row index higher than dimensions\n");
+ return -1;
+ }
+
+ con->rowconfigure[row] = *config;
+ layout_organize(widget);
+ return 0;
+}
+
+int
+aui_columnconfigure(struct aui_widget *widget, int column, struct aui_gridconfigure *config)
+{
+ struct aui_container *con = (struct aui_container *)widget;
+
+ if (config == NULL)
+ config = &default_gridconfigure;
+
+ if (column > con->grid_size[0]) {
+ fprintf(stderr, "libaui: cannot configure column index higher than dimensions\n");
+ return -1;
+ }
+
+ con->columnconfigure[column] = *config;
+ layout_organize(widget);
+ return 0;
+}
blob - ff0077c16e3465ac05c6d6ec98065e4f0a6f14ba
blob + 58662b34a7f8eebec0d48b0ebb26d2ca780ad000
--- widget.h
+++ widget.h
/*
* Grid members
*/
- uint8_t *row_maps;
- uint8_t *col_maps;
uint32_t grid_size[2];
unsigned int *row_sizes;
unsigned int *col_sizes;
unsigned int *row_pos;
unsigned int *col_pos;
- struct aui_rowpar *rowconfigure;
- struct aui_columnpar *columnconfigure;
+ struct aui_gridconfigure *rowconfigure;
+ struct aui_gridconfigure *columnconfigure;
struct container_focus {
struct aui_widget *press;