Rewritten from scratch to match the "screenblanker" style of R5.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7033 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Phipps
2004-03-19 19:41:42 +00:00
parent 06c0f437a7
commit c171a52d8b
3 changed files with 44 additions and 46 deletions
@@ -2,4 +2,4 @@ SubDir OBOS_TOP src add-ons input_server filters screensaver ;
Addon screen_saver : input_server/filters : SSInputFilter.cpp ; Addon screen_saver : input_server/filters : SSInputFilter.cpp ;
LinkSharedOSLibs screen_saver : be /system/servers/input_server ; LinkSharedOSLibs screen_saver : be ../../../../../distro/x86.R1/beos/system/lib/libscreensaver.so _APP_ ;
@@ -1,60 +1,57 @@
#include "SSInputFilter.h"
#include "OS.h" #include "OS.h"
#include "Roster.h" #include "Roster.h"
#include "Application.h"
#include "SSInputFilter.h"
extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
// TODO: SSISFilter *fltr=NULL;
// Read SS preferences for timing, corner info
// If corners get confused (l/r), check size of enums
SSISFilter *fltr; BInputServerFilter* instantiate_input_filter() { // required C func to build the IS Filter
BInputServerFilter* instantiate_input_filter()
{
return (fltr=new SSISFilter()); return (fltr=new SSISFilter());
} }
filter_result timeUpFunc (BMessage *message,BHandler **target, BMessageFilter *messageFilter) { int32 threadFunc (void *data) {
fltr->CheckTime(); while (1) {
return B_SKIP_MESSAGE; snooze(fltr->getSnoozeTime()*1000000); // snoozeTime is in microseconds
fltr->CheckTime();
}
return B_OK; // Should never get here...
} }
SSISFilter::SSISFilter() : enabled(false) { SSISFilter::SSISFilter() : enabled(false) {
messenger=new BMessenger(NULL,-1); // Get the current teams default handler pref.LoadSettings();
timeMsg=new BMessage(timeUp); blank=pref.GetBlankCorner();
runner=new BMessageRunner(*messenger, timeMsg, 3000000,-1); // CHANGE ME!!! keep=pref.GetNeverBlankCorner();
filter=new BMessageFilter(timeUp,timeUpFunc); blankTime=snoozeTime=pref.BlankTime();
watcher=spawn_thread(threadFunc,"ScreenSaverWatcher",0,NULL);
resume_thread(watcher);
} }
void SSISFilter::Invoke(void) { void SSISFilter::Invoke(void) {
status_t err;
if (current==keep) if (current==keep)
return; // If mouse is in this corner, never invoke. return; // If mouse is in this corner, never invoke.
be_roster->Launch("application/x-vnd.OBOS-ScreenSaverApp"); be_roster->Launch("application/x-vnd.OBOS-ScreenSaverApp");
ssApp=new BMessenger("application/x-vnd.OBOS-ScreenSaverApp",-1,&err);
enabled=true; enabled=true;
} }
void SSISFilter::Banish(void) { void SSISFilter::Banish(void) {
ssApp->SendMessage('QUIT'); BMessenger ssApp ("application/x-vnd.OBOS-ScreenSaverApp",-1,NULL); // Don't care if it fails
delete ssApp; ssApp.SendMessage('MOO1');
enabled=true; enabled=false;
} }
void SSISFilter::CheckTime(void) { void SSISFilter::CheckTime(void) {
uint32 rtc; if ((rtc=real_time_clock())>=lastEventTime+blankTime)
if ((rtc=real_time_clock())>=first+blankTime)
Invoke(); Invoke();
else snoozeTime=(enabled)?blankTime:lastEventTime+blankTime-rtc;
runner->SetInterval(first+blankTime-rtc); // Check back at the time when, if nothing is pressed/moved between now and then, we should blank...
} }
void SSISFilter::UpdateRectangles(void) { void SSISFilter::UpdateRectangles(void) {
BRegion region; BRegion region;
BRect frame;
GetScreenRegion(&region); GetScreenRegion(&region);
frame=region.Frame(); BRect frame=region.Frame();
topLeft.Set(frame.left,frame.top,frame.left+CORNER_SIZE,frame.top+CORNER_SIZE); topLeft.Set(frame.left,frame.top,frame.left+CORNER_SIZE,frame.top+CORNER_SIZE);
topRight.Set(frame.right-CORNER_SIZE,frame.top,frame.right,frame.top+CORNER_SIZE); topRight.Set(frame.right-CORNER_SIZE,frame.top,frame.right,frame.top+CORNER_SIZE);
@@ -62,33 +59,34 @@ void SSISFilter::UpdateRectangles(void) {
bottomRight.Set(frame.right-CORNER_SIZE,frame.bottom-CORNER_SIZE,frame.right,frame.bottom); bottomRight.Set(frame.right-CORNER_SIZE,frame.bottom-CORNER_SIZE,frame.right,frame.bottom);
} }
void SSISFilter::Cornered(cornerPos pos) { void SSISFilter::Cornered(arrowDirection pos) {
current=pos; current=pos;
if (pos==blank) if (pos==blank)
Invoke(); Invoke();
} }
filter_result SSISFilter::Filter(BMessage *msg,BList *outList) { filter_result SSISFilter::Filter(BMessage *msg,BList *outList) {
lastEventTime=real_time_clock();
if (msg->what==B_SCREEN_CHANGED) if (msg->what==B_SCREEN_CHANGED)
UpdateRectangles(); UpdateRectangles();
else if (enabled && msg->what==B_MOUSE_MOVED) { else if (enabled)
Banish();
else if (msg->what==B_MOUSE_MOVED) {
BPoint pos; BPoint pos;
msg->FindPoint("where",&pos); msg->FindPoint("where",&pos);
if (topLeft.Contains(pos)) if (topLeft.Contains(pos))
Cornered(TOPL); Cornered(UPLEFT);
else if (topRight.Contains(pos)) else if (topRight.Contains(pos))
Cornered(TOPR); Cornered(UPRIGHT);
else if (bottomLeft.Contains(pos)) else if (bottomLeft.Contains(pos))
Cornered(BOTL); Cornered(DOWNLEFT);
else if (bottomRight.Contains(pos)) else if (bottomRight.Contains(pos))
Cornered(BOTR); Cornered(DOWNRIGHT);
else else
Cornered(MIDDLE); Cornered(NONE);
} }
first=real_time_clock();
} }
SSISFilter::~SSISFilter() SSISFilter::~SSISFilter() {
{
; ;
} }
@@ -4,10 +4,13 @@
#include "Messenger.h" #include "Messenger.h"
#include "MessageFilter.h" #include "MessageFilter.h"
#include "MessageRunner.h" #include "MessageRunner.h"
#include "ScreenSaverPrefs.h"
const int CORNER_SIZE=10; const int CORNER_SIZE=10;
const int timeUp='TMUP'; const int timeUp='TMUP';
int32 threadFunc(void *);
class SSISFilter: public BInputServerFilter class SSISFilter: public BInputServerFilter
{ {
public: public:
@@ -15,20 +18,17 @@ public:
virtual ~SSISFilter(); virtual ~SSISFilter();
virtual filter_result Filter(BMessage *msg, BList *outList); virtual filter_result Filter(BMessage *msg, BList *outList);
void CheckTime(void); void CheckTime(void);
enum cornerPos {MIDDLE='ENDC',TOPL='TOPL',TOPR='TOPR',BOTL='BOTL',BOTR='BOTR'}; uint32 getSnoozeTime(void) {return snoozeTime;}
private: private:
cornerPos blank, keep, current; uint32 lastEventTime,blankTime,snoozeTime,rtc;
uint32 first,blankTime; arrowDirection blank, keep, current;
bool enabled; bool enabled;
BMessenger *ssApp;
BRect topLeft,topRight,bottomLeft,bottomRight; BRect topLeft,topRight,bottomLeft,bottomRight;
BMessageRunner *runner; ScreenSaverPrefs pref;
BMessageFilter *filter; thread_id watcher;
BMessenger *messenger;
BMessage *timeMsg;
void UpdateRectangles(void); void UpdateRectangles(void);
void Cornered(cornerPos pos); void Cornered(arrowDirection pos);
void Invoke(void); void Invoke(void);
void Banish(void); void Banish(void);
}; };