diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml
index d865f2f45..156c08854 100644
--- a/PowerEditor/installer/nativeLang/english.xml
+++ b/PowerEditor/installer/nativeLang/english.xml
@@ -1352,13 +1352,18 @@ Translation note:
+
+
+
+
+
+
-
diff --git a/PowerEditor/installer/nativeLang/english_customizable.xml b/PowerEditor/installer/nativeLang/english_customizable.xml
index 419465e8d..07271a392 100644
--- a/PowerEditor/installer/nativeLang/english_customizable.xml
+++ b/PowerEditor/installer/nativeLang/english_customizable.xml
@@ -1352,13 +1352,18 @@ Translation note:
+
+
+
+
+
+
-
diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi
index de91e6ff3..a0df6e55d 100644
--- a/PowerEditor/installer/nppSetup.nsi
+++ b/PowerEditor/installer/nppSetup.nsi
@@ -57,8 +57,9 @@ OutFile ".\build\npp.${APPVERSION}.Installer.exe"
VIAddVersionKey "FileVersion" "${Version}"
VIAddVersionKey "ProductVersion" "${ProdVer}"
; ------------------------------------------------------------------------
-
+
; Insert CheckIfRunning function as an installer and uninstaller function.
+Var runningNppDetected
!insertmacro CheckIfRunning ""
!insertmacro CheckIfRunning "un."
@@ -117,6 +118,7 @@ Var diffArchDir2Remove
Var noUpdater
Var closeRunningNpp
Var runNppAfterSilentInstall
+Var relaunchNppAfterSilentInstall
!ifdef ARCH64 || ARCHARM64
; this is needed for the 64-bit InstallDirRegKey patch
@@ -133,7 +135,7 @@ Function .onInit
; so the InstallDirRegKey checks for the irrelevant HKLM\SOFTWARE\WOW6432Node\Notepad++, explanation:
; https://nsis.sourceforge.io/Reference/SetRegView
;
-!ifdef ARCH64 || ARCHARM64
+!ifdef ARCH64 || ARCHARM64
${If} ${RunningX64}
System::Call kernel32::GetCommandLine()t.r0 ; get the original cmdline (where a possible "/D=..." is not hidden from us by NSIS)
${StrStr} $1 $0 "/D="
@@ -152,6 +154,7 @@ Function .onInit
;
; --- PATCH END ---
+ StrCpy $runningNppDetected "false" ; reset
; Begin of "/closeRunningNpp"
${GetParameters} $R0
@@ -172,14 +175,13 @@ closeRunningNppCheckDone:
IfSilent 0 notInSilentMode
System::Call 'kernel32::OpenMutex(i 0x100000, b 0, t "nppInstance") i .R0'
IntCmp $R0 0 nppNotRunning
+ StrCpy $runningNppDetected "true"
System::Call 'kernel32::CloseHandle(i $R0)' ; a Notepad++ instance is running, tidy-up the opened mutex handle only
SetErrorLevel 5 ; set an exit code > 0 otherwise the installer returns 0 aka SUCCESS ('5' means here the future ERROR_ACCESS_DENIED when trying to overwrite the notepad++.exe file...)
- Quit ; silent installation is silent, currently we cannot continue without a user interaction (TODO: a new "/closeRunningNppAutomatically" installer optional param...)
+ Quit ; silent installation is silent, we cannot continue here without a user interaction (or the installation should have been launched with the "/closeRunningNpp" param)
nppNotRunning:
notInSilentMode:
; End of "/closeRunningNpp"
-
-
; Begin of "/noUpdater"
${GetParameters} $R0
@@ -200,7 +202,6 @@ updaterDone:
${EndIf}
; End of "/noUpdater"
-
; Begin of "/runNppAfterSilentInstall"
${GetParameters} $R0
${GetOptions} $R0 "/runNppAfterSilentInstall" $R1 ;case insensitive
@@ -212,7 +213,18 @@ runNpp:
StrCpy $runNppAfterSilentInstall "true"
runNppDone:
; End of "/runNppAfterSilentInstall"
-
+
+ ; Begin of "/relaunchNppAfterSilentInstall"
+ ${GetParameters} $R0
+ ${GetOptions} $R0 "/relaunchNppAfterSilentInstall" $R1 ;case insensitive
+ IfErrors noRelaunchNpp relaunchNpp
+noRelaunchNpp:
+ StrCpy $relaunchNppAfterSilentInstall "false"
+ Goto relaunchNppDone
+relaunchNpp:
+ StrCpy $relaunchNppAfterSilentInstall "true"
+relaunchNppDone:
+ ; End of "/relaunchNppAfterSilentInstall"
${If} ${SectionIsSelected} ${PluginsAdmin}
!insertmacro SetSectionFlag ${AutoUpdater} ${SF_RO}
@@ -382,10 +394,14 @@ FunctionEnd
; which is visible in control panel in column named "size"
Section -FinishSection
- Call writeInstallInfoInRegistry
- IfSilent 0 theEnd
- ${If} $runNppAfterSilentInstall == "true"
- Call LaunchNpp
+ Call writeInstallInfoInRegistry
+ IfSilent 0 theEnd
+ ${If} $runNppAfterSilentInstall == "true"
+ Call LaunchNpp ; always launch
+ ${ElseIf} $relaunchNppAfterSilentInstall == "true"
+ ${If} $runningNppDetected == "true"
+ Call LaunchNpp ; relaunch
+ ${EndIf}
${EndIf}
theEnd:
SectionEnd
diff --git a/PowerEditor/installer/nsisInclude/tools.nsh b/PowerEditor/installer/nsisInclude/tools.nsh
index 1ee286fe3..bb42b74f6 100644
--- a/PowerEditor/installer/nsisInclude/tools.nsh
+++ b/PowerEditor/installer/nsisInclude/tools.nsh
@@ -52,6 +52,7 @@ FunctionEnd
System::Call 'kernel32::OpenMutex(i 0x100000, b 0, t "nppInstance") i .R0'
IntCmp $R0 0 NotRunning
+ StrCpy $runningNppDetected "true"
System::Call 'kernel32::CloseHandle(i $R0)'
MessageBox MB_RETRYCANCEL|MB_DEFBUTTON1|MB_ICONSTOP "Cannot continue the installation: Notepad++ is running.\
$\n$\n\
@@ -236,6 +237,7 @@ FunctionEnd
IntPtrCmp $0 0 processNotRunning
IsWindow $0 0 processNotRunning
+ StrCpy $runningNppDetected "true"
IfSilent skipDetailPrint 0
DetailPrint "Closing the ${RUNPROC_WND_CLASS} app running..."
skipDetailPrint:
diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp
index 8bfc2e5ca..7bff1db9b 100644
--- a/PowerEditor/src/NppBigSwitch.cpp
+++ b/PowerEditor/src/NppBigSwitch.cpp
@@ -765,7 +765,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_DISABLEAUTOUPDATE:
{
NppGUI & nppGUI = nppParam.getNppGUI();
- nppGUI._autoUpdateOpt._doAutoUpdate = false;
+ nppGUI._autoUpdateOpt._doAutoUpdate = NppGUI::autoupdate_disabled;
return TRUE;
}
@@ -3539,7 +3539,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
{
//printStr(L"you've got me"));
NppGUI & nppGUI = nppParam.getNppGUI();
- nppGUI._autoUpdateOpt._doAutoUpdate = false;
+ nppGUI._autoUpdateOpt._doAutoUpdate = NppGUI::autoupdate_disabled;
return TRUE;
}
diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp
index ccc31ea64..c0b8acc87 100644
--- a/PowerEditor/src/Parameters.cpp
+++ b/PowerEditor/src/Parameters.cpp
@@ -5943,7 +5943,11 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
{
const wchar_t* val = n->Value();
if (val)
- _nppGUI._autoUpdateOpt._doAutoUpdate = (!lstrcmp(val, L"yes"))?false:true;
+ {
+ // for backward compatibility with older configs
+ _nppGUI._autoUpdateOpt._doAutoUpdate = (!lstrcmp(val, L"yes")) ?
+ NppGUI::AutoUpdateMode::autoupdate_disabled : NppGUI::AutoUpdateMode::autoupdate_on_startup;
+ }
int i;
val = element->Attribute(L"intervalDays", &i);
@@ -5953,6 +5957,10 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
val = element->Attribute(L"nextUpdateDate");
if (val)
_nppGUI._autoUpdateOpt._nextUpdateDate = Date(val);
+
+ val = element->Attribute(L"autoUpdateMode", &i);
+ if (val)
+ _nppGUI._autoUpdateOpt._doAutoUpdate = static_cast(i); // newer config, so overwrite
}
}
@@ -7429,9 +7437,10 @@ void NppParameters::createXmlTreeFromGUIParams()
// no
{
- TiXmlElement *element = insertGUIConfigBoolNode(newGUIRoot, L"noUpdate", !_nppGUI._autoUpdateOpt._doAutoUpdate);
+ TiXmlElement *element = insertGUIConfigBoolNode(newGUIRoot, L"noUpdate", !(_nppGUI._autoUpdateOpt._doAutoUpdate != NppGUI::autoupdate_disabled));
element->SetAttribute(L"intervalDays", _nppGUI._autoUpdateOpt._intervalDays);
element->SetAttribute(L"nextUpdateDate", _nppGUI._autoUpdateOpt._nextUpdateDate.toString().c_str());
+ element->SetAttribute(L"autoUpdateMode", _nppGUI._autoUpdateOpt._doAutoUpdate);
}
// yes
diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h
index 73df53f8c..5bdd09365 100644
--- a/PowerEditor/src/Parameters.h
+++ b/PowerEditor/src/Parameters.h
@@ -946,9 +946,10 @@ struct NppGUI final
// items with no Notepad++ GUI to set
std::wstring _commandLineInterpreter = CMD_INTERPRETER;
+ enum AutoUpdateMode { autoupdate_disabled, autoupdate_on_startup, autoupdate_on_exit };
struct AutoUpdateOptions
{
- bool _doAutoUpdate = true;
+ AutoUpdateMode _doAutoUpdate = autoupdate_on_startup;
int _intervalDays = 15;
Date _nextUpdateDate;
AutoUpdateOptions(): _nextUpdateDate(Date()) {};
diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc
index 99ec7d0e6..175415cd8 100644
--- a/PowerEditor/src/WinControls/Preference/preference.rc
+++ b/PowerEditor/src/WinControls/Preference/preference.rc
@@ -631,17 +631,19 @@ BEGIN
CONTROL "Peek on document map",IDC_CHECK_ENABLEDOCPEEKONMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,269,71,140,10
COMBOBOX IDC_COMBO_SYSTRAY_ACTION_CHOICE,37,76,115,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "system tray",IDC_SYSTRAY_STATIC,157,78,88,8
+ LTEXT "system tray",IDC_SYSTRAY_STATIC,157,77,88,8
COMBOBOX IDC_COMBO_SC_TECHNOLOGY_CHOICE,37,96,115,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "rendering mode",IDC_SC_TECHNOLOGY_STATIC,157,97,88,8
- // "Enable Notepad++ auto-updater" should be always the 1st item, because it'll be hidden if GUP.exe is absent
- CONTROL "Enable Notepad++ auto-updater",IDC_CHECK_AUTOUPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,118,210,10
- CONTROL "Mute all sounds",IDC_CHECK_MUTE_SOUNDS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,37,133,190,10
- CONTROL "Autodetect character encoding",IDC_CHECK_DETECTENCODING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,148,217,10
- CONTROL "Show only filename in title bar",IDC_CHECK_SHORTTITLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,163,217,10
- CONTROL "Enable Save All confirm dialog",IDC_CHECK_SAVEALLCONFIRM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,178,217,10
+ // "Notepad++ auto-updater" should be always the 1st item, because it'll be hidden if GUP.exe is absent
+ RTEXT "Auto-updater:",IDC_AUTOUPDATE_STATIC,15,117,84,10
+ COMBOBOX IDC_COMBO_AUTOUPDATE,104,116,130,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+
+ CONTROL "Mute all sounds",IDC_CHECK_MUTE_SOUNDS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,37,136,190,10
+ CONTROL "Autodetect character encoding",IDC_CHECK_DETECTENCODING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,151,217,10
+ CONTROL "Show only filename in title bar",IDC_CHECK_SHORTTITLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,166,217,10
+ CONTROL "Enable Save All confirm dialog",IDC_CHECK_SAVEALLCONFIRM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,181,217,10
RTEXT "Session file ext.:",IDC_SESSIONFILEEXT_STATIC,270,130,108,8
EDITTEXT IDC_EDIT_SESSIONFILEEXT,380,127,34,12,ES_AUTOHSCROLL
diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp
index a6928b1de..9fbaf8387 100644
--- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp
+++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp
@@ -3088,13 +3088,20 @@ intptr_t CALLBACK MiscSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
::SendDlgItemMessage(_hSelf, IDC_CHECK_DETECTENCODING, BM_SETCHECK, nppGUI._detectEncoding, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_SAVEALLCONFIRM, BM_SETCHECK, nppGUI._saveAllConfirm, 0);
- ::SendDlgItemMessage(_hSelf, IDC_CHECK_AUTOUPDATE, BM_SETCHECK, nppGUI._autoUpdateOpt._doAutoUpdate, 0);
+
+ ::SendDlgItemMessage(_hSelf, IDC_COMBO_AUTOUPDATE, CB_ADDSTRING, 0, reinterpret_cast(L"Disable"));
+ ::SendDlgItemMessage(_hSelf, IDC_COMBO_AUTOUPDATE, CB_ADDSTRING, 0, reinterpret_cast(L"Enable on Notepad++ startup"));
+ ::SendDlgItemMessage(_hSelf, IDC_COMBO_AUTOUPDATE, CB_ADDSTRING, 0, reinterpret_cast(L"Enable on Notepad++ exit"));
+ if ((nppGUI._autoUpdateOpt._doAutoUpdate < NppGUI::autoupdate_disabled) || (nppGUI._autoUpdateOpt._doAutoUpdate > NppGUI::autoupdate_on_exit))
+ nppGUI._autoUpdateOpt._doAutoUpdate = NppGUI::autoupdate_on_startup;
+ ::SendDlgItemMessage(_hSelf, IDC_COMBO_AUTOUPDATE, CB_SETCURSEL, nppGUI._autoUpdateOpt._doAutoUpdate, 0);
+ ::ShowWindow(::GetDlgItem(_hSelf, IDC_AUTOUPDATE_STATIC), nppGUI._doesExistUpdater ? SW_SHOW : SW_HIDE);
+ ::ShowWindow(::GetDlgItem(_hSelf, IDC_COMBO_AUTOUPDATE), nppGUI._doesExistUpdater ? SW_SHOW : SW_HIDE);
+
::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLEDOCPEEKER, BM_SETCHECK, nppGUI._isDocPeekOnTab ? BST_CHECKED : BST_UNCHECKED, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLEDOCPEEKONMAP, BM_SETCHECK, nppGUI._isDocPeekOnMap ? BST_CHECKED : BST_UNCHECKED, 0);
::SendDlgItemMessage(_hSelf, IDC_CHECK_MUTE_SOUNDS, BM_SETCHECK, nppGUI._muteSounds ? BST_CHECKED : BST_UNCHECKED, 0);
- ::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_AUTOUPDATE), nppGUI._doesExistUpdater?SW_SHOW:SW_HIDE);
-
::SendDlgItemMessage(_hSelf, IDC_EDIT_SESSIONFILEEXT, WM_SETTEXT, 0, reinterpret_cast(nppGUI._definedSessionExt.c_str()));
::SendDlgItemMessage(_hSelf, IDC_EDIT_WORKSPACEFILEEXT, WM_SETTEXT, 0, reinterpret_cast(nppGUI._definedWorkspaceExt.c_str()));
@@ -3182,13 +3189,10 @@ intptr_t CALLBACK MiscSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
}
return TRUE;
- case IDC_CHECK_AUTOUPDATE:
- nppGUI._autoUpdateOpt._doAutoUpdate = isCheckedOrNot(static_cast(wParam));
- return TRUE;
-
case IDC_CHECK_DETECTENCODING:
nppGUI._detectEncoding = isCheckedOrNot(static_cast(wParam));
return TRUE;
+
case IDC_CHECK_ENABLEDOCSWITCHER :
{
nppGUI._doTaskList = !nppGUI._doTaskList;
@@ -3295,6 +3299,12 @@ intptr_t CALLBACK MiscSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
nppGUI._writeTechnologyEngine = static_cast(::SendDlgItemMessage(_hSelf,
IDC_COMBO_SC_TECHNOLOGY_CHOICE, CB_GETCURSEL, 0, 0));
}
+
+ else if (LOWORD(wParam) == IDC_COMBO_AUTOUPDATE)
+ {
+ nppGUI._autoUpdateOpt._doAutoUpdate = static_cast(::SendDlgItemMessage(_hSelf,
+ IDC_COMBO_AUTOUPDATE, CB_GETCURSEL, 0, 0));
+ }
}
}
}
diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h b/PowerEditor/src/WinControls/Preference/preference_rc.h
index 3ea67cb27..230b88b84 100644
--- a/PowerEditor/src/WinControls/Preference/preference_rc.h
+++ b/PowerEditor/src/WinControls/Preference/preference_rc.h
@@ -250,7 +250,7 @@
#define IDC_CHECK_CLICKABLELINK_NOUNDERLINE 6320
#define IDC_EDIT_SESSIONFILEEXT 6321
#define IDC_SESSIONFILEEXT_STATIC 6322
-#define IDC_CHECK_AUTOUPDATE 6323
+//#define IDC_CHECK_AUTOUPDATE 6323
#define IDC_DOCUMENTSWITCHER_STATIC 6324
#define IDC_CHECK_UPDATEGOTOEOF 6325
#define IDC_CHECK_ENABLSMARTHILITE 6326
@@ -269,7 +269,6 @@
#define IDC_CHECK_SMARTHILITEUSEFINDSETTINGS 6339
#define IDC_CHECK_SMARTHILITEANOTHERRVIEW 6340
-
#define IDC_DOCUMENTPEEK_STATIC 6344
#define IDC_CHECK_ENABLEDOCPEEKER 6345
#define IDC_CHECK_ENABLEDOCPEEKONMAP 6346
@@ -286,6 +285,9 @@
#define IDC_COMBO_SC_TECHNOLOGY_CHOICE 6362
#define IDC_SC_TECHNOLOGY_STATIC 6363
+#define IDC_COMBO_AUTOUPDATE 6364
+#define IDC_AUTOUPDATE_STATIC 6365
+
#define IDD_PREFERENCE_SUB_NEWDOCUMENT 6400
#define IDC_FORMAT_GB_STATIC 6401
#define IDC_RADIO_F_WIN 6402
diff --git a/PowerEditor/src/winmain.cpp b/PowerEditor/src/winmain.cpp
index a6cd9d6b9..9d2cffa33 100644
--- a/PowerEditor/src/winmain.cpp
+++ b/PowerEditor/src/winmain.cpp
@@ -375,6 +375,39 @@ void stripIgnoredParams(ParamVector & params)
}
}
+bool launchUpdater(const std::wstring& updaterFullPath, const std::wstring& updaterDir)
+{
+ NppParameters& nppParameters = NppParameters::getInstance();
+ NppGUI& nppGui = nppParameters.getNppGUI();
+
+ // check if update interval elapsed
+ Date today(0);
+ if (today < nppGui._autoUpdateOpt._nextUpdateDate)
+ return false;
+
+ std::wstring updaterParams = L"-v";
+ updaterParams += VERSION_INTERNAL_VALUE;
+
+ if (nppParameters.archType() == IMAGE_FILE_MACHINE_AMD64)
+ {
+ updaterParams += L" -px64";
+ }
+ else if (nppParameters.archType() == IMAGE_FILE_MACHINE_ARM64)
+ {
+ updaterParams += L" -parm64";
+ }
+
+ Process updater(updaterFullPath.c_str(), updaterParams.c_str(), updaterDir.c_str());
+ updater.run();
+
+ // Update next update date
+ if (nppGui._autoUpdateOpt._intervalDays < 0) // Make sure interval days value is positive
+ nppGui._autoUpdateOpt._intervalDays = 0 - nppGui._autoUpdateOpt._intervalDays;
+ nppGui._autoUpdateOpt._nextUpdateDate = Date(nppGui._autoUpdateOpt._intervalDays);
+
+ return true;
+}
+
} // namespace
@@ -505,8 +538,9 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
NppDarkMode::initDarkMode();
DPIManagerV2::initDpiAPI();
- bool doUpdateNpp = nppGui._autoUpdateOpt._doAutoUpdate;
- bool doUpdatePluginList = nppGui._autoUpdateOpt._doAutoUpdate;
+ bool doUpdateNpp = nppGui._autoUpdateOpt._doAutoUpdate != NppGUI::autoupdate_disabled;
+ bool updateAtExit = nppGui._autoUpdateOpt._doAutoUpdate == NppGUI::autoupdate_on_exit;
+ bool doUpdatePluginList = nppGui._autoUpdateOpt._doAutoUpdate != NppGUI::autoupdate_disabled;
if (doFunctionListExport || doPrintAndQuit) // export functionlist feature will serialize functionlist on the disk, then exit Notepad++. So it's important to not launch into existing instance, and keep it silent.
{
@@ -622,25 +656,8 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
std::wstring updaterFullPath = updaterDir + L"gup.exe";
- std::wstring updaterParams = L"-v";
- updaterParams += VERSION_INTERNAL_VALUE;
-
bool isUpExist = nppGui._doesExistUpdater = doesFileExist(updaterFullPath.c_str());
- if (doUpdateNpp) // check more detail
- {
- Date today(0);
-
- if (today < nppGui._autoUpdateOpt._nextUpdateDate)
- doUpdateNpp = false;
- }
-
- if (doUpdatePluginList)
- {
- // TODO: detect update frequency
- // Due to the code signing problem, the Plugin List cannot be updated independently of Notepad++ for now.
- }
-
// wingup doesn't work with the obsolete security layer (API) under xp since downloads are secured with SSL on notepad_plus_plus.org
winVer ver = nppParameters.getWinVersion();
bool isGtXP = ver > WV_XP;
@@ -648,66 +665,16 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
SecurityGuard securityGuard;
bool isSignatureOK = securityGuard.checkModule(updaterFullPath, nm_gup);
- if (TheFirstOne && isUpExist && isGtXP && isSignatureOK)
+ if (TheFirstOne && isUpExist && isGtXP && isSignatureOK && doUpdateNpp && !updateAtExit)
{
- if (nppParameters.archType() == IMAGE_FILE_MACHINE_AMD64)
- {
- updaterParams += L" -px64";
- }
- else if (nppParameters.archType() == IMAGE_FILE_MACHINE_ARM64)
- {
- updaterParams += L" -parm64";
- }
-
- if (doUpdateNpp)
- {
- Process updater(updaterFullPath.c_str(), updaterParams.c_str(), updaterDir.c_str());
- updater.run();
-
- // Update next update date
- if (nppGui._autoUpdateOpt._intervalDays < 0) // Make sure interval days value is positive
- nppGui._autoUpdateOpt._intervalDays = 0 - nppGui._autoUpdateOpt._intervalDays;
- nppGui._autoUpdateOpt._nextUpdateDate = Date(nppGui._autoUpdateOpt._intervalDays);
- }
-
- // to be removed
- doUpdatePluginList = false;
-
- if (doUpdatePluginList)
- {
- // Update Plugin List
- std::wstring upPlParams = L"-v";
- upPlParams += notepad_plus_plus.getPluginListVerStr();
-
- if (nppParameters.archType() == IMAGE_FILE_MACHINE_AMD64)
- {
- upPlParams += L" -px64";
- }
- else if (nppParameters.archType() == IMAGE_FILE_MACHINE_ARM64)
- {
- upPlParams += L" -parm64";
- }
-
- upPlParams += L" -upZip";
-
- // override "InfoUrl" in gup.xml
- upPlParams += L" https://notepad-plus-plus.org/update/pluginListDownloadUrl.php";
-
- // indicate the pluginList installation location
- upPlParams += nppParameters.getPluginConfDir();
-
- Process updater(updaterFullPath.c_str(), upPlParams.c_str(), updaterDir.c_str());
- updater.run();
-
- // TODO: Update next update date
- // Due to the code signing problem, the Plugin List cannot be updated independently of Notepad++ for now.
- }
+ launchUpdater(updaterFullPath, updaterDir);
}
MSG msg{};
msg.wParam = 0;
Win32Exception::installHandler();
MiniDumper mdump; //for debugging purposes.
+ bool isException = false;
try
{
notepad_plus_plus.init(hInstance, NULL, quotFileName.c_str(), &cmdLineParams);
@@ -732,6 +699,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
}
catch (int i)
{
+ isException = true;
wchar_t str[50] = L"God Damned Exception:";
wchar_t code[10];
wsprintf(code, L"%d", i);
@@ -741,11 +709,13 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
}
catch (std::runtime_error & ex)
{
+ isException = true;
::MessageBoxA(Notepad_plus_Window::gNppHWND, ex.what(), "Runtime Exception", MB_OK);
doException(notepad_plus_plus);
}
catch (const Win32Exception & ex)
{
+ isException = true;
wchar_t message[1024];
wsprintf(message, L"An exception occurred. Notepad++ cannot recover and must be shut down.\r\nThe exception details are as follows:\r\n"
L"Code:\t0x%08X\r\nType:\t%S\r\nException address: 0x%p", ex.code(), ex.what(), ex.where());
@@ -755,14 +725,28 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance
}
catch (std::exception & ex)
{
+ isException = true;
::MessageBoxA(Notepad_plus_Window::gNppHWND, ex.what(), "General Exception", MB_OK);
doException(notepad_plus_plus);
}
catch (...) // this shouldn't ever have to happen
{
+ isException = true;
::MessageBoxA(Notepad_plus_Window::gNppHWND, "An exception that we did not yet found its name is just caught", "Unknown Exception", MB_OK);
doException(notepad_plus_plus);
}
+ doUpdateNpp = nppGui._autoUpdateOpt._doAutoUpdate != NppGUI::autoupdate_disabled; // refresh, maybe user activated these opts in Preferences
+ updateAtExit = nppGui._autoUpdateOpt._doAutoUpdate == NppGUI::autoupdate_on_exit; // refresh
+ if (!isException && !nppParameters.isEndSessionCritical() && TheFirstOne && isUpExist && isGtXP && isSignatureOK && doUpdateNpp && updateAtExit)
+ {
+ if (launchUpdater(updaterFullPath, updaterDir))
+ {
+ // for updating the nextUpdateDate in the already saved config.xml
+ nppParameters.createXmlTreeFromGUIParams();
+ nppParameters.saveConfig_xml();
+ }
+ }
+
return static_cast(msg.wParam);
}