From 28857c0500023d3c2ddba1d42b6ce5b3f497b78b Mon Sep 17 00:00:00 2001 From: Michael Phipps Date: Tue, 9 Mar 2004 01:20:53 +0000 Subject: [PATCH] Rewritten with some help from voidref. Not complete, but pretty close. Mostly I just need to use the ScreenSaverPrefs to figure out how many seconds before blanking. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6936 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../filters/screensaver/SSInputFilter.cpp | 88 +++++++++++-------- .../filters/screensaver/SSInputFilter.h | 18 +++- 2 files changed, 65 insertions(+), 41 deletions(-) diff --git a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp index 0ecec20b23..cdf734ffb3 100644 --- a/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp +++ b/src/add-ons/input_server/filters/screensaver/SSInputFilter.cpp @@ -1,23 +1,56 @@ #include "SSInputFilter.h" -#include "Messenger.h" #include "OS.h" +#include "Roster.h" extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); -SSISFilter::SSISFilter() -{ - first=real_time_clock(); - enabled=false; - ssApp=NULL; -} +// TODO: +// Read SS preferences for timing, corner info +// If corners get confused (l/r), check size of enums + +SSISFilter *fltr; BInputServerFilter* instantiate_input_filter() { - return (new SSISFilter()); + return (fltr=new SSISFilter()); } -void SSISFilter::UpdateRectangles(void) -{ +filter_result timeUpFunc (BMessage *message,BHandler **target, BMessageFilter *messageFilter) { + fltr->CheckTime(); + return B_SKIP_MESSAGE; +} + +SSISFilter::SSISFilter() : enabled(false) { + messenger=new BMessenger(NULL,-1); // Get the current teams default handler + timeMsg=new BMessage(timeUp); + runner=new BMessageRunner(*messenger, timeMsg, 3000000,-1); // CHANGE ME!!! + filter=new BMessageFilter(timeUp,timeUpFunc); +} + +void SSISFilter::Invoke(void) { + status_t err; + if (current==keep) + return; // If mouse is in this corner, never invoke. + be_roster->Launch("application/x-vnd.OBOS-ScreenSaverApp"); + ssApp=new BMessenger("application/x-vnd.OBOS-ScreenSaverApp",-1,&err); + enabled=true; +} + +void SSISFilter::Banish(void) { + ssApp->SendMessage('QUIT'); + delete ssApp; + enabled=true; +} + +void SSISFilter::CheckTime(void) { + uint32 rtc; + if ((rtc=real_time_clock())>=first+blankTime) + Invoke(); + else + 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) { BRegion region; BRect frame; GetScreenRegion(®ion); @@ -29,21 +62,16 @@ void SSISFilter::UpdateRectangles(void) bottomRight.Set(frame.right-CORNER_SIZE,frame.bottom-CORNER_SIZE,frame.right,frame.bottom); } -void SSISFilter::Cornered(cornerPos pos) -{ - static cornerPos oldPos; - if (oldPos!=pos) - enabled=(B_OK == ssApp->SendMessage((int32)(pos))); - oldPos=pos; +void SSISFilter::Cornered(cornerPos pos) { + current=pos; + if (pos==blank) + Invoke(); } -filter_result SSISFilter::Filter(BMessage *msg,BList *outList) -{ - status_t err; +filter_result SSISFilter::Filter(BMessage *msg,BList *outList) { if (msg->what==B_SCREEN_CHANGED) UpdateRectangles(); - else if (enabled && msg->what==B_MOUSE_MOVED) - { + else if (enabled && msg->what==B_MOUSE_MOVED) { BPoint pos; msg->FindPoint("where",&pos); if (topLeft.Contains(pos)) @@ -57,23 +85,7 @@ filter_result SSISFilter::Filter(BMessage *msg,BList *outList) else Cornered(MIDDLE); } - if (real_time_clock()>first+4) // Only check every 5 seconds or so - { - if (!enabled) - { - delete ssApp; - ssApp=new BMessenger("application/x-vnd.OBOS-ScreenSaverApp",-1,&err); - if (err==B_OK) - { - enabled=true; - UpdateRectangles(); - } - } - - if (enabled) - enabled=(B_OK == ssApp->SendMessage('INPT')); - first=real_time_clock(); - } + first=real_time_clock(); } SSISFilter::~SSISFilter() diff --git a/src/add-ons/input_server/filters/screensaver/SSInputFilter.h b/src/add-ons/input_server/filters/screensaver/SSInputFilter.h index d2c545e346..50a1487218 100644 --- a/src/add-ons/input_server/filters/screensaver/SSInputFilter.h +++ b/src/add-ons/input_server/filters/screensaver/SSInputFilter.h @@ -1,8 +1,12 @@ #include "InputServerFilter.h" #include "Rect.h" #include "Region.h" +#include "Messenger.h" +#include "MessageFilter.h" +#include "MessageRunner.h" const int CORNER_SIZE=10; +const int timeUp='TMUP'; class SSISFilter: public BInputServerFilter { @@ -10,14 +14,22 @@ public: SSISFilter(); virtual ~SSISFilter(); virtual filter_result Filter(BMessage *msg, BList *outList); + void CheckTime(void); + enum cornerPos {MIDDLE='ENDC',TOPL='TOPL',TOPR='TOPR',BOTL='BOTL',BOTR='BOTR'}; private: - uint32 first; + cornerPos blank, keep, current; + uint32 first,blankTime; bool enabled; BMessenger *ssApp; BRect topLeft,topRight,bottomLeft,bottomRight; - //enum cornerPos {MIDDLE=(int32)'ENDC',TOPL=(int32)'TOPL',TOPR=(int32)'TOPR',BOTL=(int32)'BOTL',BOTR=(int32)'BOTR'}; - enum cornerPos {MIDDLE='ENDC',TOPL='TOPL',TOPR='TOPR',BOTL='BOTL',BOTR='BOTR'}; + BMessageRunner *runner; + BMessageFilter *filter; + BMessenger *messenger; + BMessage *timeMsg; + void UpdateRectangles(void); void Cornered(cornerPos pos); + void Invoke(void); + void Banish(void); };