From 6518f3e4b809bc9f56004795d38b88016be5088e Mon Sep 17 00:00:00 2001 From: ozone10 Date: Sat, 17 Dec 2022 20:38:34 +0100 Subject: [PATCH] Fix theme not changed issue after switching dark/light mode in some cases 1. Fix custom theme (in %APPDATA%) not changing if it is not in default theme dir (in the installation location). 2. Fix default dark theme not applied in dark mode if config is missing (For example, the 1st launch of Notepad++ after its installation). 3. Fix theme not working in cloud issue and portable mode. Fix #6092, fix #10801, fix #12296, close #12662 --- PowerEditor/src/Notepad_plus.cpp | 16 ++++++-- PowerEditor/src/Notepad_plus_Window.cpp | 52 +++++++++++++++---------- PowerEditor/src/NppDarkMode.h | 4 +- PowerEditor/src/Parameters.cpp | 7 +++- PowerEditor/src/Parameters.h | 5 +++ 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index e1153c595..04d86d886 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -7930,8 +7930,18 @@ void Notepad_plus::refreshDarkMode(bool resetStyle) generic_string xmlFileName = NppDarkMode::getThemeName(); if (!xmlFileName.empty()) { - themePath = themeSwitcher.getThemeDirPath(); - pathAppend(themePath, xmlFileName); + if (!nppParams.isLocal() || nppParams.isCloud()) + { + themePath = nppParams.getUserPath(); + pathAppend(themePath, TEXT("themes\\")); + pathAppend(themePath, xmlFileName); + } + + if (::PathFileExists(themePath.c_str()) == FALSE || themePath.empty()) + { + themePath = themeSwitcher.getThemeDirPath(); + pathAppend(themePath, xmlFileName); + } themeName = themeSwitcher.getThemeFromXmlFileName(themePath.c_str()); } @@ -7944,7 +7954,7 @@ void Notepad_plus::refreshDarkMode(bool resetStyle) themeName = themeSwitcher.getDefaultThemeLabel(); } - if (::PathFileExists(themePath.c_str())) + if (::PathFileExists(themePath.c_str()) == TRUE) { nppParams.getNppGUI()._themeName = themePath; diff --git a/PowerEditor/src/Notepad_plus_Window.cpp b/PowerEditor/src/Notepad_plus_Window.cpp index 410c2cd80..678e7dc10 100644 --- a/PowerEditor/src/Notepad_plus_Window.cpp +++ b/PowerEditor/src/Notepad_plus_Window.cpp @@ -70,7 +70,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin timestampBegin = time(NULL); Window::init(hInst, parent); - WNDCLASS nppClass; + WNDCLASS nppClass{}; nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS; nppClass.lpfnWndProc = Notepad_plus_Proc; @@ -128,8 +128,8 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin } else { - WINDOWPLACEMENT posInfo; - posInfo.length = sizeof(WINDOWPLACEMENT); + WINDOWPLACEMENT posInfo{}; + posInfo.length = sizeof(WINDOWPLACEMENT); posInfo.flags = 0; if (_isPrelaunch) posInfo.showCmd = SW_HIDE; @@ -215,22 +215,24 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin // Get themes from both npp install themes dir and app data themes dir with the per user // overriding default themes of the same name. - generic_string appDataThemeDir; - if (nppParams.getAppDataNppDir() && nppParams.getAppDataNppDir()[0]) - { - appDataThemeDir = nppParams.getAppDataNppDir(); - pathAppend(appDataThemeDir, TEXT("themes\\")); - _notepad_plus_plus_core.getMatchedFileNames(appDataThemeDir.c_str(), 0, patterns, fileNames, false, false); - for (size_t i = 0, len = fileNames.size() ; i < len ; ++i) - { - themeSwitcher.addThemeFromXml(fileNames[i]); - } - } + generic_string appDataThemeDir = nppParams.isCloud() ? nppParams.getUserPath() : nppParams.getAppDataNppDir(); + if (!appDataThemeDir.empty()) + { + pathAppend(appDataThemeDir, TEXT("themes\\")); + _notepad_plus_plus_core.getMatchedFileNames(appDataThemeDir.c_str(), 0, patterns, fileNames, false, false); + for (size_t i = 0, len = fileNames.size() ; i < len ; ++i) + { + themeSwitcher.addThemeFromXml(fileNames[i]); + } + } fileNames.clear(); generic_string nppThemeDir; - nppThemeDir = nppDir.c_str(); // <- should use the pointer to avoid the constructor of copy + if (!nppParams.isLocal()) + { + nppThemeDir = nppDir.c_str(); // <- should use the pointer to avoid the constructor of copy + } pathAppend(nppThemeDir, TEXT("themes\\")); // Set theme directory to their installation directory @@ -240,7 +242,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin for (size_t i = 0, len = fileNames.size(); i < len ; ++i) { generic_string themeName( themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str()) ); - if (!themeSwitcher.themeNameExists(themeName.c_str()) ) + if (!themeSwitcher.themeNameExists(themeName.c_str())) { themeSwitcher.addThemeFromXml(fileNames[i]); @@ -266,8 +268,18 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin generic_string xmlFileName = NppDarkMode::getThemeName(); if (!xmlFileName.empty()) { - themePath = themeSwitcher.getThemeDirPath(); - pathAppend(themePath, xmlFileName); + if (!nppParams.isLocal() || nppParams.isCloud()) + { + themePath = nppParams.getUserPath(); + pathAppend(themePath, TEXT("themes\\")); + pathAppend(themePath, xmlFileName); + } + + if (::PathFileExists(themePath.c_str()) == FALSE || themePath.empty()) + { + themePath = themeSwitcher.getThemeDirPath(); + pathAppend(themePath, xmlFileName); + } } else { @@ -275,7 +287,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin themePath = themeInfo.second; } - if (::PathFileExists(themePath.c_str())) + if (::PathFileExists(themePath.c_str()) == TRUE) { nppGUI._themeName.assign(themePath); nppParams.reloadStylers(themePath.c_str()); @@ -305,7 +317,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin ::SendMessage(_hSelf, NPPM_INTERNAL_ENABLECHANGEHISTORY, 0, 0); // Notify plugins that Notepad++ is ready - SCNotification scnN; + SCNotification scnN{}; scnN.nmhdr.code = NPPN_READY; scnN.nmhdr.hwndFrom = _hSelf; scnN.nmhdr.idFrom = 0; diff --git a/PowerEditor/src/NppDarkMode.h b/PowerEditor/src/NppDarkMode.h index 099961438..58c83bbe7 100644 --- a/PowerEditor/src/NppDarkMode.h +++ b/PowerEditor/src/NppDarkMode.h @@ -100,8 +100,8 @@ namespace NppDarkMode { bool _enableWindowsMode = false; - NppDarkMode::AdvOptDefaults _darkDefaults{}; - NppDarkMode::AdvOptDefaults _lightDefaults{}; + NppDarkMode::AdvOptDefaults _darkDefaults{ L"DarkModeDefault.xml", 0, 2, false }; + NppDarkMode::AdvOptDefaults _lightDefaults{ L"", 4, 0, true }; }; void initDarkMode(); // pulls options from NppParameters diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index fa196ef2c..17a48c375 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -1180,7 +1180,8 @@ bool NppParameters::load() // // the 2nd priority: cloud Choice Path // - if (::PathFileExists(cloudChoicePath.c_str())) + _isCloud = (::PathFileExists(cloudChoicePath.c_str()) == TRUE); + if (_isCloud) { // Read cloud choice std::string cloudChoiceStr = getFileContent(cloudChoicePath.c_str()); @@ -1193,6 +1194,10 @@ bool NppParameters::load() _nppGUI._cloudPath = cloudChoiceStrW; _initialCloudChoice = _nppGUI._cloudPath; } + else + { + _isCloud = false; + } } // diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index f0a06cdd8..699f6ad2f 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -1704,6 +1704,10 @@ public: return _isLocal; } + bool isCloud() const { + return _isCloud; + } + void saveConfig_xml(); generic_string getUserPath() const { @@ -1831,6 +1835,7 @@ private: WNDPROC _enableThemeDialogTextureFuncAddr = nullptr; bool _isLocal = false; bool _isx64 = false; // by default 32-bit + bool _isCloud = false; generic_string _cmdSettingsDir; generic_string _titleBarAdditional;