if the system doesn't have a pointer device exposay_transition_active will crash in weston_pointer_start_grab(seat->pointer, ...). here we fix that and also implement exposay support on systems with a touchscreen --- desktop-shell/exposay.c | 95 ++++++++++++++++++++++++++++++++++++++++++++--- desktop-shell/shell.h | 1 + 2 files changed, 90 insertions(+), 6 deletions(-)
diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c index 1d8b40e..91932ce 100644 --- a/desktop-shell/exposay.c +++ b/desktop-shell/exposay.c @@ -391,6 +391,77 @@ static const struct weston_pointer_grab_interface exposay_ptr_grab = { exposay_pointer_grab_cancel, }; +static void +exposay_touch_down(struct weston_touch_grab *grab, uint32_t time, + int touch_id, wl_fixed_t sx, wl_fixed_t sy) +{ + struct desktop_shell *shell = + container_of(grab, struct desktop_shell, exposay.grab_touch); + + wl_signal_emit(&grab->touch->motion_signal, grab->touch); + + exposay_pick(shell, + wl_fixed_to_int(grab->touch->grab_x), + wl_fixed_to_int(grab->touch->grab_y)); + + /* Store the surface we clicked on, and don't do anything if we end up + * releasing on a different surface. */ + if (grab->touch->num_tp == 1) { + shell->exposay.clicked = shell->exposay.focus_current; + } +} + +static void +exposay_touch_up(struct weston_touch_grab *grab, uint32_t time, int touch_id) +{ + struct desktop_shell *shell = + container_of(grab, struct desktop_shell, exposay.grab_touch); + struct weston_seat *seat = grab->touch->seat; + + if (grab->touch->num_tp == 0) { + if (shell->exposay.focus_current == shell->exposay.clicked) + exposay_set_state(shell, EXPOSAY_TARGET_SWITCH, seat); + else + shell->exposay.clicked = NULL; + } +} + +static void +exposay_touch_motion(struct weston_touch_grab *grab, uint32_t time, + int touch_id, wl_fixed_t sx, wl_fixed_t sy) +{ + struct desktop_shell *shell = + container_of(grab, struct desktop_shell, exposay.grab_touch); + + wl_signal_emit(&grab->touch->motion_signal, grab->touch); + + exposay_pick(shell, + wl_fixed_to_int(grab->touch->grab_x), + wl_fixed_to_int(grab->touch->grab_y)); +} + +static void +exposay_touch_frame(struct weston_touch_grab *grab) +{ +} + +static void +exposay_touch_grab_cancel(struct weston_touch_grab *grab) +{ + struct desktop_shell *shell = + container_of(grab, struct desktop_shell, exposay.grab_touch); + + exposay_set_state(shell, EXPOSAY_TARGET_CANCEL, shell->exposay.seat); +} + +static const struct weston_touch_grab_interface exposay_touch_grab = { + exposay_touch_down, + exposay_touch_up, + exposay_touch_motion, + exposay_touch_frame, + exposay_touch_grab_cancel, +}; + static int exposay_maybe_move(struct desktop_shell *shell, int row, int column) { @@ -517,7 +588,10 @@ exposay_set_inactive(struct desktop_shell *shell) struct weston_seat *seat = shell->exposay.seat; weston_keyboard_end_grab(seat->keyboard); - weston_pointer_end_grab(seat->pointer); + if (seat->pointer) + weston_pointer_end_grab(seat->pointer); + if (seat->touch) + weston_touch_end_grab(seat->touch); if (seat->keyboard->input_method_resource) seat->keyboard->grab = &seat->keyboard->input_method_grab; @@ -567,11 +641,20 @@ exposay_transition_active(struct desktop_shell *shell) &shell->exposay.grab_kbd); weston_keyboard_set_focus(seat->keyboard, NULL); - shell->exposay.grab_ptr.interface = &exposay_ptr_grab; - weston_pointer_start_grab(seat->pointer, - &shell->exposay.grab_ptr); - weston_pointer_set_focus(seat->pointer, NULL, - seat->pointer->x, seat->pointer->y); + if (seat->pointer) { + shell->exposay.grab_ptr.interface = &exposay_ptr_grab; + weston_pointer_start_grab(seat->pointer, + &shell->exposay.grab_ptr); + weston_pointer_set_focus(seat->pointer, NULL, + seat->pointer->x, seat->pointer->y); + } + + if (seat->touch) { + shell->exposay.grab_touch.interface = &exposay_touch_grab; + weston_touch_start_grab(seat->touch, + &shell->exposay.grab_touch); + weston_touch_set_focus(seat, NULL); + } wl_list_for_each(shell_output, &shell->output_list, link) { enum exposay_layout_state state; diff --git a/desktop-shell/shell.h b/desktop-shell/shell.h index 6e63785..ba7951a 100644 --- a/desktop-shell/shell.h +++ b/desktop-shell/shell.h @@ -74,6 +74,7 @@ struct exposay { struct weston_keyboard_grab grab_kbd; struct weston_pointer_grab grab_ptr; + struct weston_touch_grab grab_touch; enum exposay_target_state state_target; enum exposay_layout_state state_cur; -- 1.7.9.5 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel