From 5b31a6018bc7fe85df9e01979611219259f92729 Mon Sep 17 00:00:00 2001 From: Max Zhao Date: Sat, 1 Jan 2022 22:03:42 +0100 Subject: [PATCH] Adding a configuration screen --- YabaiIndicator.xcodeproj/project.pbxproj | 12 ++- .../UserInterfaceState.xcuserstate | Bin 24401 -> 55861 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 4 +- YabaiIndicator/ContentView.swift | 18 +---- YabaiIndicator/SettingsView.swift | 46 +++++++++--- YabaiIndicator/SpacesModel.swift | 2 + YabaiIndicator/YabaiAppDelegate.swift | 70 +++++++++++++++--- YabaiIndicator/YabaiClient.swift | 35 +++++++++ YabaiIndicator/defaults.plist | 12 +++ 9 files changed, 159 insertions(+), 40 deletions(-) create mode 100644 YabaiIndicator/YabaiClient.swift create mode 100644 YabaiIndicator/defaults.plist diff --git a/YabaiIndicator.xcodeproj/project.pbxproj b/YabaiIndicator.xcodeproj/project.pbxproj index 83a84ab..0bc863b 100644 --- a/YabaiIndicator.xcodeproj/project.pbxproj +++ b/YabaiIndicator.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 500F41362780826500C6BC9B /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500F41352780826500C6BC9B /* SettingsView.swift */; }; + 5051A4692780C02700614C85 /* YabaiClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5051A4682780C02700614C85 /* YabaiClient.swift */; }; + 5051A46B2780DC9B00614C85 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5051A46A2780DC9B00614C85 /* defaults.plist */; }; 5061206C2779212000E8F192 /* YabaiIndicatorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5061206B2779212000E8F192 /* YabaiIndicatorApp.swift */; }; 5061206E2779212000E8F192 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5061206D2779212000E8F192 /* ContentView.swift */; }; 506120702779212200E8F192 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5061206F2779212200E8F192 /* Assets.xcassets */; }; @@ -44,6 +46,8 @@ /* Begin PBXFileReference section */ 500F41352780826500C6BC9B /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + 5051A4682780C02700614C85 /* YabaiClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YabaiClient.swift; sourceTree = ""; }; + 5051A46A2780DC9B00614C85 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = ""; }; 506120682779212000E8F192 /* YabaiIndicator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = YabaiIndicator.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5061206B2779212000E8F192 /* YabaiIndicatorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YabaiIndicatorApp.swift; sourceTree = ""; }; 5061206D2779212000E8F192 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -123,6 +127,7 @@ 5061206A2779212000E8F192 /* YabaiIndicator */ = { isa = PBXGroup; children = ( + 5051A46A2780DC9B00614C85 /* defaults.plist */, 506120962779231000E8F192 /* Info.plist */, 5061206B2779212000E8F192 /* YabaiIndicatorApp.swift */, 5061206D2779212000E8F192 /* ContentView.swift */, @@ -135,6 +140,7 @@ 5061209F277A195C00E8F192 /* YabaiIndicator-Bridging-Header.h */, 506120AE277A7BF800E8F192 /* SpacesModel.swift */, 500F41352780826500C6BC9B /* SettingsView.swift */, + 5051A4682780C02700614C85 /* YabaiClient.swift */, ); path = YabaiIndicator; sourceTree = ""; @@ -287,6 +293,7 @@ buildActionMask = 2147483647; files = ( 506120732779212200E8F192 /* Preview Assets.xcassets in Resources */, + 5051A46B2780DC9B00614C85 /* defaults.plist in Resources */, 506120702779212200E8F192 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -318,6 +325,7 @@ 500F41362780826500C6BC9B /* SettingsView.swift in Sources */, 5061206E2779212000E8F192 /* ContentView.swift in Sources */, 5061206C2779212000E8F192 /* YabaiIndicatorApp.swift in Sources */, + 5051A4692780C02700614C85 /* YabaiClient.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -490,7 +498,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = de.arsbrevis.YabaiIndicator; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -525,7 +533,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = de.arsbrevis.YabaiIndicator; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/YabaiIndicator.xcodeproj/project.xcworkspace/xcuserdata/max.xcuserdatad/UserInterfaceState.xcuserstate b/YabaiIndicator.xcodeproj/project.xcworkspace/xcuserdata/max.xcuserdatad/UserInterfaceState.xcuserstate index 71c0867c8cbc8540fe980f97342e42264740ef32..51835eb776de934ff5b60b5b9e4a6466b1c73cfe 100644 GIT binary patch literal 55861 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 R)2IIrUAFxX|9_ks|9_VV)1d$W literal 24401 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 Au>b%7 diff --git a/YabaiIndicator.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/YabaiIndicator.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index ba19094..f12ff7b 100644 --- a/YabaiIndicator.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/YabaiIndicator.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "YabaiIndicator/YabaiAppDelegate.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "141" - endingLineNumber = "141" + startingLineNumber = "189" + endingLineNumber = "189" landmarkName = "applicationDidFinishLaunching(_:)" landmarkType = "7"> diff --git a/YabaiIndicator/ContentView.swift b/YabaiIndicator/ContentView.swift index 7adf043..f047a7f 100644 --- a/YabaiIndicator/ContentView.swift +++ b/YabaiIndicator/ContentView.swift @@ -7,16 +7,6 @@ import SwiftUI -@discardableResult -func shell(_ args: String...) -> Int32 { - let task = Process() - task.launchPath = "/usr/local/bin/yabai" - task.arguments = args - task.launch() - task.waitUntilExit() - return task.terminationStatus -} - struct SpaceButton : View { var space: Space @@ -32,8 +22,7 @@ struct SpaceButton : View { func switchSpace() { if !space.active && space.yabaiIndex > 0 { - shell( - "-m", "space", "--focus", "\(space.yabaiIndex)") + focusSpace(index: space.yabaiIndex) } } @@ -52,11 +41,12 @@ struct SpaceButton : View { struct ContentView: View { @EnvironmentObject var spaces: Spaces - + @AppStorage("showDisplaySeparator") private var showDisplaySeparator = true + @AppStorage("showCurrentSpaceOnly") private var showCurrentSpaceOnly = false var body: some View { HStack (spacing: 4) { - ForEach(spaces.spaceElems) {space in + ForEach(spaces.spaceElems.filter{($0.type >= 0) || showDisplaySeparator}.filter{$0.visible || !showCurrentSpaceOnly}) {space in SpaceButton(space: space) } }.padding(2) diff --git a/YabaiIndicator/SettingsView.swift b/YabaiIndicator/SettingsView.swift index 3b79f96..4d8a323 100644 --- a/YabaiIndicator/SettingsView.swift +++ b/YabaiIndicator/SettingsView.swift @@ -10,19 +10,43 @@ import SwiftUI struct SettingsView : View { @AppStorage("showDisplaySeparator") private var showDisplaySeparator = true @AppStorage("showCurrentSpaceOnly") private var showCurrentSpaceOnly = false - @AppStorage("yabaiPath") private var yabaiPath = "/usr/local/bin/yabai" + @AppStorage("yabaiPath") private var yabaiPath = "" + + @State private var validPath = false + @State private var editedPath = false + + private enum Tabs: Hashable { + case general, advanced + } + + private func checkYabaiPath() { + validPath = checkYabai() + editedPath = true + } var body: some View { - Form { - Toggle("Show Display Separator", isOn: $showDisplaySeparator) - Toggle("Show Current Space Only", isOn: $showCurrentSpaceOnly) - VStack { - TextField("Yabai Path", text: $yabaiPath).textFieldStyle(.plain) - Divider() - }.padding(5).disabled(false) - + TabView { + Form { + Toggle("Show Display Separator", isOn: $showDisplaySeparator) + Toggle("Show Current Space Only", isOn: $showCurrentSpaceOnly) + VStack{ + HStack { + Text("Yabai Path") + TextField("Yabai Path", text: $yabaiPath) + Button("Check", action: checkYabaiPath) + } + if (editedPath) { + Text(validPath ? "Valid yabai binary" : "Invalid path").foregroundColor(validPath ? Color.green : Color.red) + } + Spacer() + } + }.padding(10) + .tabItem { + Label("General", systemImage: "gear") + } + .tag(Tabs.general) - }.padding(20) - + } + .frame(width: 375, height: 120) } } diff --git a/YabaiIndicator/SpacesModel.swift b/YabaiIndicator/SpacesModel.swift index e7e2dab..0519fe1 100644 --- a/YabaiIndicator/SpacesModel.swift +++ b/YabaiIndicator/SpacesModel.swift @@ -9,6 +9,8 @@ import Foundation class Spaces: ObservableObject { @Published var spaceElems:[Space] = [] + @Published var totalSpaces:Int = 0 + @Published var totalDisplays:Int = 0 init(spaces: [Space]) { spaceElems = spaces diff --git a/YabaiIndicator/YabaiAppDelegate.swift b/YabaiIndicator/YabaiAppDelegate.swift index eb74416..cfaf310 100644 --- a/YabaiIndicator/YabaiAppDelegate.swift +++ b/YabaiIndicator/YabaiAppDelegate.swift @@ -7,6 +7,17 @@ import SwiftUI import Socket +import Combine + +extension UserDefaults { + @objc dynamic var showDisplaySeparator: Bool { + return bool(forKey: "showDisplaySeparator") + } + + @objc dynamic var showCurrentSpaceOnly: Bool { + return bool(forKey: "showCurrentSpaceOnly") + } +} class YabaiAppDelegate: NSObject, NSApplicationDelegate { var statusBarItem: NSStatusItem? @@ -16,6 +27,11 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { let g_connection = SLSMainConnectionID() let statusBarHeight = 22 let itemWidth:CGFloat = 30 + + var refreshSink: AnyCancellable? + var separatorSink: AnyCancellable? + var displaySink: AnyCancellable? + @objc func onSpaceChanged(_ notification: Notification) { @@ -32,7 +48,7 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { let activeDisplayUUID = SLSCopyActiveMenuBarDisplayIdentifier(g_connection).takeRetainedValue() as String let displays = SLSCopyManagedDisplaySpaces(g_connection).takeRetainedValue() as [AnyObject] - + var spaceIncr = 0 var totalSpaces = 0 var spaces:[Space] = [] @@ -45,7 +61,7 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { let activeDisplay = activeDisplayUUID == displayUUID if (totalSpaces > 0) { - spaces.append(Space(id: 0, uuid: "", visible: false, active: false, displayUUID: "", index: 0, yabaiIndex: totalSpaces, type: -1)) + spaces.append(Space(id: 0, uuid: "", visible: true, active: false, displayUUID: "", index: 0, yabaiIndex: totalSpaces, type: -1)) } for nsSpace:NSDictionary in displaySpaces { @@ -66,10 +82,23 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { } } self.spaces.spaceElems = spaces - - let newWidth = CGFloat(totalSpaces) * itemWidth + self.spaces.totalSpaces = totalSpaces + self.spaces.totalDisplays = displays.count + } + + func refreshBar() { + let showDisplaySeparator = UserDefaults.standard.bool(forKey: "showDisplaySeparator") + let showCurrentSpaceOnly = UserDefaults.standard.bool(forKey: "showCurrentSpaceOnly") + + let numButtons = showCurrentSpaceOnly ? spaces.totalDisplays : spaces.totalSpaces + + var newWidth = CGFloat(numButtons) * itemWidth + if !showDisplaySeparator { + newWidth -= CGFloat((spaces.totalDisplays - 1) * 10) + } statusBarItem?.button?.frame.size.width = newWidth - statusBarItem?.button?.subviews[0].frame.size.width = newWidth + statusBarItem?.button?.subviews[0].frame.size.width = newWidth + } func socketServer() async { @@ -100,6 +129,12 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { NSApp.terminate(self) } + @objc + func openPreferences() { + NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil) + NSApp.activate(ignoringOtherApps: true) + } + func createStatusItemView() -> NSView { let view = NSHostingView( rootView: ContentView().environmentObject(spaces) @@ -109,13 +144,13 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { } func createMenu() -> NSMenu { - let statusBarMenu = NSMenu(title: "Yabai Indicator Menu") - let settingsView = NSHostingView(rootView: SettingsView()) - let menuItem = NSMenuItem() - settingsView.setFrameSize(NSSize(width: 300, height: 100)) - menuItem.view = settingsView - statusBarMenu.addItem(menuItem) + let statusBarMenu = NSMenu() + statusBarMenu.addItem( + withTitle: "Preferences", + action: #selector(openPreferences), + keyEquivalent: "") statusBarMenu.addItem(NSMenuItem.separator()) + statusBarMenu.addItem( withTitle: "Quit", action: #selector(quit), @@ -129,6 +164,16 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { } func applicationDidFinishLaunching(_ notification: Notification) { + if let prefs = Bundle.main.path(forResource: "defaults", ofType: "plist"), + let dict = NSDictionary(contentsOfFile: prefs) as? [String : Any] { + UserDefaults.standard.register(defaults: dict) + } + + refreshSink = spaces.objectWillChange.sink{_ in self.refreshBar()} + separatorSink = UserDefaults.standard.publisher(for: \.showDisplaySeparator).sink {_ in self.refreshBar()} + displaySink = UserDefaults.standard.publisher(for: \.showCurrentSpaceOnly).sink {_ in self.refreshBar()} + + Task { await self.socketServer() } @@ -138,5 +183,8 @@ class YabaiAppDelegate: NSObject, NSApplicationDelegate { statusBarItem?.menu = createMenu() refreshData() + + registerObservers() + } } diff --git a/YabaiIndicator/YabaiClient.swift b/YabaiIndicator/YabaiClient.swift new file mode 100644 index 0000000..0daab4d --- /dev/null +++ b/YabaiIndicator/YabaiClient.swift @@ -0,0 +1,35 @@ +// +// YabaiClient.swift +// YabaiIndicator +// +// Created by Max Zhao on 01/01/2022. +// + +import SwiftUI + +@discardableResult +func yabai(_ args: String...) -> Int32 { + let task = Process() + let yabaiPath = UserDefaults.standard.string(forKey: "yabaiPath") + task.launchPath = yabaiPath + task.arguments = args + do { + try task.run() + } catch { + print(error) + return 1 + } + task.waitUntilExit() + let status = task.terminationStatus + return status +} + +func focusSpace(index: Int) { + yabai( + "-m", "space", "--focus", "\(index)") +} + +func checkYabai() -> Bool { + let valid = yabai("-v") == 0 + return valid +} diff --git a/YabaiIndicator/defaults.plist b/YabaiIndicator/defaults.plist new file mode 100644 index 0000000..86ed008 --- /dev/null +++ b/YabaiIndicator/defaults.plist @@ -0,0 +1,12 @@ + + + + + showDisplaySeparator + + yabaiPath + /usr/local/bin/yabai + showCurrentSpaceOnly + + +