Commit Diff


commit - 881cb741b107b58be69f057a332cb73fa57d1d99
commit + 6fe77315ff1cd8c27265b1597b5d8192337868d8
blob - 36e5840033333dc2939c3fdef1206d01fdc1f8c5
blob + 02ef472c17c38b13da36ebae7a87f31f33977bfc
--- Makefile
+++ Makefile
@@ -7,6 +7,7 @@ SRCS=		button.c \
 			driver.c \
 			frame.c \
 			font.c \
+			label.c \
 			layout.c \
 			ui.c \
 			xcb.c \
blob - 5ecf4853fe1d024726a75e43449af4c6e19fd4f3
blob + 9a3054785d21ab5b0521066d79388bcd36360df7
--- aui.h
+++ aui.h
@@ -55,6 +55,7 @@ struct aui_window;
 struct aui_frame;
 struct aui_canvas;	  /* rendering free of rules */
 struct aui_button;
+struct aui_label;
 
 struct aui_window_config {
 	unsigned int width;
@@ -74,6 +75,12 @@ struct aui_canvas_config {
 	struct aui_color bg;
 };
 
+struct aui_label_config {
+	const char *text;
+	struct aui_color fg;
+	struct aui_color bg;
+};
+
 struct aui_canvas_item;
 
 void aui_run(void);
@@ -82,6 +89,7 @@ struct aui_window *aui_window_new(struct aui_window_co
 struct aui_button *aui_button_new(struct aui_widget *, struct aui_button_config *);
 struct aui_frame *aui_frame_new(struct aui_widget *);
 struct aui_canvas *aui_canvas_new(struct aui_widget *);
+struct aui_label *aui_label_new(struct aui_widget *, struct aui_label_config *);
 int aui_place(struct aui_widget *, struct aui_placepar *);
 int aui_pack(struct aui_widget *, struct aui_packpar *);
 int aui_grid(struct aui_widget *, struct aui_gridpar *);
blob - b39ada7eed8b8720e3f6c99144a31c9033dd8ce4
blob + 05d261df8fbc7e48865fdd6f704122cb3d5ad61f
--- aui_run.3
+++ aui_run.3
@@ -19,9 +19,11 @@
 .Ft void
 .Fn aui_destroy "struct aui_widget *"
 .Ft struct aui_window*
-.Fn aui_window_new "struct aui_windowconfig * config"
+.Fn aui_window_new "struct aui_window_config * config"
 .Ft struct aui_button*
-.Fn aui_button_new "struct aui_widget * parent" "struct aui_buttonconfig * config"
+.Fn aui_button_new "struct aui_widget * parent" "struct aui_button_config * config"
+.Ft struct aui_label*
+.Fn aui_label_new "struct aui_widget * parent" "struct aui_label_config * config"
 .Ft struct aui_frame*
 .Fn aui_frame_new "struct aui_widget * parent"
 .Ft struct aui_canvas*
blob - 771779d9e1ed3c295d565aecdee4c4bb88d04ff7
blob + f5a9d06acc51ebbf6ca18aa7afc93f34839645b3
--- button.c
+++ button.c
@@ -39,9 +39,7 @@ aui_button_new(struct aui_widget *parent, struct aui_b
 {
 	struct aui_button *button = calloc(1, sizeof(struct aui_button));
 	struct aui_widget *widget = &button->widget;
-	widget_init(&button->widget);
-	widget->in_ops = &button_ops;
-	widget->type = WIDGET_TYPE_BUTTON;
+	widget_init(&button->widget, WIDGET_TYPE_BUTTON, &button_ops);
 
 	/*
 	 * Creating the rectangle primitive
blob - 33b2058eb13f6c236e7b88184dd49005fe00255e
blob + 56a859f9038051123999454079c51e46acdeac6c
--- canvas.c
+++ canvas.c
@@ -41,9 +41,7 @@ aui_canvas_new(struct aui_widget *parent)
 	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_init(widget, WIDGET_TYPE_CANVAS, &canvas_ops);
 
 	widget_add(parent, widget);
 	widget->primitives.count = 1;
blob - 0d68d695d6c279aada0f3985fbaf0b41c7f397e9
blob + bd3fe7736b6637d8e84f3c8588ba9e901d6d5063
--- frame.c
+++ frame.c
@@ -34,9 +34,7 @@ aui_frame_new(struct aui_widget *parent)
 	struct aui_widget *widget = (struct aui_widget *)frame;
 	struct aui_container *con = (struct aui_container *)frame;
 
-	widget_init(widget);
-	widget->in_ops = &frame_ops;
-	widget->type = WIDGET_TYPE_FRAME;
+	widget_init(widget, WIDGET_TYPE_FRAME, &frame_ops);
 
 	widget_add(parent, widget);
 	con->map_count = 0;
blob - /dev/null
blob + 68b44b9e7de9f46ca42c126550437393240b084f (mode 644)
--- /dev/null
+++ label.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "driver.h"
+#include "widget.h"
+
+static void label_mouse_hover(struct aui_widget *, uint16_t, uint16_t);
+static void label_mouse_unhover(struct aui_widget *);
+static void label_mouse_press(struct aui_widget *, uint16_t, uint16_t, uint8_t);
+static void label_mouse_release(struct aui_widget *, uint16_t, uint16_t, uint8_t);
+static void label_set_geometry(struct aui_widget *, struct aui_geometry *);
+static void label_free(struct aui_widget *);
+static struct aui_geometry label_get_min_size(struct aui_widget *);
+
+static struct widget_ops label_ops = {
+	label_mouse_hover,
+	label_mouse_unhover,
+	label_mouse_press,
+	label_mouse_release,
+	label_set_geometry, /* set geometry */
+	label_free,
+	label_get_min_size,
+};
+
+struct aui_label_config default_config = {
+	.text = "Hello AUI",
+};
+
+struct aui_label*
+aui_label_new(struct aui_widget *parent, struct aui_label_config *config)
+{
+	struct aui_label *label = calloc(1, sizeof(struct aui_label));
+	struct aui_widget *widget = &label->widget;
+
+	widget_init(widget, WIDGET_TYPE_LABEL, &label_ops);
+	widget_add(parent, widget);
+
+	label->config = (config == NULL) ? default_config : *config;
+
+	widget->primitives.count = 1;
+	widget->primitives.list = calloc(widget->primitives.count, sizeof(struct primitive*));
+
+	widget->primitives.list[0] = driver->ops->create_text();
+	driver->ops->set_text(widget->primitives.list[0], label->config.text, 0, 0);
+
+	return label;
+}
+
+static void
+label_mouse_hover(struct aui_widget *widget, uint16_t dx, uint16_t dy)
+{
+
+}
+
+static void
+label_mouse_unhover(struct aui_widget *widget)
+{
+
+}
+
+static void
+label_mouse_press(struct aui_widget *widget, uint16_t x, uint16_t y, uint8_t button)
+{
+
+}
+
+static void
+label_mouse_release(struct aui_widget *widget, uint16_t x, uint16_t y, uint8_t button)
+{
+
+}
+
+static void
+label_set_geometry(struct aui_widget *widget, struct aui_geometry *geom)
+{
+	struct aui_geometry tgeom = driver->ops->get_text_geometry(widget->primitives.list[0]);
+	struct aui_label *label = (struct aui_label *)widget;
+
+	driver->ops->set_text(
+		widget->primitives.list[0], 
+		label->config.text, 
+		geom->x + geom->width / 2 - tgeom.width / 2 ,
+		geom->y + geom->height
+	);
+	widget->geom = *geom;
+}
+
+static void
+label_free(struct aui_widget *widget)
+{
+
+}
+
+static struct aui_geometry
+label_get_min_size(struct aui_widget *widget)
+{
+	struct aui_geometry geom = driver->ops->get_text_geometry(widget->primitives.list[0]);
+	return geom;
+}
blob - 2e226b2403669bc70d26443bc3ee863176fb9162
blob + bcc66e218787c447009041fffa14987e560db0b8
--- widget.c
+++ widget.c
@@ -7,7 +7,7 @@
 #include "primitive.h"
 
 void
-widget_init(struct aui_widget *widget)
+widget_init(struct aui_widget *widget, unsigned int type, struct widget_ops *ops)
 {
 	TAILQ_INIT(&(widget)->queue);
 	widget->geom = (struct aui_geometry) { 0 };
@@ -16,6 +16,9 @@ widget_init(struct aui_widget *widget)
 	memset(&widget->placepar, 0, sizeof(struct aui_placepar));
 	memset(&widget->gridpar, 0, sizeof(struct aui_gridpar));
 	memset(&widget->packpar, 0, sizeof(struct aui_packpar));
+
+	widget->type = type;
+	widget->in_ops = ops;
 }
 
 void
blob - d446131c88362e0184232c761d4b8c89b9c337d4
blob + e8bf66dad05133110e600b2f51b6f4872c591f5c
--- widget.h
+++ widget.h
@@ -19,6 +19,7 @@ enum widget_type {
 	WIDGET_TYPE_FRAME,
 	WIDGET_TYPE_CANVAS,
 	WIDGET_TYPE_BUTTON,
+	WIDGET_TYPE_LABEL,
 };
 
 struct widget_primitives {
@@ -101,9 +102,14 @@ struct aui_button {
 	struct aui_button_config config;
 };
 
+struct aui_label {
+	struct aui_widget widget;
+	struct aui_label_config config;
+};
+
 extern struct aui_window_list wlist;
 
-void widget_init(struct aui_widget *);
+void widget_init(struct aui_widget*, unsigned int, struct widget_ops*);
 void widget_draw(struct aui_widget *);
 void widget_add(struct aui_widget *, struct aui_widget *);
 void widget_remove(struct aui_widget *, struct aui_widget *);
blob - 8b025f0234b95cbb3ae9f98e7a02429eca6c50b4
blob + 8b4e7d1ce36c108e08792a4e6c43df901dce0393
--- window.c
+++ window.c
@@ -50,13 +50,11 @@ aui_window_new(struct aui_window_config *config)
 	struct aui_window *aw = driver->ops->create_window(config);
 	struct aui_widget *widget = (struct aui_widget *)aw;
 	struct aui_container *con = (struct aui_container *)aw;
-	widget->type = WIDGET_TYPE_WINDOW;
 	con->map_count = 0;
 
 	LIST_INSERT_HEAD(&wlist, aw, entries);
-	widget_init(widget);
+	widget_init(widget, WIDGET_TYPE_WINDOW, &window_ops);
 
-	widget->in_ops = &window_ops;
 	widget->mapped = 1;
 
 	widget->window = aw;