diff --git a/Versions/build.txt b/Versions/build.txt index e27075af4..7dcc2b9c8 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -2627 +2629 diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index 23be18386..c50394e0d 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 BETA diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 150c599c7..6d0e0addb 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -54,7 +54,7 @@ extern "C" int s_flagSingleFileInstance; extern "C" int s_flagMultiFileArg; extern "C" int s_flagShellUseSystemMRU; extern "C" int s_flagPrintFileAndLeave; -extern "C" int s_flagDoRelaunchElevated; +extern "C" bool s_flagDoRelaunchElevated; // ---------------------------------------------------------------------------- @@ -250,6 +250,8 @@ extern "C" size_t IniFileGetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LP extern "C" bool IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR lpKeyName, LPCWSTR lpString) { + if (s_flagDoRelaunchElevated) { return false; } + CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); SI_Error rc = Ini.LoadFile(lpFilePath); if (SI_SUCCESS(rc)) @@ -261,6 +263,7 @@ extern "C" bool IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCW Ini.SetSpaces(s_bSetSpaces); rc = Ini.SaveFile(lpFilePath, true); } + Ini.Reset(); } return SI_SUCCESS(rc); } @@ -284,6 +287,8 @@ extern "C" int IniFileGetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR extern "C" bool IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR lpKeyName, int iValue) { + if (s_flagDoRelaunchElevated) { return false; } + CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); SI_Error rc = Ini.LoadFile(lpFilePath); if (SI_SUCCESS(rc)) { @@ -291,6 +296,7 @@ extern "C" bool IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); rc = Ini.SaveFile(lpFilePath, true); } + Ini.Reset(); return SI_SUCCESS(rc); } // ============================================================================ @@ -313,6 +319,8 @@ extern "C" bool IniFileGetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST extern "C" bool IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR lpKeyName, bool bValue) { + if (s_flagDoRelaunchElevated) { return false; } + CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); SI_Error rc = Ini.LoadFile(lpFilePath); if (SI_SUCCESS(rc)) { @@ -320,6 +328,7 @@ extern "C" bool IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST Ini.SetSpaces(s_bSetSpaces); rc = Ini.SaveFile(lpFilePath, true); } + Ini.Reset(); return SI_SUCCESS(rc); } // ============================================================================ @@ -327,6 +336,8 @@ extern "C" bool IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST extern "C" bool IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR lpKeyName, bool bRemoveEmpty) { + if (s_flagDoRelaunchElevated) { return false; } + CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); SI_Error rc = Ini.LoadFile(lpFilePath); if (SI_SUCCESS(rc)) @@ -335,6 +346,7 @@ extern "C" bool IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); rc = Ini.SaveFile(lpFilePath, true); } + Ini.Reset(); return SI_SUCCESS(rc); } // ============================================================================ @@ -1188,14 +1200,14 @@ void LoadFlags() bool SaveSettings(bool bSaveSettingsNow) { - if (StrIsEmpty(Globals.IniFile) || !s_bEnableSaveSettings || s_flagDoRelaunchElevated) { return false; } + if (StrIsEmpty(Globals.IniFile) || s_flagDoRelaunchElevated) { return false; } CreateIniFile(); LoadIniFile(Globals.IniFile); const WCHAR* const Settings_Section = L"Settings"; - if (!(Settings.SaveSettings || bSaveSettingsNow)) + if (!Settings.SaveSettings && !bSaveSettingsNow) { if (Settings.SaveSettings != Defaults.SaveSettings) { IniSectionSetBool(Settings_Section, L"SaveSettings", Settings.SaveSettings); @@ -1450,12 +1462,17 @@ bool SaveSettings(bool bSaveSettingsNow) IniSectionDelete(Window_Section, tchZoom, false); } + + bool const ok = SaveIniFile(Globals.IniFile); if (ok) { Style_Save(); // Scintilla Styles Globals.bIniFileFromScratch = false; } + + ReleaseIniFile(); + return ok; } //============================================================================= diff --git a/src/Config/SimpleIni.h b/src/Config/SimpleIni.h index 77897aad7..9118f0876 100644 --- a/src/Config/SimpleIni.h +++ b/src/Config/SimpleIni.h @@ -405,6 +405,7 @@ public: FILE * m_file; public: explicit FileWriter(FILE * a_file) : m_file(a_file) { } + ~FileWriter() { fflush(m_file); } void Write(const char * a_pBuf) override { fputs(a_pBuf, m_file); } @@ -2440,9 +2441,9 @@ CSimpleIniTempl::SaveFile( #ifdef _WIN32 FILE * fp = nullptr; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE - _wfopen_s(&fp, a_pwszFile, L"wb"); + _wfopen_s(&fp, a_pwszFile, L"wbc"); #else // !__STDC_WANT_SECURE_LIB__ - fp = _wfopen(a_pwszFile, L"wb"); + fp = _wfopen(a_pwszFile, L"wbc"); #endif // __STDC_WANT_SECURE_LIB__ if (!fp) return SI_FILE; SI_Error rc = SaveFile(fp, a_bAddSignature); diff --git a/src/Notepad3.c b/src/Notepad3.c index efbee3c57..db37a450d 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -827,7 +827,8 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, StringCchCat(s_wchWndClass, COUNTOF(s_wchWndClass), L"B"); } // Try to Relaunch with elevated privileges - if (RelaunchElevated(NULL)) { + s_flagDoRelaunchElevated = RelaunchElevated(NULL); + if (s_flagDoRelaunchElevated) { return 0; } // Try to run multiple instances @@ -1232,8 +1233,18 @@ HWND InitInstance(HINSTANCE hInstance,LPCWSTR pszCmdLine,int nCmdShow) Style_SetLexerFromFile(Globals.hwndEdit, Globals.CurrentFile); } // check for temp file and delete - if (s_bIsElevated && PathFileExists(s_wchTmpFilePath)) { + if (s_IsThisAnElevatedRelaunch && PathFileExists(s_wchTmpFilePath)) + { DeleteFile(s_wchTmpFilePath); + // delete possible .tmp guard + size_t const len = StringCchLen(s_wchTmpFilePath, MAX_PATH); + LPWSTR p = PathFindExtension(s_wchTmpFilePath); + if (p && *p) { + StringCchCopy(p, (MAX_PATH - len), L".tmp"); + } + if (PathFileExists(s_wchTmpFilePath)) { + DeleteFile(s_wchTmpFilePath); + } } SciCall_SetSavePoint(); _SetSaveNeededFlag(true); @@ -7575,7 +7586,7 @@ void ParseCommandLine() lp1 + CSTRLEN(L"tmpfbuf="), len - CSTRLEN(L"tmpfbuf=")); TrimSpcW(s_wchTmpFilePath); NormalizePathEx(s_wchTmpFilePath, COUNTOF(s_wchTmpFilePath), true, s_flagSearchPathIfRelative); - s_IsThisAnElevatedRelaunch = true; + s_bIsElevated = s_IsThisAnElevatedRelaunch = true; } else switch (*CharUpper(lp1)) { @@ -9646,11 +9657,13 @@ bool DoElevatedRelaunch(EditFileIOStatus* pFioStatus) s_flagDoRelaunchElevated = true; LPWSTR lpCmdLine = GetCommandLine(); - size_t const wlen = StringCchLenW(lpCmdLine, 0) + 2; + size_t const wlen = StringCchLen(lpCmdLine, 0) + 2; LPWSTR lpExe = AllocMem(sizeof(WCHAR) * wlen, HEAP_ZERO_MEMORY); LPWSTR lpArgs = AllocMem(sizeof(WCHAR) * wlen, HEAP_ZERO_MEMORY); ExtractFirstArgument(lpCmdLine, lpExe, lpArgs, (int)wlen); + // remove relaunch elevated, we are doing this here already + lpArgs[StringCchLen(lpArgs, 0)] = L' '; // add a space lpArgs = StrCutI(lpArgs, L"/u "); lpArgs = StrCutI(lpArgs, L"-u "); WCHAR wchFlags[32] = { L'\0' }; @@ -10285,7 +10298,13 @@ bool RelaunchMultiInst() { // bool RelaunchElevated(LPWSTR lpNewCmdLnArgs) { - if (!IsVista() || s_bIsElevated || !s_flagDoRelaunchElevated || s_flagDisplayHelp) { return false; } + if (!IsVista() || + !s_flagDoRelaunchElevated || + s_bIsElevated || s_IsThisAnElevatedRelaunch || + s_flagDisplayHelp) + { + return false; + } STARTUPINFO si; si.cb = sizeof(STARTUPINFO); @@ -10302,9 +10321,14 @@ bool RelaunchElevated(LPWSTR lpNewCmdLnArgs) if (lpNewCmdLnArgs) { StringCchCopy(szOrigArgs, COUNTOF(szOrigArgs), lpNewCmdLnArgs); } + size_t const len = StringCchLen(szOrigArgs, 0); + szOrigArgs[len] = L' '; // add a space + szOrigArgs[len+1] = L'\0'; // ensure termination + // remove relaunch elevated, we are doing this here already + StrCutI(szOrigArgs, L"/u "); + StrCutI(szOrigArgs, L"-u "); WCHAR szArguments[2032] = { L'\0' }; - if (StrStrI(szOrigArgs, L"/f ") || StrStrI(szOrigArgs, L"-f ") || StrIsEmpty(Globals.IniFile)) { StringCchCopy(szArguments, COUNTOF(szArguments), szOrigArgs); @@ -10317,7 +10341,7 @@ bool RelaunchElevated(LPWSTR lpNewCmdLnArgs) SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); - sei.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC | SEE_MASK_UNICODE | SEE_MASK_HMONITOR | SEE_MASK_NOZONECHECKS; + sei.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC | SEE_MASK_UNICODE | SEE_MASK_HMONITOR | SEE_MASK_NOZONECHECKS | SEE_MASK_WAITFORINPUTIDLE; sei.hwnd = GetForegroundWindow(); sei.hMonitor = MonitorFromWindow(sei.hwnd, MONITOR_DEFAULTTONEAREST); sei.lpVerb = L"runas"; diff --git a/src/Styles.c b/src/Styles.c index 4f69617d4..8b982c965 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -704,7 +704,7 @@ bool Style_Export(HWND hwnd) //============================================================================= // -// Style_ExportToFile() +// Style_Export() // #define SAVE_STYLE_IF_NOT_EQ_DEFAULT(TYPE, VARNAME, VALUE, DEFAULT) \ @@ -716,18 +716,9 @@ bool Style_Export(HWND hwnd) // ---------------------------------------------------------------------------- -bool Style_ExportToFile(const WCHAR* szFile, bool bForceAll) +void Style_ToIniSection(bool bForceAll) { - if (StrIsEmpty(szFile)) { - if (s_idxSelectedTheme != 0) { - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SETTINGSNOTSAVED); - } - return false; - } - - LoadIniFile(szFile); // reset - - // Custom colors + // Custom colors const WCHAR* const CustomColors_Section = L"Custom Colors"; for (int i = 0; i < 16; i++) { @@ -815,6 +806,27 @@ bool Style_ExportToFile(const WCHAR* szFile, bool bForceAll) IniSectionDelete(L"Default Text", NULL, true); IniSectionDelete(L"2nd Default Text", NULL, true); +} + + +//============================================================================= +// +// Style_ExportToFile() +// + +bool Style_ExportToFile(const WCHAR* szFile, bool bForceAll) +{ + if (StrIsEmpty(szFile)) { + if (s_idxSelectedTheme != 0) { + InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SETTINGSNOTSAVED); + } + return false; + } + + LoadIniFile(szFile); // reset + + Style_ToIniSection(bForceAll); + return SaveIniFile(szFile); } diff --git a/src/Styles.h b/src/Styles.h index 5d0cdd64a..9e4870088 100644 --- a/src/Styles.h +++ b/src/Styles.h @@ -34,6 +34,7 @@ bool Style_Import(HWND hwnd); bool Style_ImportFromFile(const WCHAR* szFile); void Style_Save(); bool Style_Export(HWND hwnd); +void Style_ToIniSection(bool bForceAll); bool Style_ExportToFile(const WCHAR* szFile, bool bForceAll); unsigned ThemeItems_CountOf(); diff --git a/src/VersionEx.h b/src/VersionEx.h index e0b4efc28..0eeaa3472 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 19 #define VERSION_REV 912 -#define VERSION_BUILD 2627 +#define VERSION_BUILD 2629 #define SCINTILLA_VER 420 #define ONIGURUMA_REGEX_VER 6.9.3 #define UCHARDET_VER 2018.09.27