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:
@@ -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(®ion);
|
GetScreenRegion(®ion);
|
||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user