@ -55,30 +55,11 @@ static int xwm_selection_flush_source_data(
static void xwm_selection_transfer_start_outgoing (
static void xwm_selection_transfer_start_outgoing (
struct wlr_xwm_selection_transfer * transfer ) ;
struct wlr_xwm_selection_transfer * transfer ) ;
static struct wlr_xwm_selection_transfer * xwm_selection_transfer_get_first (
struct wlr_xwm_selection * selection ) {
struct wlr_xwm_selection_transfer * first = NULL ;
if ( ! wl_list_empty ( & selection - > outgoing ) ) {
first = wl_container_of ( selection - > outgoing . prev , first , link ) ;
}
return first ;
}
void xwm_selection_transfer_destroy_outgoing (
void xwm_selection_transfer_destroy_outgoing (
struct wlr_xwm_selection_transfer * transfer ) {
struct wlr_xwm_selection_transfer * transfer ) {
struct wlr_xwm_selection * selection = transfer - > selection ;
bool was_first = transfer = = xwm_selection_transfer_get_first ( selection ) ;
wl_list_remove ( & transfer - > link ) ;
wl_list_remove ( & transfer - > link ) ;
wlr_log ( WLR_DEBUG , " Destroying transfer %p " , transfer ) ;
wlr_log ( WLR_DEBUG , " Destroying transfer %p " , transfer ) ;
// Start next queued transfer if we just removed the active one.
if ( was_first & & ! wl_list_empty ( & selection - > outgoing ) ) {
wlr_log ( WLR_DEBUG , " Destroyed transfer was active, starting next " ) ;
xwm_selection_transfer_start_outgoing (
xwm_selection_transfer_get_first ( selection ) ) ;
}
xwm_selection_transfer_remove_event_source ( transfer ) ;
xwm_selection_transfer_remove_event_source ( transfer ) ;
xwm_selection_transfer_close_wl_client_fd ( transfer ) ;
xwm_selection_transfer_close_wl_client_fd ( transfer ) ;
wl_array_release ( & transfer - > source_data ) ;
wl_array_release ( & transfer - > source_data ) ;
@ -232,7 +213,6 @@ static void xwm_selection_transfer_start_outgoing(
struct wl_event_loop * loop =
struct wl_event_loop * loop =
wl_display_get_event_loop ( xwm - > xwayland - > wl_display ) ;
wl_display_get_event_loop ( xwm - > xwayland - > wl_display ) ;
wlr_log ( WLR_DEBUG , " Starting transfer %p " , transfer ) ;
wlr_log ( WLR_DEBUG , " Starting transfer %p " , transfer ) ;
assert ( transfer = = xwm_selection_transfer_get_first ( transfer - > selection ) ) ;
transfer - > event_source = wl_event_loop_add_fd ( loop , transfer - > wl_client_fd ,
transfer - > event_source = wl_event_loop_add_fd ( loop , transfer - > wl_client_fd ,
WL_EVENT_READABLE , xwm_data_source_read , transfer ) ;
WL_EVENT_READABLE , xwm_data_source_read , transfer ) ;
}
}
@ -328,21 +308,14 @@ static bool xwm_selection_send_data(struct wlr_xwm_selection *selection,
wlr_log ( WLR_DEBUG , " Destroying stale transfer %p " , outgoing ) ;
wlr_log ( WLR_DEBUG , " Destroying stale transfer %p " , outgoing ) ;
xwm_selection_send_notify ( selection - > xwm , & outgoing - > request , false ) ;
xwm_selection_send_notify ( selection - > xwm , & outgoing - > request , false ) ;
xwm_selection_transfer_destroy_outgoing ( outgoing ) ;
xwm_selection_transfer_destroy_outgoing ( outgoing ) ;
} else {
wlr_log ( WLR_DEBUG , " Transfer %p still running " , outgoing ) ;
}
}
}
}
wl_list_insert ( & selection - > outgoing , & transfer - > link ) ;
wl_list_insert ( & selection - > outgoing , & transfer - > link ) ;
// We can only handle one transfer at a time
if ( wl_list_length ( & selection - > outgoing ) = = 1 ) {
wlr_log ( WLR_DEBUG , " No transfer active, starting %p now " , transfer ) ;
xwm_selection_transfer_start_outgoing ( transfer ) ;
xwm_selection_transfer_start_outgoing ( transfer ) ;
} else {
struct wlr_xwm_selection_transfer * outgoing ;
wl_list_for_each ( outgoing , & selection - > outgoing , link ) {
wlr_log ( WLR_DEBUG , " Transfer %p still queued " , outgoing ) ;
}
}
return true ;
return true ;
}
}