aboutsummaryrefslogtreecommitdiff
path: root/src/event.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-21 01:11:11 +0100
committerFederico Angelilli <code@fedang.net>2024-11-21 02:13:16 +0100
commit3049e4b1e3e6b36812be84cf794b55b019380c63 (patch)
tree34aa50e8258074c8f8783ed7974e9be06787b059 /src/event.c
parent2976c25d8ccca3e102dc156eb7f212afedd4b8b8 (diff)
Add mouse scroll event
Diffstat (limited to 'src/event.c')
-rw-r--r--src/event.c54
1 files changed, 28 insertions, 26 deletions
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;
}