summaryrefslogtreecommitdiffstats
path: root/src/tk/widget.h
diff options
context:
space:
mode:
authorP. 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)
commitff36b7225cd146b50cb8e4522ad58aa43c6bc153 (patch)
treeef0b4d61dfc4a2d7c878b10f5f2ac3179654303a /src/tk/widget.h
parentff4f77ec223c5a0b1a015789d34177d8ddb4a4b2 (diff)
downloadmazefight-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.h64
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);