aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/blocks/slider.c42
-rw-r--r--src/event.c54
-rw-r--r--src/event.h8
3 files changed, 61 insertions, 43 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c
index 82d6140..b01ddb7 100644
--- a/src/blocks/slider.c
+++ b/src/blocks/slider.c
@@ -9,7 +9,7 @@
typedef struct {
block_spec_t block;
- unsigned int value;
+ int value;
unsigned int height;
unsigned int width;
unsigned int line_width;
@@ -71,24 +71,30 @@ static void block_slider_render(layout_t *layout, cairo_t *cr)
static void block_slider_event(layout_t *layout, event_t event)
{
block_slider_t *slider = (block_slider_t *)layout->block;
+ int value = slider->value;
if (!slider->seekable) return;
- int bar_y = layout->y + (layout->height - slider->height) / 2;
- int bar_x = layout->x + (layout->width - slider->width) / 2;
+ 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;
- 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);
+ 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;
+ }
+ } else if (event_is_scroll(event)) {
+ int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1;
+ slider->value += step;
- log_value_debug("Updated slider value",
- "i:event_x", event.x,
- "i:bar_x", bar_x,
- "i:bar_width", slider->width,
- "i:old_value", slider->value,
- "i:new_value", value);
-
- slider->value = value;
+ if (slider->value > 100) slider->value = 100;
+ if (slider->value < 0) slider->value = 0;
}
+
+ 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, const block_scheme_t *scheme)
@@ -110,9 +116,13 @@ static void block_slider_clean(block_t *block)
static int block_slider_validate(block_t *block, const block_scheme_t *scheme)
{
- //block_slider_t *slider = (block_slider_t *)block;
+ block_slider_t *slider = (block_slider_t *)block;
int errors = 0;
- // TODO
+
+ if (slider->value < 0 || slider->value > 100) {
+ log_error("Block '%s' requires '%s' to be between 0 and 100", block->label, "bar-value");
+ errors++;
+ }
return errors;
}
@@ -125,7 +135,7 @@ static const config_entry_t block_slider_entries[] = {
{ "bar-height", CONFIG_UINT, NULL, offsetof(block_slider_t, height) },
{ "bar-width", CONFIG_UINT, NULL, offsetof(block_slider_t, width) },
{ "bar-line-width", CONFIG_UINT, NULL, offsetof(block_slider_t, line_width) },
- { "bar-value", CONFIG_UINT, NULL, offsetof(block_slider_t, value) },
+ { "bar-value", CONFIG_INT, NULL, offsetof(block_slider_t, value) },
{ "seekable", CONFIG_BOOL, NULL, offsetof(block_slider_t, seekable) },
{ 0 },
};
diff --git a/src/event.c b/src/event.c
index 65e3628..fa40a82 100644
--- a/src/event.c
+++ b/src/event.c
@@ -6,12 +6,14 @@
#include "event.h"
#include "block.h"
-const char *even_type_to_string(event_type_t type)
+const char *event_type_to_string(event_type_t type)
{
const char *types[] = {
"left_click",
"middle_click",
"right_click",
+ "scroll_up",
+ "scroll_down",
"trigger",
};
@@ -19,7 +21,20 @@ const char *even_type_to_string(event_type_t type)
return types[type];
}
-static bool event_click(layout_t *layout, event_t event)
+bool event_is_click(event_t event)
+{
+ return event.type == EVENT_LEFT_CLICK
+ || event.type == EVENT_MIDDLE_CLICK
+ || event.type == EVENT_RIGHT_CLICK;
+}
+
+bool event_is_scroll(event_t event)
+{
+ return event.type == EVENT_SCROLL_UP
+ || event.type == EVENT_SCROLL_DOWN;
+}
+
+static bool event_mouse(layout_t *layout, event_t event)
{
int width = layout->width - 2 * layout->x_padding;
int height = layout->height - 2 * layout->y_padding;
@@ -28,7 +43,7 @@ static bool event_click(layout_t *layout, event_t event)
return false;
for (int i = 0; i < layout->n_children; i++) {
- if (event_click(&layout->children[i], event))
+ if (event_mouse(&layout->children[i], event))
return true;
}
@@ -36,8 +51,8 @@ static bool event_click(layout_t *layout, event_t event)
? ((block_spec_t *)layout->block)->event_fn
: NULL;
- log_value_debug("Block was clicked",
- "s:event_type", even_type_to_string(event.type),
+ log_value_debug("Block received a mouse interaction",
+ "s:event", event_type_to_string(event.type),
"i:event_x", event.x,
"i:event_y", event.y,
"s:label", layout->block->label,
@@ -105,32 +120,19 @@ void event_dispatch(display_t *display, layout_t *layout)
xcb_button_release_event_t *button = (xcb_button_release_event_t *)xevent;
log_trace("Processing 'ButtonRelease' event");
+ if (button->detail < XCB_BUTTON_INDEX_1 || button->detail > XCB_BUTTON_INDEX_5) {
+ log_value_trace("Ignoring button release",
+ "u:value", button->detail);
+ break;
+ }
+
event_t event = {
.x = button->event_x,
.y = button->event_y,
+ .type = button->detail - 1,
};
- switch (button->detail) {
- case XCB_BUTTON_INDEX_1:
- event.type = EVENT_LEFT_CLICK;
- event_click(layout, event);
- break;
-
- case XCB_BUTTON_INDEX_2:
- event.type = EVENT_MIDDLE_CLICK;
- event_click(layout, event);
- break;
-
- case XCB_BUTTON_INDEX_3:
- event.type = EVENT_RIGHT_CLICK;
- event_click(layout, event);
- break;
-
- default:
- log_value_trace("Ignoring button release",
- "u:value", button->detail);
- break;
- }
+ event_mouse(layout, event);
break;
}
diff --git a/src/event.h b/src/event.h
index 528482d..5cc626d 100644
--- a/src/event.h
+++ b/src/event.h
@@ -7,6 +7,8 @@ typedef enum {
EVENT_LEFT_CLICK,
EVENT_MIDDLE_CLICK,
EVENT_RIGHT_CLICK,
+ EVENT_SCROLL_UP,
+ EVENT_SCROLL_DOWN,
EVENT_TRIGGER,
} event_type_t;
@@ -17,7 +19,11 @@ typedef struct {
typedef struct layout layout_t;
-const char *even_type_to_string(event_type_t type);
+const char *event_type_to_string(event_type_t type);
+
+bool event_is_click(event_t event);
+
+bool event_is_scroll(event_t event);
void event_dispatch(display_t *display, layout_t *layout);