From 850fb78d9c34e90b560a47be8ce5b3e0d9046347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 5 Sep 2005 10:09:24 +0000 Subject: [PATCH] now monitor the directory if settings file is not found, and vice et versa git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14115 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../filters/screensaver/SSInputFilter.cpp | 43 ++++++++++++++++--- .../filters/screensaver/SSInputFilter.h | 4 +- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp index 044107b6f7..5a6d322503 100644 --- a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp +++ b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp @@ -65,27 +65,59 @@ SSInputFilter::SSInputFilter() fCurrent(NONE), fEnabled(false), fFrameNum(0), - fRunner(NULL) { + fRunner(NULL), + fWatchingDirectory(false), + fWatchingFile(false) { CALLED(); fSSController = new SSController(this); fSSController->Run(); ReloadSettings(); - BEntry entry(fPref.GetPath().Path()); - entry.GetNodeRef(&fPrefNodeRef); - watch_node(&fPrefNodeRef, B_WATCH_ALL, NULL, fSSController); be_roster->StartWatching(fSSController); } SSInputFilter::~SSInputFilter() { delete fRunner; - watch_node(&fPrefNodeRef, B_STOP_WATCHING, NULL); + if (fWatchingFile) + watch_node(&fPrefNodeRef, B_STOP_WATCHING, NULL); + if (fWatchingDirectory) + watch_node(&fPrefDirNodeRef, B_STOP_WATCHING, NULL); be_roster->StopWatching(fSSController); delete fSSController; } +void +SSInputFilter::WatchPreferences() { + BEntry entry(fPref.GetPath().Path()); + if (entry.Exists()) { + if (fWatchingFile) + return; + if (fWatchingDirectory) { + watch_node(&fPrefDirNodeRef, B_STOP_WATCHING, NULL); + fWatchingDirectory = false; + } + entry.GetNodeRef(&fPrefNodeRef); + watch_node(&fPrefNodeRef, B_WATCH_ALL, NULL, fSSController); + fWatchingFile = true; + } else { + if (fWatchingDirectory) + return; + if (fWatchingFile) { + watch_node(&fPrefNodeRef, B_STOP_WATCHING, NULL); + fWatchingFile = false; + } + BEntry dir; + entry.GetParent(&dir); + dir.GetNodeRef(&fPrefDirNodeRef); + watch_node(&fPrefDirNodeRef, B_WATCH_ALL, NULL, fSSController); + fWatchingDirectory = true; + } + +} + + void SSInputFilter::Invoke() { @@ -113,6 +145,7 @@ SSInputFilter::ReloadSettings() if (fRunner->InitCheck() != B_OK) { SERIAL_PRINT(("fRunner init failed\n")); } + WatchPreferences(); } diff --git a/src/add-ons/input_server/filters/screensaver/SSInputFilter.h b/src/add-ons/input_server/filters/screensaver/SSInputFilter.h index 20b360bef7..36caf391bc 100644 --- a/src/add-ons/input_server/filters/screensaver/SSInputFilter.h +++ b/src/add-ons/input_server/filters/screensaver/SSInputFilter.h @@ -45,9 +45,11 @@ private: uint32 fFrameNum; // Used so that we don't update the screen coord's so often // Ideally, we would get a message when the screen changes. R5 doesn't do this. SSController *fSSController; - node_ref fPrefNodeRef; + node_ref fPrefNodeRef, fPrefDirNodeRef; BMessageRunner *fRunner; + bool fWatchingDirectory, fWatchingFile; + void WatchPreferences(); void UpdateRectangles(); void Cornered(arrowDirection pos); void Invoke();