diff options
| author | Federico Angelilli <code@fedang.net> | 2024-11-24 19:39:19 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-11-24 19:39:19 +0100 |
| commit | def1e18d86579cf77649d1b8aa596d0877b822bb (patch) | |
| tree | 0e6deebdef1575b4b74472bc4367b294f7551753 | |
| parent | 76ad6b0d404d40f08b73d90ac5f66564c29feb95 (diff) | |
Refactor block_change_fn
| -rw-r--r-- | comet.conf | 3 | ||||
| -rw-r--r-- | src/action.c | 36 | ||||
| -rw-r--r-- | src/block.c | 12 | ||||
| -rw-r--r-- | src/block.h | 3 | ||||
| -rw-r--r-- | src/blocks/fs.c | 15 | ||||
| -rw-r--r-- | src/blocks/group.c | 13 | ||||
| -rw-r--r-- | src/blocks/ram.c | 15 | ||||
| -rw-r--r-- | src/blocks/slider.c | 22 | ||||
| -rw-r--r-- | src/blocks/text.c | 9 | ||||
| -rw-r--r-- | src/config.c | 3 | ||||
| -rw-r--r-- | src/config.h | 13 | ||||
| -rw-r--r-- | src/event.c | 14 |
12 files changed, 108 insertions, 50 deletions
@@ -124,3 +124,6 @@ target = block.next set-text = "ciao" + target = block.mus + set-blocks = bogus + diff --git a/src/action.c b/src/action.c index 0ae0c0a..65172f5 100644 --- a/src/action.c +++ b/src/action.c @@ -10,6 +10,7 @@ void action_perform(action_t *action, block_t *block, config_t *config) { block_t *target = block; bool warned = false; + bool notify = false; for (size_t i = 0; i < action->length; i++) { const char *key = action->parts[i].key; @@ -30,20 +31,39 @@ void action_perform(action_t *action, block_t *block, config_t *config) } } } + + if (notify && target->scheme->validate_change) { + assert(target->scheme->validate_fn != NULL); + int errors = target->scheme->validate_fn(target, config); + + if (config->action_failfast && errors) { + log_debug("Aborted action '%s' for %d errors", action->label, errors); + return; + } + } + + notify = false; warned = false; break; } case ACTION_SET_PAIR: { assert(target != NULL); + if (!warned && target->scheme->change_fn == NULL) { - log_warn("Block '%s' does not support changing values", target->label); + log_warn("Block '%s' does not support 'set' actions", target->label); warned = true; continue; } - // Skip "set-" - target->scheme->change_fn(target, config, key + 4, value); + // Skip "set-" in key + bool success = block_change(target, config, key + 4, value); + if (config->action_failfast && !success) { + log_debug("Aborted action '%s'", action->label); + return; + } + + notify = true; break; } @@ -63,6 +83,16 @@ void action_perform(action_t *action, block_t *block, config_t *config) "s:value", value); } + if (notify && target->scheme->validate_change) { + assert(target->scheme->validate_fn != NULL); + int errors = target->scheme->validate_fn(target, config); + + if (config->action_failfast && errors) { + log_debug("Aborted action '%s' for %d errors", action->label, errors); + return; + } + } + log_debug("Performed action '%s'", action->label); } diff --git a/src/block.c b/src/block.c index 00a0dde..1786502 100644 --- a/src/block.c +++ b/src/block.c @@ -50,11 +50,19 @@ void block_update(block_t *block) } } -config_status_t block_change(block_t *block, const char *key, const char *value) +bool block_change(block_t *block, config_t *config, const char *key, const char *value) { + extern const config_entry_t block_entries[]; + // Ignore notify invocations + config_status_t status = key == NULL + ? CONFIG_UNKNOWN + : config_read_entry(block_entries, block, NULL, "block", block->label, key, value); - return CONFIG_UNKNOWN; + if (status == CONFIG_UNKNOWN && block->scheme->change_fn != NULL) + status = block->scheme->change_fn(block, config, key, value); + + return status == CONFIG_SUCCESS || (!config->action_strict_set && status == CONFIG_UNKNOWN); } void block_free(block_t *block) diff --git a/src/block.h b/src/block.h index ca4f4ab..b240343 100644 --- a/src/block.h +++ b/src/block.h @@ -112,6 +112,7 @@ struct block_scheme { const char *name; const config_entry_t *entries; size_t size; + bool validate_change; block_init_t init_fn; block_clean_t clean_fn; block_validate_t validate_fn; @@ -122,7 +123,7 @@ extern const block_scheme_t *block_schemes[]; void block_update(block_t *block); -config_status_t block_change(block_t *block, const char *key, const char *value); +bool block_change(block_t *block, config_t *config, const char *key, const char *value); void block_free(block_t *block); diff --git a/src/blocks/fs.c b/src/blocks/fs.c index 1196c68..a52e491 100644 --- a/src/blocks/fs.c +++ b/src/blocks/fs.c @@ -152,12 +152,15 @@ static int block_fs_validate(block_t *block, config_t *config) int marked = format_remark(&fs->format, block->label, block_fs_options); if (marked < 0) errors += -marked; - - if (marked == 0) { - log_warn("Block '%s' does not use any fs option", block->label); - - block->update_fn = NULL; - log_debug("Disabled updates for block '%s'", block->label); + else if (marked > 0) + block->update_fn = block_fs_update; + else { + log_warn("Block '%s' does not use any 'fs' option", block->label); + + if (block->update_fn != NULL) { + block->update_fn = NULL; + log_debug("Disabled updates for block '%s'", block->label); + } } } diff --git a/src/blocks/group.c b/src/blocks/group.c index febefe4..eeac132 100644 --- a/src/blocks/group.c +++ b/src/blocks/group.c @@ -1,4 +1,5 @@ #include "../block.h" +#include "../any_log.h" static void block_group_init(block_t *block) { @@ -11,6 +12,17 @@ static void block_group_clean(block_t *block) free(group->children); } +static config_status_t block_group_change(block_t *block, config_t *config, const char *key, const char *value) +{ + if (!strcmp(key, "blocks")) { + log_error("Block '%s' option '%s' cannot be changed", block->label, "blocks"); + return CONFIG_INVALID; + } + + extern const config_entry_t block_group_entries[]; + return config_read_entry(block_group_entries, block, NULL, "block", block->label, key, value); +} + const block_scheme_t block_group_scheme = { .name = "group", .entries = NULL, @@ -18,4 +30,5 @@ const block_scheme_t block_group_scheme = { .init_fn = block_group_init, .clean_fn = block_group_clean, .validate_fn = NULL, + .change_fn = block_group_change, }; diff --git a/src/blocks/ram.c b/src/blocks/ram.c index 28af60c..89cd196 100644 --- a/src/blocks/ram.c +++ b/src/blocks/ram.c @@ -160,12 +160,15 @@ static int block_ram_validate(block_t *block, config_t *config) int marked = format_remark(&ram->format, block->label, block_ram_options); if (marked < 0) errors += -marked; - - if (marked == 0) { - log_warn("Block '%s' does not use any ram option", block->label); - - block->update_fn = NULL; - log_debug("Disabled updates for block '%s'", block->label); + else if (marked > 0) + block->update_fn = block_ram_update; + else { + log_warn("Block '%s' does not use any 'ram' option", block->label); + + if (block->update_fn != NULL) { + block->update_fn = NULL; + log_debug("Disabled updates for block '%s'", block->label); + } } } diff --git a/src/blocks/slider.c b/src/blocks/slider.c index f568105..6ad5211 100644 --- a/src/blocks/slider.c +++ b/src/blocks/slider.c @@ -91,7 +91,10 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) int knob_width = slider->knob_width; int knob_radius = knob_height / 2; - int knob_rw = knob_width * cos(slider->knob_rotation) + knob_height * sin(slider->knob_rotation); + const double degree = M_PI / 180.0; + double knob_rotation = slider->knob_rotation * degree; + + int knob_rw = knob_width * cos(knob_rotation) + knob_height * sin(knob_rotation); int current = (slider->value * (slider->width - knob_rw)) / 100; int knob_x = bar_x + slider->line_width + slider->knob_x_offset + current - knob_rw / 2; @@ -107,7 +110,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) cairo_save(cr); cairo_translate(cr, t_x, t_y); - cairo_rotate(cr, slider->knob_rotation); + cairo_rotate(cr, knob_rotation); cairo_translate(cr, -t_x, -t_y); switch (slider->knob) { @@ -139,7 +142,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) cairo_save(cr); cairo_translate(cr, t_x, t_y); - cairo_rotate(cr, slider->knob_rotation); + cairo_rotate(cr, knob_rotation); cairo_translate(cr, -t_x, -t_y); switch (slider->knob) { @@ -236,17 +239,9 @@ static int block_slider_validate(block_t *block, config_t *config) errors++; } - const double degree = M_PI / 180.0; - slider->knob_rotation *= degree; - return errors; } -static config_status_t block_slider_change(block_t *block, config_t *config, const char *key, const char *value) -{ - return 0; -} - static config_enum_t knob_shape_enum[] = { { "none", KNOB_NONE }, { "capsule", KNOB_CAPSULE }, @@ -277,6 +272,11 @@ static const config_entry_t block_slider_entries[] = { { 0 }, }; +static config_status_t block_slider_change(block_t *block, config_t *config, const char *key, const char *value) +{ + return config_read_entry(block_slider_entries, block, NULL, "block", block->label, key, value); +} + const block_scheme_t block_slider_scheme = { .name = "slider", .entries = block_slider_entries, diff --git a/src/blocks/text.c b/src/blocks/text.c index bfaefe8..4046186 100644 --- a/src/blocks/text.c +++ b/src/blocks/text.c @@ -28,13 +28,8 @@ static int block_text_validate(block_t *block, config_t *config) static config_status_t block_text_change(block_t *block, config_t *config, const char *key, const char *value) { - - // text - // text_color - // text_align - // text_size - - return CONFIG_UNKNOWN; + extern const config_entry_t block_text_entries[]; + return config_read_entry(block_text_entries, block, NULL, "block", block->label, key, value); } const block_scheme_t block_text_scheme = { diff --git a/src/config.c b/src/config.c index c8f53f9..6d671b9 100644 --- a/src/config.c +++ b/src/config.c @@ -27,6 +27,9 @@ const config_entry_t bar_entries[] = { { "font", CONFIG_STRING, NULL, offsetof(config_t, font) }, { "monitor", CONFIG_STRING, NULL, offsetof(config_t, monitor) }, { "override-redirect", CONFIG_BOOL, NULL, offsetof(config_t, override_redirect) }, + { "action-strict-run", CONFIG_BOOL, NULL, offsetof(config_t, action_strict_run) }, + { "action-strict-set", CONFIG_BOOL, NULL, offsetof(config_t, action_strict_set) }, + { "action-fail-fast", CONFIG_BOOL, NULL, offsetof(config_t, action_failfast) }, { "background", CONFIG_GRADIENT, NULL, offsetof(config_t, background) }, { "scale", CONFIG_DOUBLE, NULL, offsetof(config_t, scale) }, { 0 }, diff --git a/src/config.h b/src/config.h index e56de55..e4bc2d6 100644 --- a/src/config.h +++ b/src/config.h @@ -44,6 +44,9 @@ typedef struct { char *font; char *monitor; bool override_redirect; + bool action_strict_run; + bool action_strict_set; + bool action_failfast; gradient_t background; unsigned int width; unsigned int height; @@ -55,16 +58,6 @@ typedef struct { int value; } config_enum_t; -extern config_enum_t text_align_enum[]; - -extern const config_entry_t bar_entries[]; - -extern const config_entry_t block_entries[]; - -extern const config_entry_t block_group_entries[]; - -extern const config_entry_t block_text_entries[]; - const char *config_type_to_string(config_type_t type); void config_init(config_t *config); diff --git a/src/event.c b/src/event.c index 5e8d7d5..b4e1975 100644 --- a/src/event.c +++ b/src/event.c @@ -81,7 +81,7 @@ static void event_dispatch_callback(event_state_t *state, layout_t *layout, even "b:action", layout->block->actions != NULL, "b:callback", event_fn != NULL); - if (layout->block->actions != NULL) { + if (event_is_click(event) && layout->block->actions != NULL) { action_perform(layout->block->actions, layout->block, state->config); } @@ -123,9 +123,15 @@ static bool event_dispatch_mouse(event_state_t *state, layout_t *layout, event_t if (event_is_hover(event)) { // Compare only the part related to position and size // - bool update = !memcmp(&state->hovered, layout, offsetof(layout_t, line_width)) - && event.x == state->hover_x - && event.y == state->hover_y; + bool update = event.x == state->hover_x + && event.y == state->hover_y + && state->hovered.x == layout->x + && state->hovered.y == layout->y + && state->hovered.x_padding == layout->x_padding + && state->hovered.y_padding == layout->y_padding + && state->hovered.width == layout->width + && state->hovered.height == layout->height + && state->hovered.line_width == layout->line_width; state->hover_x = event.x; state->hover_y = event.y; |
