浏览代码

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 1 周之前
父节点
当前提交
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 {
12
     private let darkModeDefaultsKey = "settings.darkModeEnabled"
12
     private let darkModeDefaultsKey = "settings.darkModeEnabled"
13
 
13
 
14
     func applicationDidFinishLaunching(_ aNotification: Notification) {
14
     func applicationDidFinishLaunching(_ aNotification: Notification) {
15
-        // Match saved preference (defaults to dark if never set).
16
-        let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
17
-        let darkEnabled = hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
15
+        // Always sync to current macOS appearance on launch.
16
+        // (User can still toggle in-app later.)
17
+        let darkEnabled = systemPrefersDarkMode()
18
+        UserDefaults.standard.set(darkEnabled, forKey: darkModeDefaultsKey)
18
         NSApp.appearance = NSAppearance(named: darkEnabled ? .darkAqua : .aqua)
19
         NSApp.appearance = NSAppearance(named: darkEnabled ? .darkAqua : .aqua)
19
     }
20
     }
20
 
21
 
@@ -26,6 +27,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
26
         return true
27
         return true
27
     }
28
     }
28
 
29
 
30
+    private func systemPrefersDarkMode() -> Bool {
31
+        // Use the system-wide appearance setting (not app/window effective appearance).
32
+        // When the key is missing, macOS is in Light mode.
33
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
34
+        let style = global?["AppleInterfaceStyle"] as? String
35
+        return style?.lowercased() == "dark"
36
+    }
29
 
37
 
30
 }
38
 }
31
 
39
 

+ 11 - 1
meetings_app/ViewController.swift

@@ -69,7 +69,7 @@ final class ViewController: NSViewController {
69
     private var darkModeEnabled: Bool {
69
     private var darkModeEnabled: Bool {
70
         get {
70
         get {
71
             let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
71
             let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
72
-            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
72
+            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : systemPrefersDarkMode()
73
         }
73
         }
74
         set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
74
         set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
75
     }
75
     }
@@ -96,6 +96,8 @@ final class ViewController: NSViewController {
96
 
96
 
97
     override func viewDidLoad() {
97
     override func viewDidLoad() {
98
         super.viewDidLoad()
98
         super.viewDidLoad()
99
+        // Sync toggle + palette with current macOS appearance on launch.
100
+        darkModeEnabled = systemPrefersDarkMode()
99
         palette = Palette(isDarkMode: darkModeEnabled)
101
         palette = Palette(isDarkMode: darkModeEnabled)
100
         setupRootView()
102
         setupRootView()
101
         buildMainLayout()
103
         buildMainLayout()
@@ -136,6 +138,14 @@ private extension ViewController {
136
         view.layer?.backgroundColor = palette.pageBackground.cgColor
138
         view.layer?.backgroundColor = palette.pageBackground.cgColor
137
     }
139
     }
138
 
140
 
141
+    func systemPrefersDarkMode() -> Bool {
142
+        // Use the system-wide appearance setting (not app/window effective appearance).
143
+        // When the key is missing, macOS is in Light mode.
144
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
145
+        let style = global?["AppleInterfaceStyle"] as? String
146
+        return style?.lowercased() == "dark"
147
+    }
148
+
139
     func buildMainLayout() {
149
     func buildMainLayout() {
140
         let splitContainer = NSStackView()
150
         let splitContainer = NSStackView()
141
         splitContainer.translatesAutoresizingMaskIntoConstraints = false
151
         splitContainer.translatesAutoresizingMaskIntoConstraints = false