diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs index 4d15857e6fa..fb463b4d4c0 100644 --- a/Flow.Launcher.Core/Resource/Theme.cs +++ b/Flow.Launcher.Core/Resource/Theme.cs @@ -124,8 +124,8 @@ public void UpdateFonts() try { // Load a ResourceDictionary for the specified theme. - var themeName = _settings.Theme; - var dict = GetThemeResourceDictionary(themeName); + var theme = _settings.Theme; + var dict = GetThemeResourceDictionary(theme); // Apply font settings to the theme resource. ApplyFontSettings(dict); @@ -292,10 +292,10 @@ private ResourceDictionary GetResourceDictionary(string theme) dict["ItemHotkeyStyle"] is Style resultHotkeyItemStyle && dict["ItemHotkeySelectedStyle"] is Style resultHotkeyItemSelectedStyle) { - Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultFont)); - Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultFontStyle)); - Setter fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultFontWeight)); - Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultFontStretch)); + var fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultFont)); + var fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultFontStyle)); + var fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultFontWeight)); + var fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultFontStretch)); Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch }; Array.ForEach( @@ -307,10 +307,10 @@ private ResourceDictionary GetResourceDictionary(string theme) dict["ItemSubTitleStyle"] is Style resultSubItemStyle && dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle) { - Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultSubFont)); - Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultSubFontStyle)); - Setter fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultSubFontWeight)); - Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultSubFontStretch)); + var fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultSubFont)); + var fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultSubFontStyle)); + var fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultSubFontWeight)); + var fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultSubFontStretch)); Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch }; Array.ForEach( @@ -395,7 +395,7 @@ public ThemeData GetCurrentTheme() public List GetAvailableThemes() { - List themes = new List(); + var themes = new List(); foreach (var themeDirectory in _themeDirectories) { var filePaths = Directory @@ -410,8 +410,7 @@ public List GetAvailableThemes() public bool ChangeTheme(string theme = null) { - if (string.IsNullOrEmpty(theme)) - theme = _settings.Theme; + if (string.IsNullOrEmpty(theme)) theme = _settings.Theme; string path = GetThemePath(theme); try @@ -426,13 +425,14 @@ public bool ChangeTheme(string theme = null) _settings.Theme = theme; - //always allow re-loading default theme, in case of failure of switching to a new theme from default theme + // Always allow re-loading default theme, in case of failure of switching to a new theme from default theme if (_oldTheme != theme || theme == Constant.DefaultTheme) { _oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath); } - BlurEnabled = IsBlurTheme(); + // Check if blur is enabled + BlurEnabled = Win32Helper.IsBackdropSupported() && IsThemeBlurEnabled(resourceDict); // Apply blur and drop shadow effect so that we do not need to call it again _ = RefreshFrameAsync(); @@ -667,11 +667,11 @@ private void SetBlurForWindow(string theme, BackdropTypes backdropType) if (mainWindow == null) return; // Check if the theme supports blur - bool hasBlur = dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool b && b; + var hasBlur = IsThemeBlurEnabled(dict); if (BlurEnabled && hasBlur && Win32Helper.IsBackdropSupported()) { // If the BackdropType is Mica or MicaAlt, set the windowborderstyle's background to transparent - if (backdropType == BackdropTypes.Mica || backdropType == BackdropTypes.MicaAlt) + if (backdropType is BackdropTypes.Mica or BackdropTypes.MicaAlt) { windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType().FirstOrDefault(x => x.Property == Control.BackgroundProperty)); windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, ThemeHelper.GetFrozenSolidColorBrush(Color.FromArgb(1, 0, 0, 0)))); @@ -681,7 +681,7 @@ private void SetBlurForWindow(string theme, BackdropTypes backdropType) windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType().FirstOrDefault(x => x.Property == Control.BackgroundProperty)); windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, Brushes.Transparent)); } - + // For themes with blur enabled, the window border is rendered by the system, so it's treated as a simple rectangle regardless of thickness. //(This is to avoid issues when the window is forcibly changed to a rectangular shape during snap scenarios.) var cornerRadiusSetter = windowBorderStyle.Setters.OfType().FirstOrDefault(x => x.Property == Border.CornerRadiusProperty); @@ -689,7 +689,7 @@ private void SetBlurForWindow(string theme, BackdropTypes backdropType) cornerRadiusSetter.Value = new CornerRadius(0); else windowBorderStyle.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(0))); - + // Apply the blur effect Win32Helper.DWMSetBackdropForWindow(mainWindow, backdropType); ColorizeWindow(theme, backdropType); @@ -826,20 +826,16 @@ private void ColorizeWindow(string theme, BackdropTypes backdropType) if (mainWindow == null) return; // Check if the theme supports blur - bool hasBlur = dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool b && b; + var hasBlur = IsThemeBlurEnabled(dict); // SystemBG value check (Auto, Light, Dark) - string systemBG = dict.Contains("SystemBG") ? dict["SystemBG"] as string : "Auto"; // 기본값 Auto + var systemBG = dict.Contains("SystemBG") ? dict["SystemBG"] as string : "Auto"; // 기본값 Auto // Check the user's ColorScheme setting - string colorScheme = _settings.ColorScheme; - - // Check system dark mode setting (read AppsUseLightTheme value) - int themeValue = (int)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1); - bool isSystemDark = themeValue == 0; + var colorScheme = _settings.ColorScheme; // Final decision on whether to use dark mode - bool useDarkMode = false; + var useDarkMode = false; // If systemBG is not "Auto", prioritize it over ColorScheme and set the mode based on systemBG value if (systemBG == "Dark") @@ -854,11 +850,20 @@ private void ColorizeWindow(string theme, BackdropTypes backdropType) { // If systemBG is "Auto", decide based on ColorScheme if (colorScheme == "Dark") + { useDarkMode = true; + } else if (colorScheme == "Light") + { useDarkMode = false; + } else + { + // Check system dark mode setting (read AppsUseLightTheme value) + var themeValue = (int)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1); + var isSystemDark = themeValue == 0; useDarkMode = isSystemDark; // Auto (based on system setting) + } } // Apply DWM Dark Mode @@ -900,7 +905,7 @@ private void ColorizeWindow(string theme, BackdropTypes backdropType) else { // Only set the background to transparent if the theme supports blur - if (backdropType == BackdropTypes.Mica || backdropType == BackdropTypes.MicaAlt) + if (backdropType is BackdropTypes.Mica or BackdropTypes.MicaAlt) { mainWindow.Background = ThemeHelper.GetFrozenSolidColorBrush(Color.FromArgb(1, 0, 0, 0)); } @@ -911,14 +916,9 @@ private void ColorizeWindow(string theme, BackdropTypes backdropType) } } - private static bool IsBlurTheme() + private static bool IsThemeBlurEnabled(ResourceDictionary dict) { - if (!Win32Helper.IsBackdropSupported()) // Windows 11 미만이면 무조건 false - return false; - - var resource = Application.Current.TryFindResource("ThemeBlurEnabled"); - - return resource is bool b && b; + return dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool enabled && enabled; } #endregion