commit 4f20f2bb803af25b4a2c304819ef73ff5d0a3cb8 from: Onana Onana Xavier Manuel date: Sun Jul 5 19:56:05 2026 UTC Updated canvas to render rectangles commit - dff0b993782d72f5a9ad1f35ff64b675ed2ad041 commit + 4f20f2bb803af25b4a2c304819ef73ff5d0a3cb8 blob - 5478f814f30df4a2b77cc9130f094a17671faa85 blob + 9e198099b539342a95f50aceb66b1f5b88c7bd96 --- aui.h +++ aui.h @@ -74,6 +74,8 @@ struct aui_canvasconfig { struct aui_color bg; }; +struct aui_canvas_item; + void aui_run(void); void aui_destroy(struct aui_widget *); struct aui_window *aui_window_new(struct aui_windowconfig *); @@ -87,4 +89,35 @@ int aui_getplacepar(struct aui_widget *, struct aui_pl int aui_getgridpar(struct aui_widget *, struct aui_gridpar *); int aui_getpackpar(struct aui_widget *, struct aui_packpar *); +struct aui_canvas_line { + int x1, y1; + int x2, y2; +}; + +struct aui_canvas_rectangle { + int x, y; + struct aui_color color; + unsigned int width, height; +}; + +struct aui_canvas_item_config { + union { + struct aui_canvas_line line; + struct aui_canvas_rectangle rectangle; + }; +}; + +#define AUI_CANVAS_RECTANGLE 0 +#define AUI_CANVAS_ARC 1 +#define AUI_CANVAS_IMAGE 2 +#define AUI_CANVAS_BITMAP 3 +#define AUI_CANVAS_OVAL 4 +#define AUI_CANVAS_POLYGON 5 +#define AUI_CANVAS_LINE 6 +#define AUI_CANVAS_TEXT 7 +#define AUI_CANVAS_WINDOW 8 +struct aui_canvas_item *aui_canvas_create(struct aui_canvas *, unsigned char, + struct aui_canvas_item_config *); +void aui_canvas_delete(struct aui_canvas *, struct aui_canvas_item *); + #endif blob - 0aa1055beb72e8d2a7453ebeb5beebf8aca6e548 blob + 33b2058eb13f6c236e7b88184dd49005fe00255e --- canvas.c +++ canvas.c @@ -18,7 +18,7 @@ static void canvas_set_geometry(struct aui_widget *, s static void canvas_free(struct aui_widget *); static struct aui_geometry canvas_get_min_size(struct aui_widget *); -#define DEFAULT_W 200 +#define DEFAULT_W 300 #define DEFAULT_H 200 static struct widget_ops canvas_ops = { @@ -31,15 +31,63 @@ static struct widget_ops canvas_ops = { canvas_get_min_size, }; +static struct aui_color colors[] = { + { 0xff, 0xff, 0xff, 0xff }, +}; + struct aui_canvas* -aui_canvas_new(struct aui_widget *widget) +aui_canvas_new(struct aui_widget *parent) { - struct aui_canvas *canvas; + struct aui_canvas *canvas = calloc(1, sizeof(struct aui_canvas)); + struct aui_widget *widget = (struct aui_widget *)canvas; + widget_init(widget); + widget->in_ops = &canvas_ops; + widget->type = WIDGET_TYPE_CANVAS; + + widget_add(parent, widget); + widget->primitives.count = 1; + widget->primitives.list = calloc(widget->primitives.count, sizeof(struct primitive *)); + widget->primitives.list[0] = driver->ops->create_rectangle(); + + driver->ops->set_rectangle_color(widget->window, widget->primitives.list[0], &colors[0]); + + TAILQ_INIT(&canvas->queue); + return canvas; } +struct aui_canvas_item* +aui_canvas_create(struct aui_canvas *canvas, unsigned char type, struct aui_canvas_item_config *cfg) +{ + struct aui_canvas_item *i = calloc(1, sizeof(struct aui_canvas_item)); + struct aui_widget *widget = (struct aui_widget *)canvas; + if (i == NULL) + return NULL; + + i->config = *cfg; + + switch (type) { + case AUI_CANVAS_RECTANGLE: + i->primitives.count = 1; + i->primitives.list = calloc(widget->primitives.count, sizeof(struct primitives *)); + i->primitives.list[0] = driver->ops->create_rectangle(); + + driver->ops->set_rectangle_color(widget->window, i->primitives.list[0], + &i->config.rectangle.color); + break; + default: + fprintf(stderr, "libaui: uknwon canvas item type\n"); + free(i); + return NULL; + } + + TAILQ_INSERT_TAIL(&canvas->queue, i, entries); + + return i; +} + static void canvas_mouse_hover(struct aui_widget *widget, uint16_t dx, uint16_t dy) { @@ -67,7 +115,36 @@ canvas_mouse_release(struct aui_widget *widget, uint16 static void canvas_set_geometry(struct aui_widget *widget, struct aui_geometry *geom) { + struct aui_canvas *canvas = (struct aui_canvas *)widget; + struct aui_canvas_item *item; + memcpy(&widget->geom, geom, sizeof(struct aui_geometry)); + driver->ops->set_rectangle_geometry(widget->window, widget->primitives.list[0], geom); + + TAILQ_FOREACH(item, &canvas->queue, entries) { + struct primitive *prim; + + switch (item->type) { + case AUI_CANVAS_RECTANGLE: { + struct aui_geometry g = { + geom->x + item->config.rectangle.x, + geom->y + item->config.rectangle.y, + item->config.rectangle.width, + item->config.rectangle.height + }; + + prim = item->primitives.list[0]; + driver->ops->set_rectangle_geometry( + widget->window, + prim, + &g + ); + break; + } + default: + break; + } + } } static void @@ -79,6 +156,6 @@ canvas_free(struct aui_widget *widget) static struct aui_geometry canvas_get_min_size(struct aui_widget *widget) { - struct aui_geometry geom = { .width = DEFAULT_W, .height = DEFAULT_H }; + struct aui_geometry geom = { .x= 0, .y = 0, .width = DEFAULT_W, .height = DEFAULT_H }; return geom; } blob - de8deb9ccfb468a2674f1d9993fa41b96297d65d blob + 05b36e6d3164335dabf4fe1ca8ece006ff671a8c --- driver.h +++ driver.h @@ -30,6 +30,8 @@ struct dri_ops { void (*set_text) (struct primitive *, const char *, int16_t, int16_t); void (*render_text) (struct aui_window *, struct primitive *); struct aui_geometry (*get_text_geometry) (struct primitive *); + + struct aui_canvas *(*create_canvas)(); }; extern struct aui_dri *driver; /* Associated with xcb backend */ blob - 6d4b0c6b5556cb1ad2be7028e7150b3491f18bf8 blob + 0d68d695d6c279aada0f3985fbaf0b41c7f397e9 --- frame.c +++ frame.c @@ -23,7 +23,7 @@ static struct widget_ops frame_ops = { frame_get_min_size, }; -struct aui_color colors[] = { +static struct aui_color colors[] = { { 0x77, 0x77, 0x77, 0xff }, }; blob - 8aca33ab8d6a7d052137366229bb00cb080fe870 blob + 2e226b2403669bc70d26443bc3ee863176fb9162 --- widget.c +++ widget.c @@ -65,6 +65,26 @@ widget_draw(struct aui_widget *widget) } } + if (widget->type == WIDGET_TYPE_CANVAS) { + struct aui_canvas *canvas = (struct aui_canvas *)widget; + struct aui_canvas_item *item; + + TAILQ_FOREACH(item, &canvas->queue, entries) { + struct primitive *prim; + for (int i = 0; i < item->primitives.count; i++) { + prim = item->primitives.list[i]; + + switch (prim->type) { + case PRIMITIVE_TYPE_RECTANGLE: + driver->ops->render_rectangle(widget->window, prim); + break; + default: + break; + } + } + } + } + struct aui_widget *child; TAILQ_FOREACH(child, &widget->queue, entries) { widget_draw(child); blob - 57105def4f591701235448adc822f9681a83ba45 blob + 3e1fa1cf196dff055845a32f3ddb71787f9f1089 --- widget.h +++ widget.h @@ -21,6 +21,11 @@ enum widget_type { WIDGET_TYPE_BUTTON, }; +struct widget_primitives { + unsigned int count; + struct primitive **list; +}; + TAILQ_HEAD(aui_widget_queue, aui_widget); struct aui_widget { enum widget_type type; @@ -35,12 +40,8 @@ struct aui_widget { struct aui_geometry packarea; unsigned int mapped; + struct widget_primitives primitives; - struct widget_primitives { - unsigned int count; - struct primitive **list; - } primitives; - struct aui_widget *parent; struct aui_widget_queue queue; TAILQ_ENTRY(aui_widget) entries; @@ -82,8 +83,16 @@ struct aui_frame { struct aui_container con; }; +struct aui_canvas_item { + unsigned int type; + struct widget_primitives primitives; + struct aui_canvas_item_config config; + TAILQ_ENTRY(aui_canvas_item) entries; +}; + struct aui_canvas { struct aui_container con; + TAILQ_HEAD(aui_canvas_item_queue, aui_canvas_item) queue; }; struct aui_button { blob - 4423a907eb4517e8175bf96e7f7c4e22e2f4e1d6 blob + c396e524cfccd569fd7f46f9648308324a52d955 --- xcb.c +++ xcb.c @@ -62,6 +62,10 @@ static void aui_dri_set_text(struct primitive *, const static void aui_dri_render_text(struct aui_window *, struct primitive *); static struct aui_geometry aui_dri_get_text_geometry(struct primitive *); +struct aui_dri_canvas { + struct aui_canvas can; +}; + static struct dri_ops aui_dri_ops = { aui_dri_create_window, aui_dri_delete_window,