From ff36b7225cd146b50cb8e4522ad58aa43c6bc153 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 06 Aug 2021 08:25:33 -0400 Subject: tk: Build focus tab index --- (limited to 'src/tk/widget.h') diff --git a/src/tk/widget.h b/src/tk/widget.h index 64b8b58..83abe0b 100644 --- a/src/tk/widget.h +++ b/src/tk/widget.h @@ -23,18 +23,33 @@ #include #include +void +mftk_window_index(struct mftk_window *win, struct mftk_widget *wid); + +enum mftk_widget_role { + MFTK_WIDGET_ROLE_NONE, + MFTK_WIDGET_ROLE_FOCUSABLE, + MFTK_WIDGET_ROLE_CONTAINER +}; + struct mftk_widget { - int w; - int h; - struct mftk_widget *container; - int vis; - int can_focus; - void (*layout)(struct mftk_widget *); - int (*event)(struct mftk_widget *, SDL_Event *, + int w; + int h; + struct mftk_widget *container; + int vis; + void (*layout)(struct mftk_widget *); + void (*index)(struct mftk_widget *, + struct mftk_window *); + int (*event)(struct mftk_widget *, SDL_Event *, int, int); - int (*render)(struct mftk_widget *, SDL_Renderer *, + int (*render)(struct mftk_widget *, SDL_Renderer *, int, int); - void (*destroy)(struct mftk_widget *); + void (*destroy)(struct mftk_widget *); + enum mftk_widget_role role; + struct mftk_widget *prev; + struct mftk_widget *next; + struct mftk_window *window; + int focused; }; struct mftk_widget * @@ -50,6 +65,34 @@ mftk_widget_new(size_t size); w->event = &_mftk_##name##_event; \ w->render = &_mftk_##name##_render; \ w->destroy = &_mftk_##name##_destroy; \ + w->role = MFTK_WIDGET_ROLE_NONE; \ + t_w = (struct mftk_##name *) w; \ + } while (0) +#define mftk_widget_init_focusable(w, t_w, name) \ + do { \ + w = mftk_widget_new(sizeof(struct mftk_##name)); \ + if (w == NULL) { \ + return NULL; \ + }; \ + w->layout = &_mftk_##name##_layout; \ + w->event = &_mftk_##name##_event; \ + w->render = &_mftk_##name##_render; \ + w->destroy = &_mftk_##name##_destroy; \ + w->role = MFTK_WIDGET_ROLE_FOCUSABLE; \ + t_w = (struct mftk_##name *) w; \ + } while (0) +#define mftk_widget_init_container(w, t_w, name) \ + do { \ + w = mftk_widget_new(sizeof(struct mftk_##name)); \ + if (w == NULL) { \ + return NULL; \ + }; \ + w->layout = &_mftk_##name##_layout; \ + w->index = &_mftk_##name##_index; \ + w->event = &_mftk_##name##_event; \ + w->render = &_mftk_##name##_render; \ + w->destroy = &_mftk_##name##_destroy; \ + w->role = MFTK_WIDGET_ROLE_CONTAINER; \ t_w = (struct mftk_##name *) w; \ } while (0) @@ -63,6 +106,9 @@ mftk_widget_get_visible(struct mftk_widget *w) void mftk_widget_layout(struct mftk_widget *w); +void +mftk_widget_index(struct mftk_widget *w, struct mftk_window *win); + int mftk_widget_event(struct mftk_widget *w, SDL_Event *e, int x, int y); -- cgit v0.9.1