diff options
author | Harry Jeffery <harry@exec64.co.uk> | 2019-07-13 00:35:19 +0100 |
---|---|---|
committer | Harry Jeffery <harry@exec64.co.uk> | 2019-07-13 00:35:19 +0100 |
commit | 4473f6d8b7bda3ecb6acaf16e8609a219f7ef6fc (patch) | |
tree | beec9492b8a013ca7ad815ed1ea8a7691e5c7a2b /src/window.c | |
parent | 5a1571d00dd1e73f906b1c83b7abe13aa0908e9a (diff) | |
download | imv-4473f6d8b7bda3ecb6acaf16e8609a219f7ef6fc.tar.gz |
Implement scroll input
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/window.c b/src/window.c index fd1986f..de188c0 100644 --- a/src/window.c +++ b/src/window.c @@ -52,6 +52,10 @@ struct imv_window { bool last; bool current; } mouse1; + struct { + double dx; + double dy; + } scroll; } pointer; struct { @@ -205,11 +209,15 @@ static void pointer_button(void *data, struct wl_pointer *pointer, static void pointer_axis(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { - (void)data; (void)pointer; (void)time; - (void)axis; - (void)value; + + struct imv_window *window = data; + if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL) { + window->pointer.scroll.dy += wl_fixed_to_double(value); + } else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) { + window->pointer.scroll.dx += wl_fixed_to_double(value); + } } static void pointer_frame(void *data, struct wl_pointer *pointer) @@ -251,6 +259,21 @@ static void pointer_frame(void *data, struct wl_pointer *pointer) imv_window_push_event(window, &e); } + if (window->pointer.scroll.dx || window->pointer.scroll.dy) { + struct imv_event e = { + .type = IMV_EVENT_MOUSE_SCROLL, + .data = { + .mouse_scroll = { + .dx = window->pointer.scroll.dx, + .dy = window->pointer.scroll.dy + } + } + }; + imv_window_push_event(window, &e); + window->pointer.scroll.dx = 0; + window->pointer.scroll.dy = 0; + } + } static void pointer_axis_source(void *data, struct wl_pointer *pointer, @@ -565,6 +588,16 @@ bool imv_window_get_mouse_button(struct imv_window *window, int button) return false; } +void imv_window_get_mouse_position(struct imv_window *window, double *x, double *y) +{ + if (x) { + *x = window->pointer.x.last; + } + if (y) { + *y = window->pointer.y.last; + } +} + void imv_window_present(struct imv_window *window) { eglSwapBuffers(window->egl_display, window->egl_surface); |