aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/block.c28
-rw-r--r--src/block.h5
-rw-r--r--src/blocks/date.c34
-rw-r--r--src/blocks/fs.c50
-rw-r--r--src/blocks/group.c10
-rw-r--r--src/blocks/ram.c36
-rw-r--r--src/blocks/scheme.h1
-rw-r--r--src/blocks/text.c13
-rw-r--r--src/config.c42
9 files changed, 116 insertions, 103 deletions
diff --git a/src/block.c b/src/block.c
index f735174..6a7311e 100644
--- a/src/block.c
+++ b/src/block.c
@@ -31,36 +31,10 @@ void block_update(block_t *block)
}
}
-void block_copy(block_t *copy, const block_t *block)
-{
-// memcpy(copy, block, sizeof(block_t));
-//
-// // NOTE: Strings must be copied
-// copy->label = strcopy(block->label);
-//
-// if (block->type == BLOCK_TEXT) {
-// copy->text.text = strcopy(block->text.text);
-// } else if (block->type == BLOCK_GROUP) {
-// copy->group.children = calloc(block->group.n_children, sizeof(block_t *));
-//
-// for (int i = 0; i < block->group.n_children; i++) {
-// block->group.children[i] = malloc(sizeof(block_t));
-// block_copy(block->group.children[i], copy->group.children[i]);
-// }
-// }
-}
-
-// NOTE: This does not recursively free groups!
void block_free(block_t *block)
{
free(block->label);
-//
-// if (block->type == BLOCK_TEXT) {
-// free(block->text.text);
-// } else if (block->type == BLOCK_GROUP) {
-// free(block->group.children);
-// }
-//
assert(block->clean_fn != NULL);
block->clean_fn(block);
+ free(block);
}
diff --git a/src/block.h b/src/block.h
index d9800ee..b310a36 100644
--- a/src/block.h
+++ b/src/block.h
@@ -36,6 +36,7 @@ typedef void (*block_event_t)(block_t *block, event_t event);
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);
@@ -87,7 +88,7 @@ typedef struct {
block_t block;
unsigned int spacing;
size_t n_children;
- struct block **children;
+ block_t **children;
bool collapse;
} block_group_t;
@@ -100,8 +101,6 @@ typedef struct {
void block_update(block_t *block);
-void block_copy(block_t *copy, const block_t *block);
-
void block_free(block_t *block);
#endif
diff --git a/src/blocks/date.c b/src/blocks/date.c
index 01c62c3..93747c3 100644
--- a/src/blocks/date.c
+++ b/src/blocks/date.c
@@ -6,33 +6,43 @@
#include "../any_log.h"
+typedef struct {
+ block_text_t block;
+ char *format;
+} block_date_t;
+
static void block_date_update(block_t *block)
{
+ block_date_t *date = (block_date_t *)block;
+
time_t epoch = time(NULL);
struct tm *loc_time = localtime(&epoch);
char buffer[64];
- strftime(buffer, sizeof(buffer), block->state, loc_time);
+ strftime(buffer, sizeof(buffer), date->format, loc_time);
- free(block->text.text);
- block->text.text = strcopy(buffer);
- assert(block->text.text != NULL);
+ free(date->block.text);
+ date->block.text = strcopy(buffer);
+ assert(date->block.text != NULL);
}
-static void block_date_finalize(block_t *block)
+static void block_date_clean(block_t *block)
{
- free(block->state);
+ block_date_t *date = (block_date_t *)block;
+ free(date->format);
}
static bool block_date_validate(block_t *block, const block_scheme_t *scheme)
{
- if (block->text.text == NULL) {
+ block_date_t *date = (block_date_t *)block;
+
+ if (date->block.text == NULL) {
log_error("Block '%s' requires key '%s'", block->label, "text");
return false;
}
- block->state = block->text.text;
- block->text.text = NULL;
+ date->format = date->block.text;
+ date->block.text = NULL;
return true;
}
@@ -44,10 +54,10 @@ const block_scheme_t block_date_scheme = {
.tv_sec = 1,
.tv_nsec = 0,
},
- .update_cb = block_date_update,
- .finalize_cb = block_date_finalize,
+ .update_fn = block_date_update,
+ .clean_fn = block_date_clean,
},
- .size = sizeof(char *),
+ .size = sizeof(block_date_t),
.entries = NULL,
.validate = block_date_validate,
};
diff --git a/src/blocks/fs.c b/src/blocks/fs.c
index 65e8fe2..9bb4452 100644
--- a/src/blocks/fs.c
+++ b/src/blocks/fs.c
@@ -10,13 +10,18 @@
#include "../any_log.h"
+typedef struct {
+ block_text_t block;
+ char *format;
+ char *path;
+} block_fs_t;
+
static void block_fs_update(block_t *block)
{
- const char *path = ((char **)block->state)[0];
- const char *text = ((char **)block->state)[1];
+ block_fs_t *fs = (block_fs_t *)block;
struct statvfs sbuf;
- assert(statvfs(path, &sbuf) == 0);
+ assert(statvfs(fs->path, &sbuf) == 0);
static const char *fs_formats[] = {
"total",
@@ -38,47 +43,48 @@ static void block_fs_update(block_t *block)
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], NULL,
};
- free(block->text.text);
- block->text.text = strformat(text, '%', fs_formats, fs_values);
- assert(block->text.text != NULL);
+ free(fs->block.text);
+ fs->block.text = strformat(fs->format, '%', fs_formats, fs_values);
+ assert(fs->block.text != NULL);
}
-static void block_fs_finalize(block_t *block)
+static void block_fs_clean(block_t *block)
{
- free(block->state);
+ block_fs_t *fs = (block_fs_t *)block;
+ free(fs->format);
+ free(fs->path);
}
static bool block_fs_validate(block_t *block, const block_scheme_t *scheme)
{
- if (block->text.text == NULL) {
+ block_fs_t *fs = (block_fs_t *)block;
+
+ if (fs->block.text == NULL) {
log_error("Block '%s' requires key '%s'", block->label, "text");
return false;
}
- if (strstr(block->text.text, "%{") == NULL) {
+ if (strstr(fs->block.text, "%{") == NULL) {
log_warn("Block '%s' does not use any fs variable", block->label);
- block->update_cb = NULL;
+ block->update_fn = NULL;
log_debug("Disabled updates for block '%s'", block->label);
return true;
}
- const char *path = ((char **)block->state)[0];
struct stat sbuf;
-
- if (path == NULL || stat(path, &sbuf) < 0) {
- log_error("Block '%s' was given an invalid path '%s'", block->label, path);
+ if (fs->path == NULL || stat(fs->path, &sbuf) < 0) {
+ log_error("Block '%s' was given an invalid path '%s'", block->label, fs->path);
return false;
}
- ((char **)block->state)[1] = block->text.text;
- block->text.text = NULL;
-
+ fs->format = fs->block.text;
+ fs->block.text = NULL;
return true;
}
static const config_entry_t block_fs_entries[] = {
- { "path", CONFIG_STRING, NULL, 0 },
+ { "path", CONFIG_STRING, NULL, offsetof(block_fs_t, path) },
{ 0 },
};
@@ -90,10 +96,10 @@ const block_scheme_t block_fs_scheme = {
.tv_sec = 20,
.tv_nsec = 0,
},
- .update_cb = block_fs_update,
- .finalize_cb = block_fs_finalize,
+ .update_fn = block_fs_update,
+ .clean_fn = block_fs_clean,
},
- .size = 2 * sizeof(char *),
+ .size = sizeof(block_fs_t),
.entries = block_fs_entries,
.validate = block_fs_validate,
};
diff --git a/src/blocks/group.c b/src/blocks/group.c
index 9843afa..ae8f981 100644
--- a/src/blocks/group.c
+++ b/src/blocks/group.c
@@ -1,12 +1,18 @@
#include "scheme.h"
+static void block_group_clean(block_t *block)
+{
+ block_group_t *group = (block_group_t *)block;
+ free(group->children);
+}
+
const block_scheme_t block_group_scheme = {
.name = "group",
.block = {
.type = BLOCK_GROUP,
- .group.collapse = false,
+ .clean_fn = block_group_clean,
},
- .size = 0,
+ .size = sizeof(block_group_t),
.entries = NULL,
.validate = NULL,
};
diff --git a/src/blocks/ram.c b/src/blocks/ram.c
index 5a95013..8c21b21 100644
--- a/src/blocks/ram.c
+++ b/src/blocks/ram.c
@@ -7,6 +7,11 @@
#include "../any_log.h"
+typedef struct {
+ block_text_t block;
+ char *format;
+} block_ram_t;
+
static void block_ram_update(block_t *block)
{
FILE *meminfo = fopen("/proc/meminfo", "rb");
@@ -47,33 +52,38 @@ static void block_ram_update(block_t *block)
NULL,
};
- free(block->text.text);
- block->text.text = strformat(block->state, '%', ram_formats, ram_values);
- assert(block->text.text != NULL);
+ block_ram_t *ram = (block_ram_t *)block;
+ free(ram->block.text);
+
+ ram->block.text = strformat(ram->format, '%', ram_formats, ram_values);
+ assert(ram->block.text != NULL);
}
-static void block_ram_finalize(block_t *block)
+static void block_ram_clean(block_t *block)
{
- free(block->state);
+ block_ram_t *ram = (block_ram_t *)block;
+ free(ram->format);
}
static bool block_ram_validate(block_t *block, const block_scheme_t *scheme)
{
- if (block->text.text == NULL) {
+ block_ram_t *ram = (block_ram_t *)block;
+
+ if (ram->block.text == NULL) {
log_error("Block '%s' requires key '%s'", block->label, "text");
return false;
}
- if (strstr(block->text.text, "%{") == NULL) {
+ if (strstr(ram->block.text, "%{") == NULL) {
log_warn("Block '%s' does not use any ram variable", block->label);
- block->update_cb = NULL;
+ block->update_fn = NULL;
log_debug("Disabled updates for block '%s'", block->label);
return true;
}
- block->state = block->text.text;
- block->text.text = NULL;
+ ram->format = ram->block.text;
+ ram->block.text = NULL;
return true;
}
@@ -85,10 +95,10 @@ const block_scheme_t block_ram_scheme = {
.tv_sec = 1,
.tv_nsec = 0,
},
- .update_cb = block_ram_update,
- .finalize_cb = block_ram_finalize,
+ .update_fn = block_ram_update,
+ .clean_fn = block_ram_clean,
},
- .size = sizeof(char *),
+ .size = sizeof(block_ram_t),
.entries = NULL,
.validate = block_ram_validate,
};
diff --git a/src/blocks/scheme.h b/src/blocks/scheme.h
index b726afe..a3dc9c2 100644
--- a/src/blocks/scheme.h
+++ b/src/blocks/scheme.h
@@ -13,7 +13,6 @@ struct block_scheme {
size_t size;
const config_entry_t *entries;
block_validate_t validate;
- //block_resolve_t resolve;
};
extern const block_scheme_t *block_schemes[];
diff --git a/src/blocks/text.c b/src/blocks/text.c
index f2c1651..270b197 100644
--- a/src/blocks/text.c
+++ b/src/blocks/text.c
@@ -2,9 +2,17 @@
#include "../any_log.h"
+static void block_text_clean(block_t *block)
+{
+ block_text_t *text = (block_text_t *)block;
+ free(text->text);
+}
+
static bool block_text_validate(block_t *block, const block_scheme_t *scheme)
{
- if (block->text.text == NULL) {
+ block_text_t *text = (block_text_t *)block;
+
+ if (text->text == NULL) {
log_error("Block '%s' requires key '%s'", block->label, "text");
return false;
}
@@ -16,8 +24,9 @@ const block_scheme_t block_text_scheme = {
.name = "text",
.block = {
.type = BLOCK_TEXT,
+ .clean_fn = block_text_clean,
},
- .size = 0,
+ .size = sizeof(block_text_t),
.entries = NULL,
.validate = block_text_validate,
};
diff --git a/src/config.c b/src/config.c
index 0d48ef6..d89bdde 100644
--- a/src/config.c
+++ b/src/config.c
@@ -350,6 +350,21 @@ static config_status_t config_read_block(const block_scheme_t *scheme, block_t *
: config_read_entry(scheme->entries, block, type, section, key, value);
}
+static block_t *config_alloc_block(config_t *config, const block_scheme_t *scheme, char *label)
+{
+ 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);
+ block_t *block = config->blocks[config->n_blocks - 1];
+ assert(block != NULL);
+
+ memcpy(block, &scheme->block, sizeof(block_t));
+ block->label = label;
+ return block;
+}
+
+// TODO: More robust way to define defaults
void config_init(config_t *config)
{
const config_t config_default = {
@@ -363,11 +378,9 @@ void config_init(config_t *config)
memcpy(config, &config_default, sizeof(config_t));
config->font = strcopy(config_default.font);
- config->n_blocks = 1;
- config->blocks = calloc(1, sizeof(block_t *));
- config->blocks[0]->label = strcopy("bar");
- config->blocks[0]->type = BLOCK_GROUP;
- //config->blocks->group.spacing = 10;
+ extern const block_scheme_t block_group_scheme;
+ block_group_t *bar = (block_group_t *)config_alloc_block(config, &block_group_scheme, strcopy("bar"));
+ bar->spacing = 10;
}
void config_read(config_t *config, FILE *file)
@@ -388,10 +401,6 @@ void config_read(config_t *config, FILE *file)
if (section != NULL) {
if (!strncmp(section, "block.", 6)) {
- config->blocks = realloc(config->blocks, ++config->n_blocks * sizeof(block_t *));
- assert(config->blocks != NULL);
- block = config->blocks[config->n_blocks - 1];
-
char *label = strcopy(section + 6);
if (label == NULL || *label == '\0' || !strcmp(label, "bar")) {
++errors;
@@ -399,7 +408,7 @@ void config_read(config_t *config, FILE *file)
"s:section", section,
"i:line", ini.line);
} else {
- for (size_t i = 0; i < config->n_blocks - 1; i++) {
+ for (size_t i = 0; i < config->n_blocks; i++) {
if (!strcmp(label, config->blocks[i]->label)) {
++errors;
log_value_error("Block section must have a unique label",
@@ -432,15 +441,7 @@ void config_read(config_t *config, FILE *file)
continue;
scheme = block_schemes[i];
- block_copy(block, &scheme->block);
- free(block->label);
- block->label = label;
-
- //if (scheme->size != 0) {
- // block->state = malloc(scheme->size);
- // memset(block->state, 0, scheme->size);
- //}
-
+ block = config_alloc_block(config, scheme, label);
goto skip_pair;
}
@@ -481,8 +482,7 @@ void config_read(config_t *config, FILE *file)
}
if (block != NULL) {
- status = config_read_block(scheme, config->blocks[config->n_blocks - 1],
- &type, section, key, value);
+ status = config_read_block(scheme, block, &type, section, key, value);
}
switch (status) {