aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/block.c20
-rw-r--r--src/block.h52
-rw-r--r--src/blocks/date.c31
-rw-r--r--src/blocks/fs.c31
-rw-r--r--src/blocks/group.c20
-rw-r--r--src/blocks/ram.c31
-rw-r--r--src/blocks/scheme.c16
-rw-r--r--src/blocks/scheme.h20
-rw-r--r--src/blocks/text.c19
-rw-r--r--src/comet.c1
-rw-r--r--src/config.c36
-rw-r--r--src/config.h7
13 files changed, 159 insertions, 127 deletions
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 <assert.h>
#include <time.h>
-#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 <sys/statvfs.h>
#include <sys/stat.h>
-#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 <assert.h>
#include <stdlib.h>
-#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 <stdint.h>
#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;