aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-24 19:39:19 +0100
committerFederico Angelilli <code@fedang.net>2024-11-24 19:39:19 +0100
commitdef1e18d86579cf77649d1b8aa596d0877b822bb (patch)
tree0e6deebdef1575b4b74472bc4367b294f7551753 /src
parent76ad6b0d404d40f08b73d90ac5f66564c29feb95 (diff)
Refactor block_change_fn
Diffstat (limited to 'src')
-rw-r--r--src/action.c36
-rw-r--r--src/block.c12
-rw-r--r--src/block.h3
-rw-r--r--src/blocks/fs.c15
-rw-r--r--src/blocks/group.c13
-rw-r--r--src/blocks/ram.c15
-rw-r--r--src/blocks/slider.c22
-rw-r--r--src/blocks/text.c9
-rw-r--r--src/config.c3
-rw-r--r--src/config.h13
-rw-r--r--src/event.c14
11 files changed, 105 insertions, 50 deletions
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;