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

View File

@ -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(&region);
@ -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,24 +85,8 @@ 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();
}
}
SSISFilter::~SSISFilter()
{

View File

@ -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);
};