aboutsummaryrefslogtreecommitdiff
path: root/src/blocks
diff options
context:
space:
mode:
Diffstat (limited to 'src/blocks')
-rw-r--r--src/blocks/slider.c92
1 files changed, 59 insertions, 33 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c
index 1b5d4c3..32ec3e6 100644
--- a/src/blocks/slider.c
+++ b/src/blocks/slider.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <math.h>
+#include "../action.h"
#include "../block.h"
#include "../format.h"
#include "../any_log.h"
@@ -78,7 +79,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr)
pattern = slider->line_color.pattern;
if (pattern != NULL) {
- int line_radius = radius - slider->line_width / 2;
+ int line_radius = radius + slider->line_width / 2;
render_capsule_fast(cr, bar_x, bar_y, slider->width, radius, line_radius);
cairo_pattern_set_matrix(pattern, &matrix);
@@ -172,35 +173,65 @@ static void block_slider_render(layout_t *layout, cairo_t *cr)
}
}
-static void block_slider_event(layout_t *layout, event_t event)
+static void block_slider_event(layout_t *layout, config_t *config, event_t event)
{
block_slider_t *slider = (block_slider_t *)layout->block;
- int value = slider->value;
-
if (layout->block->hidden) return;
- if (!slider->seekable) return;
+ int value = slider->value;
if (event_is_click(event)) {
- int bar_x = layout->x + (layout->width - slider->width) / 2;
- int bar_y = layout->y + (layout->height - slider->height) / 2;
+ int bar_x = layout->x + (layout->width - slider->width) / 2 - slider->line_width;
+ int bar_y = layout->y + (layout->height - slider->height) / 2 - slider->line_width;
+
+ int bar_width = slider->width + 2 * slider->line_width;
+ int bar_height = slider->height + 2 * slider->line_width;
+
+ bool clicked = check_capsule(event.x, event.y, bar_x, bar_y, bar_width, bar_height);
+
+ action_t *action = layout->block->actions[event.type];
+ switch (event.type) {
+ case EVENT_LEFT_CLICK:
+ if (slider->left_click != NULL && clicked)
+ action = slider->left_click;
+ break;
+
+ case EVENT_MIDDLE_CLICK:
+ if (slider->middle_click != NULL && clicked)
+ action = slider->middle_click;
+ break;
- if (check_capsule(event.x, event.y, bar_x, bar_y, slider->width, slider->height)) {
- int value = 100 * (event.x - bar_x) / (double)(slider->width - 1);
- slider->value = value;
+ case EVENT_RIGHT_CLICK:
+ if (slider->right_click != NULL && clicked)
+ action = slider->right_click;
+ break;
+
+ default:
+ unreachable();
+ }
+
+ action_perform(action, layout->block, config);
+
+ if (slider->seekable && clicked)
+ slider->value = 100 * (event.x - bar_x) / (double)(slider->width - 1);
+ } else {
+ action_perform(layout->block->actions[event.type], layout->block, config);
+
+ if (slider->seekable && event_is_scroll(event)) {
+ int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1;
+ slider->value += step;
+
+ if (slider->value > 100) slider->value = 100;
+ if (slider->value < 0) slider->value = 0;
}
- } else if (event_is_scroll(event)) {
- int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1;
- slider->value += step;
-
- if (slider->value > 100) slider->value = 100;
- if (slider->value < 0) slider->value = 0;
- } else return;
-
- log_value_debug("Updated slider value",
- "s:label", layout->block->label,
- "i:old_value", value,
- "i:new_value", slider->value);
+ }
+
+ if (slider->value != value) {
+ log_value_debug("Updated slider value",
+ "s:label", layout->block->label,
+ "i:old_value", value,
+ "i:new_value", slider->value);
+ }
}
static void block_slider_init(block_t *block)
@@ -215,11 +246,11 @@ static void block_slider_init(block_t *block)
static void block_slider_clean(block_t *block)
{
block_slider_t *slider = (block_slider_t *)block;
- gradient_free(&slider->bar_color);
- gradient_free(&slider->line_color);
- gradient_free(&slider->bg_color);
- gradient_free(&slider->knob_color);
- gradient_free(&slider->knob_line_color);
+ gradient_clean(&slider->bar_color);
+ gradient_clean(&slider->line_color);
+ gradient_clean(&slider->bg_color);
+ gradient_clean(&slider->knob_color);
+ gradient_clean(&slider->knob_line_color);
}
static int block_slider_validate(block_t *block, config_t *config)
@@ -256,13 +287,8 @@ static bool block_slider_resolve(block_t *block, config_t *config)
};
for (size_t i = 0; i < 3; i++) {
- char *label = (char *)*actions[i];
- if (label == NULL) continue;
-
- if (!config_resolve_action(config, label, actions[i]))
+ if (!block_resolve_action(block, config, actions[i]))
return false;
-
- free(label);
}
return true;