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:
@@ -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) {
|
||||||
|
while (1) {
|
||||||
|
snooze(fltr->getSnoozeTime()*1000000); // snoozeTime is in microseconds
|
||||||
fltr->CheckTime();
|
fltr->CheckTime();
|
||||||
return B_SKIP_MESSAGE;
|
}
|
||||||
|
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(®ion);
|
GetScreenRegion(®ion);
|
||||||
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);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user