git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14245 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-09-26 23:34:26 +00:00
parent 4097611c9f
commit 3b7087718c
1 changed files with 73 additions and 27 deletions

View File

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