Merge pull request #2124 from zed-industries/fix-display-uuid-panic

Make display uuid optional if the display is disconnected
This commit is contained in:
Kay Simmons 2023-02-02 17:17:01 -08:00 committed by GitHub
commit ae15673dfd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 22 deletions

View file

@ -914,7 +914,7 @@ impl MutableAppContext {
self.presenters_and_platform_windows[&window_id].1.bounds() self.presenters_and_platform_windows[&window_id].1.bounds()
} }
pub fn window_display_uuid(&self, window_id: usize) -> Uuid { pub fn window_display_uuid(&self, window_id: usize) -> Option<Uuid> {
self.presenters_and_platform_windows[&window_id] self.presenters_and_platform_windows[&window_id]
.1 .1
.screen() .screen()
@ -2375,12 +2375,13 @@ impl MutableAppContext {
callback(is_fullscreen, this) callback(is_fullscreen, this)
}); });
let bounds = this.window_bounds(window_id); if let Some(uuid) = this.window_display_uuid(window_id) {
let uuid = this.window_display_uuid(window_id); let bounds = this.window_bounds(window_id);
let mut bounds_observations = this.window_bounds_observations.clone(); let mut bounds_observations = this.window_bounds_observations.clone();
bounds_observations.emit(window_id, this, |callback, this| { bounds_observations.emit(window_id, this, |callback, this| {
callback(bounds, uuid, this) callback(bounds, uuid, this)
}); });
}
Some(()) Some(())
}); });
@ -2559,14 +2560,15 @@ impl MutableAppContext {
} }
fn handle_window_moved(&mut self, window_id: usize) { fn handle_window_moved(&mut self, window_id: usize) {
let bounds = self.window_bounds(window_id); if let Some(display) = self.window_display_uuid(window_id) {
let display = self.window_display_uuid(window_id); let bounds = self.window_bounds(window_id);
self.window_bounds_observations self.window_bounds_observations
.clone() .clone()
.emit(window_id, self, move |callback, this| { .emit(window_id, self, move |callback, this| {
callback(bounds, display, this); callback(bounds, display, this);
true true
}); });
}
} }
pub fn focus(&mut self, window_id: usize, view_id: Option<usize>) { pub fn focus(&mut self, window_id: usize, view_id: Option<usize>) {

View file

@ -124,7 +124,7 @@ pub trait InputHandler {
pub trait Screen: Debug { pub trait Screen: Debug {
fn as_any(&self) -> &dyn Any; fn as_any(&self) -> &dyn Any;
fn bounds(&self) -> RectF; fn bounds(&self) -> RectF;
fn display_uuid(&self) -> Uuid; fn display_uuid(&self) -> Option<Uuid>;
} }
pub trait Window { pub trait Window {

View file

@ -35,7 +35,7 @@ impl Screen {
.map(|ix| Screen { .map(|ix| Screen {
native_screen: native_screens.objectAtIndex(ix), native_screen: native_screens.objectAtIndex(ix),
}) })
.find(|screen| platform::Screen::display_uuid(screen) == uuid) .find(|screen| platform::Screen::display_uuid(screen) == Some(uuid))
} }
} }
@ -58,7 +58,7 @@ impl platform::Screen for Screen {
self self
} }
fn display_uuid(&self) -> uuid::Uuid { fn display_uuid(&self) -> Option<uuid::Uuid> {
unsafe { unsafe {
// Screen ids are not stable. Further, the default device id is also unstable across restarts. // Screen ids are not stable. Further, the default device id is also unstable across restarts.
// CGDisplayCreateUUIDFromDisplayID is stable but not exposed in the bindings we use. // CGDisplayCreateUUIDFromDisplayID is stable but not exposed in the bindings we use.
@ -74,8 +74,12 @@ impl platform::Screen for Screen {
(&mut device_id) as *mut _ as *mut c_void, (&mut device_id) as *mut _ as *mut c_void,
); );
let cfuuid = CGDisplayCreateUUIDFromDisplayID(device_id as CGDirectDisplayID); let cfuuid = CGDisplayCreateUUIDFromDisplayID(device_id as CGDirectDisplayID);
if cfuuid.is_null() {
return None;
}
let bytes = CFUUIDGetUUIDBytes(cfuuid); let bytes = CFUUIDGetUUIDBytes(cfuuid);
Uuid::from_bytes([ Some(Uuid::from_bytes([
bytes.byte0, bytes.byte0,
bytes.byte1, bytes.byte1,
bytes.byte2, bytes.byte2,
@ -92,7 +96,7 @@ impl platform::Screen for Screen {
bytes.byte13, bytes.byte13,
bytes.byte14, bytes.byte14,
bytes.byte15, bytes.byte15,
]) ]))
} }
} }

View file

@ -238,8 +238,8 @@ impl super::Screen for Screen {
RectF::new(Vector2F::zero(), Vector2F::new(1920., 1080.)) RectF::new(Vector2F::zero(), Vector2F::new(1920., 1080.))
} }
fn display_uuid(&self) -> uuid::Uuid { fn display_uuid(&self) -> Option<uuid::Uuid> {
uuid::Uuid::new_v4() Some(uuid::Uuid::new_v4())
} }
} }