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
This commit is contained in:
Michael Phipps
2004-03-09 01:20:53 +00:00
parent ec54625e5e
commit 28857c0500
2 changed files with 65 additions and 41 deletions
@@ -1,23 +1,56 @@
#include "SSInputFilter.h" #include "SSInputFilter.h"
#include "Messenger.h"
#include "OS.h" #include "OS.h"
#include "Roster.h"
extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
SSISFilter::SSISFilter() // TODO:
{ // Read SS preferences for timing, corner info
first=real_time_clock(); // If corners get confused (l/r), check size of enums
enabled=false;
ssApp=NULL; SSISFilter *fltr;
}
BInputServerFilter* instantiate_input_filter() 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; BRegion region;
BRect frame; BRect frame;
GetScreenRegion(&region); GetScreenRegion(&region);
@@ -29,21 +62,16 @@ 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(cornerPos pos) {
{ current=pos;
static cornerPos oldPos; if (pos==blank)
if (oldPos!=pos) Invoke();
enabled=(B_OK == ssApp->SendMessage((int32)(pos)));
oldPos=pos;
} }
filter_result SSISFilter::Filter(BMessage *msg,BList *outList) filter_result SSISFilter::Filter(BMessage *msg,BList *outList) {
{
status_t err;
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 && 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))
@@ -57,23 +85,7 @@ filter_result SSISFilter::Filter(BMessage *msg,BList *outList)
else else
Cornered(MIDDLE); Cornered(MIDDLE);
} }
if (real_time_clock()>first+4) // Only check every 5 seconds or so first=real_time_clock();
{
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();
}
} }
SSISFilter::~SSISFilter() SSISFilter::~SSISFilter()
@@ -1,8 +1,12 @@
#include "InputServerFilter.h" #include "InputServerFilter.h"
#include "Rect.h" #include "Rect.h"
#include "Region.h" #include "Region.h"
#include "Messenger.h"
#include "MessageFilter.h"
#include "MessageRunner.h"
const int CORNER_SIZE=10; const int CORNER_SIZE=10;
const int timeUp='TMUP';
class SSISFilter: public BInputServerFilter class SSISFilter: public BInputServerFilter
{ {
@@ -10,14 +14,22 @@ public:
SSISFilter(); SSISFilter();
virtual ~SSISFilter(); virtual ~SSISFilter();
virtual filter_result Filter(BMessage *msg, BList *outList); virtual filter_result Filter(BMessage *msg, BList *outList);
void CheckTime(void);
enum cornerPos {MIDDLE='ENDC',TOPL='TOPL',TOPR='TOPR',BOTL='BOTL',BOTR='BOTR'};
private: private:
uint32 first; cornerPos blank, keep, current;
uint32 first,blankTime;
bool enabled; bool enabled;
BMessenger *ssApp; BMessenger *ssApp;
BRect topLeft,topRight,bottomLeft,bottomRight; BRect topLeft,topRight,bottomLeft,bottomRight;
//enum cornerPos {MIDDLE=(int32)'ENDC',TOPL=(int32)'TOPL',TOPR=(int32)'TOPR',BOTL=(int32)'BOTL',BOTR=(int32)'BOTR'}; BMessageRunner *runner;
enum cornerPos {MIDDLE='ENDC',TOPL='TOPL',TOPR='TOPR',BOTL='BOTL',BOTR='BOTR'}; BMessageFilter *filter;
BMessenger *messenger;
BMessage *timeMsg;
void UpdateRectangles(void); void UpdateRectangles(void);
void Cornered(cornerPos pos); void Cornered(cornerPos pos);
void Invoke(void);
void Banish(void);
}; };