diff --git a/lib/app_widget.dart b/lib/app_widget.dart index 78ad8aeca..f202e83aa 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -164,6 +164,21 @@ class _AppWidgetState extends State } } + @override + Future didChangePlatformBrightness() async { + super.didChangePlatformBrightness(); + final ThemeProvider themeProvider = Provider.of(context, listen: false); + KazumiLogger().i("Platform brightness changed, themeMode: ${themeProvider.themeMode}"); + + // Only update title bar theme when following system + // If user has forced a specific theme, keep title bar consistent with app content + if (themeProvider.themeMode == ThemeMode.system && Platform.isWindows) { + final brightness = WidgetsBinding.instance.platformDispatcher.platformBrightness; + KazumiLogger().i("Updating title bar brightness: $brightness"); + await windowManager.setBrightness(brightness); + } + } + Future _handleTray() async { if (Platform.isWindows) { await trayManager.setIcon('assets/images/logo/logo_lanczos.ico'); @@ -215,6 +230,12 @@ class _AppWidgetState extends State if (defaultThemeMode == 'system') { themeProvider.setThemeMode(ThemeMode.system, notify: false); } + + // Set Windows title bar theme based on app theme + if (Platform.isWindows) { + windowManager.setBrightness(themeProvider.isEffectiveDark() ? Brightness.dark : Brightness.light); + } + themeProvider.setFontFamily(useSystemFont, notify: false); var defaultDarkTheme = ThemeData( useMaterial3: true, diff --git a/lib/bean/settings/theme_provider.dart b/lib/bean/settings/theme_provider.dart index 70fb8cbc9..797739475 100644 --- a/lib/bean/settings/theme_provider.dart +++ b/lib/bean/settings/theme_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:kazumi/utils/constants.dart'; class ThemeProvider extends ChangeNotifier { @@ -8,6 +9,15 @@ class ThemeProvider extends ChangeNotifier { late ThemeData dark; String? currentFontFamily = customAppFontFamily; + /// Returns true if the effective theme is dark mode. + /// Automatically gets platform brightness when themeMode is ThemeMode.system. + bool isEffectiveDark() { + if (themeMode == ThemeMode.dark) return true; + if (themeMode == ThemeMode.light) return false; + final platformBrightness = SchedulerBinding.instance.platformDispatcher.platformBrightness; + return platformBrightness == Brightness.dark; + } + void setTheme(ThemeData light, ThemeData dark, {bool notify = true}) { this.light = light; this.dark = dark; diff --git a/lib/pages/settings/theme_settings_page.dart b/lib/pages/settings/theme_settings_page.dart index 90d9dd0bc..35795c899 100644 --- a/lib/pages/settings/theme_settings_page.dart +++ b/lib/pages/settings/theme_settings_page.dart @@ -13,6 +13,7 @@ import 'package:kazumi/bean/settings/color_type.dart'; import 'package:kazumi/utils/utils.dart'; import 'package:card_settings_ui/card_settings_ui.dart'; import 'package:provider/provider.dart'; +import 'package:window_manager/window_manager.dart'; class ThemeSettingsPage extends StatefulWidget { const ThemeSettingsPage({super.key}); @@ -122,6 +123,11 @@ class _ThemeSettingsPageState extends State { setState(() { defaultThemeMode = theme; }); + + // Update Windows title bar theme + if (Platform.isWindows) { + await windowManager.setBrightness(themeProvider.isEffectiveDark() ? Brightness.dark : Brightness.light); + } } void updateOledEnhance() { diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index 8e098faba..1217c619d 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -221,9 +221,10 @@ Win32Window::MessageHandler(HWND hwnd, } return 0; - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; + // Theme state is now maintained by Flutter side (app_widget.dart). + // case WM_DWMCOLORIZATIONCOLORCHANGED: + // UpdateTheme(hwnd); + // return 0; } return DefWindowProc(window_handle_, message, wparam, lparam);