Split background menu

This commit is contained in:
世界
2023-07-20 06:44:39 +08:00
parent 7a616bbe15
commit fdbf50d875
6 changed files with 43 additions and 9 deletions
@@ -28,15 +28,10 @@ public struct ExtensionStatusView: View {
StatusItem("Downlink", LibboxFormatBytes(message.downlink) + "/s") StatusItem("Downlink", LibboxFormatBytes(message.downlink) + "/s")
StatusItem("Uplink Total", LibboxFormatBytes(message.uplinkTotal)) StatusItem("Uplink Total", LibboxFormatBytes(message.uplinkTotal))
StatusItem("Downlink Total", LibboxFormatBytes(message.downlinkTotal)) StatusItem("Downlink Total", LibboxFormatBytes(message.downlinkTotal))
} else {
#if os(macOS)
StatusItem("Connections", "\(message.connectionsOut)")
#endif
} }
} else { } else {
StatusItem("Memory", "Loading...") StatusItem("Memory", "Loading...")
StatusItem("Goroutines", "Loading...") StatusItem("Goroutines", "Loading...")
StatusItem("Connections", "Loading...")
} }
}.background { }.background {
GeometryReader { geometry in GeometryReader { geometry in
@@ -17,6 +17,7 @@ public struct SettingView: View {
#if os(macOS) #if os(macOS)
@State private var startAtLogin = false @State private var startAtLogin = false
@Environment(\.showMenuBarExtra) private var showMenuBarExtra @Environment(\.showMenuBarExtra) private var showMenuBarExtra
@State private var keepMenuBarInBackground = false
#endif #endif
@State private var disableMemoryLimit = false @State private var disableMemoryLimit = false
@@ -51,8 +52,19 @@ public struct SettingView: View {
.onChange(of: showMenuBarExtra.wrappedValue) { newValue in .onChange(of: showMenuBarExtra.wrappedValue) { newValue in
Task.detached { Task.detached {
SharedPreferences.showMenuBarExtra = newValue SharedPreferences.showMenuBarExtra = newValue
if !newValue {
keepMenuBarInBackground = false
}
} }
} }
if showMenuBarExtra.wrappedValue {
Toggle("Keep Menu Bar in Background", isOn: $keepMenuBarInBackground)
.onChange(of: keepMenuBarInBackground) { newValue in
Task.detached {
SharedPreferences.menuBarExtraInBackground = newValue
}
}
}
} }
#endif #endif
Section("Packet Tunnel") { Section("Packet Tunnel") {
@@ -132,6 +144,7 @@ public struct SettingView: View {
private func loadSettings() async { private func loadSettings() async {
#if os(macOS) #if os(macOS)
startAtLogin = SMAppService.mainApp.status == .enabled startAtLogin = SMAppService.mainApp.status == .enabled
keepMenuBarInBackground = SharedPreferences.menuBarExtraInBackground
#endif #endif
disableMemoryLimit = SharedPreferences.disableMemoryLimit disableMemoryLimit = SharedPreferences.disableMemoryLimit
version = LibboxVersion() version = LibboxVersion()
+1
View File
@@ -14,6 +14,7 @@ public enum SharedPreferences {
#if os(macOS) #if os(macOS)
@Preference<Bool>("show_menu_bar_extra", defaultValue: true) public static var showMenuBarExtra @Preference<Bool>("show_menu_bar_extra", defaultValue: true) public static var showMenuBarExtra
@Preference<Bool>("menu_bar_extra_in_background", defaultValue: false) public static var menuBarExtraInBackground
@Preference<Bool>("started_by_user", defaultValue: false) public static var startedByUser @Preference<Bool>("started_by_user", defaultValue: false) public static var startedByUser
#endif #endif
+20 -2
View File
@@ -61,14 +61,32 @@ struct Application: App {
.menuBarExtraAccess(isPresented: $isMenuPresented) .menuBarExtraAccess(isPresented: $isMenuPresented)
} }
private func initialize() async { private func initialize() {
let initialShowMenuBarExtra = SharedPreferences.showMenuBarExtra let initialShowMenuBarExtra = SharedPreferences.showMenuBarExtra
await MainActor.run { DispatchQueue.main.async {
showMenuBarExtra = initialShowMenuBarExtra showMenuBarExtra = initialShowMenuBarExtra
} }
} }
private func hide(closeApp: Bool) { private func hide(closeApp: Bool) {
Task.detached {
if SharedPreferences.menuBarExtraInBackground {
DispatchQueue.main.async {
hide0(closeApp: closeApp)
}
} else {
DispatchQueue.main.async {
if closeApp {
NSApp.terminate(nil)
} else {
NSApp.keyWindow?.close()
}
}
}
}
}
private func hide0(closeApp: Bool) {
if closeApp || NSApp.keyWindow?.identifier?.rawValue == "main" { if closeApp || NSApp.keyWindow?.identifier?.rawValue == "main" {
let transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication) let transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess)) var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
+3 -2
View File
@@ -12,7 +12,7 @@ class ApplicationDelegate: NSObject, NSApplicationDelegate {
let launchedAsLogInItem = let launchedAsLogInItem =
event?.eventID == kAEOpenApplication && event?.eventID == kAEOpenApplication &&
event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem
if !launchedAsLogInItem || !SharedPreferences.showMenuBarExtra { if !launchedAsLogInItem || !SharedPreferences.showMenuBarExtra || !SharedPreferences.menuBarExtraInBackground {
NSApp.setActivationPolicy(.regular) NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true) NSApp.activate(ignoringOtherApps: true)
} else { } else {
@@ -39,12 +39,13 @@ class ApplicationDelegate: NSObject, NSApplicationDelegate {
} }
func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool { func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool {
!SharedPreferences.showMenuBarExtra !SharedPreferences.menuBarExtraInBackground
} }
func applicationShouldHandleReopen(_: NSApplication, hasVisibleWindows flag: Bool) -> Bool { func applicationShouldHandleReopen(_: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if !flag, NSApp.activationPolicy() == .accessory { if !flag, NSApp.activationPolicy() == .accessory {
NSApp.setActivationPolicy(.regular) NSApp.setActivationPolicy(.regular)
NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.dock").first?.activate()
} }
return true return true
} }
+6
View File
@@ -40,6 +40,12 @@ struct MenuView: View {
MenuCommand { MenuCommand {
NSApp.setActivationPolicy(.regular) NSApp.setActivationPolicy(.regular)
openWindow(id: "main") openWindow(id: "main")
if let dockApp = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.dock").first {
dockApp.activate()
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
NSApp.activate(ignoringOtherApps: true)
}
}
} label: { } label: {
Text("Open") Text("Open")
} }