aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorLibravatar bigfoot547 <[email protected]>2023-11-24 05:20:01 -0600
committerLibravatar bigfoot547 <[email protected]>2023-11-24 05:21:12 -0600
commit153d7b4b6621bc291d24f1df5d5af68b3eebd0d9 (patch)
treecdbfe0e56616cd318d348eac748ed8cc4393b640 /src/ui
parentnot every UI window maps to a curses window (diff)
make debug code worse-looking (but more verbose)
also note that previous commit is WIP until a better solution to finding the focused UI window backed by a curses window
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/debug.c52
-rw-r--r--src/ui/ui.internal.h29
2 files changed, 56 insertions, 25 deletions
diff --git a/src/ui/debug.c b/src/ui/debug.c
index 6d3ea5d..6e404a3 100644
--- a/src/ui/debug.c
+++ b/src/ui/debug.c
@@ -3,37 +3,57 @@
#include "../macros.h"
#include "ui.internal.h"
-struct ui_window_base *ui__check_cast_to_base(void *obj)
+#include <stdio.h>
+
+const char *ui__debug_types[] = {
+#define WT_DEF(_t) "UI__WINDOW_TYPE_" #_t
+ UI__FOREACH_WINDOW_TYPE(WT_DEF)
+#undef WT_DEF
+};
+
+size_t ui__debug_type_count = sizeof(ui__debug_types) / sizeof(ui__debug_types[0]);
+
+const char *ui__debug_type_to_str(unsigned type)
{
+ if (type >= ui__debug_type_count) return "???";
+ return ui__debug_types[type];
+}
+
+struct ui_window_base *ui__check_cast_to_base(void *obj, const char *file, const char *func, int line)
+{
+ umps_unused(file);
+ umps_unused(func);
+ umps_unused(line);
return obj; /* this cast always succeeds */
}
-struct ui_window_leaf *ui__check_cast_to_leaf(void *obj)
+#define UMPS__DEBUG_DO_ERROR(_o, _fi, _fn, _ln, _t) \
+ struct ui_window_base *base = _o; \
+ if (base->type != _t) { \
+ fprintf(stderr, "!!!!!\n!!!!!\n!!!!! UMPS UI bad cast at %s:%d %s (expect %s got %s:%u) !!!!!\n!!!!!\n!!!!!\n", \
+ _fi, _ln, _fn, #_t, ui__debug_type_to_str(base->type), base->type); \
+ umps_trap; \
+ } \
+ return _o;
+
+struct ui_window_leaf *ui__check_cast_to_leaf(void *obj, const char *file, const char *func, int line)
{
- struct ui_window_base *base = obj;
- umps_assert(base->type == UI__WINDOW_TYPE_LEAF);
- return obj;
+ UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_LEAF);
}
-struct ui_window_dock *ui__check_cast_to_dock(void *obj)
+struct ui_window_dock *ui__check_cast_to_dock(void *obj, const char *file, const char *func, int line)
{
- struct ui_window_base *base = obj;
- umps_assert(base->type == UI__WINDOW_TYPE_DOCK);
- return obj;
+ UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_DOCK);
}
-struct ui_window_root *ui__check_cast_to_root(void *obj)
+struct ui_window_root *ui__check_cast_to_root(void *obj, const char *file, const char *func, int line)
{
- struct ui_window_base *base = obj;
- umps_assert(base->type == UI__WINDOW_TYPE_ROOT);
- return obj;
+ UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_ROOT);
}
#else
/* the file must have a declaration */
-void umps__debug_do_nothing(void)
-{
-}
+void umps__debug_do_nothing(void);
#endif
diff --git a/src/ui/ui.internal.h b/src/ui/ui.internal.h
index 946d57a..201e61e 100644
--- a/src/ui/ui.internal.h
+++ b/src/ui/ui.internal.h
@@ -13,25 +13,36 @@
#define UI__WINDOW_DOCK_LEFT (2u)
#define UI__WINDOW_DOCK_RIGHT (3u)
#define UI__WINDOW_DOCK_CENTER (4u)
+#define UI__WINDOW_DOCK_MAX UI__WINDOW_DOCK_CENTER+1
#define UI__WINDOW_FOCUS_NONE (999u)
-#define UI__WINDOW_TYPE_BASE (0u)
+#define UI__FOREACH_WINDOW_TYPE(O) \
+ O(BASE), \
+ O(LEAF), \
+ O(DOCK), \
+ O(ROOT)
+
+enum {
+#define WT_DEF(_t) UI__WINDOW_TYPE_ ## _t
+ UI__FOREACH_WINDOW_TYPE(WT_DEF)
+#undef WT_DEF
+};
+
+/*#define UI__WINDOW_TYPE_BASE (0u)
#define UI__WINDOW_TYPE_LEAF (1u)
#define UI__WINDOW_TYPE_DOCK (2u)
-#define UI__WINDOW_TYPE_ROOT (3u)
-
-#define UI__WINDOW_DOCK_MAX UI__WINDOW_DOCK_CENTER+1
+#define UI__WINDOW_TYPE_ROOT (3u)*/
#ifdef NDEBUG
#define ui__cast(_t, _v) ((struct ui_window_ ## _t *)(_v))
#else
-#define ui__cast(_t, _v) (ui__check_cast_to_ ## _t(_v))
+#define ui__cast(_t, _v) (ui__check_cast_to_ ## _t(_v, __FILE__, __func__, __LINE__))
-struct ui_window_base *ui__check_cast_to_base(void *);
-struct ui_window_leaf *ui__check_cast_to_leaf(void *);
-struct ui_window_dock *ui__check_cast_to_dock(void *);
-struct ui_window_root *ui__check_cast_to_root(void *);
+struct ui_window_base *ui__check_cast_to_base(void *, const char *, const char *, int);
+struct ui_window_leaf *ui__check_cast_to_leaf(void *, const char *, const char *, int);
+struct ui_window_dock *ui__check_cast_to_dock(void *, const char *, const char *, int);
+struct ui_window_root *ui__check_cast_to_root(void *, const char *, const char *, int);
#endif
/* concrete type definitions */