@@ -516,6 +516,37 @@ impl InnerBackend {
516516 }
517517 }
518518
519+ fn destroy_object_inner ( & self , guard : & mut MutexGuard < ConnectionState > , id : & ObjectId ) {
520+ if let Some ( ref alive) = id. id . alive {
521+ let udata = unsafe {
522+ Box :: from_raw ( ffi_dispatch ! (
523+ wayland_client_handle( ) ,
524+ wl_proxy_get_user_data,
525+ id. id. ptr
526+ ) as * mut ProxyUserData )
527+ } ;
528+ unsafe {
529+ ffi_dispatch ! (
530+ wayland_client_handle( ) ,
531+ wl_proxy_set_user_data,
532+ id. id. ptr,
533+ std:: ptr:: null_mut( )
534+ ) ;
535+ }
536+ alive. store ( false , Ordering :: Release ) ;
537+ udata. data . destroyed ( id. clone ( ) ) ;
538+ }
539+ guard. known_proxies . remove ( & id. id . ptr ) ;
540+ unsafe {
541+ ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. id. ptr) ;
542+ }
543+ }
544+
545+ pub fn destroy_object ( & self , id : & ObjectId ) -> Result < ( ) , InvalidId > {
546+ self . destroy_object_inner ( & mut self . lock_state ( ) , id) ;
547+ Ok ( ( ) )
548+ }
549+
519550 pub fn send_request (
520551 & self ,
521552 Message { sender_id : ObjectId { id } , opcode, args } : Message < ObjectId , RawFd > ,
@@ -732,29 +763,7 @@ impl InnerBackend {
732763 } ;
733764
734765 if message_desc. is_destructor {
735- if let Some ( ref alive) = id. alive {
736- let udata = unsafe {
737- Box :: from_raw ( ffi_dispatch ! (
738- wayland_client_handle( ) ,
739- wl_proxy_get_user_data,
740- id. ptr
741- ) as * mut ProxyUserData )
742- } ;
743- unsafe {
744- ffi_dispatch ! (
745- wayland_client_handle( ) ,
746- wl_proxy_set_user_data,
747- id. ptr,
748- std:: ptr:: null_mut( )
749- ) ;
750- }
751- alive. store ( false , Ordering :: Release ) ;
752- udata. data . destroyed ( ObjectId { id : id. clone ( ) } ) ;
753- }
754- guard. known_proxies . remove ( & id. ptr ) ;
755- unsafe {
756- ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. ptr) ;
757- }
766+ self . destroy_object_inner ( & mut guard, & ObjectId { id } )
758767 }
759768
760769 Ok ( child_id)
0 commit comments