commit a3b5b286f3bc8991a6fa36dbcadb098b5e4b0be2 from: Onana Onana Xavier Manuel date: Wed Jun 10 04:18:32 2026 UTC Proper pack implementation. * Added get_min_size to window * Added early pack algorithm * Mild cleanups commit - 16946472422902f8b4a9feb948e6e73d605a6e76 commit + a3b5b286f3bc8991a6fa36dbcadb098b5e4b0be2 blob - a885c16166113b3772919d9d01bf5d3e4f32b7d3 blob + b24b74b8223102c8100367fcaf6aea99fe427e4a --- aui.h +++ aui.h @@ -32,14 +32,6 @@ struct aui_placepar { struct aui_packpar { unsigned char anchor; - unsigned char expand; -#define AUI_FILL_NONE 0 -#define AUI_FILL_X 1 -#define AUI_FILL_Y 2 -#define AUI_FILL_BOTH 3 - unsigned char fill; - int padx[2]; - int pady[2]; #define AUI_SIDE_TOP 1 #define AUI_SIDE_RIGHT 2 #define AUI_SIDE_LEFT 3 blob - 98c86a341a67860a50f01948937df86b56ad35f3 blob + c3835f2fa4c36cfd1df65f0362a1b099240e53c6 --- button.c +++ button.c @@ -114,14 +114,16 @@ static void button_set_geometry(struct aui_widget *widget, struct aui_geometry *geom) { struct aui_button *button = (struct aui_button *)widget; - struct aui_geometry fgeom = { .x = geom->x + 1, - .y = geom->y + 1, - .width = geom->width - 2, - .height = geom->height - 2 }; + struct aui_geometry fgeom = { 0 }; struct aui_geometry tgeom = driver->ops->get_text_geometry(widget->primitives.list[2]); int tx = geom->x + geom->width / 2 - tgeom.width / 2; int ty = geom->y + geom->height / 2 + tgeom.height / 2; + fgeom.x = geom->x + 1; + fgeom.y = geom->y + 1; + fgeom.width = geom->width - 2; + fgeom.height = geom->height - 2; + memcpy(&widget->geom, geom, sizeof(struct aui_geometry)); driver->ops->set_rectangle_geometry(widget->window, widget->primitives.list[0], geom); driver->ops->set_rectangle_geometry(widget->window, widget->primitives.list[1], &fgeom); @@ -134,7 +136,7 @@ button_get_min_size(struct aui_widget *widget) struct aui_geometry geom = driver->ops->get_text_geometry(widget->primitives.list[2]); struct aui_button *button = (struct aui_button *)widget; - geom.width = (geom.width < 20) ? geom.width = 20 : geom.width + 20; + geom.width = (geom.width < 30) ? geom.width = 30 : geom.width + 30; geom.height = (button->config.text == NULL) ? 12 + 20 : geom.height + 20; return geom; blob - 25f5fe46830eb47cb866b852d54ef82b5163a416 blob + 920984852cc2190f7582bb59cff1b68acc2ee2ea --- layout.c +++ layout.c @@ -176,20 +176,54 @@ layout_organize(struct aui_widget *widget) } break; } + /* + * As far as I'm aware of, Tk's pack is just a rectangle that shrinks + * depending on the side of the widget being added. + */ case AUI_LAYOUT_PACK: { - unsigned int cell_size[] = { 50, 50 }; - struct aui_geometry geom = { 0 }; - struct aui_placepar *par = NULL; - int dx = 0, dy = 0; + struct aui_geometry space = widget->in_ops->get_min_size(widget); TAILQ_FOREACH(child, &widget->queue, entries) { - geom.height = cell_size[1]; - geom.width = cell_size[0]; - geom.y = dy; - geom.x = widget->geom.x + widget->geom.width/2 - geom.width / 2; + if (child->mapped == 0) + continue; - dy += geom.height; - child->in_ops->set_geometry(child, &geom); + struct aui_geometry cgeom = child->in_ops->get_min_size(child); + + switch (child->packpar.side) { + case AUI_SIDE_TOP: + cgeom.width = (cgeom.width > space.width) ? space.width : cgeom.width; + cgeom.height = (cgeom.height > space.height) ? space.height : cgeom.height; + cgeom.x = space.x + space.width / 2 - cgeom.width / 2; + cgeom.y = space.y; + space.y += cgeom.height; + space.height -= cgeom.height; + break; + case AUI_SIDE_LEFT: + cgeom.width = (cgeom.width > space.width) ? space.width : cgeom.width; + cgeom.height = (cgeom.height > space.height) ? space.height : cgeom.height; + cgeom.x = space.x; + cgeom.y = space.y + space.height / 2 - cgeom.height / 2; + space.width -= cgeom.width; + space.x += cgeom.width; + break; + case AUI_SIDE_RIGHT: + cgeom.width = (cgeom.width > space.width) ? space.width : cgeom.width; + cgeom.height = (cgeom.height > space.height) ? space.height : cgeom.height; + cgeom.x = space.x + space.width - cgeom.width; + cgeom.y = space.y + space.height / 2 - cgeom.height / 2; + space.width -= cgeom.width; + break; + case AUI_SIDE_BOTTOM: + cgeom.width = (cgeom.width > space.width) ? space.width : cgeom.width; + cgeom.height = (cgeom.height > space.height) ? space.height : cgeom.height; + cgeom.x = space.x + space.width / 2 - cgeom.width / 2; + cgeom.y = space.y + space.height - cgeom.height; + space.height -= cgeom.height; + break; + default: + continue; + } + child->in_ops->set_geometry(child, &cgeom); } TAILQ_FOREACH(child, &widget->queue, entries) { blob - dfa6125bc9d4bf7473ccbd60eb42299430f7a074 blob + cd3f35f503057c9db280654aa530b7ce9d8072bb --- ui.c +++ ui.c @@ -92,6 +92,9 @@ aui_run(void) struct aui_event_resize *rze = (struct aui_event_resize *)ev; struct aui_window *aw = ev->aw; + aw->config.width = rze->new_w; + aw->config.height = rze->new_h; + driver->ops->resize_window(aw); free((void *)rze); blob - 6c91aa4e9996a5df3de2272b9a8aff291dd2dc18 blob + 15256c1c92b57321638eae18c58b770b1ddaf469 --- window.c +++ window.c @@ -14,6 +14,7 @@ static void window_mouse_unhover(struct aui_widget *); static void window_mouse_press(struct aui_widget *, uint16_t, uint16_t, uint8_t); static void window_mouse_release(struct aui_widget *, uint16_t, uint16_t, uint8_t); static void window_free(struct aui_widget *); +static struct aui_geometry window_get_min_size(struct aui_widget *); static struct widget_ops window_ops = { window_mouse_hover, @@ -22,6 +23,7 @@ static struct widget_ops window_ops = { window_mouse_release, NULL, /* set geomtry */ window_free, + window_get_min_size, }; static struct aui_windowconfig default_config = { @@ -128,3 +130,13 @@ window_mouse_release(struct aui_widget *widget, uint16 window_mouse_hover(widget, x, y); } } + +static struct aui_geometry +window_get_min_size(struct aui_widget *widget) +{ + struct aui_window *aw = (struct aui_window *)widget; + struct aui_geometry geom = { 0 }; + geom.width = aw->config.width; + geom.height = aw->config.height; + return geom; +}