Skip to content

Commit e94a5d6

Browse files
committed
Add native tray_set_windows_move_to_active_space() for reliable Spaces support
The JNA-based setMoveToActiveSpace() via Native.getComponentID() was not reliably reaching the NSWindow. Add a native Swift function that directly iterates NSApp.windows and inserts .moveToActiveSpace into each window's collectionBehavior. Called from TrayApp before toFront(). Also separate runCatching blocks so a failure in Spaces configuration does not prevent toFront()/requestFocus() from running.
1 parent eb33e26 commit e94a5d6

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

maclib/tray.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,4 +412,16 @@ public func tray_get_status_item_region_for(
412412
let midX = screen.frame.midX
413413
let region = rect.minX < midX ? "top-left" : "top-right"
414414
return strdup(region)
415+
}
416+
417+
// MARK: - Spaces / Virtual Desktop support
418+
419+
/// Sets NSWindowCollectionBehavior.moveToActiveSpace on all app windows
420+
/// so that showing a window moves it to the current Space instead of
421+
/// switching back to the Space where it was originally created.
422+
@_cdecl("tray_set_windows_move_to_active_space")
423+
public func tray_set_windows_move_to_active_space() {
424+
for window in NSApp.windows {
425+
window.collectionBehavior.insert(.moveToActiveSpace)
426+
}
415427
}

src/commonMain/kotlin/com/kdroid/composetray/lib/mac/MacTrayManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,8 @@ internal class MacTrayManager(
349349

350350
@JvmStatic external fun tray_get_status_item_region(): String?
351351
@JvmStatic external fun tray_get_status_item_region_for(tray: MacTray): String?
352+
353+
@JvmStatic external fun tray_set_windows_move_to_active_space()
352354
}
353355

354356
// Structure for a menu item

src/commonMain/kotlin/com/kdroid/composetray/tray/api/TrayApp.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.ui.window.*
2525
import com.kdroid.composetray.lib.linux.LinuxOutsideClickWatcher
2626
import com.kdroid.composetray.lib.mac.MacOSWindowManager
2727
import com.kdroid.composetray.lib.mac.MacOutsideClickWatcher
28+
import com.kdroid.composetray.lib.mac.MacTrayLoader
2829
import com.kdroid.composetray.lib.windows.WindowsOutsideClickWatcher
2930
import com.kdroid.composetray.menu.api.TrayMenuBuilder
3031
import com.kdroid.composetray.utils.*
@@ -620,10 +621,12 @@ private fun ApplicationScope.TrayAppImplOriginal(
620621
runCatching { WindowVisibilityMonitor.recompute() }
621622

622623
invokeLater {
624+
// Move the popup to the current Space before bringing it to front (macOS)
625+
if (getOperatingSystem() == MACOS) {
626+
runCatching { MacTrayLoader.lib.tray_set_windows_move_to_active_space() }
627+
runCatching { MacOSWindowManager().setMoveToActiveSpace(window) }
628+
}
623629
runCatching {
624-
if (getOperatingSystem() == MACOS) {
625-
MacOSWindowManager().setMoveToActiveSpace(window)
626-
}
627630
window.toFront()
628631
window.requestFocus()
629632
window.requestFocusInWindow()

0 commit comments

Comments
 (0)