diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b864f2c..bc18988d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ And please only add new entries to the top of this list, right below the `# Unre - Make `WindowBuilder` `Send + Sync`. - On macOS, fix assertion when pressing `Globe` key. - On Windows, updated `WM_MOUSEMOVE` to detect when cursor Enter or Leave window client area while captured and send the corresponding events. (#3153) +- On macOS, fix crash when accessing tabbing APIs. # 0.29.1-beta diff --git a/src/platform_impl/macos/appkit/tab_group.rs b/src/platform_impl/macos/appkit/tab_group.rs index 8a86e3c0..e52bf572 100644 --- a/src/platform_impl/macos/appkit/tab_group.rs +++ b/src/platform_impl/macos/appkit/tab_group.rs @@ -23,7 +23,7 @@ extern_methods!( pub fn selectPreviousTab(&self); #[method_id(windows)] - pub fn tabbedWindows(&self) -> Id>; + pub fn tabbedWindows(&self) -> Option>>; #[method(setSelectedWindow:)] pub fn setSelectedWindow(&self, window: &NSWindow); diff --git a/src/platform_impl/macos/appkit/window.rs b/src/platform_impl/macos/appkit/window.rs index 4a0a99c3..74b2bf3b 100644 --- a/src/platform_impl/macos/appkit/window.rs +++ b/src/platform_impl/macos/appkit/window.rs @@ -218,7 +218,7 @@ extern_methods!( pub(crate) fn tabbingIdentifier(&self) -> Id; #[method_id(tabGroup)] - pub(crate) fn tabGroup(&self) -> Id; + pub(crate) fn tabGroup(&self) -> Option>; #[method(isDocumentEdited)] pub(crate) fn isDocumentEdited(&self) -> bool; diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index 31d6166e..0096a6bd 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -1525,27 +1525,35 @@ impl WindowExtMacOS for WinitWindow { #[inline] fn select_next_tab(&self) { - self.tabGroup().selectNextTab(); + if let Some(group) = self.tabGroup() { + group.selectNextTab(); + } } #[inline] fn select_previous_tab(&self) { - self.tabGroup().selectPreviousTab(); + if let Some(group) = self.tabGroup() { + group.selectPreviousTab() + } } #[inline] fn select_tab_at_index(&self, index: usize) { - let tab_group = self.tabGroup(); - let windows = tab_group.tabbedWindows(); - if index < windows.len() { - tab_group.setSelectedWindow(&windows[index]); + if let Some(group) = self.tabGroup() { + if let Some(windows) = group.tabbedWindows() { + if index < windows.len() { + group.setSelectedWindow(&windows[index]); + } + } } } #[inline] fn num_tabs(&self) -> usize { - let tab_group = self.tabGroup(); - tab_group.tabbedWindows().len() + self.tabGroup() + .and_then(|group| group.tabbedWindows()) + .map(|windows| windows.len()) + .unwrap_or(1) } fn is_document_edited(&self) -> bool {