URI: 
       tStart adding widget flags - ltk - Socket-based GUI for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit c5dbd602a0e8b531a5760038c271098feffdcf47
   DIR parent bf6d516dc0a01db18fb93ddb4f153a454b36700b
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Thu, 16 Jun 2022 20:04:01 +0200
       
       Start adding widget flags
       
       Diffstat:
         M src/box.c                           |       5 ++---
         M src/button.c                        |       3 +--
         M src/grid.c                          |       3 +--
         M src/label.c                         |       3 +--
         M src/menu.c                          |       3 +--
         M src/scrollbar.c                     |       3 +--
         M src/widget.c                        |       6 +++---
         M src/widget.h                        |      30 ++++++++++++++++++++++++++++--
       
       8 files changed, 38 insertions(+), 18 deletions(-)
       ---
   DIR diff --git a/src/box.c b/src/box.c
       t@@ -59,9 +59,8 @@ static struct ltk_widget_vtable vtable = {
                .get_child_at_pos = &ltk_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(
   DIR diff --git a/src/button.c b/src/button.c
       t@@ -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 {
   DIR diff --git a/src/grid.c b/src/grid.c
       t@@ -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(
   DIR diff --git a/src/label.c b/src/label.c
       t@@ -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 {
   DIR diff --git a/src/menu.c b/src/menu.c
       t@@ -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[] = {
   DIR diff --git a/src/scrollbar.c b/src/scrollbar.c
       t@@ -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 {
   DIR diff --git a/src/widget.c b/src/widget.c
       t@@ -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;
       t@@ -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;
       t@@ -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);
        }
        
   DIR diff --git a/src/widget.h b/src/widget.h
       t@@ -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,
       t@@ -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);