From cd2da682c6b23ae6dd42898771026dc3508f2bc2 Mon Sep 17 00:00:00 2001 From: Michael Lehenauer Date: Fri, 31 May 2024 16:05:10 +0200 Subject: [PATCH 1/2] sort spaces by monitor locaction # Conflicts: # Spaceman/Helpers/SpaceObserver.swift --- Spaceman/Helpers/SpaceObserver.swift | 46 +++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/Spaceman/Helpers/SpaceObserver.swift b/Spaceman/Helpers/SpaceObserver.swift index ac2e23b2..28588ec2 100644 --- a/Spaceman/Helpers/SpaceObserver.swift +++ b/Spaceman/Helpers/SpaceObserver.swift @@ -27,10 +27,49 @@ class SpaceObserver { object: nil) } + func display1IsLeft(display1: NSDictionary, display2: NSDictionary) -> Bool { + let d1Center = getDisplayCenter(display: display1) + let d2Center = getDisplayCenter(display: display2) + return d1Center.x < d2Center.x + } + + func getDisplayCenter(display: NSDictionary) -> CGPoint { + guard let uuidString = display["Display Identifier"] as? String + else { + return CGPoint(x: 0, y: 0) + } + let uuid = CFUUIDCreateFromString(kCFAllocatorDefault, uuidString as CFString) + let dId = CGDisplayGetDisplayIDFromUUID(uuid) + print(dId) + let bounds = CGDisplayBounds(dId); + return CGPoint(x: bounds.origin.x + bounds.size.width/2, y: bounds.origin.y + bounds.size.height/2) + } + @objc public func updateSpaceInformation() { - let displays = CGSCopyManagedDisplaySpaces(conn) as! [NSDictionary] + var displays = CGSCopyManagedDisplaySpaces(conn) as! [NSDictionary] + + // create dict with correct sorting before changing it + var displayNumber: [String: Int] = [:] + var spacesIndex = 1 + for d in displays { + guard let spaces = d["Spaces"] as? [[String: Any]] + else { + continue + } + + for s in spaces { + let spaceID = String(s["ManagedSpaceID"] as! Int) + displayNumber[spaceID] = spacesIndex + spacesIndex += 1 + } + } + + // sort displays based on location + displays.sort(by: { + display1IsLeft(display1: $0, display2: $1) + }) + var activeSpaceID = -1 - var spacesIndex = 0 var allSpaces = [Space]() var updatedDict = [String: SpaceNameInfo]() @@ -55,7 +94,7 @@ class SpaceObserver { for s in spaces { let spaceID = String(s["ManagedSpaceID"] as! Int) - let spaceNumber: Int = spacesIndex + 1 + let spaceNumber = displayNumber[spaceID]! let isCurrentSpace = activeSpaceID == s["ManagedSpaceID"] as! Int let isFullScreen = s["TileLayoutManager"] as? [String: Any] != nil var desktopNumber : Int? @@ -88,7 +127,6 @@ class SpaceObserver { let nameInfo = SpaceNameInfo(spaceNum: spaceNumber, spaceName: space.spaceName) updatedDict[spaceID] = nameInfo allSpaces.append(space) - spacesIndex += 1 } } From 740bc173674172a6c4c534c87a0248482576b624 Mon Sep 17 00:00:00 2001 From: Michael Lehenauer Date: Fri, 31 May 2024 16:30:56 +0200 Subject: [PATCH 2/2] remove print from getDisplayCenter function --- Spaceman/Helpers/SpaceObserver.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Spaceman/Helpers/SpaceObserver.swift b/Spaceman/Helpers/SpaceObserver.swift index 28588ec2..f92b89d1 100644 --- a/Spaceman/Helpers/SpaceObserver.swift +++ b/Spaceman/Helpers/SpaceObserver.swift @@ -40,7 +40,6 @@ class SpaceObserver { } let uuid = CFUUIDCreateFromString(kCFAllocatorDefault, uuidString as CFString) let dId = CGDisplayGetDisplayIDFromUUID(uuid) - print(dId) let bounds = CGDisplayBounds(dId); return CGPoint(x: bounds.origin.x + bounds.size.width/2, y: bounds.origin.y + bounds.size.height/2) }