Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/app_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,13 @@ class _AppWidgetState extends State<AppWidget>
if (defaultThemeMode == 'system') {
themeProvider.setThemeMode(ThemeMode.system, notify: false);
}

// Set Windows title bar theme based on app theme
if (Platform.isWindows) {
final brightness = WidgetsBinding.instance.platformDispatcher.platformBrightness;
windowManager.setBrightness(themeProvider.isEffectiveDark(brightness) ? Brightness.dark : Brightness.light);
}

themeProvider.setFontFamily(useSystemFont, notify: false);
var defaultDarkTheme = ThemeData(
useMaterial3: true,
Expand Down
8 changes: 8 additions & 0 deletions lib/bean/settings/theme_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ class ThemeProvider extends ChangeNotifier {
late ThemeData dark;
String? currentFontFamily = customAppFontFamily;

/// Returns true if the effective theme is dark mode.
/// When themeMode is ThemeMode.system, uses the provided platform brightness.
bool isEffectiveDark(Brightness platformBrightness) {
Comment thread
ChouChiu marked this conversation as resolved.
Outdated
if (themeMode == ThemeMode.dark) return true;
if (themeMode == ThemeMode.light) return false;
return platformBrightness == Brightness.dark;
}

void setTheme(ThemeData light, ThemeData dark, {bool notify = true}) {
this.light = light;
this.dark = dark;
Expand Down
7 changes: 7 additions & 0 deletions lib/pages/settings/theme_settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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});
Expand Down Expand Up @@ -122,6 +123,12 @@ class _ThemeSettingsPageState extends State<ThemeSettingsPage> {
setState(() {
defaultThemeMode = theme;
});

// Update Windows title bar theme
if (Platform.isWindows) {
final brightness = WidgetsBinding.instance.platformDispatcher.platformBrightness;
await windowManager.setBrightness(themeProvider.isEffectiveDark(brightness) ? Brightness.dark : Brightness.light);
}
}

void updateOledEnhance() {
Expand Down
8 changes: 4 additions & 4 deletions windows/runner/win32_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ Win32Window::MessageHandler(HWND hwnd,
}
return 0;

case WM_DWMCOLORIZATIONCOLORCHANGED:
UpdateTheme(hwnd);
case WM_SETTINGCHANGE:
Comment thread
ChouChiu marked this conversation as resolved.
Outdated
UpdateTheme(window_handle_);
Comment thread
ChouChiu marked this conversation as resolved.
Outdated
return 0;
Comment thread
ChouChiu marked this conversation as resolved.
Outdated
}

Expand Down Expand Up @@ -289,8 +289,8 @@ void Win32Window::UpdateTheme(HWND const window) {
&light_mode_size);

if (result == ERROR_SUCCESS) {
BOOL enable_dark_mode = light_mode == 0;
Comment thread
ChouChiu marked this conversation as resolved.
BOOL enable = light_mode == 0 ? TRUE : FALSE;
DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,
&enable_dark_mode, sizeof(enable_dark_mode));
&enable, sizeof(enable));
}
}
Loading