From 2f22e2790230e91759de751aa0790b5e9c112e65 Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Fri, 2 Jan 2026 12:29:40 +0530 Subject: [PATCH] Fix: Individual disable HUDs --- .../components/Settings/SettingsView.swift | 31 +++++++++++++++++++ .../managers/SystemChangesObserver.swift | 12 +++---- DynamicIsland/managers/SystemHUDManager.swift | 18 ++++++----- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 1fc6926..9a46e38 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -1302,6 +1302,9 @@ private struct HUDAndOSDSettingsView: View { @Default(.enableVerticalHUD) var enableVerticalHUD @Default(.enableCircularHUD) var enableCircularHUD @Default(.verticalHUDPosition) var verticalHUDPosition + @Default(.enableVolumeHUD) var enableVolumeHUD + @Default(.enableBrightnessHUD) var enableBrightnessHUD + @Default(.enableKeyboardBacklightHUD) var enableKeyboardBacklightHUD // Vertical HUD Props @Default(.verticalHUDShowValue) var verticalHUDShowValue @@ -1530,6 +1533,20 @@ private struct HUDAndOSDSettingsView: View { Text("Accessibility") } } + + if accessibilityPermission.isAuthorized { + Section { + Toggle("Volume HUD", isOn: $enableVolumeHUD) + Toggle("Brightness HUD", isOn: $enableBrightnessHUD) + Toggle("Keyboard Backlight HUD", isOn: $enableKeyboardBacklightHUD) + } header: { + Text("Controls") + } footer: { + Text("Choose which system controls should display HUD notifications.") + .foregroundStyle(.secondary) + .font(.caption) + } + } Section { Toggle("Show Percentage", isOn: $verticalHUDShowValue) @@ -1598,6 +1615,20 @@ private struct HUDAndOSDSettingsView: View { Text("Accessibility") } } + + if accessibilityPermission.isAuthorized { + Section { + Toggle("Volume HUD", isOn: $enableVolumeHUD) + Toggle("Brightness HUD", isOn: $enableBrightnessHUD) + Toggle("Keyboard Backlight HUD", isOn: $enableKeyboardBacklightHUD) + } header: { + Text("Controls") + } footer: { + Text("Choose which system controls should display HUD notifications.") + .foregroundStyle(.secondary) + .font(.caption) + } + } Section { Toggle("Show Percentage", isOn: $circularHUDShowValue) diff --git a/DynamicIsland/managers/SystemChangesObserver.swift b/DynamicIsland/managers/SystemChangesObserver.swift index 4eeed2f..980d9de 100644 --- a/DynamicIsland/managers/SystemChangesObserver.swift +++ b/DynamicIsland/managers/SystemChangesObserver.swift @@ -182,7 +182,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { } // Send to Circular HUD if enabled - if Defaults[.enableCircularHUD] { + if Defaults[.enableCircularHUD] && Defaults[.enableVolumeHUD] { Task { @MainActor in CircularHUDWindowManager.shared.show(type: .volume, value: CGFloat(value)) } @@ -190,7 +190,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { } // Send to Vertical HUD if enabled - if Defaults[.enableVerticalHUD] { + if Defaults[.enableVerticalHUD] && Defaults[.enableVolumeHUD] { let icon = resolvedVolumeIcon(isMuted: isMuted) VerticalHUDWindowManager.shared.show(type: .volume, value: CGFloat(value), icon: icon) return @@ -228,7 +228,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { private func sendBrightnessNotification(value: Float) { // Send to Circular HUD if enabled - if Defaults[.enableCircularHUD] { + if Defaults[.enableCircularHUD] && Defaults[.enableBrightnessHUD] { Task { @MainActor in CircularHUDWindowManager.shared.show(type: .brightness, value: CGFloat(value)) } @@ -236,7 +236,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { } // Send to Vertical HUD if enabled - if Defaults[.enableVerticalHUD] { + if Defaults[.enableVerticalHUD] && Defaults[.enableBrightnessHUD] { Task { @MainActor in VerticalHUDWindowManager.shared.show(type: .brightness, value: CGFloat(value)) } @@ -266,7 +266,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { private func sendKeyboardBacklightNotification(value: Float) { // Send to Circular HUD if enabled - if Defaults[.enableCircularHUD] { + if Defaults[.enableCircularHUD] && Defaults[.enableKeyboardBacklightHUD] { Task { @MainActor in CircularHUDWindowManager.shared.show(type: .backlight, value: CGFloat(value)) } @@ -274,7 +274,7 @@ final class SystemChangesObserver: MediaKeyInterceptorDelegate { } // Send to Vertical HUD if enabled - if Defaults[.enableVerticalHUD] { + if Defaults[.enableVerticalHUD] && Defaults[.enableKeyboardBacklightHUD] { Task { @MainActor in VerticalHUDWindowManager.shared.show(type: .backlight, value: CGFloat(value)) } diff --git a/DynamicIsland/managers/SystemHUDManager.swift b/DynamicIsland/managers/SystemHUDManager.swift index 02b4bcb..77c3f51 100644 --- a/DynamicIsland/managers/SystemHUDManager.swift +++ b/DynamicIsland/managers/SystemHUDManager.swift @@ -98,7 +98,7 @@ class SystemHUDManager { // Observe individual HUD toggles Defaults.publisher(.enableVolumeHUD, options: []).sink { [weak self] change in - guard let self = self, self.isSetupComplete, Defaults[.enableSystemHUD] else { + guard let self = self, self.isSetupComplete, self.requiresSystemToggleHandling else { return } self.changesObserver?.update( @@ -109,7 +109,7 @@ class SystemHUDManager { }.store(in: &cancellables) Defaults.publisher(.enableBrightnessHUD, options: []).sink { [weak self] change in - guard let self = self, self.isSetupComplete, Defaults[.enableSystemHUD] else { + guard let self = self, self.isSetupComplete, self.requiresSystemToggleHandling else { return } self.changesObserver?.update( @@ -120,7 +120,7 @@ class SystemHUDManager { }.store(in: &cancellables) Defaults.publisher(.enableKeyboardBacklightHUD, options: []).sink { [weak self] change in - guard let self = self, self.isSetupComplete, Defaults[.enableSystemHUD] else { + guard let self = self, self.isSetupComplete, self.requiresSystemToggleHandling else { return } self.changesObserver?.update( @@ -166,6 +166,10 @@ class SystemHUDManager { } private var cancellables = Set() + + private var requiresSystemToggleHandling: Bool { + Defaults[.enableSystemHUD] || Defaults[.enableVerticalHUD] || Defaults[.enableCircularHUD] + } /// Public property to check if system operations are in progress var isOperationInProgress: Bool { @@ -206,10 +210,10 @@ class SystemHUDManager { let keyboardBacklightEnabled: Bool if Defaults[.enableCircularHUD] || Defaults[.enableVerticalHUD] { - // Vertical and Circular HUD support all events - volumeEnabled = true - brightnessEnabled = true - keyboardBacklightEnabled = true + // Respect per-control toggles so the system HUD can handle disabled events + volumeEnabled = Defaults[.enableVolumeHUD] + brightnessEnabled = Defaults[.enableBrightnessHUD] + keyboardBacklightEnabled = Defaults[.enableKeyboardBacklightHUD] } else if Defaults[.enableCustomOSD] { volumeEnabled = Defaults[.enableOSDVolume] brightnessEnabled = Defaults[.enableOSDBrightness]