aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/blocks/slider.c4
-rw-r--r--src/event.c67
-rw-r--r--src/event.h17
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);