Split background menu
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user