diff options
author | P. J. McDermott <pj@pehjota.net> | 2021-08-06 08:25:33 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2021-08-06 08:35:56 (EDT) |
commit | ff36b7225cd146b50cb8e4522ad58aa43c6bc153 (patch) | |
tree | ef0b4d61dfc4a2d7c878b10f5f2ac3179654303a /src/tk/widget.h | |
parent | ff4f77ec223c5a0b1a015789d34177d8ddb4a4b2 (diff) | |
download | mazefight-ff36b7225cd146b50cb8e4522ad58aa43c6bc153.zip mazefight-ff36b7225cd146b50cb8e4522ad58aa43c6bc153.tar.gz mazefight-ff36b7225cd146b50cb8e4522ad58aa43c6bc153.tar.bz2 |
tk: Build focus tab index
Diffstat (limited to 'src/tk/widget.h')
-rw-r--r-- | src/tk/widget.h | 64 |
1 files changed, 55 insertions, 9 deletions
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 <SDL.h> #include <stdarg.h> +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); |