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
This commit is contained in:
Jérôme Duval
2005-09-05 10:09:24 +00:00
parent 448f8b3243
commit 850fb78d9c
2 changed files with 41 additions and 6 deletions
@@ -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();
}
@@ -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();