Merge branch 'Master' into Mui_Beta

This commit is contained in:
Pairi Daiza 2023-03-16 19:51:51 +01:00
commit ec878cb59b
No known key found for this signature in database
GPG Key ID: AC2515EF755AF96F
5 changed files with 26 additions and 17 deletions

View File

@ -14,7 +14,7 @@ SettingsVersion=5
;DenyVirtualSpaceAccess=0
;filebrowser.exe=minipath.exe
;grepWin.exe=grepWinNP3.exe
;FileCheckInterval=2000
;FileCheckInterval=2000 (min: 500[msec] - if equal or less, notify immediately)
;FileChangedIndicator=[@]
;FileDeletedIndicator=[X]
;FileDlgFilters=

View File

@ -1257,7 +1257,7 @@ void LoadSettings()
}
bDirtyFlag = true;
}
Settings2.FileCheckInterval = clampul(Settings2.FileCheckInterval, 120UL, (24UL*60*60*1000) << 1); // min: 120msec max: 48h
Settings2.FileCheckInterval = clampul(Settings2.FileCheckInterval, MIN_FC_POLL_INTERVAL, (24UL * 60 * 60 * 1000) << 1); // min: 500msec max: 48h
FileWatching.FileCheckInterval = Settings2.FileCheckInterval;
IniSectionGetString(IniSecSettings2, L"FileChangedIndicator", L"[@]", Settings2.FileChangedIndicator, COUNTOF(Settings2.FileChangedIndicator));

View File

@ -420,11 +420,13 @@ bool IsRunAsAdmin();
void BackgroundWorker_Init(BackgroundWorker* worker, HWND hwnd, const HPATHL hFilePath);
void BackgroundWorker_Start(BackgroundWorker* worker, _beginthreadex_proc_type routine, LPVOID property);
void BackgroundWorker_Cancel(BackgroundWorker *worker);
void BackgroundWorker_Destroy(BackgroundWorker *worker);
void BackgroundWorker_Cancel(BackgroundWorker* worker);
void BackgroundWorker_Destroy(BackgroundWorker* worker);
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); }}
inline bool BackgroundWorker_Continue(BackgroundWorker* worker) { return (worker) ? (WaitForSingleObject(worker->eventCancel, 0) != WAIT_OBJECT_0) : false; }
bool BitmapMergeAlpha(HBITMAP hbmp,COLORREF crDest);

View File

@ -12581,17 +12581,24 @@ unsigned int WINAPI FileChangeObserver(LPVOID lpParam)
BackgroundWorker* const worker = &(pFCOBSVData->worker);
assert(!IS_VALID_HANDLE(pFCOBSVData->hFileChanged) && "ChangeHandle not properly closed!");
pFCOBSVData->hFileChanged = FindFirstChangeNotificationW(Path_Get(pFCOBSVData->worker.hFilePath), false,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE);
while (BackgroundWorker_Continue(worker)) {
switch (WaitForSingleObject(pFCOBSVData->hFileChanged, (FileWatching.FileCheckInterval >> 1))) {
switch (WaitForSingleObject(pFCOBSVData->hFileChanged, 100)) {
case WAIT_TIMEOUT:
// okay, wait again until done
// okay, check BGWorker cancellation or wait again until done
break;
case WAIT_OBJECT_0:
if (/*FileWatching.MonitoringLog*/ false) {
NotifyIfFileHasChanged(false); // immediate notification
if (pFCOBSVData->bNotifyImmediate) {
NotifyIfFileHasChanged(/*(!)*/false); // immediate notification
} else {
WatchTimerProc(NULL, 0, 0ULL, 0); // rely on FileCheckInterval
}
@ -12607,7 +12614,7 @@ unsigned int WINAPI FileChangeObserver(LPVOID lpParam)
}
}
FindCloseChangeNotification(pFCOBSVData->hFileChanged);
FindCloseChangeNotification(pFCOBSVData->hFileChanged); // stop monitoring
pFCOBSVData->hFileChanged = INVALID_HANDLE_VALUE;
BackgroundWorker_End(worker, retcode);
@ -12633,6 +12640,8 @@ 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);
@ -12661,12 +12670,7 @@ void InstallFileWatching(const bool bInstall) {
// Save data of current file
ResetFileObservationData(false); // (!) false
assert(!IS_VALID_HANDLE(s_FileChgObsvrData.hFileChanged) && "ChangeHandle not properly closed!");
s_FileChgObsvrData.hFileChanged = FindFirstChangeNotificationW(Path_Get(hdir_pth), false,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE);
Path_Reset(s_FileChgObsvrData.worker.hFilePath, Path_Get(hdir_pth)); // directory monitoring
BackgroundWorker_Start(&(s_FileChgObsvrData.worker), FileChangeObserver, &s_FileChgObsvrData);
}

View File

@ -852,11 +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, { NULL, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, NULL } }
#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 MIN_FC_POLL_INTERVAL (500UL)
//=============================================================================