From dd2fd09c209a9206852f7249d921ad22b95fccec Mon Sep 17 00:00:00 2001 From: rkotten Date: Tue, 28 Mar 2023 13:44:55 +0200 Subject: [PATCH] +fix: Integration and Notification of DirectoryObserver and FileChanged-Polling --- src/Config/Config.cpp | 5 +- src/Edit.c | 8 +-- src/Helpers.h | 110 ++++++++++++++++++++++-------------------- src/Notepad3.c | 95 +++++++++++++++++------------------- src/TypeDefs.h | 9 ++-- 5 files changed, 112 insertions(+), 115 deletions(-) diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index c1a6593a6..3a41dd4ea 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -1261,8 +1261,7 @@ void LoadSettings() } int const deprecatedFCI = max_i(autoReload, dfci); - Settings2.FileCheckInterval = static_cast(clampll(IniSectionGetLongLong(IniSecSettings2, correctKeyFCI, deprecatedFCI), - MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL)); + Settings2.FileCheckInterval = IniSectionGetLongLong(IniSecSettings2, correctKeyFCI, deprecatedFCI); if (Settings2.FileCheckInterval == defaultFCI) { if (deprecatedFCI != defaultFCI) { @@ -1274,7 +1273,7 @@ void LoadSettings() IniSectionSetLongLong(IniSecSettings2, correctKeyFCI, Settings2.FileCheckInterval); bDirtyFlag = true; } - FileWatching.FileCheckInterval = Settings2.FileCheckInterval; + FileWatching.FileCheckInterval = clampll(Settings2.FileCheckInterval, MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL); IniSectionGetString(IniSecSettings2, L"FileChangedIndicator", L"[@]", Settings2.FileChangedIndicator, COUNTOF(Settings2.FileChangedIndicator)); diff --git a/src/Edit.c b/src/Edit.c index f2212e8ce..b9bd2a1b7 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -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 }; @@ -9691,8 +9691,8 @@ void EditFoldClick(DocLn ln, int mode) 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; } } diff --git a/src/Helpers.h b/src/Helpers.h index f51c7484f..99971899b 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -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 int64_t GetTicks_ms() { LARGE_INTEGER freq; if (!QueryPerformanceFrequency(&freq)) { return (int64_t)GetTickCount64(); } - ticks.QuadPart *= 1000000; - ticks.QuadPart /= freq.QuadPart; - return ticks.QuadPart; + LARGE_INTEGER ticks; + if (!QueryPerformanceCounter(&ticks)) { + return (int64_t)GetTickCount64(); + } + return (ticks.QuadPart * 1000LL) / freq.QuadPart; } // ---------------------------------------------------------------------------- diff --git a/src/Notepad3.c b/src/Notepad3.c index 07ad52d0c..b61462693 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -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; @@ -1521,7 +1521,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 +1549,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 +1835,26 @@ HWND InitInstance(const HINSTANCE hInstance, int nCmdShow) // Source Encoding Encoding_Forced(s_flagSetEncoding); + 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; + } + // 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 +1905,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 +2199,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 +2753,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 +3673,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); @@ -3931,7 +3926,7 @@ LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) SET_FCT_GUARD(TRUE); - InstallFileWatching(false); // terminate + ResetFileObservationData(true); DocPos const iCurPos = SciCall_GetCurrentPos(); @@ -3963,6 +3958,8 @@ LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) } 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); @@ -3976,8 +3973,6 @@ LRESULT MsgFileChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) } - InstallFileWatching(true); - RESET_FCT_GUARD(); return TRUE; } @@ -6281,11 +6276,11 @@ 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; - FileWatching.FileCheckInterval = Settings2.FileCheckInterval; + FileWatching.FileCheckInterval = clampll(Settings2.FileCheckInterval, MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL); SciCall_SetEndAtLastLine(!Settings.ScrollPastEOF); } Sci_ScrollSelectionToView(); @@ -11298,7 +11293,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""); } @@ -11448,7 +11443,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""); @@ -11898,7 +11893,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""); } @@ -12532,7 +12527,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; @@ -12561,13 +12556,13 @@ void CALLBACK PasteBoardTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD //============================================================================= -static inline void NotifyIfFileHasChanged(const bool forcedNotify) { +static inline void NotifyIfFileHasChanged() { - if (forcedNotify || HasCurrentFileChanged()) { + if (IsFileChangedFlagSet() || IsFileDeletedFlagSet() || RaiseFlagIfCurrentFileChanged()) { PostMessage(Globals.hwndMain, WM_FILECHANGEDNOTIFY, 0, 0); } // reset Timeout interval - s_FileChgObsvrData.iFileChangeNotifyTime = GetTicks(); + s_FileChgObsvrData.iFileChangeNotifyTime = GetTicks_ms(); } // ---------------------------------------------------------------------------- @@ -12580,10 +12575,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; + int64_t const diff = (GetTicks_ms() - s_FileChgObsvrData.iFileChangeNotifyTime); // 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 +12610,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 +12656,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 +12689,9 @@ void InstallFileWatching(const bool bInstall) { BackgroundWorker_Start(&(s_FileChgObsvrData.worker), FileChangeObserver, &s_FileChgObsvrData); } - s_FileChgObsvrData.iFileChangeNotifyTime = (FileWatching.FileWatchingMode == FWM_AUTORELOAD) ? GetTicks() : 0; + s_FileChgObsvrData.iFileChangeNotifyTime = GetTicks_ms(); - if (FileWatching.FileCheckInterval > 0) { + if (Settings2.FileCheckInterval > 0) { SetTimer(Globals.hwndMain, ID_WATCHTIMER, (UINT)FileWatching.FileCheckInterval, WatchTimerProc); } else { diff --git a/src/TypeDefs.h b/src/TypeDefs.h index 55d8d61a0..d87e5ee86 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -852,15 +852,14 @@ typedef struct FCOBSRVDATA_T { 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 //============================================================================= @@ -868,7 +867,7 @@ typedef struct FILEWATCHING_T { FILE_WATCHING_MODE flagChangeNotify; // <-> s_flagChangeNotify; FILE_WATCHING_MODE FileWatchingMode; // <-> Settings.FileWatchingMode; - int64_t FileCheckInterval; // <-> Settings2.FileCheckInterval; + int64_t FileCheckInterval; // <-> clampll(Settings2.FileCheckInterval, MIN_FC_POLL_INTERVAL, MAX_FC_POLL_INTERVAL); bool MonitoringLog; } FILEWATCHING_T, *PFILEWATCHING_T;