From 43d892dbf75f0e073f212c2c66cf6606ca729434 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 13 May 2023 20:39:16 +0800 Subject: [PATCH] Fix follow system theme --- .../v2rayN/ViewModels/MainWindowViewModel.cs | 57 +++++-------------- v2rayN/v2rayN/Views/MainWindow.xaml.cs | 24 ++++++-- 2 files changed, 33 insertions(+), 48 deletions(-) diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 83fe9a7d..976e6de7 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -12,10 +12,8 @@ using System.Drawing; using System.IO; using System.Reactive; using System.Reactive.Linq; -using System.Runtime.InteropServices; using System.Text; using System.Windows; -using System.Windows.Interop; using System.Windows.Media; using v2rayN.Base; using v2rayN.Handler; @@ -249,7 +247,7 @@ namespace v2rayN.ViewModels #region Init - public MainWindowViewModel(ISnackbarMessageQueue snackbarMessageQueue, Action updateView,HwndSource hwndSource) + public MainWindowViewModel(ISnackbarMessageQueue snackbarMessageQueue, Action updateView) { _updateView = updateView; ThreadPool.RegisterWaitForSingleObject(App.ProgramStarted, OnProgramStarted, null, -1, false); @@ -314,7 +312,7 @@ namespace v2rayN.ViewModels y => y == true) .Subscribe(c => DoEnableTun(c)); - BindingUI(hwndSource); + BindingUI(); RestoreUI(); AutoHideStartup(); @@ -1652,7 +1650,14 @@ namespace v2rayN.ViewModels private void RestoreUI() { - ModifyTheme(_config.uiItem.colorModeDark); + if (FollowSystemTheme) + { + ModifyTheme(!Utils.IsLightTheme()); + } + else + { + ModifyTheme(_config.uiItem.colorModeDark); + } if (!_config.uiItem.colorPrimaryName.IsNullOrEmpty()) { @@ -1670,7 +1675,7 @@ namespace v2rayN.ViewModels { } - private void BindingUI(HwndSource hwndSource) + private void BindingUI() { ColorModeDark = _config.uiItem.colorModeDark; FollowSystemTheme = _config.uiItem.followSystemTheme; @@ -1703,47 +1708,11 @@ namespace v2rayN.ViewModels if (_config.uiItem.followSystemTheme != FollowSystemTheme) { _config.uiItem.followSystemTheme = FollowSystemTheme; + ConfigHandler.SaveConfig(ref _config); if (FollowSystemTheme) { - hwndSource.AddHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => - { - const int WM_SETTINGCHANGE = 0x001A; - if (msg == WM_SETTINGCHANGE) - { - if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") - { - var isLightTheme = Utils.IsLightTheme(); - ColorModeDark = !isLightTheme; - } - } - - return IntPtr.Zero; - - }); - - var isLightTheme = Utils.IsLightTheme(); - ColorModeDark = !isLightTheme; + ModifyTheme(!Utils.IsLightTheme()); } - else - { - hwndSource.RemoveHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => - { - const int WM_SETTINGCHANGE = 0x001A; - if (msg == WM_SETTINGCHANGE) - { - if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") - { - var isLightTheme = Utils.IsLightTheme(); - ColorModeDark = !isLightTheme; - } - } - - return IntPtr.Zero; - - }); - } - - ConfigHandler.SaveConfig(ref _config); } }); diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index 90c70d26..db5ca106 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -44,10 +44,7 @@ namespace v2rayN.Views lstProfiles.Drop += LstProfiles_Drop; } - var helper = new WindowInteropHelper(this); - var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); - - ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler,hwndSource); + ViewModel = new MainWindowViewModel(MainSnackbar.MessageQueue!, UpdateViewHandler); Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); for (int i = Global.MinFontSize; i <= Global.MinFontSize + 8; i++) @@ -211,6 +208,25 @@ namespace v2rayN.Views { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; } + + var helper = new WindowInteropHelper(this); + var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); + hwndSource.AddHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => + { + if (_config.uiItem.followSystemTheme) + { + const int WM_SETTINGCHANGE = 0x001A; + if (msg == WM_SETTINGCHANGE) + { + if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") + { + ViewModel?.ModifyTheme(!Utils.IsLightTheme()); + } + } + } + + return IntPtr.Zero; + }); } #region Event