commit 2d01cf0a86e0e42ff032a682edae1b28675f49a8 from: Onana Onana Xavier Manuel date: Wed Jun 10 13:28:34 2026 UTC Pack geometry manager update * Implemented anchoring commit - a3b5b286f3bc8991a6fa36dbcadb098b5e4b0be2 commit + 2d01cf0a86e0e42ff032a682edae1b28675f49a8 blob - af3a0824989abaeafa2af19497dc2ebe1e3dab27 blob + 0106a7c1cc9ef90a3965a6743bf1fa20259b7b28 --- README +++ README @@ -1,9 +1,6 @@ libaui - A User Interface Library -Minimal, portable and simple. This library is -inspired by Tk. - -FAQ - -Q: Why? -A: Why not? +Minimal, portable and simple. This library is inspired by Tk. +The goal of this library is not to be competing with popular +UI toolkits but rather offer a simple codebase that can be +used for studying. blob - b24b74b8223102c8100367fcaf6aea99fe427e4a blob + 31b0fd16a57399bf1bdd828c8d96964bbfd23d13 --- aui.h +++ aui.h @@ -32,6 +32,11 @@ struct aui_placepar { struct aui_packpar { unsigned char anchor; +#define AUI_FILL_NONE 0 +#define AUI_FILL_X 1 +#define AUI_FILL_Y 2 +#define AUI_FILL_BOTH 3 + unsigned char fill; #define AUI_SIDE_TOP 1 #define AUI_SIDE_RIGHT 2 #define AUI_SIDE_LEFT 3 blob - 920984852cc2190f7582bb59cff1b68acc2ee2ea blob + ae2e2a9a978e050ed1cabb0be1cd48ac9a165227 --- layout.c +++ layout.c @@ -31,7 +31,6 @@ layout_organize(struct aui_widget *widget) { struct aui_container *con = (struct aui_container *)widget; struct aui_widget *child; - int dx, dy; switch (con->layout_type) { case AUI_LAYOUT_PLACE: @@ -40,6 +39,7 @@ layout_organize(struct aui_widget *widget) continue; struct aui_placepar *par = &child->placepar; + int dx = 0, dy = 0; struct aui_geometry geom = { .x = widget->geom.x + child->placepar.x + widget->geom.width * child->placepar.relx, @@ -179,6 +179,10 @@ layout_organize(struct aui_widget *widget) /* * 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. + * + * The fill attribute is a bit tricky. You can set it to x, y and both + * but you have to keep in mind that x only works on side top and bottom + * and y works on side left and right. */ case AUI_LAYOUT_PACK: { struct aui_geometry space = widget->in_ops->get_min_size(widget); @@ -190,38 +194,120 @@ layout_organize(struct aui_widget *widget) 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; + case AUI_SIDE_TOP: + cgeom.width = (cgeom.width > space.width) ? space.width : cgeom.width; + cgeom.height = (cgeom.height > space.height) ? space.height : cgeom.height; + switch (child->packpar.anchor) { + case AUI_ANCHOR_CENTER: + case AUI_ANCHOR_N: + case AUI_ANCHOR_S: 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; + case AUI_ANCHOR_NW: + case AUI_ANCHOR_SW: + case AUI_ANCHOR_W: cgeom.x = space.x; + cgeom.y = space.y; + break; + case AUI_ANCHOR_NE: + case AUI_ANCHOR_SE: + case AUI_ANCHOR_E: + cgeom.x = space.x + space.width - cgeom.width; + cgeom.y = space.y; + break; + default: + break; + } + 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; + switch (child->packpar.anchor) { + case AUI_ANCHOR_CENTER: + case AUI_ANCHOR_E: + case AUI_ANCHOR_W: + 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; + case AUI_ANCHOR_N: + case AUI_ANCHOR_NE: + case AUI_ANCHOR_NW: + cgeom.x = space.x; + cgeom.y = space.y; + break; + case AUI_ANCHOR_S: + case AUI_ANCHOR_SE: + case AUI_ANCHOR_SW: + cgeom.x = space.x; + cgeom.y = space.y + space.height - cgeom.height; + break; + default: + break; + } + 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; + switch (child->packpar.anchor) { + case AUI_ANCHOR_CENTER: + case AUI_ANCHOR_E: + case AUI_ANCHOR_W: 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; + case AUI_ANCHOR_N: + case AUI_ANCHOR_NE: + case AUI_ANCHOR_NW: + cgeom.x = space.x + space.width - cgeom.width; + cgeom.y = space.y; + break; + case AUI_ANCHOR_S: + case AUI_ANCHOR_SE: + case AUI_ANCHOR_SW: + cgeom.x = space.x + space.width - cgeom.width; + cgeom.y = space.y + space.height - cgeom.height; + break; + default: + break; + } + 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; + switch (child->packpar.anchor) { + case AUI_ANCHOR_CENTER: + case AUI_ANCHOR_N: + case AUI_ANCHOR_S: cgeom.x = space.x + space.width / 2 - cgeom.width / 2; cgeom.y = space.y + space.height - cgeom.height; - space.height -= cgeom.height; break; + case AUI_ANCHOR_NW: + case AUI_ANCHOR_SW: + case AUI_ANCHOR_W: + cgeom.x = space.x; + cgeom.y = space.y + space.height - cgeom.height; + break; + case AUI_ANCHOR_NE: + case AUI_ANCHOR_SE: + case AUI_ANCHOR_E: + cgeom.x = space.x + space.width - cgeom.width; + cgeom.y = space.y + space.height - cgeom.height; + break; default: - continue; + break; + } + space.height -= cgeom.height; + break; + default: + continue; } child->in_ops->set_geometry(child, &cgeom); }