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
This commit is contained in:
ozone10 2022-12-17 20:38:34 +01:00 committed by Don Ho
parent a0c41cc5a5
commit 6518f3e4b8
5 changed files with 58 additions and 26 deletions

View File

@ -7929,9 +7929,19 @@ void Notepad_plus::refreshDarkMode(bool resetStyle)
generic_string xmlFileName = NppDarkMode::getThemeName();
if (!xmlFileName.empty())
{
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;

View File

@ -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,7 +128,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin
}
else
{
WINDOWPLACEMENT posInfo;
WINDOWPLACEMENT posInfo{};
posInfo.length = sizeof(WINDOWPLACEMENT);
posInfo.flags = 0;
if (_isPrelaunch)
@ -215,10 +215,9 @@ 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])
generic_string appDataThemeDir = nppParams.isCloud() ? nppParams.getUserPath() : nppParams.getAppDataNppDir();
if (!appDataThemeDir.empty())
{
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)
@ -230,7 +229,10 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin
fileNames.clear();
generic_string nppThemeDir;
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
@ -265,17 +267,27 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin
generic_string themePath;
generic_string xmlFileName = NppDarkMode::getThemeName();
if (!xmlFileName.empty())
{
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
{
auto& themeInfo = themeSwitcher.getElementFromIndex(0);
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;

View File

@ -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

View File

@ -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;
}
}
//

View File

@ -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;