From 3049e4b1e3e6b36812be84cf794b55b019380c63 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Thu, 21 Nov 2024 01:11:11 +0100 Subject: Add mouse scroll event --- src/blocks/slider.c | 42 +++++++++++++++++++++++++---------------- src/event.c | 54 +++++++++++++++++++++++++++-------------------------- src/event.h | 8 +++++++- 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); -- cgit v1.2.3