diff options
| author | Federico Angelilli <code@fedang.net> | 2024-09-11 22:20:04 +0200 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-09-11 22:20:04 +0200 |
| commit | b94e342ea59c9d13ef1e380834534c1c1c8a83ec (patch) | |
| tree | 17e7fcb888710927c78fd14003a103dc7e52ae27 /src | |
| parent | ee3ea3be13744f766af57e4ae4504b5942655184 (diff) | |
Add collapse option to groups
Diffstat (limited to 'src')
| -rw-r--r-- | src/block.c | 5 | ||||
| -rw-r--r-- | src/block.h | 1 | ||||
| -rw-r--r-- | src/blocks/group.c | 1 | ||||
| -rw-r--r-- | src/config.c | 10 | ||||
| -rw-r--r-- | src/layout.c | 7 |
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; |
