@ -249,25 +249,47 @@ void xwm_selection_finish(struct wlr_xwm *xwm) {
if ( ! xwm ) {
return ;
}
struct wlr_xwm_selection * selections [ ] = {
& xwm - > clipboard_selection ,
& xwm - > primary_selection ,
& xwm - > dnd_selection ,
} ;
for ( size_t i = 0 ; i < sizeof ( selections ) / sizeof ( selections [ 0 ] ) ; i + + ) {
struct wlr_xwm_selection * selection = selections [ i ] ;
struct wlr_xwm_selection_transfer * outgoing , * tmp ;
wl_list_for_each_safe ( outgoing , tmp , & selection - > outgoing , outgoing_link ) {
wlr_log ( WLR_INFO , " destroyed pending transfer %ld/%p " , i , outgoing ) ;
xwm_selection_transfer_destroy_outgoing ( outgoing ) ;
}
xwm_selection_transfer_finish ( & selection - > incoming ) ;
}
if ( xwm - > selection_window ) {
xcb_destroy_window ( xwm - > xcb_conn , xwm - > selection_window ) ;
}
if ( xwm - > dnd_window ) {
xcb_destroy_window ( xwm - > xcb_conn , xwm - > dnd_window ) ;
}
if ( xwm - > seat ) {
if ( xwm - > seat - > selection_source & &
data_source_is_xwayland (
xwm - > seat - > selection_source ) ) {
data_source_is_xwayland ( xwm - > seat - > selection_source ) ) {
wlr_seat_set_selection ( xwm - > seat , NULL ,
wl_display_next_serial ( xwm - > xwayland - > wl_display ) ) ;
}
if ( xwm - > seat - > primary_selection_source & &
primary_selection_source_is_xwayland (
xwm - > seat - > primary_selection_source ) ) {
wlr_seat_set_primary_selection ( xwm - > seat , NULL ,
wl_display_next_serial ( xwm - > xwayland - > wl_display ) ) ;
}
wlr_xwayland_set_seat ( xwm - > xwayland , NULL ) ;
}
}