From 9843c8735a5a886252858a848c473cb877875ef4 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Sat, 16 Nov 2024 00:07:14 +0100 Subject: Link scheme with block --- Makefile | 2 +- src/block.c | 20 ++++++++++++++++++-- src/block.h | 52 +++++++++++++++++++++++++++++++++++----------------- src/blocks/date.c | 31 +++++++++++++++++++------------ src/blocks/fs.c | 31 +++++++++++++++++++------------ src/blocks/group.c | 20 ++++++++++++-------- src/blocks/ram.c | 31 +++++++++++++++++++------------ src/blocks/scheme.c | 16 ---------------- src/blocks/scheme.h | 20 -------------------- src/blocks/text.c | 19 ++++++++++++------- src/comet.c | 1 + src/config.c | 36 ++++++++++++++++++++---------------- src/config.h | 7 +++---- 13 files changed, 159 insertions(+), 127 deletions(-) delete mode 100644 src/blocks/scheme.c delete mode 100644 src/blocks/scheme.h diff --git a/Makefile b/Makefile index 3d15574..b7373cc 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SRC = $(shell find src/ -name '*.c') OBJ = $(SRC:.c=.o) -BIN = comet.bin +BIN = comet PCDEP = xcb \ xcb-aux \ diff --git a/src/block.c b/src/block.c index 6a7311e..c844e9b 100644 --- a/src/block.c +++ b/src/block.c @@ -5,6 +5,21 @@ #include "util.h" #include "any_log.h" +extern const block_scheme_t block_text_scheme; +extern const block_scheme_t block_group_scheme; +extern const block_scheme_t block_ram_scheme; +extern const block_scheme_t block_fs_scheme; +extern const block_scheme_t block_date_scheme; + +const block_scheme_t *block_schemes[] = { + &block_text_scheme, + &block_group_scheme, + &block_ram_scheme, + &block_fs_scheme, + &block_date_scheme, + NULL, +}; + void block_update(block_t *block) { if (block->update_fn != NULL) { @@ -34,7 +49,8 @@ void block_update(block_t *block) void block_free(block_t *block) { free(block->label); - assert(block->clean_fn != NULL); - block->clean_fn(block); + assert(block->scheme != NULL); + assert(block->scheme->clean_fn != NULL); + block->scheme->clean_fn(block); free(block); } diff --git a/src/block.h b/src/block.h index b310a36..71db95e 100644 --- a/src/block.h +++ b/src/block.h @@ -8,6 +8,7 @@ #include "event.h" #include "util.h" #include "layout.h" +#include "config.h" // Element or text alignment // @@ -27,18 +28,7 @@ typedef enum { typedef struct block block_t; -// Triggered when an event is directed towards the block -// -typedef void (*block_event_t)(block_t *block, event_t event); - -// Regularly called depending on the inverval passed from the last update -// -typedef void (*block_update_t)(block_t *block); - -// Called to cleanup a block and free its memory -// NOTE: This should NOT free any other block! -// -typedef void (*block_clean_t)(block_t *block); +typedef struct block_scheme block_scheme_t; // Called in layout_init // @@ -48,24 +38,27 @@ typedef void (*block_layout_t)(block_t *block, layout_t *layout, layout_info_t i // typedef void (*block_render_t)(layout_t *layout, cairo_t *cr); -// Called in config_resolve_children +// Triggered when an event is directed towards the block // -typedef struct config config_t; +typedef void (*block_event_t)(block_t *block, event_t event); -typedef bool (*block_resolve_t)(block_t *block, config_t *config); +// Regularly called depending on the inverval passed from the last update +// +typedef void (*block_update_t)(block_t *block); // The block struct // struct block { block_type_t type; char *label; + const block_scheme_t *scheme; + bool validated; bool resolved; bool hidden; struct timespec update_interval; struct timespec update_last; block_update_t update_fn; block_event_t event_fn; - block_clean_t clean_fn; // TODO //gradient_t bg_color; //gradient_t line_color; @@ -96,9 +89,34 @@ typedef struct { block_t block; block_layout_t layout_fn; block_render_t render_fn; - block_resolve_t resolve_fn; } block_spec_t; +// Called to allocate a block with its default state +// +typedef block_t *(*block_alloc_t)(const block_scheme_t *scheme); + +// Called to cleanup a block and free its memory +// NOTE: This should NOT free any other block! +// +typedef void (*block_clean_t)(block_t *block); + +// Called to validate the block after parsing the config +// +typedef bool (*block_validate_t)(block_t *block, const block_scheme_t *scheme); + +typedef bool (*block_resolve_t)(block_t *block, config_t *config); + +struct block_scheme { + const char *name; + const config_entry_t *entries; + block_alloc_t alloc_fn; + block_clean_t clean_fn; + block_validate_t validate_fn; + block_resolve_t resolve_fn; +}; + +extern const block_scheme_t *block_schemes[]; + void block_update(block_t *block); void block_free(block_t *block); diff --git a/src/blocks/date.c b/src/blocks/date.c index 93747c3..adb248e 100644 --- a/src/blocks/date.c +++ b/src/blocks/date.c @@ -2,7 +2,7 @@ #include #include -#include "scheme.h" +#include "../block.h" #include "../any_log.h" @@ -11,6 +11,11 @@ typedef struct { char *format; } block_date_t; +static const struct timespec block_date_interval = { + .tv_sec = 1, + .tv_nsec = 0, +}; + static void block_date_update(block_t *block) { block_date_t *date = (block_date_t *)block; @@ -26,6 +31,15 @@ static void block_date_update(block_t *block) assert(date->block.text != NULL); } +static block_t *block_date_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_date_t)); + block->type = BLOCK_TEXT; + block->update_interval = block_date_interval; + block->update_fn = block_date_update; + return block; +} + static void block_date_clean(block_t *block) { block_date_t *date = (block_date_t *)block; @@ -48,16 +62,9 @@ static bool block_date_validate(block_t *block, const block_scheme_t *scheme) const block_scheme_t block_date_scheme = { .name = "date", - .block = { - .type = BLOCK_TEXT, - .update_interval = { - .tv_sec = 1, - .tv_nsec = 0, - }, - .update_fn = block_date_update, - .clean_fn = block_date_clean, - }, - .size = sizeof(block_date_t), .entries = NULL, - .validate = block_date_validate, + .alloc_fn = block_date_alloc, + .clean_fn = block_date_clean, + .validate_fn = block_date_validate, + .resolve_fn = NULL, }; diff --git a/src/blocks/fs.c b/src/blocks/fs.c index 9bb4452..45ea0a3 100644 --- a/src/blocks/fs.c +++ b/src/blocks/fs.c @@ -6,7 +6,7 @@ #include #include -#include "scheme.h" +#include "../block.h" #include "../any_log.h" @@ -16,6 +16,11 @@ typedef struct { char *path; } block_fs_t; +static const struct timespec block_fs_interval = { + .tv_sec = 20, + .tv_nsec = 0, +}; + static void block_fs_update(block_t *block) { block_fs_t *fs = (block_fs_t *)block; @@ -48,6 +53,15 @@ static void block_fs_update(block_t *block) assert(fs->block.text != NULL); } +static block_t *block_fs_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_fs_t)); + block->type = BLOCK_TEXT; + block->update_interval = block_fs_interval; + block->update_fn = block_fs_update; + return block; +} + static void block_fs_clean(block_t *block) { block_fs_t *fs = (block_fs_t *)block; @@ -90,16 +104,9 @@ static const config_entry_t block_fs_entries[] = { const block_scheme_t block_fs_scheme = { .name = "fs", - .block = { - .type = BLOCK_TEXT, - .update_interval = { - .tv_sec = 20, - .tv_nsec = 0, - }, - .update_fn = block_fs_update, - .clean_fn = block_fs_clean, - }, - .size = sizeof(block_fs_t), .entries = block_fs_entries, - .validate = block_fs_validate, + .alloc_fn = block_fs_alloc, + .clean_fn = block_fs_clean, + .validate_fn = block_fs_validate, + .resolve_fn = NULL, }; diff --git a/src/blocks/group.c b/src/blocks/group.c index ae8f981..bf377f5 100644 --- a/src/blocks/group.c +++ b/src/blocks/group.c @@ -1,4 +1,11 @@ -#include "scheme.h" +#include "../block.h" + +static block_t *block_group_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_group_t)); + block->type = BLOCK_GROUP; + return block; +} static void block_group_clean(block_t *block) { @@ -8,12 +15,9 @@ static void block_group_clean(block_t *block) const block_scheme_t block_group_scheme = { .name = "group", - .block = { - .type = BLOCK_GROUP, - .clean_fn = block_group_clean, - }, - .size = sizeof(block_group_t), .entries = NULL, - .validate = NULL, + .alloc_fn = block_group_alloc, + .clean_fn = block_group_clean, + .validate_fn = NULL, + .resolve_fn = NULL, }; - diff --git a/src/blocks/ram.c b/src/blocks/ram.c index 8c21b21..158583c 100644 --- a/src/blocks/ram.c +++ b/src/blocks/ram.c @@ -3,7 +3,7 @@ #include #include -#include "scheme.h" +#include "../block.h" #include "../any_log.h" @@ -12,6 +12,11 @@ typedef struct { char *format; } block_ram_t; +static const struct timespec block_ram_interval = { + .tv_sec = 1, + .tv_nsec = 0, +}; + static void block_ram_update(block_t *block) { FILE *meminfo = fopen("/proc/meminfo", "rb"); @@ -59,6 +64,15 @@ static void block_ram_update(block_t *block) assert(ram->block.text != NULL); } +static block_t *block_ram_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_ram_t)); + block->type = BLOCK_TEXT; + block->update_interval = block_ram_interval; + block->update_fn = block_ram_update; + return block; +} + static void block_ram_clean(block_t *block) { block_ram_t *ram = (block_ram_t *)block; @@ -89,16 +103,9 @@ static bool block_ram_validate(block_t *block, const block_scheme_t *scheme) const block_scheme_t block_ram_scheme = { .name = "ram", - .block = { - .type = BLOCK_TEXT, - .update_interval = { - .tv_sec = 1, - .tv_nsec = 0, - }, - .update_fn = block_ram_update, - .clean_fn = block_ram_clean, - }, - .size = sizeof(block_ram_t), .entries = NULL, - .validate = block_ram_validate, + .alloc_fn = block_ram_alloc, + .clean_fn = block_ram_clean, + .validate_fn = block_ram_validate, + .resolve_fn = NULL, }; diff --git a/src/blocks/scheme.c b/src/blocks/scheme.c deleted file mode 100644 index 75519fc..0000000 --- a/src/blocks/scheme.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "scheme.h" - -extern const block_scheme_t block_text_scheme; -extern const block_scheme_t block_group_scheme; -extern const block_scheme_t block_ram_scheme; -extern const block_scheme_t block_fs_scheme; -extern const block_scheme_t block_date_scheme; - -const block_scheme_t *block_schemes[] = { - &block_text_scheme, - &block_group_scheme, - &block_ram_scheme, - &block_fs_scheme, - &block_date_scheme, - NULL, -}; diff --git a/src/blocks/scheme.h b/src/blocks/scheme.h deleted file mode 100644 index a3dc9c2..0000000 --- a/src/blocks/scheme.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef COMET_SCHEME_H -#define COMET_SCHEME_H - -#include "../config.h" - -typedef struct block_scheme block_scheme_t; - -typedef bool (*block_validate_t)(block_t *block, const block_scheme_t *scheme); - -struct block_scheme { - const char *name; - block_t block; - size_t size; - const config_entry_t *entries; - block_validate_t validate; -}; - -extern const block_scheme_t *block_schemes[]; - -#endif diff --git a/src/blocks/text.c b/src/blocks/text.c index 270b197..115beb0 100644 --- a/src/blocks/text.c +++ b/src/blocks/text.c @@ -1,7 +1,14 @@ -#include "scheme.h" +#include "../block.h" #include "../any_log.h" +static block_t *block_text_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_text_t)); + block->type = BLOCK_TEXT; + return block; +} + static void block_text_clean(block_t *block) { block_text_t *text = (block_text_t *)block; @@ -22,11 +29,9 @@ static bool block_text_validate(block_t *block, const block_scheme_t *scheme) const block_scheme_t block_text_scheme = { .name = "text", - .block = { - .type = BLOCK_TEXT, - .clean_fn = block_text_clean, - }, - .size = sizeof(block_text_t), .entries = NULL, - .validate = block_text_validate, + .alloc_fn = block_text_alloc, + .clean_fn = block_text_clean, + .validate_fn = block_text_validate, + .resolve_fn = NULL, }; diff --git a/src/comet.c b/src/comet.c index a539015..1522bf7 100644 --- a/src/comet.c +++ b/src/comet.c @@ -8,6 +8,7 @@ #include "util.h" #include "event.h" #include "config.h" +#include "block.h" #ifdef RELEASE #define ANY_LOG_VALUE_BEFORE(level, module, func, message) \ diff --git a/src/config.c b/src/config.c index d89bdde..c9543b7 100644 --- a/src/config.c +++ b/src/config.c @@ -9,7 +9,7 @@ #include "config.h" #include "util.h" #include "block.h" -#include "blocks/scheme.h" +#include "block.h" #define ANY_INI_IMPLEMENT #include "any_ini.h" @@ -355,12 +355,12 @@ static block_t *config_alloc_block(config_t *config, const block_scheme_t *schem config->blocks = realloc(config->blocks, ++config->n_blocks * sizeof(block_t *)); assert(config->blocks != NULL); - config->blocks[config->n_blocks - 1] = calloc(1, scheme->size); + config->blocks[config->n_blocks - 1] = scheme->alloc_fn(scheme); block_t *block = config->blocks[config->n_blocks - 1]; assert(block != NULL); - memcpy(block, &scheme->block, sizeof(block_t)); block->label = label; + block->scheme = scheme; return block; } @@ -516,32 +516,34 @@ skip_pair: free(value); } - if (block != NULL && scheme != NULL && scheme->validate != NULL) { + if (block != NULL && scheme != NULL && scheme->validate_fn != NULL) { if (errors != 0) log_trace("Skipped validation for block '%s'", section); - else - errors += !scheme->validate(block, scheme); + else { + block->validated = scheme->validate_fn(block, scheme); + errors += !block->validated; + } } free(section); n_errors += errors; } while ((section = any_ini_stream_next_section(&ini)) != NULL); - if (n_errors > 0) - log_panic("Config file contained %d errors", n_errors); + if (n_errors > 0) { + log_error("Config file contained %d errors", n_errors); + exit(EXIT_FAILURE); + } } bool config_resolve_children(config_t *config, block_t *block) { block->resolved = true; - if (block->type == BLOCK_TEXT) - return true; + if (block->scheme != NULL && block->scheme->resolve_fn != NULL) + return block->scheme->resolve_fn(block, config); - if (block->type == BLOCK_SPEC) { - block_spec_t *spec = (block_spec_t *)block; - return spec->resolve_fn == NULL || spec->resolve_fn(block, config); - } + if (block->type != BLOCK_GROUP) + return true; assert(block->type == BLOCK_GROUP); block_group_t *group = (block_group_t *)block; @@ -600,8 +602,10 @@ block_t *config_resolve(config_t *config) errors += !config_resolve_children(config, config->blocks[0]); } - if (errors > 0) - log_panic("Config could not be resolved"); + if (errors > 0) { + log_error("Config could not be resolved"); + exit(EXIT_FAILURE); + } return config->blocks[0]; } diff --git a/src/config.h b/src/config.h index 48fd273..fef2cba 100644 --- a/src/config.h +++ b/src/config.h @@ -5,9 +5,8 @@ #include #include "util.h" -#include "block.h" -typedef struct config config_t; +typedef struct block block_t; typedef enum { CONFIG_STRING, @@ -28,7 +27,7 @@ typedef struct { size_t offset; } config_entry_t; -struct config { +typedef struct { size_t n_blocks; block_t **blocks; char *font; @@ -37,7 +36,7 @@ struct config { color_t background; unsigned int width; unsigned int height; -}; +} config_t; typedef struct { const char *label; -- cgit v1.2.3