From 5d96bf908db82c97ca751a01c6a7637337ca360a Mon Sep 17 00:00:00 2001 From: Milo Turner Date: Thu, 13 Feb 2020 12:53:03 -0500 Subject: [PATCH] [back] backend stub less stubby --- src/backend.h | 17 +++++++++++++++++ src/backend/sdl.c | 21 +++++++++++++++++++++ src/ctxt.h | 6 ++++++ src/ctxt/ctxt.c | 29 +++++++++++++++++++++++++++-- src/util/region.h | 8 ++++++++ 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/backend.h create mode 100644 src/backend/sdl.c diff --git a/src/backend.h b/src/backend.h new file mode 100644 index 0000000..b4a0927 --- /dev/null +++ b/src/backend.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +struct rgn; + +struct ax_backend; +struct ax_font_h; + +extern const char* ax__backend_impl_name; + +struct ax_backend* ax__backend_new( + struct rgn* init_rgn); + +const char* ax__backend_get_error( + struct ax_backend* bac); diff --git a/src/backend/sdl.c b/src/backend/sdl.c new file mode 100644 index 0000000..9085424 --- /dev/null +++ b/src/backend/sdl.c @@ -0,0 +1,21 @@ +#include "../backend.h" +#include "../util/region.h" + +struct ax_backend { +}; + +const char* ax__backend_impl_name = "SDL"; + +struct ax_backend* ax__backend_new( + struct rgn* init_rgn) +{ + struct ax_backend* bac = ralloc_typed(init_rgn, struct ax_backend, 1); + return bac; +} + +const char* ax__backend_get_error( + struct ax_backend* bac) +{ + (void) bac; + return NULL; +} diff --git a/src/ctxt.h b/src/ctxt.h index 30b6e42..c12dd0e 100644 --- a/src/ctxt.h +++ b/src/ctxt.h @@ -6,6 +6,7 @@ struct ax_theme; struct ax_theme_builder; +struct ax_backend; struct ax_ctxt { struct rgn* init_rgn; @@ -18,6 +19,9 @@ struct ax_ctxt { struct rgn err_rgn; const char* err; + // backend + struct ax_backend* bac; + // theme struct rgn thmb_rgn; struct ax_theme_builder* thmb; @@ -39,3 +43,5 @@ static inline void ax__set_error(struct ax_ctxt* ax, const char* text) { strcpy(ax__make_error_buf(ax, strlen(text) + 1), text); } + +struct ax_backend* ax__backend(struct ax_ctxt* ax); diff --git a/src/ctxt/ctxt.c b/src/ctxt/ctxt.c index 6bf393c..810305d 100644 --- a/src/ctxt/ctxt.c +++ b/src/ctxt/ctxt.c @@ -1,6 +1,7 @@ +#include "../ax.h" +#include "../backend.h" #include "../ctxt.h" #include "../util.h" -#include "../ax.h" #include "theme.h" /* ----------------------------------------------------------------------------- @@ -47,6 +48,8 @@ void ax__ctxt_init(struct ax_ctxt* ax, struct rgn* init_rgn) rgn_init(&ax->thmb_rgn, THEME_BUILDER_DESIRED_REGION_SIZE); ax->thmb = NULL; ax->sel_theme = NULL; + + ax->bac = NULL; } void ax__ctxt_cleanup(struct ax_ctxt* ax) @@ -55,6 +58,20 @@ void ax__ctxt_cleanup(struct ax_ctxt* ax) rgn_cleanup(&ax->err_rgn); } +struct ax_backend* ax__backend(struct ax_ctxt* ax) +{ + if (ax->bac == NULL) { + struct rgn msg_rgn; + rgn_init(&msg_rgn, SMALL); + ax_log(ax, rsprintf(&msg_rgn, "initializing `%s' backend", + ax__backend_impl_name)); + rgn_cleanup(&msg_rgn); + + ax->bac = ax__backend_new(ax->init_rgn); + } + return ax->bac; +} + /* ----------------------------------------------------------------------------- * API functions :: logging * -------------------------------------------------------------------------- */ @@ -89,8 +106,16 @@ void ax_begin_theme(struct ax_ctxt* ax) void ax_end_theme(struct ax_ctxt* ax, struct ax_theme** out_thm) { ASSERT(ax->thmb != NULL, "`ax_end_theme' called while not building a theme"); - ax__theme_builder_finish(ax->thmb, ax->init_rgn, out_thm); + + struct ax_theme* thm; + ax__theme_builder_finish(ax->thmb, ax->init_rgn, &thm); rgn_clear(&ax->thmb_rgn); + + (void) ax__backend(ax); // TODO: tell backend to load this theme + + if (out_thm != NULL) { + *out_thm = thm; + } } void ax_set_theme_color( diff --git a/src/util/region.h b/src/util/region.h index 0b589b2..381c08c 100644 --- a/src/util/region.h +++ b/src/util/region.h @@ -66,3 +66,11 @@ static inline char* rstrdup(struct rgn* rgn, const char* str) #define rmemdup_typed(_rgn, T, _p, _n) \ ((T*) rmemdup(_rgn, _p, sizeof(T) * (_n))) + +#define rsprintf(_rgn, ...) ({ \ + size_t sprintf__len = \ + snprintf(NULL, 0, __VA_ARGS__); \ + char* sprintf__msg = \ + ralloc_typed(_rgn, char, sprintf__len + 1); \ + sprintf(sprintf__msg, __VA_ARGS__); \ + sprintf__msg; })