Просмотр исходного кода

Sync app appearance with macOS on launch

Detect light/dark via AppleInterfaceStyle (global domain). On each launch,
align NSApp appearance, saved toggle preference, and UI palette with the
current system appearance so Light macOS opens in light mode; in-app toggle
still works for the session.

Made-with: Cursor
huzaifahayat12 3 месяцев назад
Родитель
Сommit
6b23f7fd94
2 измененных файлов с 22 добавлено и 4 удалено
  1. 11 3
      meetings_app/AppDelegate.swift
  2. 11 1
      meetings_app/ViewController.swift

+ 11 - 3
meetings_app/AppDelegate.swift

@@ -12,9 +12,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
     private let darkModeDefaultsKey = "settings.darkModeEnabled"
 
     func applicationDidFinishLaunching(_ aNotification: Notification) {
-        // Match saved preference (defaults to dark if never set).
-        let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
-        let darkEnabled = hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
+        // Always sync to current macOS appearance on launch.
+        // (User can still toggle in-app later.)
+        let darkEnabled = systemPrefersDarkMode()
+        UserDefaults.standard.set(darkEnabled, forKey: darkModeDefaultsKey)
         NSApp.appearance = NSAppearance(named: darkEnabled ? .darkAqua : .aqua)
     }
 
@@ -26,6 +27,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
         return true
     }
 
+    private func systemPrefersDarkMode() -> Bool {
+        // Use the system-wide appearance setting (not app/window effective appearance).
+        // When the key is missing, macOS is in Light mode.
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
+        let style = global?["AppleInterfaceStyle"] as? String
+        return style?.lowercased() == "dark"
+    }
 
 }
 

+ 11 - 1
meetings_app/ViewController.swift

@@ -69,7 +69,7 @@ final class ViewController: NSViewController {
     private var darkModeEnabled: Bool {
         get {
             let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
-            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
+            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : systemPrefersDarkMode()
         }
         set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
     }
@@ -96,6 +96,8 @@ final class ViewController: NSViewController {
 
     override func viewDidLoad() {
         super.viewDidLoad()
+        // Sync toggle + palette with current macOS appearance on launch.
+        darkModeEnabled = systemPrefersDarkMode()
         palette = Palette(isDarkMode: darkModeEnabled)
         setupRootView()
         buildMainLayout()
@@ -136,6 +138,14 @@ private extension ViewController {
         view.layer?.backgroundColor = palette.pageBackground.cgColor
     }
 
+    func systemPrefersDarkMode() -> Bool {
+        // Use the system-wide appearance setting (not app/window effective appearance).
+        // When the key is missing, macOS is in Light mode.
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
+        let style = global?["AppleInterfaceStyle"] as? String
+        return style?.lowercased() == "dark"
+    }
+
     func buildMainLayout() {
         let splitContainer = NSStackView()
         splitContainer.translatesAutoresizingMaskIntoConstraints = false