@ -41,6 +41,11 @@ static void default_touch_cancel(struct wlr_seat_touch_grab *grab) {
// cannot be cancelled
// cannot be cancelled
}
}
static void default_touch_wl_cancel ( struct wlr_seat_touch_grab * grab ,
struct wlr_surface * surface ) {
wlr_seat_touch_send_cancel ( grab - > seat , surface ) ;
}
const struct wlr_touch_grab_interface default_touch_grab_impl = {
const struct wlr_touch_grab_interface default_touch_grab_impl = {
. down = default_touch_down ,
. down = default_touch_down ,
. up = default_touch_up ,
. up = default_touch_up ,
@ -48,6 +53,7 @@ const struct wlr_touch_grab_interface default_touch_grab_impl = {
. enter = default_touch_enter ,
. enter = default_touch_enter ,
. frame = default_touch_frame ,
. frame = default_touch_frame ,
. cancel = default_touch_cancel ,
. cancel = default_touch_cancel ,
. wl_cancel = default_touch_wl_cancel ,
} ;
} ;
@ -238,6 +244,26 @@ void wlr_seat_touch_notify_frame(struct wlr_seat *seat) {
}
}
}
}
void wlr_seat_touch_notify_cancel ( struct wlr_seat * seat ,
struct wlr_surface * surface ) {
struct wlr_seat_touch_grab * grab = seat - > touch_state . grab ;
if ( grab - > interface - > wl_cancel ) {
grab - > interface - > wl_cancel ( grab , surface ) ;
}
struct wl_client * client = wl_resource_get_client ( surface - > resource ) ;
struct wlr_seat_client * seat_client = wlr_seat_client_for_wl_client ( seat , client ) ;
if ( seat_client = = NULL ) {
return ;
}
struct wlr_touch_point * point , * tmp ;
wl_list_for_each_safe ( point , tmp , & seat - > touch_state . touch_points , link ) {
if ( point - > client = = seat_client ) {
touch_point_destroy ( point ) ;
}
}
}
static void handle_point_focus_destroy ( struct wl_listener * listener ,
static void handle_point_focus_destroy ( struct wl_listener * listener ,
void * data ) {
void * data ) {
struct wlr_touch_point * point =
struct wlr_touch_point * point =
@ -376,6 +402,22 @@ void wlr_seat_touch_send_frame(struct wlr_seat *seat) {
}
}
}
}
void wlr_seat_touch_send_cancel ( struct wlr_seat * seat , struct wlr_surface * surface ) {
struct wl_client * client = wl_resource_get_client ( surface - > resource ) ;
struct wlr_seat_client * seat_client = wlr_seat_client_for_wl_client ( seat , client ) ;
if ( seat_client = = NULL ) {
return ;
}
struct wl_resource * resource ;
wl_resource_for_each ( resource , & seat_client - > touches ) {
if ( seat_client_from_touch_resource ( resource ) = = NULL ) {
continue ;
}
wl_touch_send_cancel ( resource ) ;
}
}
int wlr_seat_touch_num_points ( struct wlr_seat * seat ) {
int wlr_seat_touch_num_points ( struct wlr_seat * seat ) {
return wl_list_length ( & seat - > touch_state . touch_points ) ;
return wl_list_length ( & seat - > touch_state . touch_points ) ;
}
}