* Fixed use of ScreenSaverSettings::TimeFlags() - it's a flags field after

all, so it should be used like one.
* Fixed a memory leak because of incorrect BMessageRunner usage.
* Some corner rects were computed incorrectly (I did that earlier).
* Since either a file or a directory is watched, but never both at the same
  time, we only need to store one ref.
* Don't update the settings as long as there is no settings file.
* Fixed strange usage of watch_node() - not specifying a handler means that
  the message is sent to the preferred handler, a BLooper is also always a
  handler, and the message only should go there.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17773 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-06-07 21:29:04 +00:00
parent 58c7d50a41
commit 1fa515a650
2 changed files with 45 additions and 33 deletions
@@ -121,41 +121,45 @@ ScreenSaverFilter::~ScreenSaverFilter()
{ {
delete fRunner; delete fRunner;
if (fWatchingFile) if (fWatchingFile || fWatchingDirectory)
watch_node(&fPrefsNodeRef, B_STOP_WATCHING, NULL); watch_node(&fNodeRef, B_STOP_WATCHING, fController);
if (fWatchingDirectory)
watch_node(&fPrefsDirNodeRef, B_STOP_WATCHING, NULL);
be_roster->StopWatching(fController); be_roster->StopWatching(fController);
delete fController; delete fController;
} }
/*!
Starts watching the settings file, or if that doesn't exist, the directory
the settings file will be placed into.
*/
void void
ScreenSaverFilter::_WatchPreferences() ScreenSaverFilter::_WatchSettings()
{ {
BEntry entry(fSettings.Path().Path()); BEntry entry(fSettings.Path().Path());
if (entry.Exists()) { if (entry.Exists()) {
if (fWatchingFile) if (fWatchingFile)
return; return;
if (fWatchingDirectory) { if (fWatchingDirectory) {
watch_node(&fPrefsDirNodeRef, B_STOP_WATCHING, NULL); watch_node(&fNodeRef, B_STOP_WATCHING, fController);
fWatchingDirectory = false; fWatchingDirectory = false;
} }
entry.GetNodeRef(&fPrefsNodeRef); if (entry.GetNodeRef(&fNodeRef) == B_OK
watch_node(&fPrefsNodeRef, B_WATCH_ALL, NULL, fController); && watch_node(&fNodeRef, B_WATCH_ALL, fController) == B_OK)
fWatchingFile = true; fWatchingFile = true;
} else { } else {
if (fWatchingDirectory) if (fWatchingDirectory)
return; return;
if (fWatchingFile) { if (fWatchingFile) {
watch_node(&fPrefsNodeRef, B_STOP_WATCHING, NULL); watch_node(&fNodeRef, B_STOP_WATCHING, fController);
fWatchingFile = false; fWatchingFile = false;
} }
BEntry dir; BEntry dir;
entry.GetParent(&dir); if (entry.GetParent(&dir) == B_OK
dir.GetNodeRef(&fPrefsDirNodeRef); && dir.GetNodeRef(&fNodeRef) == B_OK
watch_node(&fPrefsDirNodeRef, B_WATCH_ALL, NULL, fController); && watch_node(&fNodeRef, B_WATCH_DIRECTORY, fController) == B_OK)
fWatchingDirectory = true; fWatchingDirectory = true;
} }
} }
@@ -166,7 +170,7 @@ ScreenSaverFilter::_Invoke()
{ {
CALLED(); CALLED();
if (fCurrentCorner == fNeverBlankCorner || fEnabled if (fCurrentCorner == fNeverBlankCorner || fEnabled
|| fSettings.TimeFlags() != 1 || fSettings.TimeFlags() == SAVER_DISABLED
|| be_roster->IsRunning(SCREEN_BLANKER_SIG)) || be_roster->IsRunning(SCREEN_BLANKER_SIG))
return; return;
@@ -179,23 +183,29 @@ void
ScreenSaverFilter::ReloadSettings() ScreenSaverFilter::ReloadSettings()
{ {
CALLED(); CALLED();
if (!fSettings.LoadSettings()) { bool isFirst = !fWatchingDirectory && !fWatchingFile;
SERIAL_PRINT(("preferences loading failed: going to defaults\n"));
_WatchSettings();
if (fWatchingDirectory && !isFirst) {
// there is no settings file yet
return;
} }
fSettings.LoadSettings();
fBlankCorner = fSettings.GetBlankCorner(); fBlankCorner = fSettings.GetBlankCorner();
fNeverBlankCorner = fSettings.GetNeverBlankCorner(); fNeverBlankCorner = fSettings.GetNeverBlankCorner();
fBlankTime = fSnoozeTime = fSettings.BlankTime(); fBlankTime = fSnoozeTime = fSettings.BlankTime();
CheckTime(); CheckTime();
delete fRunner; delete fRunner;
fRunner = new BMessageRunner(BMessenger(NULL, fController),
new BMessage(kMsgCheckTime), fSnoozeTime); BMessage check(kMsgCheckTime);
fRunner = new BMessageRunner(fController, &check, fSnoozeTime);
if (fRunner->InitCheck() != B_OK) { if (fRunner->InitCheck() != B_OK) {
SERIAL_PRINT(("fRunner init failed\n")); SERIAL_PRINT(("fRunner init failed\n"));
} }
_WatchPreferences();
} }
@@ -269,16 +279,16 @@ ScreenSaverFilter::_ScreenCorner(screen_corner corner, uint32 cornerSize)
frame.top + cornerSize - 1); frame.top + cornerSize - 1);
case UPRIGHT: case UPRIGHT:
return BRect(frame.right, frame.top, frame.right - cornerSize + 1, return BRect(frame.right - cornerSize + 1, frame.top, frame.right,
frame.top + cornerSize - 1); frame.top + cornerSize - 1);
case DOWNRIGHT: case DOWNRIGHT:
return BRect(frame.right, frame.bottom, frame.right - cornerSize + 1, return BRect(frame.right - cornerSize + 1, frame.bottom - cornerSize + 1,
frame.bottom - cornerSize + 1); frame.right, frame.bottom);
case DOWNLEFT: case DOWNLEFT:
return BRect(frame.left, frame.bottom, frame.left + cornerSize - 1, return BRect(frame.left, frame.bottom - cornerSize + 1,
frame.bottom - cornerSize + 1); frame.left + cornerSize - 1, frame.bottom);
default: default:
// return an invalid rectangle // return an invalid rectangle
@@ -295,8 +305,10 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
switch (message->what) { switch (message->what) {
case B_MOUSE_MOVED: case B_MOUSE_MOVED:
{ {
BPoint pos; BPoint where;
message->FindPoint("where", &pos); if (message->FindPoint("where", &where) != B_OK)
break;
if ((fFrameNum++ % 32) == 0) { if ((fFrameNum++ % 32) == 0) {
// Every so many frames, update // Every so many frames, update
// Used so that we don't update the screen coord's so often // Used so that we don't update the screen coord's so often
@@ -305,7 +317,7 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
_UpdateRectangles(); _UpdateRectangles();
} }
if (fBlankRect.Contains(pos)) { if (fBlankRect.Contains(where)) {
fCurrentCorner = fBlankCorner; fCurrentCorner = fBlankCorner;
// start screen blanker after one second // start screen blanker after one second
@@ -315,7 +327,7 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
break; break;
} }
if (fNeverBlankRect.Contains(pos)) if (fNeverBlankRect.Contains(where))
fCurrentCorner = fNeverBlankCorner; fCurrentCorner = fNeverBlankCorner;
else else
fCurrentCorner = NONE; fCurrentCorner = NONE;
@@ -49,7 +49,7 @@ class ScreenSaverFilter : public BInputServerFilter {
void SetEnabled(bool enabled) { fEnabled = enabled; } void SetEnabled(bool enabled) { fEnabled = enabled; }
private: private:
void _WatchPreferences(); void _WatchSettings();
void _UpdateRectangles(); void _UpdateRectangles();
BRect _ScreenCorner(screen_corner pos, uint32 cornerSize); BRect _ScreenCorner(screen_corner pos, uint32 cornerSize);
@@ -64,7 +64,7 @@ class ScreenSaverFilter : public BInputServerFilter {
uint32 fFrameNum; uint32 fFrameNum;
ScreenSaverController* fController; ScreenSaverController* fController;
node_ref fPrefsNodeRef, fPrefsDirNodeRef; node_ref fNodeRef;
BMessageRunner* fRunner; BMessageRunner* fRunner;
bool fWatchingDirectory, fWatchingFile; bool fWatchingDirectory, fWatchingFile;
}; };