ltk

Socket-based GUI for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit c5dbd602a0e8b531a5760038c271098feffdcf47
parent bf6d516dc0a01db18fb93ddb4f153a454b36700b
Author: lumidify <nobody@lumidify.org>
Date:   Thu, 16 Jun 2022 20:04:01 +0200

Start adding widget flags

Diffstat:
Msrc/box.c | 5++---
Msrc/button.c | 3+--
Msrc/grid.c | 3+--
Msrc/label.c | 3+--
Msrc/menu.c | 3+--
Msrc/scrollbar.c | 3+--
Msrc/widget.c | 6+++---
Msrc/widget.h | 30++++++++++++++++++++++++++++--
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 = &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( 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);