commit c5dbd602a0e8b531a5760038c271098feffdcf47
parent bf6d516dc0a01db18fb93ddb4f153a454b36700b
Author: lumidify <nobody@lumidify.org>
Date:   Thu, 16 Jun 2022 20:04:01 +0200
Start adding widget flags
Diffstat:
8 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/src/box.c b/src/box.c
@@ -59,9 +59,8 @@ static struct ltk_widget_vtable vtable = {
 	.get_child_at_pos = <k_box_get_child_at_pos,
 	.mouse_leave = NULL,
 	.mouse_enter = NULL,
-	.needs_redraw = 0,
-	.needs_surface = 0,
-	.type = LTK_BOX
+	.type = LTK_BOX,
+	.flags = 0,
 };
 
 static int ltk_box_cmd_add(
diff --git a/src/button.c b/src/button.c
@@ -61,8 +61,7 @@ static struct ltk_widget_vtable vtable = {
 	.child_size_change = NULL,
 	.remove_child = NULL,
 	.type = LTK_BUTTON,
-	.needs_redraw = 1,
-	.needs_surface = 1
+	.flags = LTK_NEEDS_REDRAW | LTK_NEEDS_SURFACE,
 };
 
 static struct {
diff --git a/src/grid.c b/src/grid.c
@@ -69,8 +69,7 @@ static struct ltk_widget_vtable vtable = {
 	.key_press = NULL,
 	.key_release = NULL,
 	.type = LTK_GRID,
-	.needs_redraw = 0,
-	.needs_surface = 0
+	.flags = 0,
 };
 
 static int ltk_grid_cmd_add(
diff --git a/src/label.c b/src/label.c
@@ -58,8 +58,7 @@ static struct ltk_widget_vtable vtable = {
 	.mouse_leave = NULL,
 	.mouse_enter = NULL,
 	.type = LTK_LABEL,
-	.needs_redraw = 1,
-	.needs_surface = 1
+	.flags = LTK_NEEDS_REDRAW | LTK_NEEDS_SURFACE,
 };
 
 static struct {
diff --git a/src/menu.c b/src/menu.c
@@ -135,8 +135,7 @@ static struct ltk_widget_vtable vtable = {
 	.child_size_change = NULL,
 	.remove_child = NULL,
 	.type = LTK_MENU,
-	.needs_redraw = 1,
-	.needs_surface = 1
+	.flags = LTK_NEEDS_REDRAW | LTK_NEEDS_SURFACE,
 };
 
 static ltk_theme_parseinfo menu_parseinfo[] = {
diff --git a/src/scrollbar.c b/src/scrollbar.c
@@ -53,8 +53,7 @@ static struct ltk_widget_vtable vtable = {
 	.child_size_change = NULL,
 	.remove_child = NULL,
 	.type = LTK_UNKNOWN, /* FIXME */
-	.needs_redraw = 1,
-	.needs_surface = 1
+	.flags = LTK_NEEDS_REDRAW | LTK_NEEDS_SURFACE,
 };
 
 static struct {
diff --git a/src/widget.c b/src/widget.c
@@ -81,7 +81,7 @@ ltk_fill_widget_defaults(ltk_widget *widget, const char *id, ltk_window *window,
 	widget->window = window;
 	widget->parent = NULL;
 
-	if (vtable->needs_surface)
+	if (vtable->flags & LTK_NEEDS_SURFACE)
 		widget->surface_key = ltk_surface_cache_get_unnamed_key(window->surface_cache, w, h);
 	else
 		widget->surface_key = NULL;
@@ -112,7 +112,7 @@ ltk_widget_resize(ltk_widget *widget) {
 	/* FIXME: should surface maybe be resized first? */
 	if (widget->vtable->resize)
 		widget->vtable->resize(widget);
-	if (!widget->vtable->needs_surface)
+	if (!widget->vtable->flags & LTK_NEEDS_SURFACE)
 		return;
 	ltk_surface_cache_request_surface_size(widget->surface_key, widget->rect.w, widget->rect.h);
 	widget->dirty = 1;
@@ -122,7 +122,7 @@ void
 ltk_widget_change_state(ltk_widget *widget) {
 	if (widget->vtable->change_state)
 		widget->vtable->change_state(widget);
-	if (widget->vtable->needs_redraw)
+	if (widget->vtable->flags & LTK_NEEDS_REDRAW)
 		ltk_window_invalidate_rect(widget->window, widget->rect);
 }
 
diff --git a/src/widget.h b/src/widget.h
@@ -25,6 +25,15 @@
 typedef struct ltk_widget ltk_widget;
 
 typedef enum {
+	LTK_ACTIVATABLE_NORMAL = 1,
+	LTK_ACTIVATABLE_SPECIAL = 2,
+	LTK_ACTIVATABLE_ALWAYS = 1|2,
+	LTK_GRABS_INPUT = 4,
+	LTK_NEEDS_REDRAW = 8,
+	LTK_NEEDS_SURFACE = 16, /* FIXME: let widgets handle this themselves */
+} ltk_widget_flags;
+
+typedef enum {
 	LTK_STICKY_LEFT = 1 << 0,
 	LTK_STICKY_RIGHT = 1 << 1,
 	LTK_STICKY_TOP = 1 << 2,
@@ -102,14 +111,31 @@ struct ltk_widget_vtable {
 	void (*change_state) (struct ltk_widget *);
 	void (*destroy) (struct ltk_widget *, int);
 
+	struct ltk_widget *(*nearest_child)(struct ltk_widget *self, ltk_rect rect);
+	struct ltk_widget *(*nearest_child_left)(struct ltk_widget *self, ltk_rect rect);
+	struct ltk_widget *(*nearest_child_right)(struct ltk_widget *self, ltk_rect rect);
+	struct ltk_widget *(*nearest_child_above)(struct ltk_widget *self, ltk_rect rect);
+	struct ltk_widget *(*nearest_child_below)(struct ltk_widget *self, ltk_rect rect);
+	struct ltk_widget *(*next_child)(struct ltk_widget *self, ltk_widget *child);
+	struct ltk_widget *(*prev_child)(struct ltk_widget *self, ltk_widget *child);
+	struct ltk_widget *(*first_child)(struct ltk_widget *self);
+
+	/* FIXME: make menu entries actual widgets so this isn't needed anymore */
+	int (*move_active_left)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_right)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_above)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_below)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_next)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_prev)(struct ltk_widget *self, ltk_rect *rect_ret);
+	int (*move_active_first)(struct ltk_widget *self, ltk_rect *rect_ret);
+
 	void (*child_size_change) (struct ltk_widget *, struct ltk_widget *);
 	/* FIXME: why does this take window? */
 	int (*remove_child) (struct ltk_window *, struct ltk_widget *, struct ltk_widget *, char **);
 	struct ltk_widget *(*get_child_at_pos)(struct ltk_widget *, int x, int y);
 
 	ltk_widget_type type;
-	char needs_redraw;
-	char needs_surface;
+	ltk_widget_flags flags;
 };
 
 int ltk_widget_destroy(ltk_widget *widget, int shallow, char **errstr);