fix: window might be noted to be on the wrong space
This commit is contained in:
1 parent
93defcd3a7
commit
541337259d
5 files changed
+28
-23
No files matched your search
@@ -85,8 +85,8 @@ class DebugProfile {
|
||||
("isTabbed", String(window.isTabbed)),
|
||||
("isOnAllSpaces", String(window.isOnAllSpaces)),
|
||||
("shouldShowTheUser", String(window.shouldShowTheUser)),
|
||||
("spaceId", String(window.spaceId)),
|
||||
("spaceIndex", String(window.spaceIndex)),
|
||||
("spaceIds", window.spaceIds.map(String.init).joined(separator: interSeparator)),
|
||||
("spaceIndexes", window.spaceIndexes.map(String.init).joined(separator: interSeparator)),
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ extension NSScreen {
|
||||
static func active() -> NSScreen? {
|
||||
if let app = Applications.find(NSWorkspace.shared.frontmostApplication?.processIdentifier) {
|
||||
if let focusedWindow = app.focusedWindow {
|
||||
// on the very first summon, this window may not have its spaces updated, which may land the wrong active screen
|
||||
Windows.updatesWindowSpace(focusedWindow)
|
||||
return NSScreen.screens.first { focusedWindow.isOnScreen($0) }
|
||||
}
|
||||
return NSScreen.withActiveMenubar()
|
||||
|
||||
@@ -19,8 +19,8 @@ class Window {
|
||||
var isWindowlessApp = false
|
||||
var position: CGPoint?
|
||||
var size: CGSize?
|
||||
var spaceId = CGSSpaceID.max
|
||||
var spaceIndex = SpaceIndex.max
|
||||
var spaceIds = [CGSSpaceID.max]
|
||||
var spaceIndexes = [SpaceIndex.max]
|
||||
var axUiElement: AXUIElement!
|
||||
var application: Application
|
||||
var axObserver: AXObserver?
|
||||
@@ -40,8 +40,7 @@ class Window {
|
||||
self.axUiElement = axUiElement
|
||||
self.application = application
|
||||
cgWindowId = wid
|
||||
spaceId = Spaces.currentSpaceId
|
||||
spaceIndex = Spaces.currentSpaceIndex
|
||||
Windows.updatesWindowSpace(self)
|
||||
self.isFullscreen = isFullscreen
|
||||
self.isMinimized = isMinimized
|
||||
self.position = position
|
||||
@@ -232,10 +231,11 @@ class Window {
|
||||
return application.localizedName ?? ""
|
||||
}
|
||||
|
||||
/// window may not be visible on that screen (e.g. the window is not on the current Space)
|
||||
func isOnScreen(_ screen: NSScreen) -> Bool {
|
||||
if NSScreen.screensHaveSeparateSpaces {
|
||||
if let screenUuid = screen.uuid(), let screenSpaces = Spaces.screenSpacesMap[screenUuid] {
|
||||
return screenSpaces.contains { $0 == spaceId }
|
||||
return screenSpaces.contains { screenSpace in spaceIds.contains { $0 == screenSpace } }
|
||||
}
|
||||
} else {
|
||||
let referenceWindow = referenceWindowForTabbedWindow()
|
||||
|
||||
+14
-12
@@ -51,7 +51,15 @@ class Windows {
|
||||
order = compareByAppNameThenWindowTitle($0, $1)
|
||||
}
|
||||
if sortType == .space {
|
||||
order = $0.spaceIndex.compare($1.spaceIndex)
|
||||
if $0.isOnAllSpaces && $1.isOnAllSpaces {
|
||||
order = .orderedSame
|
||||
} else if $0.isOnAllSpaces {
|
||||
order = .orderedAscending
|
||||
} else if $1.isOnAllSpaces {
|
||||
order = .orderedDescending
|
||||
} else if let spaceIndex0 = $0.spaceIndexes.first, let spaceIndex1 = $1.spaceIndexes.first {
|
||||
order = spaceIndex0.compare(spaceIndex1)
|
||||
}
|
||||
if order == .orderedSame {
|
||||
order = compareByAppNameThenWindowTitle($0, $1)
|
||||
}
|
||||
@@ -283,21 +291,15 @@ class Windows {
|
||||
return true
|
||||
}
|
||||
|
||||
private static func updatesWindowSpace(_ window: Window) {
|
||||
static func updatesWindowSpace(_ window: Window) {
|
||||
// macOS bug: if you tab a window, then move the tab group to another space, other tabs from the tab group will stay on the current space
|
||||
// you can use the Dock to focus one of the other tabs and it will teleport that tab in the current space, proving that it's a macOS bug
|
||||
// note: for some reason, it behaves differently if you minimize the tab group after moving it to another space
|
||||
if let cgWindowId = window.cgWindowId {
|
||||
let spaceIds = cgWindowId.spaces()
|
||||
if spaceIds.count == 1 {
|
||||
window.spaceId = spaceIds.first!
|
||||
window.spaceIndex = Spaces.idsAndIndexes.first { $0.0 == spaceIds.first! }!.1
|
||||
window.isOnAllSpaces = false
|
||||
} else if spaceIds.count > 1 {
|
||||
window.spaceId = Spaces.currentSpaceId
|
||||
window.spaceIndex = Spaces.currentSpaceIndex
|
||||
window.isOnAllSpaces = true
|
||||
}
|
||||
window.spaceIds = spaceIds
|
||||
window.spaceIndexes = spaceIds.map { spaceId in Spaces.idsAndIndexes.first { $0.0 == spaceId }!.1 }
|
||||
window.isOnAllSpaces = spaceIds.count > 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,7 +360,7 @@ class Windows {
|
||||
!window.isWindowlessApp &&
|
||||
!(!(Preferences.showFullscreenWindows[App.app.shortcutIndex] != .hide) && window.isFullscreen) &&
|
||||
!(!(Preferences.showMinimizedWindows[App.app.shortcutIndex] != .hide) && window.isMinimized) &&
|
||||
!(Preferences.spacesToShow[App.app.shortcutIndex] == .visible && !Spaces.visibleSpaces.contains(window.spaceId)) &&
|
||||
!(Preferences.spacesToShow[App.app.shortcutIndex] == .visible && !Spaces.visibleSpaces.contains { visibleSpace in window.spaceIds.contains { $0 == visibleSpace } }) &&
|
||||
!(Preferences.screensToShow[App.app.shortcutIndex] == .showingAltTab && !window.isOnScreen(NSScreen.preferred)) &&
|
||||
(Preferences.showTabsAsWindows || !window.isTabbed))
|
||||
}
|
||||
|
||||
@@ -351,12 +351,13 @@ class ThumbnailView: FlippedView {
|
||||
}
|
||||
label.updateTruncationModeIfNeeded()
|
||||
if !spaceIcon.isHidden {
|
||||
if element.spaceIndex > 30 || element.isOnAllSpaces {
|
||||
let spaceIndex = element.spaceIndexes.first
|
||||
if element.isOnAllSpaces || (spaceIndex != nil && spaceIndex! > 30) {
|
||||
spaceIcon.setStar()
|
||||
spaceIcon.toolTip = NSLocalizedString("Window is on every Space", comment: "")
|
||||
} else {
|
||||
spaceIcon.setNumber(element.spaceIndex, false)
|
||||
spaceIcon.toolTip = String(format: NSLocalizedString("Window is on Space %d", comment: ""), element.spaceIndex)
|
||||
} else if let spaceIndex {
|
||||
spaceIcon.setNumber(spaceIndex, false)
|
||||
spaceIcon.toolTip = String(format: NSLocalizedString("Window is on Space %d", comment: ""), spaceIndex)
|
||||
}
|
||||
}
|
||||
let appIconChanged = updateAppIcon(element, title)
|
||||
|
||||
Reference in new issue
Block a user