Adding touch support to weston's nested wayland backend to make testing easier.
https://bugs.freedesktop.org/show_bug.cgi?id=77769 --- src/compositor-wayland.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index a08b71a..45040d4 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -1582,6 +1582,91 @@ static const struct wl_keyboard_listener keyboard_listener = { }; static void +input_handle_touch_down(void *data, struct wl_touch *touch, uint32_t serial, + uint32_t time, struct wl_surface *surface, int32_t id, + wl_fixed_t x, wl_fixed_t y) +{ + struct wayland_input *input = data; + int32_t fx, fy; + + if (input->output->frame) { + frame_touch_down(input->output->frame, input, id, + wl_fixed_to_int(x), wl_fixed_to_int(y)); + frame_interior(input->output->frame, &fx, &fy, NULL, NULL); + x -= wl_fixed_from_int(fx); + y -= wl_fixed_from_int(fy); + + if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT) + weston_output_schedule_repaint(&input->output->base); + } + + weston_output_transform_coordinate(&input->output->base, x, y, &x, &y); + + notify_touch(&input->base, time, id, x, y, WL_TOUCH_DOWN); +} + +static void +input_handle_touch_up(void *data, struct wl_touch *touch, uint32_t serial, + uint32_t time, int32_t id) +{ + struct wayland_input *input = data; + + if (input->output->frame) { + frame_touch_up(input->output->frame, input, id); + + if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT) + weston_output_schedule_repaint(&input->output->base); + } + + notify_touch(&input->base, time, id, 0, 0, WL_TOUCH_UP); +} + +static void +input_handle_touch_motion(void *data, struct wl_touch *touch, uint32_t time, + int32_t id, wl_fixed_t x, wl_fixed_t y) +{ + struct wayland_input *input = data; + int32_t fx, fy; + + if (input->output->frame) { + frame_touch_motion(input->output->frame, input, id, + wl_fixed_to_int(x), wl_fixed_to_int(y)); + + frame_interior(input->output->frame, &fx, &fy, NULL, NULL); + x -= wl_fixed_from_int(fx); + y -= wl_fixed_from_int(fy); + + if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT) + weston_output_schedule_repaint(&input->output->base); + } + + weston_output_transform_coordinate(&input->output->base, x, y, &x, &y); + + notify_touch(&input->base, time, id, x, y, WL_TOUCH_MOTION); +} + +static void +input_handle_touch_frame(void *data, struct wl_touch *touch) +{ + struct wayland_input *input = data; + + notify_touch_frame(&input->base); +} + +static void +input_handle_touch_cancel(void *data, struct wl_touch *touch) +{ +} + +static const struct wl_touch_listener touch_listener = { + input_handle_touch_down, + input_handle_touch_up, + input_handle_touch_motion, + input_handle_touch_frame, + input_handle_touch_cancel +}; + +static void input_handle_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps) { @@ -1607,6 +1692,16 @@ input_handle_capabilities(void *data, struct wl_seat *seat, wl_keyboard_destroy(input->parent.keyboard); input->parent.keyboard = NULL; } + + if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !input->parent.touch) { + input->parent.touch = wl_seat_get_touch(seat); + wl_touch_set_user_data(input->parent.touch, input); + wl_touch_add_listener(input->parent.touch, + &touch_listener, input); + } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->parent.touch) { + wl_touch_destroy(input->parent.touch); + input->parent.touch = NULL; + } } static const struct wl_seat_listener seat_listener = { -- 1.9.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel