* fEnabled is now maintained correctly, so that a screen blanker is now also quit
by _Banish() (never happened before). * Instead of sending a new message for every mouse move in a corner, we now keep one BMessageRunner around and only update its interval; we now also check the time with no events in CheckCornerInvoke() - this both makes sure that the screen is not blanked while there is still user activity. * The screen saver never worked if you didn't set the never-blank corner to something. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19699 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -20,11 +20,15 @@
|
|||||||
|
|
||||||
#include <Debug.h>
|
#include <Debug.h>
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
#define CALLED() SERIAL_PRINT(("%s\n", __PRETTY_FUNCTION__))
|
#define CALLED() SERIAL_PRINT(("%s\n", __PRETTY_FUNCTION__))
|
||||||
|
|
||||||
|
|
||||||
static const int32 kNeverBlankCornerSize = 10;
|
static const int32 kNeverBlankCornerSize = 10;
|
||||||
static const int32 kBlankCornerSize = 5;
|
static const int32 kBlankCornerSize = 5;
|
||||||
|
static const bigtime_t kCornerDelay = 1000000LL;
|
||||||
|
// one second
|
||||||
|
|
||||||
static const int32 kMsgCheckTime = 'SSCT';
|
static const int32 kMsgCheckTime = 'SSCT';
|
||||||
static const int32 kMsgCornerInvoke = 'Scin';
|
static const int32 kMsgCornerInvoke = 'Scin';
|
||||||
@@ -38,7 +42,7 @@ extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
|
|||||||
BInputServerFilter*
|
BInputServerFilter*
|
||||||
instantiate_input_filter()
|
instantiate_input_filter()
|
||||||
{
|
{
|
||||||
return new ScreenSaverFilter();
|
return new (std::nothrow) ScreenSaverFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -105,11 +109,15 @@ ScreenSaverFilter::ScreenSaverFilter()
|
|||||||
fEnabled(false),
|
fEnabled(false),
|
||||||
fFrameNum(0),
|
fFrameNum(0),
|
||||||
fRunner(NULL),
|
fRunner(NULL),
|
||||||
|
fCornerRunner(NULL),
|
||||||
fWatchingDirectory(false),
|
fWatchingDirectory(false),
|
||||||
fWatchingFile(false)
|
fWatchingFile(false)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
fController = new ScreenSaverController(this);
|
fController = new (std::nothrow) ScreenSaverController(this);
|
||||||
|
if (fController == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
fController->Run();
|
fController->Run();
|
||||||
|
|
||||||
ReloadSettings();
|
ReloadSettings();
|
||||||
@@ -119,6 +127,7 @@ ScreenSaverFilter::ScreenSaverFilter()
|
|||||||
|
|
||||||
ScreenSaverFilter::~ScreenSaverFilter()
|
ScreenSaverFilter::~ScreenSaverFilter()
|
||||||
{
|
{
|
||||||
|
delete fCornerRunner;
|
||||||
delete fRunner;
|
delete fRunner;
|
||||||
|
|
||||||
if (fWatchingFile || fWatchingDirectory)
|
if (fWatchingFile || fWatchingDirectory)
|
||||||
@@ -169,13 +178,15 @@ void
|
|||||||
ScreenSaverFilter::_Invoke()
|
ScreenSaverFilter::_Invoke()
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
if (fCurrentCorner == fNeverBlankCorner || fEnabled
|
if (fCurrentCorner == fNeverBlankCorner && fNeverBlankCorner != NO_CORNER
|
||||||
|| fSettings.TimeFlags() == SAVER_DISABLED
|
|| fSettings.TimeFlags() == SAVER_DISABLED
|
||||||
|
|| fEnabled
|
||||||
|| be_roster->IsRunning(SCREEN_BLANKER_SIG))
|
|| be_roster->IsRunning(SCREEN_BLANKER_SIG))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SERIAL_PRINT(("we run screenblanker\n"));
|
SERIAL_PRINT(("we run screenblanker\n"));
|
||||||
be_roster->Launch(SCREEN_BLANKER_SIG);
|
if (be_roster->Launch(SCREEN_BLANKER_SIG) == B_OK)
|
||||||
|
fEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -192,6 +203,10 @@ ScreenSaverFilter::ReloadSettings()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete fCornerRunner;
|
||||||
|
delete fRunner;
|
||||||
|
fRunner = fCornerRunner = NULL;
|
||||||
|
|
||||||
fSettings.Load();
|
fSettings.Load();
|
||||||
|
|
||||||
fBlankCorner = fSettings.BlankCorner();
|
fBlankCorner = fSettings.BlankCorner();
|
||||||
@@ -199,10 +214,15 @@ ScreenSaverFilter::ReloadSettings()
|
|||||||
fBlankTime = fSnoozeTime = fSettings.BlankTime();
|
fBlankTime = fSnoozeTime = fSettings.BlankTime();
|
||||||
CheckTime();
|
CheckTime();
|
||||||
|
|
||||||
delete fRunner;
|
if (fBlankCorner != NO_CORNER || fNeverBlankCorner != NO_CORNER) {
|
||||||
|
BMessage invoke(kMsgCornerInvoke);
|
||||||
|
fCornerRunner = new (std::nothrow) BMessageRunner(fController,
|
||||||
|
&invoke, B_INFINITE_TIMEOUT);
|
||||||
|
// will be reset in Filter()
|
||||||
|
}
|
||||||
|
|
||||||
BMessage check(kMsgCheckTime);
|
BMessage check(kMsgCheckTime);
|
||||||
fRunner = new BMessageRunner(fController, &check, fSnoozeTime);
|
fRunner = new (std::nothrow) 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"));
|
||||||
}
|
}
|
||||||
@@ -221,6 +241,7 @@ ScreenSaverFilter::_Banish()
|
|||||||
// Don't care if it fails
|
// Don't care if it fails
|
||||||
BMessenger blankerMessenger(SCREEN_BLANKER_SIG, -1, NULL);
|
BMessenger blankerMessenger(SCREEN_BLANKER_SIG, -1, NULL);
|
||||||
blankerMessenger.SendMessage(B_QUIT_REQUESTED);
|
blankerMessenger.SendMessage(B_QUIT_REQUESTED);
|
||||||
|
fEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -252,7 +273,10 @@ ScreenSaverFilter::CheckTime()
|
|||||||
void
|
void
|
||||||
ScreenSaverFilter::CheckCornerInvoke()
|
ScreenSaverFilter::CheckCornerInvoke()
|
||||||
{
|
{
|
||||||
if (fCurrentCorner == fBlankCorner)
|
bigtime_t inactivity = system_time() - fLastEventTime;
|
||||||
|
|
||||||
|
if (fCurrentCorner == fBlankCorner && fBlankCorner != NO_CORNER
|
||||||
|
&& inactivity >= kCornerDelay)
|
||||||
_Invoke();
|
_Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,9 +344,8 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
|
|||||||
if (fBlankRect.Contains(where)) {
|
if (fBlankRect.Contains(where)) {
|
||||||
fCurrentCorner = fBlankCorner;
|
fCurrentCorner = fBlankCorner;
|
||||||
|
|
||||||
// start screen blanker after one second
|
// start screen blanker after one second of inactivity
|
||||||
BMessage invoke(kMsgCornerInvoke);
|
if (fCornerRunner->SetInterval(kCornerDelay) != B_OK)
|
||||||
if (BMessageRunner::StartSending(fController, &invoke, 1000000ULL, 1) != B_OK)
|
|
||||||
_Invoke();
|
_Invoke();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ class ScreenSaverFilter : public BInputServerFilter {
|
|||||||
ScreenSaverController* fController;
|
ScreenSaverController* fController;
|
||||||
node_ref fNodeRef;
|
node_ref fNodeRef;
|
||||||
BMessageRunner* fRunner;
|
BMessageRunner* fRunner;
|
||||||
|
BMessageRunner* fCornerRunner;
|
||||||
bool fWatchingDirectory, fWatchingFile;
|
bool fWatchingDirectory, fWatchingFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user