diff --git a/src-tauri/src/macos.rs b/src-tauri/src/macos.rs index af1052f8a..4053be31f 100644 --- a/src-tauri/src/macos.rs +++ b/src-tauri/src/macos.rs @@ -83,16 +83,23 @@ fn same_group(a: &NSWindow, b: &NSWindow) -> bool { } } -/// Puts `members` in one native tab group and shows `selected`. -pub fn sync_tab_group(members: Vec, selected: &WebviewWindow) -> tauri::Result<()> { +/// Adds `members` to the existing anchor's native tab group and shows `selected`. +pub fn sync_tab_group( + members: Vec, + anchor: &WebviewWindow, + selected: &WebviewWindow, +) -> tauri::Result<()> { + let anchor = anchor.clone(); let target = selected.clone(); on_main(selected, move || { let Some(shown) = native(&target) else { return }; - for member in members.iter().filter(|m| m.label() != target.label()) { + let Some(anchor_window) = native(&anchor) else { return }; + // Joining into a new tab's desktop window would take the existing group out of full screen. + for member in members.iter().filter(|m| m.label() != anchor.label()) { if let Some(window) = native(member) - && !same_group(shown, window) + && !same_group(anchor_window, window) { - shown.addTabbedWindow_ordered(window, objc2_app_kit::NSWindowOrderingMode::Above); + anchor_window.addTabbedWindow_ordered(window, objc2_app_kit::NSWindowOrderingMode::Above); } } if let Some(group) = shown.tabGroup() { diff --git a/src-tauri/src/window_groups.rs b/src-tauri/src/window_groups.rs index 699a7a00c..85335be40 100644 --- a/src-tauri/src/window_groups.rs +++ b/src-tauri/src/window_groups.rs @@ -100,8 +100,9 @@ pub fn select(app: &AppHandle, caller: &str, target: &str) -> IdeResult<()> { #[cfg(target_os = "macos")] fn native_select(app: &AppHandle, group: &Group, to: &WebviewWindow) -> IdeResult<()> { let members = group.members.iter().filter_map(|m| app.get_webview_window(m)).collect(); + let anchor = app.get_webview_window(&group.selected).unwrap_or_else(|| to.clone()); to.unminimize().map_err(|e| IdeError::internal(e.to_string()))?; - crate::macos::sync_tab_group(members, to).map_err(|e| IdeError::internal(e.to_string())) + crate::macos::sync_tab_group(members, &anchor, to).map_err(|e| IdeError::internal(e.to_string())) } #[cfg(target_os = "macos")]