[backend] design a little different
This commit is contained in:
parent
174e57e51d
commit
932e7fc708
|
@ -2,9 +2,12 @@
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
struct rgn;
|
struct rgn;
|
||||||
|
struct msgq;
|
||||||
struct ax_backend;
|
struct ax_backend;
|
||||||
|
struct ax_theme;
|
||||||
|
|
||||||
extern const char* ax__backend_impl_name;
|
extern const char* ax__backend_impl_name;
|
||||||
|
|
||||||
|
@ -13,7 +16,20 @@ int ax__backend_new(
|
||||||
struct ax_backend** out_bac,
|
struct ax_backend** out_bac,
|
||||||
const char** out_err);
|
const char** out_err);
|
||||||
|
|
||||||
void ax__backend_enqueue_font(
|
enum {
|
||||||
struct ax_backend* bac,
|
ax_msg_shutdown_TAG,
|
||||||
const char* font_path,
|
ax_msg_load_font_TAG,
|
||||||
size_t font_size);
|
};
|
||||||
|
|
||||||
|
struct ax_msg_shutdown {};
|
||||||
|
|
||||||
|
struct ax_msg_load_font {
|
||||||
|
struct ax_theme* theme;
|
||||||
|
int category;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct msgq* ax__backend_msgq(struct ax_backend*);
|
||||||
|
|
||||||
|
void ax__backend_wait_for_event(struct ax_backend*);
|
||||||
|
|
||||||
|
void ax__backend_step(struct ax_backend*, bool* out_shutdown);
|
||||||
|
|
|
@ -1,32 +1,24 @@
|
||||||
#include "../backend.h"
|
#include "../backend.h"
|
||||||
#include "../util/region.h"
|
#include "../util/region.h"
|
||||||
#include "../concurrent/msgq.h"
|
#include "../concurrent/msgq.h"
|
||||||
|
#include "../ctxt/theme.h"
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <SDL2/SDL_ttf.h>
|
#include <SDL2/SDL_ttf.h>
|
||||||
|
|
||||||
/* --- Backend data type --- */
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Backend type
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
const char* ax__backend_impl_name = "SDL";
|
const char* ax__backend_impl_name = "SDL";
|
||||||
|
|
||||||
struct ax_backend {
|
struct ax_backend {
|
||||||
struct msgq* mq;
|
struct msgq* mq;
|
||||||
|
bool shutdown;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- Async messages --- */
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Backend functions
|
||||||
enum {
|
* -------------------------------------------------------------------------- */
|
||||||
msg_close_TAG,
|
|
||||||
msg_load_font_TAG,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct msg_close {};
|
|
||||||
|
|
||||||
struct msg_load_font {
|
|
||||||
const char* path;
|
|
||||||
size_t size;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* --- Functions --- */
|
|
||||||
|
|
||||||
static void backend_cleanup(struct ax_backend* bac);
|
static void backend_cleanup(struct ax_backend* bac);
|
||||||
|
|
||||||
|
@ -49,6 +41,7 @@ int ax__backend_new(
|
||||||
rgn_pin(init_rgn, bac, (void*) backend_cleanup);
|
rgn_pin(init_rgn, bac, (void*) backend_cleanup);
|
||||||
|
|
||||||
bac->mq = msgq_new(init_rgn);
|
bac->mq = msgq_new(init_rgn);
|
||||||
|
bac->shutdown = false;
|
||||||
|
|
||||||
if (out_bac != NULL) {
|
if (out_bac != NULL) {
|
||||||
*out_bac = bac;
|
*out_bac = bac;
|
||||||
|
@ -64,21 +57,46 @@ fail:
|
||||||
|
|
||||||
static void backend_cleanup(struct ax_backend* bac)
|
static void backend_cleanup(struct ax_backend* bac)
|
||||||
{
|
{
|
||||||
msgq_begin_send_typed(bac->mq, msg_close);
|
|
||||||
msgq_end_send(bac->mq);
|
|
||||||
|
|
||||||
// printf("bye, from SDL\n");
|
|
||||||
TTF_Quit();
|
TTF_Quit();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ax__backend_enqueue_font(
|
struct msgq* ax__backend_msgq(struct ax_backend* bac)
|
||||||
struct ax_backend* bac,
|
|
||||||
const char* font_path,
|
|
||||||
size_t font_size)
|
|
||||||
{
|
{
|
||||||
struct msg_load_font* m = msgq_begin_send_typed(bac->mq, msg_load_font);
|
return bac->mq;
|
||||||
m->path = rstrdup(&bac->mq->rgn, font_path);
|
}
|
||||||
m->size = font_size;
|
|
||||||
msgq_end_send(bac->mq);
|
void ax__backend_wait_for_event(struct ax_backend* bac)
|
||||||
|
{
|
||||||
|
(void) bac;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ax__backend_step(struct ax_backend* bac, bool* out_shutdown)
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
void* data;
|
||||||
|
msgq_begin_recv(bac->mq);
|
||||||
|
while ((data = msgq_recv1(bac->mq, &type)) != NULL) {
|
||||||
|
switch (type) {
|
||||||
|
|
||||||
|
case ax_msg_shutdown_TAG:
|
||||||
|
bac->shutdown = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ax_msg_load_font_TAG: {
|
||||||
|
struct ax_msg_load_font* m = data;
|
||||||
|
printf("TODO: load font `%s' (size %zu)\n",
|
||||||
|
m->theme->font_path[m->category],
|
||||||
|
m->theme->font_size[m->category]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msgq_end_recv(bac->mq);
|
||||||
|
|
||||||
|
if (out_shutdown != NULL) {
|
||||||
|
*out_shutdown = bac->shutdown;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue