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);