@@ -10,7 +10,7 @@ import SwiftUI
1010@main
1111struct AggregateVolumeMenuApp : App {
1212 @NSApplicationDelegateAdaptor ( AppDelegate . self) var appDelegate
13-
13+
1414 var body : some Scene {
1515 Settings {
1616 EmptyView ( )
@@ -23,7 +23,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
2323 private var popover : NSPopover ?
2424 private var audioManager = AudioDeviceManager . shared
2525 private var volumeObserverTimer : Timer ?
26-
26+
2727 func applicationDidFinishLaunching( _ notification: Notification ) {
2828 setupStatusItem ( )
2929 setupPopover ( )
@@ -34,96 +34,85 @@ class AppDelegate: NSObject, NSApplicationDelegate {
3434 func applicationWillTerminate( _ notification: Notification ) {
3535 volumeObserverTimer? . invalidate ( )
3636 }
37-
37+
3838 private func setupStatusItem( ) {
3939 statusItem = NSStatusBar . system. statusItem ( withLength: 30 )
40-
40+
4141 if let button = statusItem? . button {
4242 updateMenuBarIcon ( )
4343 button. action = #selector( togglePopover)
4444 button. target = self
4545 button. sendAction ( on: [ . leftMouseUp, . rightMouseUp] )
4646 }
4747 }
48-
48+
4949 private func observeVolumeChanges( ) {
5050 volumeObserverTimer = Timer . scheduledTimer ( withTimeInterval: 0.05 , repeats: true ) { _ in
5151 self . updateMenuBarIcon ( )
5252 }
5353 }
54-
54+
5555 private func updateMenuBarIcon( ) {
5656 guard let button = statusItem? . button else { return }
57-
57+
5858 let volume = audioManager. currentVolume
5959 let isMuted = audioManager. isMuted
6060 let volumePercentage = Int ( volume * 100 )
61-
61+
6262 let iconName = AudioDeviceManager . getVolumeIcon ( for: volume, isMuted: isMuted)
63-
63+
6464 let image = NSImage ( systemSymbolName: iconName, accessibilityDescription: " Volume: \( volumePercentage) % " )
6565 image? . isTemplate = true
6666
6767 button. image = image
6868 button. imagePosition = . imageOnly
6969
7070 updateTooltip ( button: button, volume: volumePercentage, isMuted: isMuted)
71-
72- if isMuted {
73- button. contentTintColor = NSColor . systemRed
74- button. alphaValue = 0.9
75- } else if volume == 0 {
76- button. contentTintColor = NSColor . systemGray
77- button. alphaValue = 0.7
78- } else {
79- button. contentTintColor = nil
80- button. alphaValue = 1.0
81- }
8271 }
83-
72+
8473 private func updateTooltip( button: NSButton , volume: Int , isMuted: Bool ) {
8574 var tooltipComponents : [ String ] = [ ]
86-
75+
8776 if isMuted {
8877 tooltipComponents. append ( " Muted " )
8978 } else {
9079 tooltipComponents. append ( " Volume: \( volume) % " )
9180 }
92-
81+
9382 if let device = audioManager. currentDevice {
9483 tooltipComponents. append ( " Device: \( device. name) " )
9584 }
96-
85+
9786 tooltipComponents. append ( " Click to open • Space to mute " )
9887 button. toolTip = tooltipComponents. joined ( separator: " \n " )
9988 }
100-
89+
10190 private func setupPopover( ) {
10291 popover = NSPopover ( )
10392 popover? . contentSize = NSSize ( width: 320 , height: 420 )
10493 popover? . behavior = . transient
10594 popover? . animates = true
10695 popover? . contentViewController = NSHostingController ( rootView: ContentView ( ) )
10796 }
108-
97+
10998 private func setupMediaKeyHandling( ) {
11099 NSEvent . addGlobalMonitorForEvents ( matching: . systemDefined) { event in
111100 self . handleMediaKey ( event: event)
112101 }
113-
102+
114103 NSEvent . addLocalMonitorForEvents ( matching: . systemDefined) { event in
115104 self . handleMediaKey ( event: event)
116105 return event
117106 }
118107 }
119-
108+
120109 private func handleMediaKey( event: NSEvent ) {
121110 guard event. subtype == . screenChanged else { return }
122-
111+
123112 let keyCode = ( ( event. data1 & 0xFFFF0000 ) >> 16 )
124113 let keyFlags = ( event. data1 & 0x0000FFFF )
125114 let keyState = ( ( keyFlags & 0xFF00 ) >> 8 ) == 0xA
126-
115+
127116 if keyState {
128117 switch Int32 ( keyCode) {
129118 case NX_KEYTYPE_SOUND_UP:
@@ -143,10 +132,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
143132 }
144133 }
145134 }
146-
135+
147136 @objc private func togglePopover( ) {
148137 guard let button = statusItem? . button else { return }
149-
138+
150139 if let popover = popover {
151140 if popover. isShown {
152141 popover. performClose ( nil )
0 commit comments