diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/blocks/slider.c | 4 | ||||
| -rw-r--r-- | src/event.c | 67 | ||||
| -rw-r--r-- | src/event.h | 17 |
3 files changed, 53 insertions, 35 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c index 854b284..f4a9ad0 100644 --- a/src/blocks/slider.c +++ b/src/blocks/slider.c @@ -191,7 +191,7 @@ static void block_slider_event(layout_t *layout, config_t *config, event_t event int bar_height = slider->height; // NOTE: Consider disabling these actions for non seekable sliders - bool clicked = check_capsule(event.x, event.y, bar_x, bar_y, bar_width, bar_height); + bool clicked = check_capsule(event.mouse.x, event.mouse.y, bar_x, bar_y, bar_width, bar_height); action_t *action = layout->block->actions[event.type]; switch (event.type) { @@ -217,7 +217,7 @@ static void block_slider_event(layout_t *layout, config_t *config, event_t event action_perform(action, layout->block, config); if (slider->seekable && clicked) - slider->value = 100 * (event.x - bar_x) / (double)(bar_width - 1); + slider->value = 100 * (event.mouse.x - bar_x) / (double)(bar_width - 1); } else { action_perform(layout->block->actions[event.type], layout->block, config); diff --git a/src/event.c b/src/event.c index 8b7d56c..24975bf 100644 --- a/src/event.c +++ b/src/event.c @@ -25,11 +25,32 @@ const char *event_type_to_string(event_type_t type) return types[type]; } +void event_init_trigger(event_t *event, const char *origin, const char *payload) +{ + event->type = EVENT_TRIGGER; + event->trigger.origin = origin; + event->trigger.payload = payload; +} + +void event_init_mouse(event_t *event, event_type_t type, int x, int y) +{ + event->type = type; + event->mouse.x = x; + event->mouse.y = y; +} + bool event_is_trigger(event_t event) { return event.type == EVENT_TRIGGER; } +bool event_is_mouse(event_t event) +{ + return event_is_click(event) + || event_is_scroll(event) + || event_is_hover(event); +} + bool event_is_click(event_t event) { return event.type == EVENT_LEFT_CLICK @@ -71,9 +92,9 @@ static void event_dispatch_callback(event_state_t *state, layout_t *layout, even log_value_debug("Block received an event", "s:event", event_type_to_string(event.type), - "i:event_x", event.x, - "i:event_y", event.y, - "s:label", layout->block->label, + "i:event_x", event.mouse.x, + "i:event_y", event.mouse.y, + "s:target", layout->block->label, "i:x", layout->x, "i:y", layout->y, "i:width", layout->width, @@ -111,7 +132,7 @@ static bool event_dispatch_mouse(event_state_t *state, layout_t *layout, event_t int width = layout->width - 2 * layout->x_padding; int height = layout->height - 2 * layout->y_padding; - if (!check_capsule(event.x, event.y, layout->x, layout->y, width, height)) + if (!check_capsule(event.mouse.x, event.mouse.y, layout->x, layout->y, width, height)) return false; for (size_t i = 0; i < layout->n_children; i++) { @@ -122,8 +143,8 @@ 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 = event.x == state->hover_x - && event.y == state->hover_y + bool update = event.mouse.x == state->hover_x + && event.mouse.y == state->hover_y && state->hovered.x == layout->x && state->hovered.y == layout->y && state->hovered.x_padding == layout->x_padding @@ -132,8 +153,8 @@ static bool event_dispatch_mouse(event_state_t *state, layout_t *layout, event_t && state->hovered.height == layout->height && state->hovered.line_width == layout->line_width; - state->hover_x = event.x; - state->hover_y = event.y; + state->hover_x = event.mouse.x; + state->hover_y = event.mouse.y; if (layout->block != state->hovered.block) { if (state->hovered.block != NULL) { @@ -156,15 +177,12 @@ static bool event_dispatch_mouse(event_state_t *state, layout_t *layout, event_t void event_dispatch(event_state_t *state, window_t *window) { + event_t event; + // Check last cursor position again // if (state->hovered.block != NULL) { - event_t event = { - .type = EVENT_HOVER_MOVE, - .x = state->hover_x, - .y = state->hover_y, - }; - + event_init_mouse(&event, EVENT_HOVER_MOVE, state->hover_x, state->hover_y); event_dispatch_mouse(state, state->layout, event); } @@ -219,12 +237,7 @@ void event_dispatch(event_state_t *state, window_t *window) if (leave->event != window->window) break; if (state->hovered.block == NULL) break; - event_t event = { - .type = EVENT_HOVER_STOP, - .x = leave->event_x, - .y = leave->event_y, - }; - + event_init_mouse(&event, EVENT_HOVER_STOP, leave->event_x, leave->event_y); event_dispatch_callback_block(state, state->hovered.block, event); memset(&state->hovered, 0, sizeof(layout_t)); @@ -248,12 +261,7 @@ void event_dispatch(event_state_t *state, window_t *window) } // NOTE: The order of event_type_t is important! - event_t event = { - .type = button->detail, - .x = button->event_x, - .y = button->event_y, - }; - + event_init_mouse(&event, button->detail, button->event_x, button->event_y); assert(event_is_click(event) || event_is_scroll(event)); event_dispatch_mouse(state, state->layout, event); break; @@ -299,12 +307,7 @@ void event_dispatch(event_state_t *state, window_t *window) if (motion != NULL) { log_trace("Processing 'MotionNotify' event"); - event_t event = { - .type = EVENT_HOVER_MOVE, - .x = motion->event_x, - .y = motion->event_y, - }; - + event_init_mouse(&event, EVENT_HOVER_MOVE, motion->event_x, motion->event_y); event_dispatch_mouse(state, state->layout, event); free(motion); } diff --git a/src/event.h b/src/event.h index 2f00c49..40466d4 100644 --- a/src/event.h +++ b/src/event.h @@ -21,7 +21,16 @@ typedef enum { typedef struct { event_type_t type; - int x, y; + union { + struct { + const char *origin; + const char *payload; + } trigger; + struct { + int x; + int y; + } mouse; + }; } event_t; typedef struct { @@ -33,8 +42,14 @@ typedef struct { const char *event_type_to_string(event_type_t type); +void event_init_trigger(event_t *event, const char *origin, const char *payload); + +void event_init_mouse(event_t *event, event_type_t type, int x, int y); + bool event_is_trigger(event_t event); +bool event_is_mouse(event_t event); + bool event_is_click(event_t event); bool event_is_scroll(event_t event); |
