From 31de70e7dd2afa352d0bdaf052d69d4dc71d4398 Mon Sep 17 00:00:00 2001 From: Jordan Baird Date: Tue, 25 Jun 2024 01:12:04 -0600 Subject: [PATCH] Make sure control items maintain the correct order Closes #164 --- Ice/MenuBar/MenuBarItemManager.swift | 39 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/Ice/MenuBar/MenuBarItemManager.swift b/Ice/MenuBar/MenuBarItemManager.swift index ef656d54..f6b8743c 100644 --- a/Ice/MenuBar/MenuBarItemManager.swift +++ b/Ice/MenuBar/MenuBarItemManager.swift @@ -29,9 +29,6 @@ class MenuBarItemManager: ObservableObject { func performSetup() { configureCancellables() - DispatchQueue.main.async { - self.cacheCurrentMenuBarItems() - } } private func configureCancellables() { @@ -39,8 +36,20 @@ class MenuBarItemManager: ObservableObject { Timer.publish(every: 3, on: .main, in: .default) .autoconnect() + .merge(with: Just(.now)) .sink { [weak self] _ in - self?.cacheCurrentMenuBarItems() + guard let self else { + return + } + Task { + let items = MenuBarItem.getMenuBarItemsPrivateAPI(onScreenOnly: false) + do { + try await self.arrangeItems(items) + } catch { + Logger.itemManager.error("Error arranging items: \(error)") + } + self.cacheItems(items) + } } .store(in: &c) @@ -52,7 +61,7 @@ class MenuBarItemManager: ObservableObject { extension MenuBarItemManager { /// Caches the current menu bar items. - private func cacheCurrentMenuBarItems() { + private func cacheItems(_ items: [MenuBarItem]) { guard tempShownItemsInfo.isEmpty else { Logger.itemManager.info("Items are temporarily shown, so deferring cache") return @@ -65,8 +74,6 @@ extension MenuBarItemManager { } } - let items = MenuBarItem.getMenuBarItemsPrivateAPI(onScreenOnly: false) - guard let hiddenControlItem = items.first(where: { $0.info == .hiddenControlItem }), let alwaysHiddenControlItem = items.first(where: { $0.info == .alwaysHiddenControlItem }) @@ -865,6 +872,24 @@ extension MenuBarItemManager { } } +// MARK: - Arrange Items + +extension MenuBarItemManager { + func arrangeItems(_ items: [MenuBarItem]) async throws { + guard + let hiddenControlItem = items.first(where: { $0.info == .hiddenControlItem }), + let alwaysHiddenControlItem = items.first(where: { $0.info == .alwaysHiddenControlItem }) + else { + return + } + + // make sure the always-hidden control item is to the left of the hidden control item + if hiddenControlItem.frame.maxX <= alwaysHiddenControlItem.frame.minX { + try await slowMove(item: alwaysHiddenControlItem, to: .leftOfItem(hiddenControlItem)) + } + } +} + // MARK: - CGEvent Helpers private extension CGEvent {