Move ownership of `MacOSDisplay` to the rust side

Antonio Scandurra created

Change summary

crates/capture/src/main.rs                                              | 10 
crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift |  2 
crates/live_kit/src/live_kit.rs                                         |  8 
3 files changed, 5 insertions(+), 15 deletions(-)

Detailed changes

crates/capture/src/main.rs 🔗

@@ -59,14 +59,8 @@ fn main() {
             room2.connect(&live_kit_url, &user2_token).await.unwrap();
             cx.add_window(Default::default(), |cx| ScreenCaptureView::new(room2, cx));
 
-            let display = live_kit::display_sources()
-                .await
-                .unwrap()
-                .into_iter()
-                .next()
-                .unwrap();
-
-            let track = LocalVideoTrack::screen_share_for_display(display);
+            let display_sources = live_kit::display_sources().await.unwrap();
+            let track = LocalVideoTrack::screen_share_for_display(display_sources.first().unwrap());
             room1.publish_video_track(&track).await.unwrap();
         })
         .detach();

crates/live_kit/LiveKitBridge/Sources/LiveKitBridge/LiveKitBridge.swift 🔗

@@ -88,7 +88,7 @@ public func LKRoomPublishVideoTrack(room: UnsafeRawPointer, track: UnsafeRawPoin
 
 @_cdecl("LKCreateScreenShareTrackForDisplay")
 public func LKCreateScreenShareTrackForDisplay(display: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
-    let display = Unmanaged<MacOSDisplay>.fromOpaque(display).takeRetainedValue()
+    let display = Unmanaged<MacOSDisplay>.fromOpaque(display).takeUnretainedValue()
     let track = LocalVideoTrack.createMacOSScreenShareTrack(source: display, preferredMethod: .legacy)
     return Unmanaged.passRetained(track).toOpaque()
 }

crates/live_kit/src/live_kit.rs 🔗

@@ -187,11 +187,8 @@ impl Drop for RoomDelegate {
 pub struct LocalVideoTrack(*const c_void);
 
 impl LocalVideoTrack {
-    pub fn screen_share_for_display(display: MacOSDisplay) -> Self {
-        let ptr = display.0;
-        let this = Self(unsafe { LKCreateScreenShareTrackForDisplay(ptr) });
-        std::mem::forget(display);
-        this
+    pub fn screen_share_for_display(display: &MacOSDisplay) -> Self {
+        Self(unsafe { LKCreateScreenShareTrackForDisplay(display.0) })
     }
 }
 
@@ -259,7 +256,6 @@ pub fn display_sources() -> impl Future<Output = Result<Vec<MacOSDisplay>>> {
                 let sources = CFArray::wrap_under_get_rule(sources);
                 let sources_vec = sources.iter().map(|source| MacOSDisplay(*source)).collect();
                 let _ = tx.send(Ok(sources_vec));
-                std::mem::forget(sources); // HACK: If I drop the CFArray, all the objects inside it get dropped and we get issues accessing the display later.
             }
         }
     }