diff --git a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp index c6fa7c6cd8..f600980ee3 100644 --- a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp +++ b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp @@ -4,8 +4,10 @@ * * Authors: * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Jérôme Duval, jerome.duval@free.fr */ + + #include #include #include @@ -16,13 +18,22 @@ #include #define CALLED() SERIAL_PRINT(("%s\n", __PRETTY_FUNCTION__)) + extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); -BInputServerFilter* instantiate_input_filter() { // required C func to build the IS Filter - return (new SSInputFilter()); + +/** required C func to build the IS Filter */ + +BInputServerFilter* +instantiate_input_filter() +{ + return new SSInputFilter(); } +// #pragma mark - + + SSController::SSController(SSInputFilter *filter) : BLooper("screensaver controller", B_LOW_PRIORITY), fFilter(filter) @@ -47,8 +58,8 @@ SSController::MessageReceived(BMessage *msg) case B_SOME_APP_QUIT: { const char *signature; - if (msg->FindString("be:signature", &signature)==B_OK - && strcasecmp(signature, SCREEN_BLANKER_SIG)==0) { + if (msg->FindString("be:signature", &signature) == B_OK + && strcasecmp(signature, SCREEN_BLANKER_SIG) == 0) { fFilter->SetEnabled(msg->what == B_SOME_APP_LAUNCHED); } SERIAL_PRINT(("mime_sig %s\n", signature)); @@ -60,6 +71,9 @@ SSController::MessageReceived(BMessage *msg) } +// #pragma mark - + + SSInputFilter::SSInputFilter() : fLastEventTime(0), fBlankTime(0), @@ -70,7 +84,8 @@ SSInputFilter::SSInputFilter() fFrameNum(0), fRunner(NULL), fWatchingDirectory(false), - fWatchingFile(false) { + fWatchingFile(false) +{ CALLED(); fSSController = new SSController(this); fSSController->Run(); @@ -80,19 +95,23 @@ SSInputFilter::SSInputFilter() } -SSInputFilter::~SSInputFilter() { +SSInputFilter::~SSInputFilter() +{ delete fRunner; + 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() { +SSInputFilter::WatchPreferences() +{ BEntry entry(fPref.GetPath().Path()); if (entry.Exists()) { if (fWatchingFile) @@ -117,7 +136,6 @@ SSInputFilter::WatchPreferences() { watch_node(&fPrefDirNodeRef, B_WATCH_ALL, NULL, fSSController); fWatchingDirectory = true; } - } @@ -125,8 +143,14 @@ void SSInputFilter::Invoke() { CALLED(); - if ((fKeep!=NONE && fCurrent == fKeep) || fEnabled || fPref.TimeFlags()!=1 || be_roster->IsRunning(SCREEN_BLANKER_SIG)) - return; // If mouse is in this corner, never invoke. + if ((fKeep != NONE && fCurrent == fKeep) + || fEnabled + || fPref.TimeFlags() != 1 + || be_roster->IsRunning(SCREEN_BLANKER_SIG)) { + // If mouse is in this corner, never invoke. + return; + } + SERIAL_PRINT(("we run screenblanker\n")); be_roster->Launch(SCREEN_BLANKER_SIG); } @@ -139,15 +163,19 @@ SSInputFilter::ReloadSettings() if (!fPref.LoadSettings()) { SERIAL_PRINT(("preferences loading failed: going to defaults\n")); } + fBlank = fPref.GetBlankCorner(); fKeep = fPref.GetNeverBlankCorner(); fBlankTime = fSnoozeTime = fPref.BlankTime(); CheckTime(); + delete fRunner; - fRunner = new BMessageRunner(BMessenger(NULL, fSSController), new BMessage(SS_CHECK_TIME), fSnoozeTime, -1); + fRunner = new BMessageRunner(BMessenger(NULL, fSSController), + new BMessage(SS_CHECK_TIME), fSnoozeTime, -1); if (fRunner->InitCheck() != B_OK) { SERIAL_PRINT(("fRunner init failed\n")); } + WatchPreferences(); } @@ -158,21 +186,28 @@ SSInputFilter::Banish() CALLED(); if (!fEnabled) return; + SERIAL_PRINT(("we quit screenblanker\n")); - BMessenger ssApp(SCREEN_BLANKER_SIG,-1,NULL); // Don't care if it fails - ssApp.SendMessage(B_QUIT_REQUESTED); + + // Don't care if it fails + BMessenger blankerMessenger(SCREEN_BLANKER_SIG, -1, NULL); + blankerMessenger.SendMessage(B_QUIT_REQUESTED); } void -SSInputFilter::CheckTime() { +SSInputFilter::CheckTime() +{ CALLED(); fRtc = system_time(); if (fRtc >= fLastEventTime + fBlankTime) Invoke(); - // If the screen saver is on OR it was time to come on but it didn't (corner), snooze for blankTime - // Otherwise, there was an event in the middle of the last snooze, so snooze for the remainder - if (fEnabled || (fLastEventTime+fBlankTime<=fRtc)) + + // If the screen saver is on OR it was time to come on but it didn't (corner), + // snooze for blankTime. + // Otherwise, there was an event in the middle of the last snooze, so snooze + // for the remainder. + if (fEnabled || fLastEventTime + fBlankTime <= fRtc) fSnoozeTime = fBlankTime; else fSnoozeTime = fLastEventTime + fBlankTime - fRtc; @@ -180,18 +215,26 @@ SSInputFilter::CheckTime() { void -SSInputFilter::UpdateRectangles() { +SSInputFilter::UpdateRectangles() +{ + // TODO: make this better if possible at all (in a clean way) CALLED(); BRect frame = BScreen().Frame(); - fTopLeft.Set(frame.left,frame.top,frame.left+CORNER_SIZE,frame.top+CORNER_SIZE); - fTopRight.Set(frame.right-CORNER_SIZE,frame.top,frame.right,frame.top+CORNER_SIZE); - fBottomLeft.Set(frame.left,frame.bottom-CORNER_SIZE,frame.left+CORNER_SIZE,frame.bottom); - fBottomRight.Set(frame.right-CORNER_SIZE,frame.bottom-CORNER_SIZE,frame.right,frame.bottom); + + fTopLeft.Set(frame.left, frame.top, + frame.left + CORNER_SIZE, frame.top + CORNER_SIZE); + fTopRight.Set(frame.right - CORNER_SIZE, frame.top, + frame.right, frame.top + CORNER_SIZE); + fBottomLeft.Set(frame.left, frame.bottom - CORNER_SIZE, + frame.left + CORNER_SIZE, frame.bottom); + fBottomRight.Set(frame.right - CORNER_SIZE, frame.bottom - CORNER_SIZE, + frame.right, frame.bottom); } void -SSInputFilter::Cornered(arrowDirection pos) { +SSInputFilter::Cornered(arrowDirection pos) +{ //CALLED(); fCurrent = pos; if (fBlank != NONE && pos == fBlank) @@ -200,13 +243,16 @@ SSInputFilter::Cornered(arrowDirection pos) { filter_result -SSInputFilter::Filter(BMessage *msg,BList *outList) { +SSInputFilter::Filter(BMessage *msg, BList *outList) +{ fLastEventTime = system_time(); - if (msg->what==B_MOUSE_MOVED) { + + if (msg->what == B_MOUSE_MOVED) { BPoint pos; msg->FindPoint("where",&pos); - if ((fFrameNum++ % 32)==0) // Every so many frames, update + if ((fFrameNum++ % 32) == 0) // Every so many frames, update UpdateRectangles(); + if (fTopLeft.Contains(pos)) Cornered(UPLEFT); else if (fTopRight.Contains(pos))