diff --git a/example/pointer.c b/example/pointer.c index 9a2f33d7..035af240 100644 --- a/example/pointer.c +++ b/example/pointer.c @@ -54,6 +54,13 @@ static void handle_pointer_motion(struct pointer_state *pstate, state->cur_y += d_y; } +static void handle_pointer_motion_absolute(struct pointer_state *pstate, + double x, double y) { + struct sample_state *state = pstate->compositor->data; + state->cur_x = x; + state->cur_y = y; +} + static void handle_pointer_button(struct pointer_state *pstate, uint32_t button, enum wlr_button_state state) { struct sample_state *sample = pstate->compositor->data; @@ -109,6 +116,7 @@ int main(int argc, char *argv[]) { compositor.output_add_cb = handle_output_add; compositor.output_frame_cb = handle_output_frame; compositor.pointer_motion_cb = handle_pointer_motion; + compositor.pointer_motion_absolute_cb = handle_pointer_motion_absolute; compositor.pointer_button_cb = handle_pointer_button; compositor.pointer_axis_cb = handle_pointer_axis; compositor_init(&compositor); diff --git a/example/shared.c b/example/shared.c index c4ec4ffe..fbb6c559 100644 --- a/example/shared.c +++ b/example/shared.c @@ -105,6 +105,15 @@ static void pointer_motion_notify(struct wl_listener *listener, void *data) { } } +static void pointer_motion_absolute_notify(struct wl_listener *listener, void *data) { + struct wlr_event_pointer_motion_absolute *event = data; + struct pointer_state *pstate = wl_container_of(listener, pstate, motion_absolute); + if (pstate->compositor->pointer_motion_absolute_cb) { + pstate->compositor->pointer_motion_absolute_cb(pstate, + event->x_mm, event->y_mm); + } +} + static void pointer_button_notify(struct wl_listener *listener, void *data) { struct wlr_event_pointer_button *event = data; struct pointer_state *pstate = wl_container_of(listener, pstate, button); @@ -132,9 +141,11 @@ static void pointer_add(struct wlr_input_device *device, struct compositor_state wl_list_init(&pstate->button.link); wl_list_init(&pstate->axis.link); pstate->motion.notify = pointer_motion_notify; + pstate->motion_absolute.notify = pointer_motion_absolute_notify; pstate->button.notify = pointer_button_notify; pstate->axis.notify = pointer_axis_notify; wl_signal_add(&device->pointer->events.motion, &pstate->motion); + wl_signal_add(&device->pointer->events.motion_absolute, &pstate->motion_absolute); wl_signal_add(&device->pointer->events.button, &pstate->button); wl_signal_add(&device->pointer->events.axis, &pstate->axis); wl_list_insert(&state->pointers, &pstate->link); @@ -308,7 +319,7 @@ static void pointer_remove(struct wlr_input_device *device, struct compositor_st } wl_list_remove(&pstate->link); wl_list_remove(&pstate->motion.link); - //wl_list_remove(&pstate->motion_absolute.link); + wl_list_remove(&pstate->motion_absolute.link); wl_list_remove(&pstate->button.link); wl_list_remove(&pstate->axis.link); } diff --git a/example/shared.h b/example/shared.h index c95df9cc..37f52dcc 100644 --- a/example/shared.h +++ b/example/shared.h @@ -83,6 +83,8 @@ struct compositor_state { enum wlr_key_state key_state); void (*pointer_motion_cb)(struct pointer_state *s, double d_x, double d_y); + void (*pointer_motion_absolute_cb)(struct pointer_state *s, + double x, double y); void (*pointer_button_cb)(struct pointer_state *s, uint32_t button, enum wlr_button_state state); void (*pointer_axis_cb)(struct pointer_state *s,