Merge pull request #4707 from RaiKoHoff/Dev_Master

Enhancement on "File changed on disk" notification handling
This commit is contained in:
Rainer Kottenhoff 2023-03-31 08:31:24 +02:00 committed by GitHub
commit b1014377f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 553 additions and 327 deletions

View File

@ -317,14 +317,16 @@
#define IDD_MUI_INFOBOX3 17029
#define IDD_MUI_INFOBOX4 17030
#define IDD_MUI_INFOBOX5 17031
#define IDD_MUI_SORT 17032
#define IDD_MUI_RECODE 17033
#define IDD_MUI_ENCODING 17034
#define IDD_MUI_ALIGN 17035
#define IDD_MUI_CMDLINEHELP 17037
#define IDD_MUI_SYSFONT_WITHLINK 17038
#define IDD_MUI_SYSCOLOR_DLG 17039
#define IDD_MUI_AUTOSAVE_BACKUP 17040
#define IDD_MUI_INFOBOX6 17032
#define IDD_MUI_INFOBOX7 17033
#define IDD_MUI_SORT 17034
#define IDD_MUI_RECODE 17035
#define IDD_MUI_ENCODING 17036
#define IDD_MUI_ALIGN 17037
#define IDD_MUI_CMDLINEHELP 17038
#define IDD_MUI_SYSFONT_WITHLINK 17039
#define IDD_MUI_SYSCOLOR_DLG 17040
#define IDD_MUI_AUTOSAVE_BACKUP 17041
#define IDC_COMMANDLINE 18000
#define IDC_SEARCHEXE 18001

View File

@ -276,7 +276,7 @@ CAPTION "Nachricht bei Dateiänderung"
FONT 9, "Segoe UI", 400, 0, 0x1
BEGIN
CONTROL "&Keine.", IDC_RADIO_BTN_A,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,7,99,10
CONTROL "&Indikator (lautlos).", IDC_RADIO_BTN_B, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 7, 19, 99, 10
CONTROL "&Indikator (still).", IDC_RADIO_BTN_B, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 7, 19, 99, 10
CONTROL "&Zeige Nachricht.", IDC_RADIO_BTN_C,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,31,99,10
CONTROL "&Auto-Neuladen.", IDC_RADIO_BTN_D,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,43,99,10
CONTROL "&Exklusive Sperrung der Datei.", IDC_RADIO_BTN_E,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,55,120,10
@ -615,7 +615,7 @@ BEGIN
PUSHBUTTON "&Nein",IDNO,61,70,50,14
PUSHBUTTON "&Abbrechen",IDCANCEL,115,70,50,14
CONTROL "&Diese Nachricht nicht nochmals anzeigen.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,54,122,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,54,140,10
END
IDD_MUI_INFOBOX5 DIALOGEX 0, 0, 244, 71
@ -626,12 +626,42 @@ BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
DEFPUSHBUTTON "Wiederholen",IDRETRY,131,50,50,14
DEFPUSHBUTTON "&Wiederholen",IDRETRY,131,50,50,14
PUSHBUTTON "&Abbrechen",IDCANCEL,187,50,50,14
CONTROL "&Diese Nachricht nicht nochmals anzeigen.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,122,10
END
IDD_MUI_INFOBOX6 DIALOGEX 0, 0, 299, 91
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Notepad3"
FONT 9, "Segoe UI", 400, 0, 0x1
BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
CONTROL "&Diese Nachricht nicht nochmals anzeigen.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,140,10
DEFPUSHBUTTON "&Wiederholen",IDRETRY,186,70,50,14
PUSHBUTTON "&Abbrechen",IDABORT,130,70, 50, 14
PUSHBUTTON "&Ignorieren",IDIGNORE,242,70,50,14
END
IDD_MUI_INFOBOX7 DIALOGEX 0, 0, 299, 91
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Notepad3"
FONT 9, "Segoe UI", 400, 0, 0x1
BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
CONTROL "&Diese Nachricht nicht nochmals anzeigen.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,140,10
DEFPUSHBUTTON "&Wiederholen", IDRETRY, 186, 70, 50, 14
PUSHBUTTON "&Abbrechen",IDCANCEL,130,70, 50, 14
PUSHBUTTON "&Weiter",IDCONTINUE,242,70,50,14
END
IDD_MUI_SORT DIALOGEX 0, 0, 185, 188
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Sortiere Zeilen"
@ -1072,6 +1102,38 @@ BEGIN
BOTTOMMARGIN, 64
END
IDD_MUI_INFOBOX4, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 181
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_INFOBOX5, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 251
TOPMARGIN, 7
BOTTOMMARGIN, 64
END
IDD_MUI_INFOBOX6, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 306
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_INFOBOX7, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 306
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_SORT, DIALOG
BEGIN
LEFTMARGIN, 7

View File

@ -177,7 +177,7 @@ BEGIN
IDS_MUI_ASK_CLEAR_UNDO "Diese Operation wird die Undo-History löschen. Weiter machen?"
IDS_MUI_READONLY_SAVE """%s"" ist schreibgeschützt. Dokument unter einem anderen Dateipfad speichern?"
IDS_MUI_FILECHANGENOTIFY
"Die geladene Datei wurde durch ein anderes Programm auf dem Datenträger verändert. Neu laden?"
"Die geladene Datei wurde durch ein anderes Programm auf dem Datenträger verändert.\n[Abbrechen]: \tIgnoriere alle Änderungen (Stiller Indikator).\n[Wiederholen]:\tDatei neu laden.\n[Weiter]: \tWechsle ins Logfile Monitoring."
IDS_MUI_FILECHANGENOTIFY2 "Die geladene Datei wurde auf dem Datenträger gelöscht. Nochmals speichern?"
IDS_MUI_FILELOCK_ERROR "Es konnte keine exklusive Dateisperre auf ""%s"" gesetzt werden!"
IDS_MUI_STICKYWINPOS "Eingefrorene Fensterpositionierung is eingeschaltet worden. Jede neue Notepad3 Instanz wird nun diese Fensterpositionierung initial verwenden."

View File

@ -611,11 +611,11 @@ BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,126,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
CONTROL "&Don't display this message again.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,54,122,10
DEFPUSHBUTTON "&Yes",IDOK,7,70,50,14
PUSHBUTTON "&No",IDNO,61,70,50,14
PUSHBUTTON "&Cancel",IDCANCEL,115,70,50,14
CONTROL "&Don't display this message again.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,54,122,10
END
IDD_MUI_INFOBOX5 DIALOGEX 0, 0, 244, 71
@ -626,12 +626,42 @@ BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
DEFPUSHBUTTON "Retry",IDRETRY,131,50,50,14
DEFPUSHBUTTON "&Retry",IDRETRY,131,50,50,14
PUSHBUTTON "&Cancel",IDCANCEL,187,50,50,14
CONTROL "&Don't display this message again.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,122,10
END
IDD_MUI_INFOBOX6 DIALOGEX 0, 0, 299, 91
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Notepad3"
FONT 9, "Segoe UI", 400, 0, 0x1
BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
CONTROL "&Don't display this message again.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,122,10
DEFPUSHBUTTON "&Retry",IDRETRY,186,70,50,14
PUSHBUTTON "&Abort",IDABORT, 130, 70, 50, 14
PUSHBUTTON "&Ignore",IDIGNORE,242,70,50,14
END
IDD_MUI_INFOBOX7 DIALOGEX 0, 0, 299, 91
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Notepad3"
FONT 9, "Segoe UI", 400, 0, 0x1
BEGIN
//~ICON IDR_MAINWND,IDC_INFOBOXICON,7,7,0,0
CONTROL IDR_MAINWND, IDC_INFOBOXICON, "Static", SS_BITMAP | SS_NOTIFY, 7, 7, 24, 24, WS_EX_TRANSPARENT
LTEXT "",IDC_INFOBOXTEXT,35,7,202,41,SS_EDITCONTROL | SS_NOPREFIX | SS_LEFT
CONTROL "&Don't display this message again.",IDC_INFOBOXCHECK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,54,122,10
DEFPUSHBUTTON "&Try Again",IDRETRY,186,70,50,14
PUSHBUTTON "&Cancel", IDCANCEL, 130, 70, 50, 14
PUSHBUTTON "&Continue",IDCONTINUE,242,70,50,14
END
IDD_MUI_SORT DIALOGEX 0, 0, 185, 188
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Sort Lines"
@ -1051,7 +1081,7 @@ BEGIN
IDD_MUI_INFOBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 237
RIGHTMARGIN, 251
TOPMARGIN, 7
BOTTOMMARGIN, 64
END
@ -1059,7 +1089,7 @@ BEGIN
IDD_MUI_INFOBOX2, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 237
RIGHTMARGIN, 251
TOPMARGIN, 7
BOTTOMMARGIN, 64
END
@ -1067,11 +1097,43 @@ BEGIN
IDD_MUI_INFOBOX3, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 237
RIGHTMARGIN, 251
TOPMARGIN, 7
BOTTOMMARGIN, 64
END
IDD_MUI_INFOBOX4, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 181
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_INFOBOX5, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 251
TOPMARGIN, 7
BOTTOMMARGIN, 64
END
IDD_MUI_INFOBOX6, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 306
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_INFOBOX7, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 306
TOPMARGIN, 7
BOTTOMMARGIN, 84
END
IDD_MUI_SORT, DIALOG
BEGIN
LEFTMARGIN, 7

View File

@ -177,7 +177,7 @@ BEGIN
IDS_MUI_ASK_CLEAR_UNDO "This operation will clear the undo history. Continue?"
IDS_MUI_READONLY_SAVE """%s"" is read only. Save to a different file?"
IDS_MUI_FILECHANGENOTIFY
"The current file has been modified by an external program. Reload?"
"The current file has been modified by an external program.\n[Cancel]: \tIgnore any changes (silent indicator).\n[Try Again]:\tReload File.\n[Continue]: \tSwitch to File Monitoring."
IDS_MUI_FILECHANGENOTIFY2 "The current file has been deleted. Save now?"
IDS_MUI_FILELOCK_ERROR "Can not acquire exclusive file lock for ""%s""!"
IDS_MUI_STICKYWINPOS "Sticky Window Position is enabled. Any new Notepad3 windows will use the current window placement settings."

View File

@ -136,7 +136,7 @@
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
@ -163,7 +163,7 @@
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>

View File

@ -38,7 +38,7 @@
<CharacterSet>Unicode</CharacterSet>
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15.0'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
@ -50,7 +50,7 @@
<PlatformToolset Condition="'$(VisualStudioVersion)'=='15.0'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<CharacterSet>Unicode</CharacterSet>

View File

@ -1244,38 +1244,39 @@ void LoadSettings()
StrgReset(Settings2.FileDlgFilters, pPathBuffer);
// handle deprecated (typo) key 'FileCheckInverval'
constexpr const int64_t defaultFCI = 2000;
constexpr const LONG64 NOTSETFCI = -111LL;
constexpr const LONG64 defaultFCI = 2000LL;
constexpr const WCHAR* deprecatedKeyART = L"AutoReloadTimeout";
constexpr const WCHAR* deprecatedKeyFCI = L"FileCheckInverval";
constexpr const WCHAR* correctKeyFCI = L"FileCheckInterval";
int const autoReload = IniSectionGetInt(IniSecSettings2, deprecatedKeyART, -111); // deprecated
if (autoReload != -111) {
LONG64 const autoReload = IniSectionGetLongLong(IniSecSettings2, deprecatedKeyART, NOTSETFCI); // deprecated
if (autoReload != NOTSETFCI) {
IniSectionDelete(IniSecSettings2, deprecatedKeyART, true); // deprecated
bDirtyFlag = true;
}
int const dfci = IniSectionGetInt(IniSecSettings2, deprecatedKeyFCI, -111); // get deprecated typo setting
if (dfci != -111) {
LONG64 const dfci = IniSectionGetLongLong(IniSecSettings2, deprecatedKeyFCI, NOTSETFCI); // get deprecated typo setting
if (dfci != NOTSETFCI) {
IniSectionDelete(IniSecSettings2, deprecatedKeyFCI, true); // deprecated wrong (typo) name
bDirtyFlag = true;
}
int const deprecatedFCI = max_i(autoReload, dfci);
LONG64 const adpDefaultFCI = (max_ll(autoReload, dfci) == NOTSETFCI) ? defaultFCI :
clampll(max_ll(autoReload, dfci), MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL);
Settings2.FileCheckInterval = static_cast<int64_t>(clampll(IniSectionGetLongLong(IniSecSettings2, correctKeyFCI, deprecatedFCI),
MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL));
Settings2.FileCheckInterval = clampll(IniSectionGetLongLong(IniSecSettings2, correctKeyFCI, adpDefaultFCI), MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL);
if (Settings2.FileCheckInterval == defaultFCI) {
if (deprecatedFCI != defaultFCI) {
IniSectionDelete(IniSecSettings2, correctKeyFCI, true); // is default
bDirtyFlag = true;
}
}
else if (Settings2.FileCheckInterval == static_cast<int64_t>(deprecatedFCI)) {
IniSectionSetLongLong(IniSecSettings2, correctKeyFCI, Settings2.FileCheckInterval);
IniSectionDelete(IniSecSettings2, correctKeyFCI, true); // is default
bDirtyFlag = true;
}
else if (Settings2.FileCheckInterval == adpDefaultFCI) {
IniSectionSetLongLong(IniSecSettings2, correctKeyFCI, adpDefaultFCI);
bDirtyFlag = true;
}
FileWatching.FileCheckInterval = Settings2.FileCheckInterval;
IniSectionGetString(IniSecSettings2, L"FileChangedIndicator", L"[@]", Settings2.FileChangedIndicator, COUNTOF(Settings2.FileChangedIndicator));
IniSectionGetString(IniSecSettings2, L"FileDeletedIndicator", L"[X]", Settings2.FileDeletedIndicator, COUNTOF(Settings2.FileDeletedIndicator));

View File

@ -311,6 +311,10 @@ static INT_PTR CALLBACK _InfoBoxLngDlgProc(HWND hwnd, UINT umsg, WPARAM wParam,
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, LOWORD(IDCLOSE));
break;
case WM_DESTROY:
if (hIconBmp) {
DeleteObject(hIconBmp);
@ -374,6 +378,8 @@ CASE_WM_CTLCOLOR_SET:
bool const isChecked = IsButtonChecked(hwnd, IDC_INFOBOXCHECK);
DialogEnableControl(hwnd, IDNO, !isChecked);
DialogEnableControl(hwnd, IDABORT, !isChecked);
DialogEnableControl(hwnd, IDIGNORE, !isChecked);
DialogEnableControl(hwnd, IDCONTINUE, !isChecked);
DialogEnableControl(hwnd, IDCLOSE, !isChecked);
DialogEnableControl(hwnd, IDCANCEL, !isChecked);
SendMessage(hwnd, WM_NEXTDLGCTL, 0, FALSE);
@ -488,7 +494,11 @@ LONG InfoBoxLng(UINT uType, LPCWSTR lpstrSetting, UINT uidMsg, ...)
int idDlg;
switch (uType & MB_TYPEMASK) {
case MB_YESNO: // contains two push buttons : Yes and No.
case MB_OK: // one push button : OK. This is the default.
idDlg = IDD_MUI_INFOBOX;
break;
case MB_YESNO: // contains two push buttons : Yes and No.
idDlg = IDD_MUI_INFOBOX2;
break;
@ -505,9 +515,13 @@ LONG InfoBoxLng(UINT uType, LPCWSTR lpstrSetting, UINT uidMsg, ...)
break;
case MB_ABORTRETRYIGNORE: // three push buttons : Abort, Retry, and Ignore.
case MB_CANCELTRYCONTINUE: // three push buttons : Cancel, Try Again, Continue.Use this message box type instead of MB_ABORTRETRYIGNORE.
idDlg = IDD_MUI_INFOBOX6;
break;
// Use this message box type instead of MB_ABORTRETRYIGNORE.
case MB_CANCELTRYCONTINUE: // three push buttons : Cancel, Try Again, Continue.
idDlg = IDD_MUI_INFOBOX7;
break;
case MB_OK: // one push button : OK. This is the default.
default:
idDlg = IDD_MUI_INFOBOX;
break;
@ -1040,6 +1054,10 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam
}
break;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
if (hVersionFont) {
DeleteObject(hVersionFont);
@ -1329,6 +1347,10 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM l
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
DeleteBitmapButton(hwnd, IDC_SEARCHEXE);
return FALSE;
@ -1582,6 +1604,10 @@ static INT_PTR CALLBACK OpenWithDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
DirList_Destroy(hwndLV);
hwndLV = NULL;
@ -1838,6 +1864,11 @@ static INT_PTR CALLBACK FavoritesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARA
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
DirList_Destroy(hwndLV);
hwndLV = NULL;
@ -2046,6 +2077,11 @@ static INT_PTR CALLBACK AddToFavDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPA
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
ResizeDlg_Destroy(hwnd, &Settings.AddToFavDlgSizeX, NULL);
return FALSE;
@ -2316,6 +2352,10 @@ static INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPAR
}
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY: {
BackgroundWorker *worker = (BackgroundWorker *)GetProp(hwnd, L"it");
BackgroundWorker_Destroy(worker);
@ -3628,6 +3668,11 @@ static INT_PTR CALLBACK SelectEncodingDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY: {
ImageList_Destroy(himl);
himl = NULL;

View File

@ -83,14 +83,15 @@ DWORD MsgBoxLastError(LPCWSTR lpszMessage, DWORD dwErrID);
LONG InfoBoxLng(UINT uType, LPCWSTR lpstrSetting, UINT uidMsg, ...);
#define INFOBOX_ANSW(_R_) LOWORD(_R_)
#define INFOBOX_MODE(_R_) HIWORD(_R_)
inline bool IsYesOkay(INT_PTR answ) {
return ((LOWORD(answ) == IDOK) || (LOWORD(answ) == IDYES));
}
inline bool IsRetryContinue(INT_PTR answ) {
return ((LOWORD(answ) == IDRETRY) || (LOWORD(answ) == IDCONTINUE));
}
inline bool IsNoCancel(INT_PTR answ) {
return ((LOWORD(answ) == IDNO) || (LOWORD(answ) == IDCANCEL));
inline bool IsNoCancelClose(INT_PTR answ) {
return ((LOWORD(answ) == IDNO) || (LOWORD(answ) == IDCANCEL) || (LOWORD(answ) == 0));
}
void SetWindowTitle(HWND hwnd, const HPATHL pthFilePath, int iFormat,

View File

@ -102,23 +102,23 @@ __forceinline size_t SizeOfMemStrg(LPCVOID lpMemory) {
/* */
/**************************************************/
#define limit_len(len) (((len) < STRINGW_MAX_CCH) ? (len) : (STRINGW_MAX_CCH - 1))
__forceinline size_t limit_len(const size_t len) { return (((len) < STRINGW_MAX_CCH) ? max_s((8 / sizeof(wchar_t)), len) : (STRINGW_MAX_CCH - 1)); }
__forceinline STRINGW* ToWStrg(HSTRINGW hstr) { return (STRINGW*)hstr; }
inline static void * AllocBuffer(const size_t len, bool bZeroMem) {
inline static void * AllocBuffer(const size_t len) {
if (!s_hndlProcessHeap) {
s_hndlProcessHeap = GetProcessHeap();
}
return AllocMemStrg(limit_len(len) * sizeof(wchar_t), bZeroMem ? HEAP_ZERO_MEMORY : 0);
return AllocMemStrg(limit_len(len) * sizeof(wchar_t), HEAP_ZERO_MEMORY);
}
// ----------------------------------------------------------------------------
inline static void * ReAllocBuffer(void* pdata, const size_t len, bool bZeroMem, bool bInPlace) {
inline static void * ReAllocBuffer(void* pdata, const size_t len, bool bInPlace) {
if (!s_hndlProcessHeap) {
s_hndlProcessHeap = GetProcessHeap();
}
DWORD const dwFlags = (bZeroMem ? HEAP_ZERO_MEMORY : 0) | (bInPlace ? HEAP_REALLOC_IN_PLACE_ONLY : 0);
DWORD const dwFlags = HEAP_ZERO_MEMORY | (bInPlace ? HEAP_REALLOC_IN_PLACE_ONLY : 0);
return ReAllocMemStrg(pdata, limit_len(len) * sizeof(wchar_t), dwFlags);
}
// ----------------------------------------------------------------------------
@ -148,18 +148,16 @@ inline static void FreeBufferW(STRINGW* pstr) {
}
// ----------------------------------------------------------------------------
static void ReAllocW(STRINGW* pstr, size_t len, bool bZeroMem)
static void ReAllocW(STRINGW* pstr, size_t len)
{
len = limit_len(len);
size_t const alloc_len = len + 1;
if (!pstr->data) {
pstr->data = AllocBuffer(alloc_len, bZeroMem);
pstr->data = AllocBuffer(alloc_len);
if (pstr->data) { // init
pstr->alloc_length = LengthOfBuffer(pstr->data);
assert("inconsistent data" && (alloc_len != (pstr->alloc_length * sizeof(wchar_t))));
assert("inconsistent data" && (alloc_len == pstr->alloc_length));
pstr->data_length = 0;
pstr->data[len] = WCHR_NULL; // ensure terminating zero
pstr->data[0] = WCHR_NULL; // ensure empty
}
else {
pstr->alloc_length = 0;
@ -167,17 +165,15 @@ static void ReAllocW(STRINGW* pstr, size_t len, bool bZeroMem)
}
}
else if (pstr->alloc_length < alloc_len) {
pstr->data = ReAllocBuffer(pstr->data, alloc_len, bZeroMem, false);
pstr->data = ReAllocBuffer(pstr->data, alloc_len, false);
pstr->alloc_length = LengthOfBuffer(pstr->data);
assert("inconsistent data 1" && (alloc_len != (pstr->alloc_length * sizeof(wchar_t))));
assert("inconsistent data 1" && (alloc_len == pstr->alloc_length));
/// original memory block is moved, so data_length is not touched
assert("inconsistent data 2" && (alloc_len > pstr->data_length));
pstr->data[pstr->data_length] = WCHR_NULL; // ensure terminating zero
}
else {
if (bZeroMem) {
ZeroMemory(&(pstr->data[pstr->data_length]), (pstr->alloc_length - pstr->data_length) * sizeof(wchar_t));
}
ZeroMemory(&(pstr->data[pstr->data_length]), (pstr->alloc_length - pstr->data_length) * sizeof(wchar_t));
}
}
// ----------------------------------------------------------------------------
@ -187,7 +183,7 @@ static void AllocCopyW(STRINGW* pstr, STRINGW* pDest, size_t copy_len, size_t co
size_t new_len = copy_len + extra_len;
if (0 < new_len)
{
ReAllocW(pDest, new_len, true);
ReAllocW(pDest, new_len);
StringCchCopyNW(pDest->data, pDest->alloc_length, (pstr->data + copy_index), copy_len);
pDest->data_length = StrlenW(pstr->data);
}
@ -196,7 +192,7 @@ static void AllocCopyW(STRINGW* pstr, STRINGW* pDest, size_t copy_len, size_t co
static void SetCopyW(STRINGW* pstr, size_t len, LPCWSTR p)
{
ReAllocW(pstr, len, false);
ReAllocW(pstr, len);
if (pstr->data) {
StringCchCopyNW(pstr->data, pstr->alloc_length, p, len);
pstr->data_length = StrlenW(pstr->data);
@ -210,7 +206,7 @@ static void SetCopyW(STRINGW* pstr, size_t len, LPCWSTR p)
static LPWSTR CopyOldDataW(STRINGW* pstr, size_t* outLen)
{
size_t const old_siz = StrlenW(pstr->data) + 1;
LPWSTR const ptr = AllocBuffer(old_siz, FALSE);
LPWSTR const ptr = AllocBuffer(old_siz);
if (ptr) {
StringCchCopyW(ptr, old_siz, pstr->data ? pstr->data : L"");
*outLen = wcslen(ptr);
@ -225,7 +221,7 @@ static void FreeUnusedData(STRINGW* pstr, size_t keep_length)
{
size_t const new_alloc_len = max_s(keep_length + 1, pstr->data_length + 1);
if ((pstr->alloc_length > new_alloc_len) ) {
pstr->data = ReAllocBuffer(pstr->data, new_alloc_len, true, false);
pstr->data = ReAllocBuffer(pstr->data, new_alloc_len, false);
pstr->alloc_length = LengthOfBuffer(pstr->data);
pstr->data_length = StrlenW(pstr->data);
}
@ -237,7 +233,7 @@ static void CopyConcatW(STRINGW *pstr, size_t len1, LPCWSTR p1, size_t len2, LPC
{
size_t const new_len = len1 + len2;
if (0 < new_len) {
ReAllocW(pstr, new_len, true);
ReAllocW(pstr, new_len);
StringCchCopyNW(pstr->data, pstr->alloc_length, p1, len1);
StringCchCatNW(pstr->data, pstr->alloc_length, p2, len2);
pstr->data_length = StrlenW(pstr->data);
@ -252,7 +248,7 @@ static void ConcatW(STRINGW* pstr, size_t len, LPCWSTR p)
size_t const new_len = pstr->data_length + len;
if (pstr->alloc_length <= new_len) {
ReAllocW(pstr, new_len, true); // copies old data
ReAllocW(pstr, new_len); // copies old data
}
StringCchCatNW(pstr->data, pstr->alloc_length, p, len);
pstr->data_length = StrlenW(pstr->data);
@ -410,7 +406,7 @@ static void FormatW(STRINGW* pstr, LPCWSTR fmt, va_list args)
max_len += item_len;
}
ReAllocW(pstr, max_len, true);
ReAllocW(pstr, max_len);
StringCchVPrintfW(pstr->data, pstr->alloc_length, fmt, orig_list);
pstr->data_length = StrlenW(pstr->data);
@ -429,7 +425,7 @@ static void FormatW(STRINGW* pstr, LPCWSTR fmt, va_list args)
HSTRINGW STRAPI StrgCreate(LPCWSTR str)
{
STRINGW *pstr = AllocBuffer(sizeof(STRINGW), true);
STRINGW *pstr = AllocBuffer(sizeof(STRINGW));
if (!pstr)
return NULL;
if (str)
@ -534,7 +530,7 @@ void STRAPI StrgEmpty(const HSTRINGW hstr, bool truncate)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
return;
}
(pstr->data)[0] = WCHR_NULL;
@ -552,7 +548,7 @@ void STRAPI StrgSetAt(HSTRINGW hstr, const size_t index, const wchar_t ch)
if (!pstr)
return;
if (!(pstr->data)) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
if (index >= pstr->data_length)
{
@ -571,7 +567,7 @@ wchar_t STRAPI StrgGetAt(const HSTRINGW hstr, const size_t index)
if (!pstr)
return WCHR_NULL;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
if (index >= pstr->data_length)
{
@ -632,7 +628,7 @@ size_t STRAPI StrgInsert(HSTRINGW hstr, size_t index, LPCWSTR str)
if (!pstr)
return STRINGW_INVALID_IDX;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
size_t const ins_len = StrlenW(str);
@ -646,7 +642,7 @@ size_t STRAPI StrgInsert(HSTRINGW hstr, size_t index, LPCWSTR str)
new_len += ins_len;
if (pstr->alloc_length <= new_len) {
ReAllocW(pstr, new_len, true);
ReAllocW(pstr, new_len);
}
wmemmove_s((pstr->data + index + ins_len), (pstr->alloc_length - index - ins_len),
(pstr->data + index), (new_len - index - ins_len + 1));
@ -664,14 +660,14 @@ size_t STRAPI StrgInsertCh(HSTRINGW hstr, size_t index, const wchar_t c)
if (!pstr)
return 0;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
size_t const new_len = pstr->data_length + 1;
if (index >= new_len)
index = new_len - 1;
if (pstr->alloc_length <= new_len) {
ReAllocW(pstr, new_len, true);
ReAllocW(pstr, new_len);
}
wmemmove_s((pstr->data + index + 1), (pstr->alloc_length - index - 1),
(pstr->data + index), (new_len - index));
@ -689,7 +685,7 @@ size_t STRAPI StrgReplace(HSTRINGW hstr, LPCWSTR pOld, LPCWSTR pNew)
if (!pstr)
return 0;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
size_t const src_len = StrlenW(pOld);
@ -718,7 +714,7 @@ size_t STRAPI StrgReplace(HSTRINGW hstr, LPCWSTR pOld, LPCWSTR pNew)
size_t const new_len = old_len + (repl_len - src_len) * count;
if (pstr->alloc_length <= new_len) {
ReAllocW(pstr, new_len, true);
ReAllocW(pstr, new_len);
}
start = pstr->data;
end = pstr->data + pstr->data_length;
@ -757,7 +753,7 @@ size_t STRAPI StrgReplaceCh(HSTRINGW hstr, const wchar_t chOld, const wchar_t ch
if (!pstr)
return 0;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
size_t count = 0;
@ -786,7 +782,7 @@ size_t STRAPI StrgRemoveCh(HSTRINGW hstr, const wchar_t chRemove)
if (!pstr)
return 0;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
LPWSTR source = pstr->data;
@ -819,7 +815,7 @@ size_t STRAPI StrgDelete(HSTRINGW hstr, const size_t index, size_t count)
if (!pstr)
return 0;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
size_t const len = pstr->data_length;
@ -849,7 +845,7 @@ int STRAPI StrgResetFromUTF8(HSTRINGW hstr, const char* str)
if (!pstr || !str)
return -1;
int const len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0) + 1;
ReAllocW(pstr, len, true);
ReAllocW(pstr, len);
int const res = MultiByteToWideChar(CP_UTF8, 0, str, -1, pstr->data, (int)pstr->alloc_length);
pstr->data_length = StrlenW(pstr->data);
return res;
@ -863,7 +859,7 @@ void STRAPI StrgToUpper(HSTRINGW hstr)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
if (pstr->data)
_wcsupr_s(pstr->data, pstr->data_length);
@ -877,7 +873,7 @@ void STRAPI StrgToLower(HSTRINGW hstr)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
if (pstr->data)
_wcslwr_s(pstr->data, pstr->data_length);
@ -891,7 +887,7 @@ void STRAPI StrgReverse(HSTRINGW hstr)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
_wcsrev(pstr->data);
}
@ -904,7 +900,7 @@ void STRAPI StrgTrimRight(HSTRINGW hstr, const wchar_t wch)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
LPWSTR start = pstr->data;
@ -937,7 +933,7 @@ void STRAPI StrgTrimLeft(HSTRINGW hstr, const wchar_t wch)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
LPWSTR start = pstr->data;
@ -1026,7 +1022,7 @@ HSTRINGW STRAPI StrgMid(HSTRINGW hstr, const size_t start, size_t count)
if (!pstr)
return NULL;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
if (start + count > pstr->data_length)
@ -1056,7 +1052,7 @@ HSTRINGW STRAPI StrgLeft(HSTRINGW hstr, const size_t count)
if (!pstr)
return NULL;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
HSTRINGW hCopy = StrgCreate(NULL);
@ -1078,7 +1074,7 @@ HSTRINGW STRAPI StrgRight(HSTRINGW hstr, const size_t count)
if (!pstr)
return NULL;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
HSTRINGW hCopy = StrgCreate(NULL);
@ -1115,7 +1111,7 @@ LPWSTR STRAPI StrgWriteAccessBuf(HSTRINGW hstr, size_t min_len)
return NULL;
if (pstr->alloc_length <= min_len) {
ReAllocW(pstr, min_len, true);
ReAllocW(pstr, min_len);
}
return pstr->data;
}
@ -1127,15 +1123,13 @@ void STRAPI StrgSanitize(HSTRINGW hstr)
if (!pstr)
return;
if (!pstr->data) {
ReAllocW(pstr, 0, true);
ReAllocW(pstr, 0);
}
// ensure buffer limits
pstr->alloc_length = LengthOfBuffer(pstr->data);
ptrdiff_t const end = (ptrdiff_t)pstr->alloc_length - 1;
if (end >= 0) {
if (pstr->data)
pstr->data[end] = WCHR_NULL; // terminating zero
}
size_t const buflen = LengthOfBuffer(pstr->data);
if (pstr->data && (buflen > 0))
pstr->data[buflen - 1] = WCHR_NULL;
pstr->alloc_length = buflen;
pstr->data_length = StrlenW(pstr->data);
}
// --------------------------------------------------------------------------

View File

@ -161,7 +161,7 @@ static int msgcmp(void* mqc1, void* mqc2)
return 1;
}
static int64_t sortcmp(void *mqc1, void *mqc2) {
static LONG64 sortcmp(void *mqc1, void *mqc2) {
const CmdMessageQueue_t *const pMQC1 = (CmdMessageQueue_t *)mqc1;
const CmdMessageQueue_t *const pMQC2 = (CmdMessageQueue_t *)mqc2;
return (pMQC1->delay - pMQC2->delay);
@ -5242,7 +5242,7 @@ void EditSortLines(HWND hwnd, int iSortFlags)
qsort(pLines, iLineCount, sizeof(SORTLINE), CmpStdRev);
}
} else { /*if (iSortFlags & SORT_SHUFFLE)*/
srand((UINT)GetTicks());
srand((UINT)GetTicks_ms());
for (DocLn i = (iLineCount - 1); i > 0; --i) {
int j = rand() % i;
SORTLINE sLine = { NULL, NULL };
@ -9682,17 +9682,17 @@ void EditToggleFolds(FOLD_ACTION action, bool bForceAll)
void EditFoldClick(DocLn ln, int mode)
{
static struct {
DocLn ln;
int mode;
int64_t iTickCount;
DocLn ln;
int mode;
LONG64 iTickCount;
} prev = { 0, 0, 0 };
bool fGotoFoldPoint = mode & FOLD_SIBLINGS;
if (!(SciCall_GetFoldLevel(ln) & SC_FOLDLEVELHEADERFLAG)) {
// Not a fold point: need to look for a double-click
if (prev.ln == ln && prev.mode == mode &&
GetTicks() - prev.iTickCount <= GetDoubleClickTime()) {
if ((prev.ln == ln) && (prev.mode == mode) &&
((GetTicks_ms() - prev.iTickCount) <= GetDoubleClickTime())) {
prev.ln = NOT_FOUND_LN; // Prevent re-triggering on a triple-click
ln = SciCall_GetFoldParent(ln);
@ -9706,7 +9706,7 @@ void EditFoldClick(DocLn ln, int mode)
// Save the info needed to match this click with the next click
prev.ln = ln;
prev.mode = mode;
prev.iTickCount = GetTicks();
prev.iTickCount = GetTicks_ms();
return;
}
}

View File

@ -63,12 +63,12 @@
#define DEFAULT_ALLOC_FLAGS (HEAP_CREATE_HARDENED)
#endif
inline LPVOID AllocMem(size_t numBytes, DWORD dwFlags)
static inline LPVOID AllocMem(size_t numBytes, DWORD dwFlags)
{
return HeapAlloc(Globals.hndlProcessHeap, (dwFlags | DEFAULT_ALLOC_FLAGS), numBytes);
}
inline LPVOID ReAllocMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
static inline LPVOID ReAllocMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
{
if (lpMem) {
return HeapReAlloc(Globals.hndlProcessHeap, (dwFlags | DEFAULT_ALLOC_FLAGS), lpMem, numBytes);
@ -76,7 +76,7 @@ inline LPVOID ReAllocMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
return HeapAlloc(Globals.hndlProcessHeap, (dwFlags | DEFAULT_ALLOC_FLAGS), numBytes);
}
inline LPVOID ReAllocGrowMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
static inline LPVOID ReAllocGrowMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
{
if (lpMem) {
size_t const memSize = HeapSize(Globals.hndlProcessHeap, 0, lpMem);
@ -91,12 +91,12 @@ inline LPVOID ReAllocGrowMem(LPVOID lpMem, size_t numBytes, DWORD dwFlags)
return HeapAlloc(Globals.hndlProcessHeap, (dwFlags | DEFAULT_ALLOC_FLAGS), numBytes);
}
inline bool FreeMem(LPVOID lpMem)
static inline bool FreeMem(LPVOID lpMem)
{
return (lpMem ? HeapFree(Globals.hndlProcessHeap, 0, lpMem) : true);
}
inline size_t SizeOfMem(LPCVOID lpMem)
static inline size_t SizeOfMem(LPCVOID lpMem)
{
return (lpMem ? HeapSize(Globals.hndlProcessHeap, 0, lpMem) : 0);
}
@ -207,7 +207,7 @@ __forceinline bool IsAsyncKeyDown(int key) {
// ----------------------------------------------------------------------------
inline DWORD GetNumberOfProcessors()
static inline DWORD GetNumberOfProcessors()
{
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
@ -216,13 +216,14 @@ inline DWORD GetNumberOfProcessors()
// ----------------------------------------------------------------------------
inline bool Str2Int(LPCWSTR str, int *value) {
__forceinline bool Str2Int(LPCWSTR str, int* value)
{
LPWSTR end;
*value = (int)wcstol(str, &end, 10);
return (str != end);
}
inline bool Str2Float(LPCWSTR str, float* value)
__forceinline bool Str2Float(LPCWSTR str, float* value)
{
LPWSTR end;
*value = (float)wcstod(str, &end);
@ -298,7 +299,7 @@ __forceinline bool StrIsEmptyW(LPCWSTR s) {
//inline COLORREF GetBackgroundColor(HWND hwnd) { return GetBkColor(GetDC(hwnd)); }
inline int SetModeBkColor(const HDC hdc, const bool bDarkMode)
static inline int SetModeBkColor(const HDC hdc, const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
return SetBkColor(hdc, bDarkMode ? Settings2.DarkModeBkgColor : GetSysColor(COLOR_WINDOW));
@ -308,7 +309,7 @@ inline int SetModeBkColor(const HDC hdc, const bool bDarkMode)
#endif
}
inline int SetModeBtnFaceColor(const HDC hdc, const bool bDarkMode)
static inline int SetModeBtnFaceColor(const HDC hdc, const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
return SetBkColor(hdc, bDarkMode ? Settings2.DarkModeBtnFaceColor : GetSysColor(COLOR_BTNFACE));
@ -318,7 +319,7 @@ inline int SetModeBtnFaceColor(const HDC hdc, const bool bDarkMode)
#endif
}
inline COLORREF GetModeBkColor(const bool bDarkMode)
static inline COLORREF GetModeBkColor(const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
return bDarkMode ? Settings2.DarkModeBkgColor : (COLORREF)GetSysColor(COLOR_WINDOW);
@ -328,7 +329,7 @@ inline COLORREF GetModeBkColor(const bool bDarkMode)
#endif
}
inline COLORREF GetModeBtnfaceColor(const bool bDarkMode)
static inline COLORREF GetModeBtnfaceColor(const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
return bDarkMode ? Settings2.DarkModeBtnFaceColor : (COLORREF)GetSysColor(COLOR_BTNFACE);
@ -339,7 +340,7 @@ inline COLORREF GetModeBtnfaceColor(const bool bDarkMode)
}
inline int SetModeTextColor(const HDC hdc, const bool bDarkMode)
static inline int SetModeTextColor(const HDC hdc, const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
//return SetTextColor(hdc, bDarkMode ? Settings2.DarkModeTxtColor : GetSysColor(COLOR_WINDOWTEXT));
@ -350,7 +351,7 @@ inline int SetModeTextColor(const HDC hdc, const bool bDarkMode)
#endif
}
inline COLORREF GetModeTextColor(const bool bDarkMode)
static inline COLORREF GetModeTextColor(const bool bDarkMode)
{
#ifdef D_NP3_WIN10_DARK_MODE
//return bDarkMode ? Settings2.DarkModeTxtColor : (COLORREF)GetSysColor(COLOR_WINDOWTEXT);
@ -364,7 +365,7 @@ inline COLORREF GetModeTextColor(const bool bDarkMode)
#ifdef D_NP3_WIN10_DARK_MODE
inline INT_PTR SetDarkModeCtlColors(const HDC hdc, const bool bDarkMode)
static inline INT_PTR SetDarkModeCtlColors(const HDC hdc, const bool bDarkMode)
{
if (bDarkMode) {
SetBkColor(hdc, Settings2.DarkModeBkgColor);
@ -390,7 +391,7 @@ bool SetClipboardText(HWND hwnd, LPCWSTR pszTextW, size_t cchTextW);
// ----------------------------------------------------------------------------
inline void GetCurrentMonitorResolution(HWND hwnd, int* pCXScreen, int* pCYScreen)
static inline void GetCurrentMonitorResolution(HWND hwnd, int* pCXScreen, int* pCYScreen)
{
HMONITOR const hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFO mi = { sizeof(MONITORINFO) };
@ -400,7 +401,7 @@ inline void GetCurrentMonitorResolution(HWND hwnd, int* pCXScreen, int* pCYScree
}
// FullHD? => 0:'==', -1:'<', +1:'>'
inline int IsFullHD(HWND hwnd, int resX, int resY)
static inline int IsFullHD(HWND hwnd, int resX, int resY)
{
int cxScreen, cyScreen;
GetCurrentMonitorResolution(hwnd, &cxScreen, &cyScreen);
@ -427,10 +428,10 @@ void BackgroundWorker_Start(BackgroundWorker* worker, _beginthreadex_proc
void BackgroundWorker_Cancel(BackgroundWorker* worker);
void BackgroundWorker_Destroy(BackgroundWorker* worker);
inline bool BackgroundWorker_Continue(BackgroundWorker* worker) {
static inline bool BackgroundWorker_Continue(BackgroundWorker* worker) {
return (worker) ? (WaitForSingleObject(worker->eventCancel, 0) != WAIT_OBJECT_0) : false;
}
inline void BackgroundWorker_End(BackgroundWorker* worker, unsigned int retcode) { if (worker) { _endthreadex(retcode); }}
static inline void BackgroundWorker_End(BackgroundWorker* worker, unsigned int retcode) { if (worker) { _endthreadex(retcode); }}
bool BitmapMergeAlpha(HBITMAP hbmp,COLORREF crDest);
@ -445,15 +446,15 @@ bool IsCmdEnabled(HWND hwnd, UINT uId);
#define SetBtn(b) ((b) ? BST_CHECKED : BST_UNCHECKED)
inline bool IsButtonChecked(HWND hwnd, int iButtonID)
__forceinline bool IsButtonChecked(HWND hwnd, int iButtonID)
{
return (IsDlgButtonChecked(hwnd, iButtonID) == BST_CHECKED);
}
inline bool IsButtonIntermediate(HWND hwnd, int iButtonID)
__forceinline bool IsButtonIntermediate(HWND hwnd, int iButtonID)
{
return (IsDlgButtonChecked(hwnd, iButtonID) == BST_INDETERMINATE);
}
inline bool IsButtonUnchecked(HWND hwnd, int iButtonID)
__forceinline bool IsButtonUnchecked(HWND hwnd, int iButtonID)
{
return (IsDlgButtonChecked(hwnd, iButtonID) == BST_UNCHECKED);
}
@ -478,7 +479,7 @@ bool SplitFilePathLineNum(LPWSTR lpszPath, int *lineNum);
bool StrLTrimI(LPWSTR pszSource,LPCWSTR pszTrimChars);
bool StrRTrimI(LPWSTR pszSource,LPCWSTR pszTrimChars);
inline bool TrimSpcA(LPSTR lpString)
static inline bool TrimSpcA(LPSTR lpString)
{
if (!lpString || !*lpString) {
return false;
@ -486,7 +487,7 @@ inline bool TrimSpcA(LPSTR lpString)
return (bool)StrTrimA(lpString, " \t\v");
};
inline bool TrimSpcW(LPWSTR lpString)
static inline bool TrimSpcW(LPWSTR lpString)
{
if (!lpString || !*lpString) {
return false;
@ -577,29 +578,29 @@ __forceinline ptrdiff_t MultiByteToWideCharEx(
// ============================================================================
inline int wcscmp_s(const wchar_t* s1, const wchar_t* s2)
__forceinline int wcscmp_s(const wchar_t* s1, const wchar_t* s2)
{
return (s1 && s2) ? wcscmp(s1, s2) : ((s1 ? 1 : (s2 ? -1 : 0)));
}
inline int wcscoll_s(const wchar_t* s1, const wchar_t* s2)
__forceinline int wcscoll_s(const wchar_t* s1, const wchar_t* s2)
{
return (s1 && s2) ? wcscoll(s1, s2) : ((s1 ? 1 : (s2 ? -1 : 0)));
}
inline int wcsicmp_s(const wchar_t* s1, const wchar_t* s2)
__forceinline int wcsicmp_s(const wchar_t* s1, const wchar_t* s2)
{
return (s1 && s2) ? _wcsicmp(s1, s2) : ((s1 ? 1 : (s2 ? -1 : 0)));
}
inline int wcsicoll_s(const wchar_t* s1, const wchar_t* s2)
__forceinline int wcsicoll_s(const wchar_t* s1, const wchar_t* s2)
{
return (s1 && s2) ? _wcsicoll(s1, s2) : ((s1 ? 1 : (s2 ? -1 : 0)));
}
// ============================================================================
inline void SwabEx(char* src, char* dest, size_t n)
static inline void SwabEx(char* src, char* dest, size_t n)
{
static int const max = (INT_MAX - (INT_MAX % 2));
@ -658,7 +659,7 @@ bool StrDelChrA(LPSTR pszSource, LPCSTR pCharsToRemove);
// inline size_t StringCchLenW(LPCWSTR s, size_t n) {
// n = (n ? n : STRSAFE_MAX_CCH); size_t len; return (size_t)(!s ? 0 : (SUCCEEDED(StringCchLengthW(s, n, &len)) ? len : n));
// }
inline size_t StringCchLenW(LPCWSTR s, size_t n)
static inline size_t StringCchLenW(LPCWSTR s, size_t n)
{
n = (n ? n : STRSAFE_MAX_CCH);
return (s ? wcsnlen_s(s, n) : 0LL);
@ -666,7 +667,7 @@ inline size_t StringCchLenW(LPCWSTR s, size_t n)
// inline size_t StringCchLenA(LPCSTR s, size_t n) {
// n = (n ? n : STRSAFE_MAX_CCH); size_t len; return (size_t)(!s ? 0 : (SUCCEEDED(StringCchLengthA(s, n, &len)) ? len : n));
// }
inline size_t StringCchLenA(LPCSTR s, size_t n)
static inline size_t StringCchLenA(LPCSTR s, size_t n)
{
n = (n ? n : STRSAFE_MAX_CCH);
return (s ? strnlen_s(s, n) : 0LL);
@ -679,12 +680,12 @@ inline size_t StringCchLenA(LPCSTR s, size_t n)
// ----------------------------------------------------------------------------
inline WCHAR* StrEndW(const WCHAR* pStart, size_t siz)
static inline WCHAR* StrEndW(const WCHAR* pStart, size_t siz)
{
// cppcheck-suppress cert-EXP05-C // Attempt to cast away const - Intended(!)
return (WCHAR*)(pStart + StringCchLenW(pStart, siz));
}
inline char* StrEndA(const char* pStart, size_t siz)
static inline char* StrEndA(const char* pStart, size_t siz)
{
// cppcheck-suppress cert-EXP05-C // Attempt to cast away const - Intended(!)
return (char*)(pStart + StringCchLenA(pStart, siz));
@ -697,7 +698,7 @@ inline char* StrEndA(const char* pStart, size_t siz)
// ----------------------------------------------------------------------------
inline void StrReplChrW(WCHAR* pStrg, const WCHAR chSearch, const WCHAR chReplace)
static inline void StrReplChrW(WCHAR* pStrg, const WCHAR chSearch, const WCHAR chReplace)
{
while (pStrg && *pStrg) {
if (*pStrg == chSearch) {
@ -706,7 +707,7 @@ inline void StrReplChrW(WCHAR* pStrg, const WCHAR chSearch, const WCHAR chReplac
++pStrg;
}
}
inline void StrReplChrA(CHAR* pStrg, const CHAR chSearch, const CHAR chReplace)
static inline void StrReplChrA(CHAR* pStrg, const CHAR chSearch, const CHAR chReplace)
{
while (pStrg && *pStrg) {
if (*pStrg == chSearch) {
@ -781,29 +782,35 @@ inline void StrReplChrA(CHAR* pStrg, const CHAR chSearch, const CHAR chReplace)
#define IsOctalDigitW(wch) (((wch) >= L'0') && ((wch) <= L'7'))
// Is the character an octal digit?
inline bool IsDigitA(const char ch) {
__forceinline bool IsDigitA(const char ch)
{
return ((ch >= '0') && (ch <= '9'));
}
inline bool IsDigitW(const WCHAR wch) {
__forceinline bool IsDigitW(const WCHAR wch)
{
return ((wch >= L'0') && (wch <= L'9'));
}
// Is the character a white space char?
inline bool IsBlankCharA(const char ch) {
__forceinline bool IsBlankCharA(const char ch)
{
return ((ch == ' ') || (ch == '\t'));
}
inline bool IsBlankCharW(const WCHAR wch) {
__forceinline bool IsBlankCharW(const WCHAR wch)
{
return ((wch == L' ') || (wch == L'\t'));
}
// no encoding for safe chars
inline bool IsAlphaNumericA(const char ch) {
__forceinline bool IsAlphaNumericA(const char ch)
{
return ((ch >= '0') && (ch <= '9')) ||
((ch >= 'a') && (ch <= 'z')) ||
((ch >= 'A') && (ch <= 'Z'));
}
inline bool IsAlphaNumericW(const WCHAR ch) {
__forceinline bool IsAlphaNumericW(const WCHAR ch)
{
return
((ch >= L'0') && (ch <= L'9')) ||
((ch >= L'a') && (ch <= L'z')) ||
@ -811,7 +818,7 @@ inline bool IsAlphaNumericW(const WCHAR ch) {
}
// If the character is an hexadecimal digit, get its value.
inline int GetHexDigitA(const char ch)
static inline int GetHexDigitA(const char ch)
{
if (ch >= '0' && ch <= '9') {
return ch - '0';
@ -825,7 +832,7 @@ inline int GetHexDigitA(const char ch)
return -1;
}
inline int GetHexDigitW(const WCHAR ch)
static inline int GetHexDigitW(const WCHAR ch)
{
if (ch >= L'0' && ch <= L'9') {
return ch - L'0';
@ -855,24 +862,23 @@ void CloseApplication();
// ----------------------------------------------------------------------------
inline int PointSizeToFontHeight(const float fPtHeight, const HDC hdc) {
static inline int PointSizeToFontHeight(const float fPtHeight, const HDC hdc) {
return -MulDiv(f2int(fPtHeight * 100.0f), GetDeviceCaps(hdc, LOGPIXELSY), 72 * SC_FONT_SIZE_MULTIPLIER);
}
// ----------------------------------------------------------------------------
static inline int64_t GetTicks() {
LARGE_INTEGER ticks;
if (!QueryPerformanceCounter(&ticks)) {
return (int64_t)GetTickCount64();
}
static inline LONG64 GetTicks_ms() {
LARGE_INTEGER freq;
if (!QueryPerformanceFrequency(&freq)) {
return (int64_t)GetTickCount64();
return (LONG64)GetTickCount64();
}
ticks.QuadPart *= 1000000;
ticks.QuadPart /= freq.QuadPart;
return ticks.QuadPart;
LARGE_INTEGER ticks;
if (!QueryPerformanceCounter(&ticks)) {
return (LONG64)GetTickCount64();
}
return (ticks.QuadPart * 1000LL) / freq.QuadPart;
}
// ----------------------------------------------------------------------------

View File

@ -155,7 +155,7 @@ static int s_iAlignMode = 0;
static bool s_bIsAppThemed = true;
static UINT s_msgTaskbarCreated = 0;
static WCHAR s_wchTitleExcerpt[MIDSZ_BUFFER] = { L'\0' };
static int64_t s_iLastCopyTime = 0;
static LONG64 s_iLastCopyTime = 0;
static bool s_bLastCopyFromMe = false;
static bool s_bInMultiEditMode = false;
static bool s_bCallTipEscDisabled = false;
@ -445,8 +445,8 @@ static inline void _SplitUndoTransaction()
// ----------------------------------------------------------------------------
static void _DelayClearCallTip(const int64_t delay);
static void _DelaySplitUndoTransaction(const int64_t delay);
static void _DelayClearCallTip(const LONG64 delay);
static void _DelaySplitUndoTransaction(const LONG64 delay);
static void _RestoreActionSelection(const LONG token, DoAction doAct);
// ----------------------------------------------------------------------------
@ -527,7 +527,7 @@ static int msgcmp(void* mqc1, void* mqc2)
#define _MQ_ms2cycl(T) (((T) + USER_TIMER_MINIMUM) / _MQ_TIMER_CYCLE)
static void _MQ_AppendCmd(CmdMessageQueue_t* const pMsgQCmd, int64_t cycles)
static void _MQ_AppendCmd(CmdMessageQueue_t* const pMsgQCmd, LONG64 cycles)
{
if (!pMsgQCmd) { return; }
@ -622,7 +622,7 @@ static inline bool IsFileDeletedFlagSet() {
return (WaitForSingleObject(s_FileChgObsvrData.hEventFileDeleted, 0) != WAIT_TIMEOUT);
}
static inline bool HasCurrentFileChanged() {
static inline bool RaiseFlagIfCurrentFileChanged() {
if (Path_IsEmpty(Paths.CurrentFile)) {
return false;
@ -804,7 +804,6 @@ static void _InitGlobals()
FocusedView.CodeFoldingAvailable = false;
FocusedView.ShowCodeFolding = true;
FileWatching.flagChangeNotify = FWM_DONT_CARE;
FileWatching.FileWatchingMode = FWM_DONT_CARE;
FileWatching.MonitoringLog = false;
@ -1521,7 +1520,7 @@ static BOOL CALLBACK _EnumWndProc(HWND hwnd, LPARAM lParam)
if (StringCchCompareNIW(szClassName, COUNTOF(szClassName), s_wchWndClass, COUNTOF(s_wchWndClass)) == 0) {
UINT const iReuseLock = GetDlgItemInt(hwnd, IDC_REUSELOCK, NULL, FALSE);
if ((GetTicks() - iReuseLock) >= REUSEWINDOWLOCKTIMEOUT) {
if ((GetTicks_ms() - iReuseLock) >= REUSEWINDOWLOCKTIMEOUT) {
*(HWND*)lParam = hwnd;
@ -1549,7 +1548,7 @@ static BOOL CALLBACK _EnumWndProc2(HWND hwnd, LPARAM lParam)
if (StringCchCompareNIW(szClassName, COUNTOF(szClassName), s_wchWndClass, COUNTOF(s_wchWndClass)) == 0) {
UINT const iReuseLock = GetDlgItemInt(hwnd, IDC_REUSELOCK, NULL, FALSE);
if ((GetTicks() - iReuseLock) >= REUSEWINDOWLOCKTIMEOUT) {
if ((GetTicks_ms() - iReuseLock) >= REUSEWINDOWLOCKTIMEOUT) {
if (IsWindowEnabled(hwnd)) {
bContinue = FALSE;
@ -1835,11 +1834,24 @@ HWND InitInstance(const HINSTANCE hInstance, int nCmdShow)
// Source Encoding
Encoding_Forced(s_flagSetEncoding);
switch (s_flagChangeNotify) {
case FWM_DONT_CARE:
case FWM_INDICATORSILENT:
case FWM_MSGBOX:
case FWM_AUTORELOAD:
case FWM_EXCLUSIVELOCK:
FileWatching.FileWatchingMode = s_flagChangeNotify;
break;
case FWM_NO_INIT:
default:
FileWatching.FileWatchingMode = Settings.FileWatchingMode;
break;
}
// Initial FileLoad() moved in front of ShowWindow()
bool bOpened = false;
// Pathname parameter
if (s_IsThisAnElevatedRelaunch || (Path_IsNotEmpty(s_pthArgFilePath) /*&& !g_flagNewFromClipboard*/))
{
fLoadFlags |= Settings.SkipUnicodeDetection ? FLF_SkipUnicodeDetect : 0;
@ -1890,26 +1902,6 @@ HWND InitInstance(const HINSTANCE hInstance, int nCmdShow)
Path_Empty(s_pthArgFilePath, false);
if (bOpened) {
switch (s_flagChangeNotify) {
case FWM_NO_INIT:
FileWatching.FileWatchingMode = Settings.FileWatchingMode;
break;
case FWM_DONT_CARE:
case FWM_INDICATORSILENT:
case FWM_MSGBOX:
case FWM_AUTORELOAD:
case FWM_EXCLUSIVELOCK:
FileWatching.FileWatchingMode = s_flagChangeNotify;
break;
default:
FileWatching.FileWatchingMode = FWM_MSGBOX;
break;
}
if (!s_IsThisAnElevatedRelaunch) {
InstallFileWatching(true);
}
}
} else {
cpi_enc_t const forcedEncoding = Encoding_Forced(CPI_GET);
if (Encoding_IsValid(forcedEncoding)) {
@ -2204,7 +2196,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case WM_DRAWCLIPBOARD:
if (!s_bLastCopyFromMe) {
s_iLastCopyTime = GetTicks();
s_iLastCopyTime = GetTicks_ms();
} else {
s_bLastCopyFromMe = false;
}
@ -2758,7 +2750,7 @@ LRESULT MsgCreate(HWND hwnd, WPARAM wParam,LPARAM lParam)
hInstance,
NULL);
SetDlgItemInt(hwnd,IDC_REUSELOCK,(UINT)GetTicks(),false);
SetDlgItemInt(hwnd,IDC_REUSELOCK,(UINT)GetTicks_ms(),false);
// Menu
//~SetMenuDefaultItem(GetSubMenu(GetMenu(hwnd),0),0);
@ -3678,7 +3670,7 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam)
// Reset Change Notify
//bPendingChangeNotify = false;
SetDlgItemInt(hwnd, IDC_REUSELOCK, (UINT)GetTicks(), false);
SetDlgItemInt(hwnd, IDC_REUSELOCK, (UINT)GetTicks_ms(), false);
if (pcds->dwData == DATA_NOTEPAD3_PARAMS) {
LPnp3params const params = AllocMem(pcds->cbData, HEAP_ZERO_MEMORY);
@ -3712,15 +3704,20 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam)
}
if (bOpened) {
if (params->flagChangeNotify == FWM_MSGBOX) {
FileWatching.FileWatchingMode = FWM_DONT_CARE;
FileWatching.FileWatchingMode = FWM_MSGBOX;
InstallFileWatching(true);
} else if (params->flagChangeNotify == FWM_AUTORELOAD) {
if (!FileWatching.MonitoringLog) {
}
else if (params->flagChangeNotify == FWM_AUTORELOAD) {
if (FileWatching.MonitoringLog) {
PostWMCommand(Globals.hwndMain, IDM_VIEW_CHASING_DOCTAIL);
} else {
FileWatching.FileWatchingMode = FWM_AUTORELOAD;
InstallFileWatching(true);
}
else {
FileWatching.FileWatchingMode = FWM_AUTORELOAD;
}
InstallFileWatching(true);
}
else if (params->flagChangeNotify == FWM_INDICATORSILENT) {
InstallFileWatching(true);
}
if (params->flagSetEncoding != CPI_NONE) {
@ -3920,69 +3917,6 @@ LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
return (imenu != MNU_NONE) ? !0 : 0;
}
//=============================================================================
//
// MsgFileChangeNotify() - Handles WM_FILECHANGEDNOTIFY
//
LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
SET_FCT_GUARD(TRUE);
InstallFileWatching(false); // terminate
DocPos const iCurPos = SciCall_GetCurrentPos();
if ((FileWatching.FileWatchingMode == FWM_MSGBOX) || IsSaveNeeded()) {
SetForegroundWindow(hwnd);
}
if (Path_IsExistingFile(Paths.CurrentFile)) {
bool bRevertFile = ((FileWatching.FileWatchingMode == FWM_AUTORELOAD) && !IsSaveNeeded());
if (!bRevertFile) {
if (FileWatching.FileWatchingMode == FWM_MSGBOX) {
bRevertFile = IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_FILECHANGENOTIFY));
} else {
// FWM_INDICATORSILENT: nothing todo here
}
}
if (bRevertFile) {
FileRevert(Paths.CurrentFile, false);
if (FileWatching.MonitoringLog) {
SciCall_SetReadOnly(FileWatching.MonitoringLog);
} else {
Sci_GotoPosChooseCaret(iCurPos);
}
Sci_ScrollSelectionToView();
}
} else { // file has been deleted
if (FileWatching.FileWatchingMode == FWM_MSGBOX) {
if (IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_FILECHANGENOTIFY2))) {
FileSave(FSF_SaveAlways);
} else {
SetSaveNeeded(true);
}
} else {
// FWM_INDICATORSILENT: nothing todo here
SetSaveNeeded(true);
}
}
InstallFileWatching(true);
RESET_FCT_GUARD();
return TRUE;
}
//=============================================================================
//
// MsgTrayMessage() - Handles WM_TRAYMESSAGE
@ -4657,15 +4591,17 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case IDM_FILE_REVERT:
if (IsSaveNeeded()) {
if (!IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONQUESTION, NULL, IDS_MUI_ASK_REVERT))) {
break;
if (!FileWatching.MonitoringLog) {
if (IsSaveNeeded()) {
if (!IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONQUESTION, NULL, IDS_MUI_ASK_REVERT))) {
break;
}
//~ don't revert if no save needed
//~FileRevert(Paths.CurrentFile, false);
}
//~ don't revert if no save needed
//~FileRevert(Paths.CurrentFile, false);
// revert in any case (manually forced)
FileRevert(Paths.CurrentFile, true);
}
// revert in any case (manually forced)
FileRevert(Paths.CurrentFile, true);
break;
@ -6268,12 +6204,14 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
break;
case IDM_VIEW_CHASING_DOCTAIL: {
InstallFileWatching(false);
static FILE_WATCHING_MODE _saveChgNotify = FWM_NO_INIT;
if (_saveChgNotify == FWM_NO_INIT) {
_saveChgNotify = FileWatching.FileWatchingMode;
}
FileWatching.MonitoringLog = !FileWatching.MonitoringLog; // toggle
FileWatching.flagChangeNotify = s_flagChangeNotify;
SciCall_SetReadOnly(FileWatching.MonitoringLog);
if (FileWatching.MonitoringLog) {
@ -6281,7 +6219,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
SendWMCommand(hwnd, IDM_FILE_REVERT);
_saveChgNotify = FileWatching.FileWatchingMode;
FileWatching.FileWatchingMode = FWM_AUTORELOAD;
FileWatching.FileCheckInterval = 250LL;
FileWatching.FileCheckInterval = MIN_FC_POLL_INTERVAL << 2;
SciCall_SetEndAtLastLine(false);
} else {
FileWatching.FileWatchingMode = _saveChgNotify;
@ -8626,7 +8564,7 @@ inline static LRESULT _MsgNotifyLean(const SCNotification *const scn, bool* bMod
}
}
if (*bModified) {
int64_t const timeout = Settings2.UndoTransactionTimeout;
LONG64 const timeout = Settings2.UndoTransactionTimeout;
if (timeout != 0LL) {
if (!bInUndoRedoStep) {
_DelaySplitUndoTransaction(max_ll(_MQ_IMMEDIATE, timeout));
@ -8648,7 +8586,9 @@ inline static LRESULT _MsgNotifyLean(const SCNotification *const scn, bool* bMod
EditToggleView(Globals.hwndEdit);
}
else {
if (!IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONINFORMATION, L"QuietKeepReadonlyLock", IDS_MUI_DOCUMENT_READONLY))) {
if (!FileWatching.MonitoringLog
&& !IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONINFORMATION, L"QuietKeepReadonlyLock", IDS_MUI_DOCUMENT_READONLY)))
{
SendWMCommand(Globals.hwndMain, IDM_VIEW_READONLY);
}
else {
@ -9732,7 +9672,7 @@ static void _DelayUpdateStatusbar(const int delay, const bool bForceRedraw)
//
// _DelayUpdateToolbar()
//
static void _DelayUpdateToolbar(const int64_t delay)
static void _DelayUpdateToolbar(const LONG64 delay)
{
CmdMessageQueue_t mqc = MQ_WM_CMD_INIT(Globals.hwndMain, IDT_TIMER_UPDATE_TOOLBAR, 0LL);
_MQ_AppendCmd(&mqc, _MQ_ms2cycl(delay));
@ -9743,7 +9683,7 @@ static void _DelayUpdateToolbar(const int64_t delay)
//
// _DelayUpdateTitlebar()
//
static void _DelayUpdateTitlebar(const int64_t delay, const HWND hwnd)
static void _DelayUpdateTitlebar(const LONG64 delay, const HWND hwnd)
{
CmdMessageQueue_t mqc = MQ_WM_CMD_INIT(Globals.hwndMain, IDT_TIMER_UPDATE_TITLEBAR, (LPARAM)hwnd);
_MQ_AppendCmd(&mqc, _MQ_ms2cycl(delay));
@ -9754,7 +9694,7 @@ static void _DelayUpdateTitlebar(const int64_t delay, const HWND hwnd)
//
// _DelayClearCallTip()
//
static void _DelayClearCallTip(const int64_t delay)
static void _DelayClearCallTip(const LONG64 delay)
{
CmdMessageQueue_t mqc = MQ_WM_CMD_INIT(Globals.hwndMain, IDT_TIMER_CLEAR_CALLTIP, 0LL);
_MQ_AppendCmd(&mqc, _MQ_ms2cycl(delay));
@ -9765,7 +9705,7 @@ static void _DelayClearCallTip(const int64_t delay)
//
// _DelaySplitUndoTransaction()
//
static void _DelaySplitUndoTransaction(const int64_t delay)
static void _DelaySplitUndoTransaction(const LONG64 delay)
{
CmdMessageQueue_t mqc = MQ_WM_CMD_INIT(Globals.hwndMain, IDT_TIMER_UNDO_TRANSACTION, 0);
_MQ_AppendCmd(&mqc, _MQ_ms2cycl(delay));
@ -9776,10 +9716,10 @@ static void _DelaySplitUndoTransaction(const int64_t delay)
//
// MarkAllOccurrences()
//
void MarkAllOccurrences(const int64_t delay, const bool bForceClear)
void MarkAllOccurrences(const LONG64 delay, const bool bForceClear)
{
CmdMessageQueue_t mqc = MQ_WM_CMD_INIT(Globals.hwndMain, IDT_TIMER_CALLBACK_MRKALL, bForceClear);
int64_t const timer = (delay < 0) ? Settings2.UpdateDelayMarkAllOccurrences : delay;
LONG64 const timer = (delay < 0) ? Settings2.UpdateDelayMarkAllOccurrences : delay;
_MQ_AppendCmd(&mqc, _MQ_ms2cycl(timer));
}
@ -11260,10 +11200,11 @@ bool ConsistentIndentationCheck(EditFileIOStatus* status)
//
static inline void _ResetFileWatchingMode() {
FileWatching.FileWatchingMode = (s_flagChangeNotify != FWM_NO_INIT) ? s_flagChangeNotify : Settings.FileWatchingMode;
if (FileWatching.MonitoringLog) {
FileWatching.FileWatchingMode = FWM_AUTORELOAD;
PostWMCommand(Globals.hwndMain, IDM_VIEW_CHASING_DOCTAIL);
}
FileWatching.FileWatchingMode = Settings.FileWatchingMode;
ResetFileObservationData(true);
}
@ -11298,7 +11239,7 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
Path_Empty(Paths.CurrentFile, false);
SetDlgItemText(Globals.hwndMain, IDC_FILENAME, Path_Get(Paths.CurrentFile));
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks(), false);
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks_ms(), false);
if (!s_flagKeepTitleExcerpt) {
StringCchCopy(s_wchTitleExcerpt, COUNTOF(s_wchTitleExcerpt), L"");
}
@ -11313,18 +11254,20 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
SetSaveDone();
// Terminate file watching
// Restart file watching
AutoSaveStop();
InstallFileWatching(false); // terminate
InstallFileWatching(false); // terminate old
if (Settings.ResetFileWatching) {
_ResetFileWatchingMode();
}
InstallFileWatching(true);
Flags.bSettingsFileSoftLocked = false;
UpdateSaveSettingsCmds();
if (SciCall_GetZoom() != 100) {
ShowZoomCallTip();
}
UndoRedoReset();
UpdateToolbar();
@ -11448,7 +11391,7 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
Path_Reset(Paths.CurrentFile, Path_Get(hopen_file)); // dup
SetDlgItemText(Globals.hwndMain, IDC_FILENAME, Path_Get(Paths.CurrentFile));
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks(), false);
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks_ms(), false);
if (!s_flagKeepTitleExcerpt) {
StringCchCopy(s_wchTitleExcerpt, COUNTOF(s_wchTitleExcerpt), L"");
@ -11481,19 +11424,14 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
// Install watching of the current file
AutoSaveStop();
if (!bReloadFile) {
InstallFileWatching(false); // terminate previous
if (Settings.ResetFileWatching) {
_ResetFileWatchingMode();
}
InstallFileWatching(false); // terminate previous
if (!bReloadFile && Settings.ResetFileWatching) {
_ResetFileWatchingMode();
}
// consistent settings file handling (if loaded in editor)
Flags.bSettingsFileSoftLocked = (Path_StrgComparePathNormalized(Paths.CurrentFile, Paths.IniFile) == 0);
ResetFileObservationData(true);
InstallFileWatching(true);
// the .LOG feature ...
if (SciCall_GetTextLength() >= 4) {
char tchLog[5] = { '\0', '\0', '\0', '\0', '\0' };
@ -11574,6 +11512,10 @@ bool FileLoad(const HPATHL hfile_pth, const FileLoadFlags fLoadFlags)
UpdateStatusbar(true);
Path_Release(hopen_file);
ResetFileObservationData(true);
InstallFileWatching(fSuccess);
return fSuccess;
}
@ -11816,15 +11758,21 @@ bool FileSave(FileSaveFlags fSaveFlags)
bool const bIsEmptyNewFile = (Path_IsEmpty(Paths.CurrentFile) && (SciCall_GetTextLength() <= 0LL));
#endif
bool const bSaveAs = (fSaveFlags & FSF_SaveAs);
bool const bSaveAsk = (fSaveFlags & FSF_Ask);
bool const bSaveCopy = (fSaveFlags & FSF_SaveCopy);
bool const bSaveAlways = (fSaveFlags & FSF_SaveAlways);
bool const bSaveNeeded = (IsSaveNeeded() || IsFileChangedFlagSet()) && !bIsEmptyNewFile;
if (!(fSaveFlags & FSF_SaveAlways) && (!IsSaveNeeded() || IsFileChangedFlagSet() || bIsEmptyNewFile) && !(fSaveFlags & FSF_SaveAs)) {
if (!bSaveAs && !bSaveAlways && !bSaveNeeded) {
_MRU_UpdateSession();
AutoSaveStop();
ResetFileObservationData(true);
return true;
}
if (fSaveFlags & FSF_Ask) {
if (bSaveAsk) {
// File or "Untitled" ...
WCHAR wchFileName[MAX_PATH_EXPLICIT>>1] = { L'\0' };
@ -11849,7 +11797,7 @@ bool FileSave(FileSaveFlags fSaveFlags)
}
// Read only...
if (!(fSaveFlags & FSF_SaveAs) && !(fSaveFlags & FSF_SaveCopy) && Path_IsNotEmpty(Paths.CurrentFile)) {
if (!bSaveAs && !bSaveCopy && Path_IsNotEmpty(Paths.CurrentFile)) {
if (IsFileReadOnly()) {
UpdateToolbar();
INT_PTR const answer = (Settings.MuteMessageBeep) ?
@ -11864,7 +11812,7 @@ bool FileSave(FileSaveFlags fSaveFlags)
}
// Save As...
if ((fSaveFlags & FSF_SaveAs) || (fSaveFlags & FSF_SaveCopy) || Path_IsEmpty(Paths.CurrentFile)) {
if (bSaveAs || bSaveCopy || Path_IsEmpty(Paths.CurrentFile)) {
static HPATHL _hpthLastSaveCopyDir = NULL; // session remember copyTo dir
if (!_hpthLastSaveCopyDir) {
@ -11898,7 +11846,7 @@ bool FileSave(FileSaveFlags fSaveFlags)
if (!(fSaveFlags & FSF_SaveCopy)) {
Path_Swap(Paths.CurrentFile, hfile_pth);
SetDlgItemText(Globals.hwndMain, IDC_FILENAME, Path_Get(Paths.CurrentFile));
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks(), false);
SetDlgItemInt(Globals.hwndMain, IDC_REUSELOCK, (UINT)GetTicks_ms(), false);
if (!s_flagKeepTitleExcerpt) {
StringCchCopy(s_wchTitleExcerpt, COUNTOF(s_wchTitleExcerpt), L"");
}
@ -11922,7 +11870,7 @@ bool FileSave(FileSaveFlags fSaveFlags)
if (fSuccess) {
if (!((fSaveFlags & FSF_SaveCopy) || Flags.bDoRelaunchElevated)) {
if (!bSaveCopy && !Flags.bDoRelaunchElevated) {
_MRU_AddSession();
AddFilePathToRecentDocs(Paths.CurrentFile);
// Install watching of the current file
@ -12532,7 +12480,7 @@ void CALLBACK PasteBoardTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD
UNREFERENCED_PARAMETER(idEvent);
UNREFERENCED_PARAMETER(dwTime);
if ((s_iLastCopyTime > 0) && ((GetTicks() - s_iLastCopyTime) > 200)) {
if ((s_iLastCopyTime > 0) && ((GetTicks_ms() - s_iLastCopyTime) > 200)) {
if (SciCall_CanPaste()) {
bool bAutoIndent2 = Settings.AutoIndent;
@ -12553,6 +12501,111 @@ void CALLBACK PasteBoardTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD
}
//=============================================================================
//
// MsgFileChangeNotify() - Handles WM_FILECHANGEDNOTIFY
//
LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
SET_FCT_GUARD(TRUE);
DocPos const iCurPos = SciCall_GetCurrentPos();
if (Path_IsExistingFile(Paths.CurrentFile)) {
bool bRevertFile = IsSaveNeeded();
switch (FileWatching.FileWatchingMode) {
case FWM_AUTORELOAD:
bRevertFile = true;
break;
case FWM_MSGBOX: {
SetForegroundWindow(hwnd);
/// LONG const answer = MessageBoxExW(Globals.hwndMain, L"File change, Cancel, Retry, Continue", L"NP3", MB_ABORTRETRYIGNORE, GetLangIdByLocaleName(Globals.CurrentLngLocaleName));
LONG const answer = InfoBoxLng(MB_CANCELTRYCONTINUE | MB_ICONWARNING, NULL, IDS_MUI_FILECHANGENOTIFY);
switch (LOWORD(answer)) {
case IDCANCEL:
case IDABORT:
FileWatching.FileWatchingMode = FWM_INDICATORSILENT;
SetSaveNeeded(true);
bRevertFile = false;
ResetFileObservationData(false); // false (!)
UpdateToolbar();
break;
case IDIGNORE:
case IDCONTINUE:
UndoRedoReset();
FileRevert(Paths.CurrentFile, false);
SciCall_SetReadOnly(true);
FileWatching.MonitoringLog = false; // will be reset in IDM_VIEW_CHASING_DOCTAIL
PostWMCommand(Globals.hwndMain, IDM_VIEW_CHASING_DOCTAIL);
bRevertFile = false; // done already
break;
case IDTRYAGAIN:
case IDCLOSE:
default:
bRevertFile = true;
ResetFileObservationData(true);
break;
}
} break;
case FWM_DONT_CARE:
case FWM_EXCLUSIVELOCK:
ResetFileObservationData(true);
break;
case FWM_INDICATORSILENT:
bRevertFile = false;
UpdateToolbar();
break;
case FWM_NO_INIT:
default:
assert("Invalid FileWatching Mode!" && 0);
break;
}
if (bRevertFile) {
SetForegroundWindow(hwnd);
FileRevert(Paths.CurrentFile, false);
if (FileWatching.MonitoringLog) {
SciCall_SetReadOnly(FileWatching.MonitoringLog);
}
else {
Sci_GotoPosChooseCaret(iCurPos);
}
Sci_ScrollSelectionToView();
}
}
else { // file has been deleted
InstallFileWatching(false); // terminate
if (FileWatching.FileWatchingMode == FWM_MSGBOX) {
if (IsYesOkay(InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_FILECHANGENOTIFY2))) {
FileSave(FSF_SaveAlways);
}
else {
SetSaveNeeded(true);
}
}
else {
// FWM_INDICATORSILENT: nothing todo here
SetSaveNeeded(true);
}
}
RESET_FCT_GUARD();
return TRUE;
}
//=============================================================================
//
@ -12560,14 +12613,13 @@ void CALLBACK PasteBoardTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD
//
//=============================================================================
static inline void NotifyIfFileHasChanged(const bool forcedNotify) {
if (forcedNotify || HasCurrentFileChanged()) {
static inline void NotifyIfFileHasChanged()
{
if (IsFileChangedFlagSet() || IsFileDeletedFlagSet() || RaiseFlagIfCurrentFileChanged()) {
PostMessage(Globals.hwndMain, WM_FILECHANGEDNOTIFY, 0, 0);
}
// reset Timeout interval
s_FileChgObsvrData.iFileChangeNotifyTime = GetTicks();
InterlockedExchange64(&(s_FileChgObsvrData.iFileChangeNotifyTime), GetTicks_ms());
}
// ----------------------------------------------------------------------------
@ -12580,10 +12632,10 @@ static void CALLBACK WatchTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWOR
UNREFERENCED_PARAMETER(uMsg);
UNREFERENCED_PARAMETER(hwnd);
int64_t const diff = GetTicks() - s_FileChgObsvrData.iFileChangeNotifyTime;
LONG64 const diff = (GetTicks_ms() - InterlockedOr64(&(s_FileChgObsvrData.iFileChangeNotifyTime), 0LL));
// Directory-Observer is not notified for continuously updated (log-)files
if (diff > Settings2.FileCheckInterval) {
NotifyIfFileHasChanged(/*FileWatching.MonitoringLog*/ false);
if (diff > FileWatching.FileCheckInterval) {
NotifyIfFileHasChanged();
}
}
// ----------------------------------------------------------------------------
@ -12615,11 +12667,11 @@ unsigned int WINAPI FileChangeObserver(LPVOID lpParam)
break;
case WAIT_OBJECT_0:
if (pFCOBSVData->bNotifyImmediate) {
NotifyIfFileHasChanged(/*(!)*/false); // immediate notification
} else {
s_FileChgObsvrData.iFileChangeNotifyTime = GetTicks();
WatchTimerProc(NULL, 0, 0ULL, 0); // rely on FileCheckInterval
// check if current file is trigger for directory notification
if (RaiseFlagIfCurrentFileChanged()) {
if (FileWatching.FileCheckInterval <= MIN_FC_POLL_INTERVAL) {
NotifyIfFileHasChanged(); // immediate notification
}
}
FindNextChangeNotification(pFCOBSVData->hFileChanged);
break;
@ -12661,8 +12713,6 @@ void InstallFileWatching(const bool bInstall) {
bool const bExclusiveLock = (FileWatching.FileWatchingMode == FWM_EXCLUSIVELOCK);
bool const bWatchFile = (FileWatching.FileWatchingMode != FWM_DONT_CARE) && !bExclusiveLock;
s_FileChgObsvrData.bNotifyImmediate = (FileWatching.FileCheckInterval <= MIN_FC_POLL_INTERVAL);
// always release exclusive file lock in any case
if (IS_VALID_HANDLE(_hCurrFileHandle)) {
CloseHandle(_hCurrFileHandle);
@ -12696,9 +12746,9 @@ void InstallFileWatching(const bool bInstall) {
BackgroundWorker_Start(&(s_FileChgObsvrData.worker), FileChangeObserver, &s_FileChgObsvrData);
}
s_FileChgObsvrData.iFileChangeNotifyTime = (FileWatching.FileWatchingMode == FWM_AUTORELOAD) ? GetTicks() : 0;
InterlockedExchange64(&(s_FileChgObsvrData.iFileChangeNotifyTime), GetTicks_ms());
if (FileWatching.FileCheckInterval > 0) {
if (Settings2.FileCheckInterval > 0) {
SetTimer(Globals.hwndMain, ID_WATCHTIMER, (UINT)FileWatching.FileCheckInterval, WatchTimerProc);
}
else {

View File

@ -126,7 +126,7 @@ void CheckAutoLoadMostRecent();
void ShowZoomCallTip();
void ShowWrapAroundCallTip(bool forwardSearch);
void MarkAllOccurrences(const int64_t delay, const bool bForceClear);
void MarkAllOccurrences(const LONG64 delay, const bool bForceClear);
void UpdateToolbar();
void UpdateStatusbar(const bool bForceRedraw);

View File

@ -40,9 +40,9 @@
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
<UseDebugLibraries>true</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
<UseOfMfc>false</UseOfMfc>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<CharacterSet>Unicode</CharacterSet>
@ -72,9 +72,9 @@
<PlatformToolset Condition="'$(VisualStudioVersion)'=='16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset>
<UseDebugLibraries>true</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
<UseOfMfc>false</UseOfMfc>
<EnableASAN>true</EnableASAN>
<EnableASAN>false</EnableASAN>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<CharacterSet>Unicode</CharacterSet>

View File

@ -5173,6 +5173,11 @@ INT_PTR CALLBACK Style_SelectLexerDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPAR
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, IDCLOSE);
break;
case WM_DESTROY:
return TRUE;

View File

@ -330,7 +330,7 @@ typedef struct CmdMessageQueue_t {
UINT cmd;
WPARAM wparam;
LPARAM lparam;
int64_t delay;
LONG64 delay;
struct CmdMessageQueue_t* next;
struct CmdMessageQueue_t* prev;
@ -735,8 +735,8 @@ typedef struct SETTINGS2_T {
int FileLoadWarningMB;
int OpacityLevel;
int FindReplaceOpacityLevel;
int64_t FileCheckInterval;
int64_t UndoTransactionTimeout;
LONG64 FileCheckInterval;
LONG64 UndoTransactionTimeout;
int IMEInteraction;
int SciFontQuality;
int LaunchInstanceWndPosOffset;
@ -845,30 +845,28 @@ typedef struct BackgroundWorker {
typedef struct FCOBSRVDATA_T {
int64_t iFileChangeNotifyTime;
volatile LONG64 iFileChangeNotifyTime; // multi-threaded
WIN32_FIND_DATA fdCurFile;
HANDLE hEventFileChanged;
HANDLE hEventFileDeleted;
HANDLE hFileChanged; // FindFirstChangeNotification()
bool bNotifyImmediate;
BackgroundWorker worker;
} FCOBSRVDATA_T, *PFCOBSRVDATA_T;
#define INIT_FCOBSRV_T { 0UL, { 0 }, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, false, { NULL, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, NULL } }
#define INIT_FCOBSRV_T { 0LL, { 0 }, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, { NULL, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, NULL } }
#define MIN_FC_POLL_INTERVAL (500UL)
#define MAX_FC_POLL_INTERVAL ((24UL * 60 * 60 * 1000) << 1) // max: 48h
#define MIN_FC_POLL_INTERVAL (500LL)
#define MAX_FC_POLL_INTERVAL ((24LL * 60 * 60 * 1000) << 1) // max: 48h
//=============================================================================
typedef struct FILEWATCHING_T {
FILE_WATCHING_MODE flagChangeNotify; // <-> s_flagChangeNotify;
FILE_WATCHING_MODE FileWatchingMode; // <-> Settings.FileWatchingMode;
int64_t FileCheckInterval; // <-> Settings2.FileCheckInterval;
LONG64 FileCheckInterval; // <-> clampll(Settings2.FileCheckInterval, MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL);
bool MonitoringLog;
} FILEWATCHING_T, *PFILEWATCHING_T;