diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index bd1d3f4d4..2ef2a8bb6 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -1725,13 +1725,17 @@ bool MRU_Delete(LPMRULIST pmru, int iIndex) if (pmru->pszBookMarks[iIndex]) { LocalFree(pmru->pszBookMarks[iIndex]); // StrDup() } - for (i = iIndex; i < pmru->iSize - 1; i++) { + bool bZeroMoved = false; + for (i = iIndex; (i < pmru->iSize - 1) && !bZeroMoved; i++) + { pmru->pszItems[i] = pmru->pszItems[i + 1]; pmru->iEncoding[i] = pmru->iEncoding[i + 1]; pmru->iCaretPos[i] = pmru->iCaretPos[i + 1]; pmru->iSelAnchPos[i] = pmru->iSelAnchPos[i + 1]; pmru->pszBookMarks[i] = pmru->pszBookMarks[i + 1]; + bZeroMoved = (NULL == pmru->pszItems[i + 1]); + pmru->pszItems[i + 1] = NULL; pmru->iEncoding[i + 1] = 0; pmru->iCaretPos[i + 1] = -1; @@ -1830,10 +1834,13 @@ bool MRU_Load(LPMRULIST pmru) } -bool MRU_Save(LPMRULIST pmru) +void MRU_Save(LPMRULIST pmru) { - if (s_bSettingsIniFileOpend) { - if (pmru) { + if (pmru) { + + bool const bOpendByMe = !s_bSettingsIniFileOpend ? OpenSettingsFile() : false; + + if (s_bSettingsIniFileOpend) { WCHAR tchName[32] = { L'\0' }; WCHAR tchItem[2048] = { L'\0' }; @@ -1866,42 +1873,51 @@ bool MRU_Save(LPMRULIST pmru) } } } + if (bOpendByMe) { + CloseSettingsFile(); + } } - return s_bSettingsIniFileOpend; } bool MRU_MergeSave(LPMRULIST pmru, bool bAddFiles, bool bRelativePath, bool bUnexpandMyDocs) { if (pmru) { - int i; - LPMRULIST pmruBase; - pmruBase = MRU_Create(pmru->szRegKey, pmru->iFlags, pmru->iSize); - MRU_Load(pmruBase); + bool const bOpendByMe = !s_bSettingsIniFileOpend ? OpenSettingsFile() : false; - if (bAddFiles) { - for (i = pmru->iSize - 1; i >= 0; i--) { - if (pmru->pszItems[i]) { - WCHAR wchItem[MAX_PATH] = { L'\0' }; - PathAbsoluteFromApp(pmru->pszItems[i], wchItem, COUNTOF(wchItem), true); - MRU_AddFile(pmruBase, wchItem, bRelativePath, bUnexpandMyDocs, - pmru->iEncoding[i], pmru->iCaretPos[i], pmru->iSelAnchPos[i], pmru->pszBookMarks[i]); + if (s_bSettingsIniFileOpend) { + + LPMRULIST pmruBase = MRU_Create(pmru->szRegKey, pmru->iFlags, pmru->iSize); + MRU_Load(pmruBase); + + if (bAddFiles) { + for (int i = pmru->iSize - 1; i >= 0; i--) { + if (pmru->pszItems[i]) { + WCHAR wchItem[MAX_PATH] = { L'\0' }; + PathAbsoluteFromApp(pmru->pszItems[i], wchItem, COUNTOF(wchItem), true); + MRU_AddFile(pmruBase, wchItem, bRelativePath, bUnexpandMyDocs, + pmru->iEncoding[i], pmru->iCaretPos[i], pmru->iSelAnchPos[i], pmru->pszBookMarks[i]); + } } } - } - else { - for (i = pmru->iSize - 1; i >= 0; i--) { - if (pmru->pszItems[i]) - MRU_Add(pmruBase, pmru->pszItems[i], - pmru->iEncoding[i], pmru->iCaretPos[i], pmru->iSelAnchPos[i], pmru->pszBookMarks[i]); + else { + for (int i = pmru->iSize - 1; i >= 0; i--) { + if (pmru->pszItems[i]) + MRU_Add(pmruBase, pmru->pszItems[i], + pmru->iEncoding[i], pmru->iCaretPos[i], pmru->iSelAnchPos[i], pmru->pszBookMarks[i]); + } } - } - MRU_Save(pmruBase); - MRU_Destroy(pmruBase); - pmruBase = NULL; - return true; + MRU_Save(pmruBase); + MRU_Destroy(pmruBase); + pmruBase = NULL; + + if (bOpendByMe) { + CloseSettingsFile(); + } + return true; + } } return false; } diff --git a/src/Config/Config.h b/src/Config/Config.h index b29d4ea34..57215cca7 100644 --- a/src/Config/Config.h +++ b/src/Config/Config.h @@ -127,7 +127,7 @@ bool MRU_Delete(LPMRULIST pmru, int iIndex); bool MRU_Empty(LPMRULIST pmru); int MRU_Enum(LPMRULIST pmru, int iIndex, LPWSTR pszItem, int cchItem); bool MRU_Load(LPMRULIST pmru); -bool MRU_Save(LPMRULIST pmru); +void MRU_Save(LPMRULIST pmru); bool MRU_MergeSave(LPMRULIST pmru, bool, bool, bool); #define MRU_Count(pmru) MRU_Enum((pmru), 0, NULL, 0) diff --git a/src/Dialogs.c b/src/Dialogs.c index afde10df7..e9b5c924f 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -1904,9 +1904,13 @@ static INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM case LVN_ITEMCHANGED: case LVN_DELETEITEM: { - UINT cnt = ListView_GetSelectedCount(GetDlgItem(hwnd, IDC_FILEMRU)); + UINT const cnt = ListView_GetSelectedCount(GetDlgItem(hwnd, IDC_FILEMRU)); DialogEnableControl(hwnd, IDOK, (cnt > 0)); - DialogEnableControl(hwnd, IDC_REMOVE, (cnt > 0)); + // can't discard current file (myself) + int iCur = 0; + if (!MRU_FindFile(Globals.pFileMRU, Globals.CurrentFile, &iCur)) { iCur = -1; } + int const item = ListView_GetNextItem(GetDlgItem(hwnd, IDC_FILEMRU), -1, LVNI_ALL | LVNI_SELECTED); + DialogEnableControl(hwnd, IDC_REMOVE, (cnt > 0) && (iCur != item)); } break; } @@ -2032,12 +2036,15 @@ static INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM DialogEnableControl(hwnd, IDC_REMOVE, (cnt > 0)); } } - else { StringCchCopy((LPWSTR)GetWindowLongPtr(hwnd,DWLP_USER),MAX_PATH,tchFileName); EndDialog(hwnd,IDOK); } } + + if (Settings.SaveRecentFiles && !StrIsEmpty(Globals.IniFile)) { + MRU_MergeSave(Globals.pFileMRU, true, Flags.RelativeFileMRU, Flags.PortableMyDocs); + } } break; diff --git a/src/Edit.c b/src/Edit.c index 72991ba98..9a1a54d1c 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -1074,7 +1074,7 @@ bool EditLoadFile( bool const bValidUTF8 = IsValidUTF8(lpData, cbData); cpi_enc_t const iAnalyzeFallback = Settings.UseDefaultForFileEncoding ? Settings.DefaultEncoding : - (bValidUTF8 ? CPI_UTF8 : CPI_ANSI_DEFAULT); + ((bValidUTF8 && Settings.LoadASCIIasUTF8) ? CPI_UTF8 : CPI_ANSI_DEFAULT); ENC_DET_T encDetection = Encoding_DetectEncoding(pszFile, lpData, cbData, iAnalyzeFallback, bSkipUTFDetection, bSkipANSICPDetection, bForceEncDetection); diff --git a/src/Notepad3.c b/src/Notepad3.c index 970cd9ed2..8a52fd45e 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1678,35 +1678,22 @@ bool SaveAllSettings(bool bSaveSettingsNow) if (ok) { - ok = SaveSettings(bSaveSettingsNow); + SaveSettings(bSaveSettingsNow); if (StrIsNotEmpty(Globals.IniFile)) { // Cleanup unwanted MRU'selEmpty if (!Settings.SaveRecentFiles) { MRU_Empty(Globals.pFileMRU); - MRU_Save(Globals.pFileMRU); } - else { - MRU_MergeSave(Globals.pFileMRU, true, Flags.RelativeFileMRU, Flags.PortableMyDocs); - } - MRU_Destroy(Globals.pFileMRU); - Globals.pFileMRU = NULL; + MRU_Save(Globals.pFileMRU); if (!Settings.SaveFindReplace) { MRU_Empty(Globals.pMRUfind); MRU_Empty(Globals.pMRUreplace); - MRU_Save(Globals.pMRUfind); - MRU_Save(Globals.pMRUreplace); } - else { - MRU_MergeSave(Globals.pMRUfind, false, false, false); - MRU_MergeSave(Globals.pMRUreplace, false, false, false); - } - MRU_Destroy(Globals.pMRUfind); - Globals.pMRUfind = NULL; - MRU_Destroy(Globals.pMRUreplace); - Globals.pMRUreplace = NULL; + MRU_Save(Globals.pMRUfind); + MRU_Save(Globals.pMRUreplace); } } diff --git a/test/test_files/encoding/Txtfiles/apache notes.txt b/test/test_files/encoding/Txtfiles/apache notes.txt index 2e369bc56..20f866283 100644 --- a/test/test_files/encoding/Txtfiles/apache notes.txt +++ b/test/test_files/encoding/Txtfiles/apache notes.txt @@ -1,6 +1,5 @@ Apache on Windows: ================== -é * Which distribution?