commit - dff0b993782d72f5a9ad1f35ff64b675ed2ad041
commit + 4f20f2bb803af25b4a2c304819ef73ff5d0a3cb8
blob - 5478f814f30df4a2b77cc9130f094a17671faa85
blob + 9e198099b539342a95f50aceb66b1f5b88c7bd96
--- aui.h
+++ aui.h
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 *);
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
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 = {
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)
{
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
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
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
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
}
}
+ 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
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;
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;
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
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,