aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-09-11 22:20:04 +0200
committerFederico Angelilli <code@fedang.net>2024-09-11 22:20:04 +0200
commitb94e342ea59c9d13ef1e380834534c1c1c8a83ec (patch)
tree17e7fcb888710927c78fd14003a103dc7e52ae27 /src
parentee3ea3be13744f766af57e4ae4504b5942655184 (diff)
Add collapse option to groups
Diffstat (limited to 'src')
-rw-r--r--src/block.c5
-rw-r--r--src/block.h1
-rw-r--r--src/blocks/group.c1
-rw-r--r--src/config.c10
-rw-r--r--src/layout.c7
5 files changed, 17 insertions, 7 deletions
diff --git a/src/block.c b/src/block.c
index 9a65d84..d0b66c9 100644
--- a/src/block.c
+++ b/src/block.c
@@ -12,8 +12,9 @@ void block_update(block_t *block)
diff = timespec_diff(block->update_last, now);
if (timespec_greater(diff, block->update_interval)) {
- log_value_debug("Updating block",
- "s:label", block->label);
+ log_value_trace("Updating block",
+ "s:label", block->label,
+ "g:ts", ANY_LOG_FORMATTER(timespec_print), &now);
block->update_cb(block);
block->update_last = now;
diff --git a/src/block.h b/src/block.h
index 7d37c3d..4254355 100644
--- a/src/block.h
+++ b/src/block.h
@@ -68,6 +68,7 @@ struct block {
unsigned int spacing;
size_t n_children;
struct block **children;
+ bool collapse;
} group;
};
};
diff --git a/src/blocks/group.c b/src/blocks/group.c
index 4fcb420..9843afa 100644
--- a/src/blocks/group.c
+++ b/src/blocks/group.c
@@ -4,6 +4,7 @@ const block_scheme_t block_group_scheme = {
.name = "group",
.block = {
.type = BLOCK_GROUP,
+ .group.collapse = false,
},
.size = 0,
.entries = NULL,
diff --git a/src/config.c b/src/config.c
index 99888da..84804bc 100644
--- a/src/config.c
+++ b/src/config.c
@@ -44,8 +44,9 @@ static const config_entry_t block_entries[] = {
};
static const config_entry_t block_group_entries[] = {
- { "spacing", CONFIG_UINT, NULL, offsetof(block_t, group.spacing) },
- { "blocks", CONFIG_LIST, NULL, offsetof(block_t, group.children) },
+ { "spacing", CONFIG_UINT, NULL, offsetof(block_t, group.spacing) },
+ { "blocks", CONFIG_LIST, NULL, offsetof(block_t, group.children) },
+ { "collapse", CONFIG_BOOL, NULL, offsetof(block_t, group.collapse) },
{ 0 },
};
@@ -363,7 +364,7 @@ void config_init(config_t *config)
config->font = strcopy(config_default.font);
config->n_blocks = 1;
- config->blocks = malloc(sizeof(block_t));
+ config->blocks = calloc(1, sizeof(block_t));
config->blocks->label = strcopy("bar");
config->blocks->type = BLOCK_GROUP;
config->blocks->group.spacing = 10;
@@ -560,7 +561,7 @@ static bool config_resolve_children(config_t *config, block_t *block)
return false;
}
- log_debug("Block '%s' is parent to '%s'", block->label, config->blocks[j].label);
+ log_debug("Block '%s' is parent of '%s'", block->label, config->blocks[j].label);
block->group.children[i] = &config->blocks[j];
if (!config_resolve_children(config, &config->blocks[j]))
@@ -584,6 +585,7 @@ block_t *config_resolve(config_t *config)
errors++;
log_error("Section '%s' requires at least one child", "bar");
} else {
+ // NOTE: The first item is the main block
config->blocks->min_width = config->blocks->max_width = config->width;
errors += !config_resolve_children(config, config->blocks);
}
diff --git a/src/layout.c b/src/layout.c
index 6b6590e..92e6469 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -32,7 +32,12 @@ void layout_init(layout_t *layout, block_t *block, layout_info_t info)
layout->n_children++;
}
- if (layout->n_children > 0) {
+ if (block->group.collapse && layout->n_children == 1) {
+ layout_t *children = layout->children;
+ memcpy(layout, children, sizeof(layout_t));
+ free(children);
+
+ } else if (layout->n_children > 0) {
layout_t *last = &layout->children[layout->n_children - 1];
layout->width = last->x + last->width - x_offset;