Commit Diff


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,