mirror of
https://github.com/lwouis/alt-tab-macos.git
synced 2026-05-24 11:20:36 +00:00
feat: show window partially on-screen (closes #727)
This commit is contained in:
@@ -87,11 +87,11 @@ class Application: NSObject {
|
||||
let size = try $0.size()
|
||||
let isOnNormalLevel = $0.isOnNormalLevel(wid)
|
||||
if $0.isActualWindow(self.runningApplication, wid, isOnNormalLevel, title, subrole, role, size) {
|
||||
return ($0, wid, title, try $0.isFullscreen(), try $0.isMinimized(), try $0.position())
|
||||
return ($0, wid, title, try $0.isFullscreen(), try $0.isMinimized(), try $0.position(), size)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
} as [(AXUIElement, CGWindowID, String?, Bool, Bool, CGPoint?)]
|
||||
} as [(AXUIElement, CGWindowID, String?, Bool, Bool, CGPoint?, CGSize?)]
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self = self else { return }
|
||||
var windows = self.addWindows(axWindows)
|
||||
@@ -115,10 +115,10 @@ class Application: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
private func addWindows(_ axWindows: [(AXUIElement, CGWindowID, String?, Bool, Bool, CGPoint?)]) -> [Window] {
|
||||
let windows: [Window] = axWindows.compactMap { (axUiElement, wid, axTitle, isFullscreen, isMinimized, position) in
|
||||
private func addWindows(_ axWindows: [(AXUIElement, CGWindowID, String?, Bool, Bool, CGPoint?, CGSize?)]) -> [Window] {
|
||||
let windows: [Window] = axWindows.compactMap { (axUiElement, wid, axTitle, isFullscreen, isMinimized, position, size) in
|
||||
if (Windows.list.firstIndex { $0.isEqualRobust(axUiElement, wid) }) == nil {
|
||||
let window = Window(axUiElement, self, wid, axTitle, isFullscreen, isMinimized, position)
|
||||
let window = Window(axUiElement, self, wid, axTitle, isFullscreen, isMinimized, position, size)
|
||||
Windows.appendAndUpdateFocus(window)
|
||||
return window
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ class Window {
|
||||
var isOnAllSpaces = false
|
||||
var isWindowlessApp = false
|
||||
var position: CGPoint?
|
||||
var size: CGSize?
|
||||
var spaceId = CGSSpaceID.max
|
||||
var spaceIndex = SpaceIndex.max
|
||||
var axUiElement: AXUIElement!
|
||||
@@ -32,7 +33,7 @@ class Window {
|
||||
kAXWindowMovedNotification,
|
||||
]
|
||||
|
||||
init(_ axUiElement: AXUIElement, _ application: Application, _ wid: CGWindowID, _ axTitle: String?, _ isFullscreen: Bool, _ isMinimized: Bool, _ position: CGPoint?) {
|
||||
init(_ axUiElement: AXUIElement, _ application: Application, _ wid: CGWindowID, _ axTitle: String?, _ isFullscreen: Bool, _ isMinimized: Bool, _ position: CGPoint?, _ size: CGSize?) {
|
||||
// TODO: make a efficient batched AXUIElementCopyMultipleAttributeValues call once for each window, and store the values
|
||||
self.axUiElement = axUiElement
|
||||
self.application = application
|
||||
@@ -42,6 +43,7 @@ class Window {
|
||||
self.isFullscreen = isFullscreen
|
||||
self.isMinimized = isMinimized
|
||||
self.position = position
|
||||
self.size = size
|
||||
self.title = bestEffortTitle(axTitle)
|
||||
if !Preferences.hideThumbnails {
|
||||
refreshThumbnail()
|
||||
|
||||
@@ -202,10 +202,11 @@ class Windows {
|
||||
}
|
||||
|
||||
static func isOnScreen(_ window: Window, _ screen: NSScreen) -> Bool {
|
||||
if let position = window.position {
|
||||
if let topLeftCorner = window.position, let size = window.size {
|
||||
var screenFrameInQuartzCoordinates = screen.frame
|
||||
screenFrameInQuartzCoordinates.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(screen.frame)
|
||||
return screenFrameInQuartzCoordinates.contains(position)
|
||||
let windowRect = CGRect(origin: topLeftCorner, size: size)
|
||||
return windowRect.intersects(screenFrameInQuartzCoordinates)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ fileprivate func windowCreated(_ element: AXUIElement, _ pid: pid_t) throws {
|
||||
let runningApp = NSRunningApplication(processIdentifier: pid),
|
||||
element.isActualWindow(runningApp, wid, isOnNormalLevel, axTitle, subrole, role, size),
|
||||
let app = (Applications.list.first { $0.pid == pid }) {
|
||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position)
|
||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
||||
Windows.appendAndUpdateFocus(window)
|
||||
Windows.cycleFocusedWindowIndex(1)
|
||||
App.app.refreshOpenUi([window])
|
||||
@@ -124,7 +124,7 @@ fileprivate func focusedWindowChanged(_ element: AXUIElement, _ pid: pid_t) thro
|
||||
App.app.refreshOpenUi(windows)
|
||||
} else if element.isActualWindow(runningApp, wid, isOnNormalLevel, axTitle, subrole, role, size),
|
||||
let app = (Applications.list.first { $0.pid == pid }) {
|
||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position)
|
||||
let window = Window(element, app, wid, axTitle, isFullscreen, isMinimized, position, size)
|
||||
Windows.appendAndUpdateFocus(window)
|
||||
App.app.refreshOpenUi([window])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user