* Big time cleanup of the screen saver stuff, not yet finished yet, though.

Renamed lots of things, like ScreenSaverThread to ScreenSaverRunner,
  refactored code, etc. Much cleaner interfaces and code.
* Fixed a couple of bugs and in the add-on handling, especially some settings
  related bugs (ie. testing a screen saver will now use its latest settings,
  etc.).
* Correctly implemented DPMS support in ScreenSaverPrefs and the ScreenSaver
  preferences application - screen_blanker still ignores them, though.
* It's not yet font sensitive either.
* Changed the input_server add-on to not switch to the screen blanker immediately
  when it's in the "blank corner" - doesn't seem to work yet, though (only tested
  under Qemu).
* Correctly implemented the "preview" function (before, a screen saver would
  never know it rendered a preview).
* Evaluates the return value of BScreenSaver::StartSaver().
* The screen saver thread is no longer killed without notice - it's now
  always shut down properly.
* Made the code more robust against failure.
* Introduced some new bugs as well (the screen saver list view doesn't jump to
  the selection anymore, for some reason), those will be fixed later (as the
  remaining issues).
* Probably some more I forgot about.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17731 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-06-06 08:16:46 +00:00
parent ef1974cb9d
commit 7cae4a1ee0
23 changed files with 1478 additions and 1211 deletions
+50 -57
View File
@@ -1,82 +1,75 @@
#if ! defined _SCREENSAVER_H /*
* Copyright 2002-2006, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _SCREENSAVER_H
#define _SCREENSAVER_H #define _SCREENSAVER_H
#include <BeBuild.h> #include <BeBuild.h>
#include <DirectWindow.h> // for direct_buffer_info #include <DirectWindow.h>
#include <image.h> #include <image.h>
#include <Message.h> #include <Message.h>
class BView; class BView;
class BScreenSaver
{
public:
BScreenSaver(BMessage *archive, image_id);
virtual ~BScreenSaver();
// Return an error if something goes wrong or if you don't class BScreenSaver {
// like the running environment (lack of 3D acceleration, public:
// lack of sound, ...). BScreenSaver(BMessage* archive, image_id thisImage);
virtual status_t InitCheck(); virtual ~BScreenSaver();
// Animation start and stop. The view is not yet visible when virtual status_t InitCheck();
// StartSaver is called.
virtual status_t StartSaver(BView *view, bool preview);
virtual void StopSaver();
// This hook is called periodically, you should virtual status_t StartSaver(BView* view, bool preview);
// override it to do the drawing. Notice that you virtual void StopSaver();
// should clear the screen when frame == 0 if you
// don't want to paint over the desktop.
virtual void Draw(BView *view, int32 frame);
// These hooks are for direct screen access, the first is virtual void Draw(BView* view, int32 frame);
// called every time the settings change, the second is
// the equivalent of Draw to be called to access the screen
// directly. Draw and DirectDraw can be used at the same time.
virtual void DirectConnected(direct_buffer_info *info);
virtual void DirectDraw(int32 frame);
// configuration dialog methods // direct screen access
virtual void StartConfig(BView *configView); virtual void DirectConnected(direct_buffer_info* info);
virtual void StopConfig(); virtual void DirectDraw(int32 frame);
// Module should fill this in with metadata // configuration dialog methods
// example: randomizable = true virtual void StartConfig(BView* configView);
virtual void SupplyInfo(BMessage *info) const; virtual void StopConfig();
// Send all the metadata info to the module // Module should fill this in with metadata
virtual void ModulesChanged(const BMessage *info); // example: randomizable = true
virtual void SupplyInfo(BMessage* info) const;
// BArchivable like parameter saver method // Send all the metadata info to the module
virtual status_t SaveState(BMessage *into) const; virtual void ModulesChanged(const BMessage* info);
// These methods can be used to control drawing frequency. // BArchivable like parameter saver method
void SetTickSize(bigtime_t ts); virtual status_t SaveState(BMessage* into) const;
bigtime_t TickSize() const;
// These methods can be used to control animation loop cycles // These methods can be used to control drawing frequency.
void SetLoop(int32 on_count, int32 off_count); void SetTickSize(bigtime_t tickSize);
int32 LoopOnCount() const; bigtime_t TickSize() const;
int32 LoopOffCount() const;
private: // These methods can be used to control animation loop cycles
virtual void _ReservedScreenSaver1(); void SetLoop(int32 onCount, int32 offCount);
virtual void _ReservedScreenSaver2(); int32 LoopOnCount() const;
virtual void _ReservedScreenSaver3(); int32 LoopOffCount() const;
virtual void _ReservedScreenSaver4();
virtual void _ReservedScreenSaver5();
virtual void _ReservedScreenSaver6();
virtual void _ReservedScreenSaver7();
virtual void _ReservedScreenSaver8();
bigtime_t ticksize; private:
int32 looponcount; virtual void _ReservedScreenSaver1();
int32 loopoffcount; virtual void _ReservedScreenSaver2();
virtual void _ReservedScreenSaver3();
virtual void _ReservedScreenSaver4();
virtual void _ReservedScreenSaver5();
virtual void _ReservedScreenSaver6();
virtual void _ReservedScreenSaver7();
virtual void _ReservedScreenSaver8();
uint32 _reservedScreenSaver[6]; bigtime_t fTickSize;
int32 fLoopOnCount;
int32 fLoopOffCount;
uint32 _reserved[6];
}; };
extern "C" _EXPORT BScreenSaver *instantiate_screen_saver(BMessage *msg, image_id id); extern "C" _EXPORT BScreenSaver *instantiate_screen_saver(BMessage *msg, image_id id);
#endif #endif // _SCREENSAVER_H
+80 -65
View File
@@ -1,15 +1,17 @@
/* /*
* Copyright 2003, Michael Phipps. All rights reserved. * Copyright 2003-2006, Michael Phipps. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef SCREEN_SAVER_PREFS_H #ifndef SCREEN_SAVER_PREFS_H
#define SCREEN_SAVER_PREFS_H #define SCREEN_SAVER_PREFS_H
#include <Message.h> #include <Message.h>
#include <Path.h> #include <Path.h>
#include <String.h> #include <String.h>
enum arrowDirection {
enum screen_corner {
NONE = -1, NONE = -1,
UPLEFT, UPLEFT,
UPRIGHT, UPRIGHT,
@@ -18,69 +20,82 @@ enum arrowDirection {
CENTER CENTER
}; };
#define SCREEN_BLANKER_SIG "application/x-vnd.Haiku.screenblanker" // time flags
enum {
SAVER_DISABLED = 0x00,
ENABLE_SAVER = 0x01,
ENABLE_DPMS_STAND_BY = 0x02,
ENABLE_DPMS_SUSPEND = 0x04,
ENABLE_DPMS_OFF = 0x08,
class ScreenSaverPrefs ENABLE_DPMS_MASK = ENABLE_DPMS_STAND_BY | ENABLE_DPMS_SUSPEND | ENABLE_DPMS_OFF
{
public:
ScreenSaverPrefs();
bool LoadSettings();
void Defaults();
BPath & GetPath() { return fSSPath;}
BRect WindowFrame() {return fWindowFrame;}
int32 WindowTab() {return fWindowTab;}
int32 TimeFlags() {return fTimeFlags;}
bigtime_t BlankTime() {return fBlankTime;}
bigtime_t StandbyTime() {return fStandByTime;}
bigtime_t SuspendTime() {return fSuspendTime;}
bigtime_t OffTime() {return fOffTime;}
arrowDirection GetBlankCorner() {return fBlankCorner;}
arrowDirection GetNeverBlankCorner() {return fNeverBlankCorner;}
bool LockEnable() {return fLockEnabled;}
bigtime_t PasswordTime() {return fPasswordTime;}
const char *Password() { return fPassword.String(); }
const char *LockMethod() { return fLockMethod.String(); }
bool IsNetworkPassword() {return (strcmp(fLockMethod.String(), "custom") != 0);}
const char *ModuleName() {return fModuleName.String();}
status_t GetState(const char *name, BMessage *stateMsg);
void SetWindowFrame(const BRect &fr) { fWindowFrame = fr;}
void SetWindowTab(int32 tab) { fWindowTab = tab;}
void SetTimeFlags(int32 tf) {fTimeFlags = tf;}
void SetBlankTime(bigtime_t bt) {fBlankTime = bt;}
void SetStandbyTime(bigtime_t time) {fStandByTime = time;}
void SetSuspendTime(bigtime_t time) {fSuspendTime = time;}
void SetOffTime(bigtime_t intime) {fOffTime = intime;}
void SetBlankCorner(arrowDirection in) {fBlankCorner = in;}
void SetNeverBlankCorner(arrowDirection in) {fNeverBlankCorner = in;}
void SetLockEnable(bool en) {fLockEnabled = en;}
void SetPasswordTime(bigtime_t pt) {fPasswordTime = pt;}
void SetPassword(const char *pw) {fPassword = pw;} // Can not set network password from here.
void SetLockMethod(const char *method) {fLockMethod = method;}
void SetModuleName(const char *mn) {fModuleName = mn;}
void SetState(const char *name, BMessage *stateMsg);
void SaveSettings();
BMessage & GetSettings();
private:
BRect fWindowFrame;
int32 fWindowTab;
int32 fTimeFlags;
bigtime_t fBlankTime;
bigtime_t fStandByTime;
bigtime_t fSuspendTime;
bigtime_t fOffTime;
arrowDirection fBlankCorner;
arrowDirection fNeverBlankCorner;
bool fLockEnabled;
bigtime_t fPasswordTime;
BString fPassword;
BString fModuleName;
BString fLockMethod;
BMessage fSettings;
BPath fSSPath, fNetworkPath;
}; };
#define SCREEN_BLANKER_SIG "application/x-vnd.Haiku.screenblanker"
#endif //SCREEN_SAVER_PREFS_H class ScreenSaverPrefs {
public:
ScreenSaverPrefs();
bool LoadSettings();
void Defaults();
BPath& Path() { return fSettingsPath; }
BRect WindowFrame() { return fWindowFrame; }
int32 WindowTab() { return fWindowTab; }
int32 TimeFlags() { return fTimeFlags; }
bigtime_t BlankTime() { return fBlankTime; }
bigtime_t StandbyTime() { return fStandByTime; }
bigtime_t SuspendTime() { return fSuspendTime; }
bigtime_t OffTime() { return fOffTime; }
screen_corner GetBlankCorner() { return fBlankCorner; }
screen_corner GetNeverBlankCorner() { return fNeverBlankCorner; }
bool LockEnable() { return fLockEnabled; }
bigtime_t PasswordTime() { return fPasswordTime; }
const char *Password() { return fPassword.String(); }
const char *LockMethod() { return fLockMethod.String(); }
bool IsNetworkPassword() { return strcmp(fLockMethod.String(), "custom") != 0; }
const char *ModuleName() { return fModuleName.String(); }
status_t GetState(const char *name, BMessage *stateMsg);
void SetWindowFrame(const BRect &fr) { fWindowFrame = fr; }
void SetWindowTab(int32 tab) { fWindowTab = tab; }
void SetTimeFlags(int32 tf) { fTimeFlags = tf; }
void SetBlankTime(bigtime_t bt) { fBlankTime = bt; }
void SetStandbyTime(bigtime_t time) { fStandByTime = time; }
void SetSuspendTime(bigtime_t time) { fSuspendTime = time; }
void SetOffTime(bigtime_t intime) { fOffTime = intime; }
void SetBlankCorner(screen_corner in) { fBlankCorner = in; }
void SetNeverBlankCorner(screen_corner in) { fNeverBlankCorner = in; }
void SetLockEnable(bool en) { fLockEnabled = en; }
void SetPasswordTime(bigtime_t pt) { fPasswordTime = pt; }
void SetPassword(const char *pw) { fPassword = pw; }
// Cannot set network password from here.
void SetLockMethod(const char *method) { fLockMethod = method; }
void SetModuleName(const char *mn) { fModuleName = mn; }
void SetState(const char *name, BMessage *stateMsg);
void SaveSettings();
BMessage& GetSettings();
private:
BRect fWindowFrame;
int32 fWindowTab;
int32 fTimeFlags;
bigtime_t fBlankTime;
bigtime_t fStandByTime;
bigtime_t fSuspendTime;
bigtime_t fOffTime;
screen_corner fBlankCorner;
screen_corner fNeverBlankCorner;
bool fLockEnabled;
bigtime_t fPasswordTime;
BString fPassword;
BString fModuleName;
BString fLockMethod;
BMessage fSettings;
BPath fSettingsPath, fNetworkPath;
};
#endif // SCREEN_SAVER_PREFS_H
@@ -0,0 +1,56 @@
/*
* Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
* Axel Dörfler, [email protected]
*/
#ifndef SCREEN_SAVER_RUNNER_H
#define SCREEN_SAVER_RUNNER_H
#include <SupportDefs.h>
#include <DirectWindow.h>
class BScreenSaver;
class BView;
class ScreenSaverPrefs;
class ScreenSaverRunner {
public:
ScreenSaverRunner(BWindow* window, BView* view,
bool preview, ScreenSaverPrefs& prefs);
~ScreenSaverRunner();
BScreenSaver* ScreenSaver() const;
bool HasStarted() const;
status_t Run();
void Quit();
void Suspend();
void Resume();
private:
void _LoadAddOn();
void _CleanUp();
static status_t _ThreadFunc(void* data);
void _Run();
BScreenSaver* fSaver;
BWindow* fWindow;
BDirectWindow* fDirectWindow;
BView* fView;
ScreenSaverPrefs& fPrefs;
bool fPreview;
bool fHasStarted;
image_id fAddonImage;
thread_id fThread;
volatile bool fQuitting;
};
#endif //SCREEN_SAVER_THREAD_H
@@ -1,43 +0,0 @@
/*
* Copyright 2003, Michael Phipps. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef SCREEN_SAVER_THREAD_H
#define SCREEN_SAVER_THREAD_H
#include <SupportDefs.h>
#include <DirectWindow.h>
class BScreenSaver;
class BView;
class ScreenSaverPrefs;
class ScreenSaverThread {
public:
ScreenSaverThread(BWindow* window,
BView* view,
ScreenSaverPrefs* prefs);
~ScreenSaverThread();
void Thread();
BScreenSaver* LoadAddOn();
void Quit(thread_id thread);
static int32 ThreadFunc(void* data);
private:
void _CleanUp();
BScreenSaver* fSaver;
BWindow* fWin;
BDirectWindow* fDWin;
BView* fView;
ScreenSaverPrefs* fPref;
long fFrame;
int fSnoozeCount;
image_id fAddonImage;
volatile bool fQuitting;
};
#endif //SCREEN_SAVER_THREAD_H
@@ -5,22 +5,29 @@
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
* Axel Dörfler, [email protected]
*/ */
#include "ScreenSaverFilter.h"
#include <Application.h>
#include <MessageRunner.h>
#include <NodeMonitor.h> #include <NodeMonitor.h>
#include <OS.h> #include <OS.h>
#include <Roster.h> #include <Roster.h>
#include <Screen.h> #include <Screen.h>
#include <Application.h>
#include "ScreenSaverFilter.h"
#include <Debug.h> #include <Debug.h>
#define CALLED() SERIAL_PRINT(("%s\n", __PRETTY_FUNCTION__)) #define CALLED() SERIAL_PRINT(("%s\n", __PRETTY_FUNCTION__))
static const int kCornerSize = 10; static const int32 kNeverBlankCornerSize = 10;
static const int32 kBlankCornerSize = 5;
static const int32 kMsgCheckTime = 'SSCT'; static const int32 kMsgCheckTime = 'SSCT';
static const int32 kMsgCornerInvoke = 'Scin';
extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); extern "C" _EXPORT BInputServerFilter* instantiate_input_filter();
@@ -68,10 +75,18 @@ ScreenSaverController::MessageReceived(BMessage *message)
break; break;
} }
case kMsgSuspendScreenSaver:
//fFilter->Suspend(msg);
break;
case kMsgCheckTime: case kMsgCheckTime:
fFilter->CheckTime(); fFilter->CheckTime();
break; break;
case kMsgCornerInvoke:
fFilter->CheckCornerInvoke();
break;
default: default:
BLooper::MessageReceived(message); BLooper::MessageReceived(message);
} }
@@ -82,15 +97,16 @@ ScreenSaverController::MessageReceived(BMessage *message)
ScreenSaverFilter::ScreenSaverFilter() ScreenSaverFilter::ScreenSaverFilter()
: fLastEventTime(0), :
fBlankTime(0), fLastEventTime(0),
fSnoozeTime(0), fBlankTime(0),
fCurrent(NONE), fSnoozeTime(0),
fEnabled(false), fCurrentCorner(NONE),
fFrameNum(0), fEnabled(false),
fRunner(NULL), fFrameNum(0),
fWatchingDirectory(false), fRunner(NULL),
fWatchingFile(false) fWatchingDirectory(false),
fWatchingFile(false)
{ {
CALLED(); CALLED();
fController = new ScreenSaverController(this); fController = new ScreenSaverController(this);
@@ -116,9 +132,9 @@ ScreenSaverFilter::~ScreenSaverFilter()
void void
ScreenSaverFilter::WatchPreferences() ScreenSaverFilter::_WatchPreferences()
{ {
BEntry entry(fPrefs.GetPath().Path()); BEntry entry(fPrefs.Path().Path());
if (entry.Exists()) { if (entry.Exists()) {
if (fWatchingFile) if (fWatchingFile)
return; return;
@@ -145,24 +161,21 @@ ScreenSaverFilter::WatchPreferences()
} }
void void
ScreenSaverFilter::Invoke() ScreenSaverFilter::_Invoke()
{ {
CALLED(); CALLED();
if ((fKeep != NONE && fCurrent == fKeep) if (fCurrentCorner == fNeverBlankCorner || fEnabled
|| fEnabled
|| fPrefs.TimeFlags() != 1 || fPrefs.TimeFlags() != 1
|| be_roster->IsRunning(SCREEN_BLANKER_SIG)) { || be_roster->IsRunning(SCREEN_BLANKER_SIG))
// If mouse is in this corner, never invoke.
return; return;
}
SERIAL_PRINT(("we run screenblanker\n")); SERIAL_PRINT(("we run screenblanker\n"));
be_roster->Launch(SCREEN_BLANKER_SIG); be_roster->Launch(SCREEN_BLANKER_SIG);
} }
void void
ScreenSaverFilter::ReloadSettings() ScreenSaverFilter::ReloadSettings()
{ {
CALLED(); CALLED();
@@ -170,24 +183,24 @@ ScreenSaverFilter::ReloadSettings()
SERIAL_PRINT(("preferences loading failed: going to defaults\n")); SERIAL_PRINT(("preferences loading failed: going to defaults\n"));
} }
fBlank = fPrefs.GetBlankCorner(); fBlankCorner = fPrefs.GetBlankCorner();
fKeep = fPrefs.GetNeverBlankCorner(); fNeverBlankCorner = fPrefs.GetNeverBlankCorner();
fBlankTime = fSnoozeTime = fPrefs.BlankTime(); fBlankTime = fSnoozeTime = fPrefs.BlankTime();
CheckTime(); CheckTime();
delete fRunner; delete fRunner;
fRunner = new BMessageRunner(BMessenger(NULL, fController), fRunner = new BMessageRunner(BMessenger(NULL, fController),
new BMessage(kMsgCheckTime), fSnoozeTime, -1); new BMessage(kMsgCheckTime), fSnoozeTime);
if (fRunner->InitCheck() != B_OK) { if (fRunner->InitCheck() != B_OK) {
SERIAL_PRINT(("fRunner init failed\n")); SERIAL_PRINT(("fRunner init failed\n"));
} }
WatchPreferences(); _WatchPreferences();
} }
void void
ScreenSaverFilter::Banish() ScreenSaverFilter::_Banish()
{ {
CALLED(); CALLED();
if (!fEnabled) if (!fEnabled)
@@ -201,13 +214,13 @@ ScreenSaverFilter::Banish()
} }
void void
ScreenSaverFilter::CheckTime() ScreenSaverFilter::CheckTime()
{ {
CALLED(); CALLED();
bigtime_t now = system_time(); bigtime_t now = system_time();
if (now >= fLastEventTime + fBlankTime) if (now >= fLastEventTime + fBlankTime)
Invoke(); _Invoke();
// TODO: this doesn't work correctly - since the BMessageRunner is not // TODO: this doesn't work correctly - since the BMessageRunner is not
// restarted, the next check will be too far away // restarted, the next check will be too far away
@@ -226,35 +239,55 @@ ScreenSaverFilter::CheckTime()
} }
void void
ScreenSaverFilter::UpdateRectangles() ScreenSaverFilter::CheckCornerInvoke()
{
if (fCurrentCorner == fBlankCorner)
_Invoke();
}
void
ScreenSaverFilter::_UpdateRectangles()
{ {
// TODO: make this better if possible at all (in a clean way) // TODO: make this better if possible at all (in a clean way)
CALLED(); CALLED();
fBlankRect = _ScreenCorner(fBlankCorner, kBlankCornerSize);
fNeverBlankRect = _ScreenCorner(fNeverBlankCorner, kNeverBlankCornerSize);
}
BRect
ScreenSaverFilter::_ScreenCorner(screen_corner corner, uint32 cornerSize)
{
BRect frame = BScreen().Frame(); BRect frame = BScreen().Frame();
fTopLeft.Set(frame.left, frame.top, switch (corner) {
frame.left + kCornerSize, frame.top + kCornerSize); case UPLEFT:
fTopRight.Set(frame.right - kCornerSize, frame.top, return BRect(frame.left, frame.top, frame.left + cornerSize - 1,
frame.right, frame.top + kCornerSize); frame.top + cornerSize - 1);
fBottomLeft.Set(frame.left, frame.bottom - kCornerSize,
frame.left + kCornerSize, frame.bottom); case UPRIGHT:
fBottomRight.Set(frame.right - kCornerSize, frame.bottom - kCornerSize, return BRect(frame.right, frame.top, frame.right - cornerSize + 1,
frame.right, frame.bottom); frame.top + cornerSize - 1);
case DOWNRIGHT:
return BRect(frame.right, frame.bottom, frame.right - cornerSize + 1,
frame.bottom - cornerSize + 1);
case DOWNLEFT:
return BRect(frame.left, frame.bottom, frame.left + cornerSize - 1,
frame.bottom - cornerSize + 1);
default:
// return an invalid rectangle
return BRect(-1, -1, -2, -2);
}
} }
void filter_result
ScreenSaverFilter::Cornered(arrowDirection pos)
{
//CALLED();
fCurrent = pos;
if (fBlank != NONE && pos == fBlank)
Invoke();
}
filter_result
ScreenSaverFilter::Filter(BMessage *message, BList *outList) ScreenSaverFilter::Filter(BMessage *message, BList *outList)
{ {
fLastEventTime = system_time(); fLastEventTime = system_time();
@@ -264,21 +297,28 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
{ {
BPoint pos; BPoint pos;
message->FindPoint("where", &pos); message->FindPoint("where", &pos);
if ((fFrameNum++ % 32) == 0) // Every so many frames, update if ((fFrameNum++ % 32) == 0) {
UpdateRectangles(); // Every so many frames, update
// Used so that we don't update the screen coord's so often
if (fTopLeft.Contains(pos)) // Ideally, we would get a message when the screen changes.
Cornered(UPLEFT); // R5 doesn't do this.
else if (fTopRight.Contains(pos)) _UpdateRectangles();
Cornered(UPRIGHT);
else if (fBottomLeft.Contains(pos))
Cornered(DOWNLEFT);
else if (fBottomRight.Contains(pos))
Cornered(DOWNRIGHT);
else {
Cornered(NONE);
Banish();
} }
if (fBlankRect.Contains(pos)) {
fCurrentCorner = fBlankCorner;
// start screen blanker after one second
BMessage invoke(kMsgCornerInvoke);
if (BMessageRunner::StartSending(fController, &invoke, 1000000ULL, 1) != B_OK)
_Invoke();
break;
}
if (fNeverBlankRect.Contains(pos))
fCurrentCorner = fNeverBlankCorner;
else
fCurrentCorner = NONE;
break; break;
} }
@@ -289,15 +329,11 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
// screen savers possible // screen savers possible
int32 key; int32 key;
if (fEnabled && message->FindInt32("key", &key) == B_OK && key == 0xe) if (fEnabled && message->FindInt32("key", &key) == B_OK && key == 0xe)
break; return B_DISPATCH_MESSAGE;
// supposed to fall through
} }
default:
Banish();
break;
} }
_Banish();
return B_DISPATCH_MESSAGE; return B_DISPATCH_MESSAGE;
} }
@@ -1,25 +1,26 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
* Axel Dörfler, [email protected]
*/ */
#ifndef SCREEN_SAVER_FILTER_H #ifndef SCREEN_SAVER_FILTER_H
#define SCREEN_SAVER_FILTER_H #define SCREEN_SAVER_FILTER_H
#include <InputServerFilter.h>
#include <Rect.h>
#include <Region.h>
#include <Messenger.h>
#include <MessageFilter.h>
#include <MessageRunner.h>
#include <Node.h>
#include "ScreenSaverPrefs.h" #include "ScreenSaverPrefs.h"
#include <InputServerFilter.h>
#include <Looper.h>
#include <Node.h>
static const uint32 kMsgSuspendScreenSaver = 'susp';
class BMessageRunner;
class ScreenSaverFilter; class ScreenSaverFilter;
class ScreenSaverController : public BLooper { class ScreenSaverController : public BLooper {
@@ -38,32 +39,34 @@ class ScreenSaverFilter : public BInputServerFilter {
virtual filter_result Filter(BMessage *message, BList *outList); virtual filter_result Filter(BMessage *message, BList *outList);
void Suspend(BMessage *message);
void CheckTime(); void CheckTime();
void CheckCornerInvoke();
uint32 SnoozeTime() {return fSnoozeTime;} uint32 SnoozeTime() {return fSnoozeTime;}
void ReloadSettings(); void ReloadSettings();
void SetEnabled(bool enabled) { fEnabled = enabled; } void SetEnabled(bool enabled) { fEnabled = enabled; }
private: private:
bigtime_t fLastEventTime, fBlankTime, fSnoozeTime; void _WatchPreferences();
arrowDirection fBlank, fKeep, fCurrent; void _UpdateRectangles();
bool fEnabled; BRect _ScreenCorner(screen_corner pos, uint32 cornerSize);
BRect fTopLeft, fTopRight, fBottomLeft, fBottomRight;
ScreenSaverPrefs fPrefs;
uint32 fFrameNum;
// Used so that we don't update the screen coord's so often
// Ideally, we would get a message when the screen changes.
// R5 doesn't do this.
ScreenSaverController *fController; void _Invoke();
node_ref fPrefsNodeRef, fPrefsDirNodeRef; void _Banish();
BMessageRunner *fRunner;
bool fWatchingDirectory, fWatchingFile; bigtime_t fLastEventTime, fBlankTime, fSnoozeTime;
screen_corner fBlankCorner, fNeverBlankCorner, fCurrentCorner;
void WatchPreferences(); BRect fBlankRect, fNeverBlankRect;
void UpdateRectangles(); bool fEnabled;
void Cornered(arrowDirection pos); ScreenSaverPrefs fPrefs;
void Invoke(); uint32 fFrameNum;
void Banish();
ScreenSaverController* fController;
node_ref fPrefsNodeRef, fPrefsDirNodeRef;
BMessageRunner* fRunner;
bool fWatchingDirectory, fWatchingFile;
}; };
#endif /* SCREEN_SAVER_FILTER_H */ #endif /* SCREEN_SAVER_FILTER_H */
+1 -6
View File
@@ -5,18 +5,13 @@ SetSubDirSupportedPlatformsBeOSCompatible ;
UsePrivateHeaders interface screen_saver ; UsePrivateHeaders interface screen_saver ;
BinCommand screen_blanker : BinCommand screen_blanker :
ScreenSaverApp.cpp ScreenBlanker.cpp
ScreenSaverWindow.cpp ScreenSaverWindow.cpp
PasswordWindow.cpp PasswordWindow.cpp
ScreenSaver.cpp
: be game libscreensaver.so : be game libscreensaver.so
: screen_blanker.rdef : screen_blanker.rdef
; ;
SEARCH on [ FGristFiles
ScreenSaver.cpp
] = [ FDirName $(HAIKU_TOP) src kits screensaver ] ;
Package haiku-screensaverkit-cvs : Package haiku-screensaverkit-cvs :
screen_blanker : screen_blanker :
boot home config bin ; boot home config bin ;
@@ -8,38 +8,45 @@
*/ */
#include "ScreenSaverApp.h" #include "ScreenBlanker.h"
#include <Debug.h>
#include <stdio.h>
#include <Screen.h>
#include <image.h>
#include <StorageDefs.h>
#include <FindDirectory.h>
#include <SupportDefs.h>
#include <File.h>
#include <Path.h>
#include <string.h>
#include <Beep.h> #include <Beep.h>
#include <Debug.h>
#include <File.h>
#include <FindDirectory.h>
#include <Path.h>
#include <Screen.h>
#include <StorageDefs.h>
#include <SupportDefs.h>
#include <image.h>
#include <stdio.h>
#include <string.h>
const static int32 RESUME_SAVER = 'RSSV'; const static int32 RESUME_SAVER = 'RSSV';
ScreenSaverApp::ScreenSaverApp() ScreenBlanker::ScreenBlanker()
: BApplication(SCREEN_BLANKER_SIG), : BApplication(SCREEN_BLANKER_SIG),
fWindow(NULL), fWindow(NULL),
fSaver(NULL), fSaver(NULL),
fThread(NULL), fRunner(NULL),
fPasswordWindow(NULL), fPasswordWindow(NULL),
fThreadID(-1), fResumeRunner(NULL)
fRunner(NULL)
{ {
fBlankTime = system_time(); fBlankTime = system_time();
} }
ScreenBlanker::~ScreenBlanker()
{
delete fResumeRunner;
}
void void
ScreenSaverApp::ReadyToRun() ScreenBlanker::ReadyToRun()
{ {
if (!fPrefs.LoadSettings()) { if (!fPrefs.LoadSettings()) {
fprintf(stderr, "could not load settings\n"); fprintf(stderr, "could not load settings\n");
@@ -50,14 +57,12 @@ ScreenSaverApp::ReadyToRun()
BScreen screen(B_MAIN_SCREEN_ID); BScreen screen(B_MAIN_SCREEN_ID);
fWindow = new ScreenSaverWindow(screen.Frame()); fWindow = new ScreenSaverWindow(screen.Frame());
fPasswordWindow = new PasswordWindow(); fPasswordWindow = new PasswordWindow();
fThread = new ScreenSaverThread(fWindow, fWindow->ChildAt(0), &fPrefs); fRunner = new ScreenSaverRunner(fWindow, fWindow->ChildAt(0), false, fPrefs);
fSaver = fThread->LoadAddOn(); fSaver = fRunner->ScreenSaver();
if (fSaver) { if (fSaver) {
fWindow->SetSaver(fSaver); fWindow->SetSaver(fSaver);
fThreadID = spawn_thread(ScreenSaverThread::ThreadFunc, fRunner->Run();
"ScreenSaverRenderer", B_LOW_PRIORITY, fThread);
resume_thread(fThreadID);
} else { } else {
fprintf(stderr, "could not load the screensaver addon\n"); fprintf(stderr, "could not load the screensaver addon\n");
} }
@@ -69,11 +74,10 @@ ScreenSaverApp::ReadyToRun()
void void
ScreenSaverApp::_ShowPasswordWindow() ScreenBlanker::_ShowPasswordWindow()
{ {
if (fWindow->Lock()) { if (fWindow->Lock()) {
if (fThreadID > -1) fRunner->Suspend();
suspend_thread(fThreadID);
if (fWindow->SetFullScreen(false) == B_OK) { if (fWindow->SetFullScreen(false) == B_OK) {
fWindow->Sync(); fWindow->Sync();
@@ -89,19 +93,19 @@ ScreenSaverApp::_ShowPasswordWindow()
void void
ScreenSaverApp::_ResumeScreenSaver() ScreenBlanker::_ResumeScreenSaver()
{ {
delete fRunner; delete fResumeRunner;
fRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER),
fPrefs.BlankTime(), 1); fPrefs.BlankTime(), 1);
if (fRunner->InitCheck() != B_OK) { if (fResumeRunner->InitCheck() != B_OK) {
fprintf(stderr, "fRunner init failed\n"); fprintf(stderr, "fRunner init failed\n");
} }
} }
void void
ScreenSaverApp::MessageReceived(BMessage *message) ScreenBlanker::MessageReceived(BMessage *message)
{ {
switch (message->what) { switch (message->what) {
case UNLOCK_MESSAGE: case UNLOCK_MESSAGE:
@@ -125,8 +129,8 @@ ScreenSaverApp::MessageReceived(BMessage *message)
HideCursor(); HideCursor();
fPasswordWindow->Hide(); fPasswordWindow->Hide();
} }
if (fThreadID > -1)
resume_thread(fThreadID); fRunner->Resume();
fWindow->Unlock(); fWindow->Unlock();
} }
break; break;
@@ -139,10 +143,10 @@ ScreenSaverApp::MessageReceived(BMessage *message)
bool bool
ScreenSaverApp::QuitRequested() ScreenBlanker::QuitRequested()
{ {
if (fPrefs.LockEnable() if (fPrefs.LockEnable()
&& (system_time() - fBlankTime > (fPrefs.PasswordTime() - fPrefs.BlankTime()))) { && system_time() - fBlankTime > fPrefs.PasswordTime() - fPrefs.BlankTime()) {
_ShowPasswordWindow(); _ShowPasswordWindow();
return false; return false;
} }
@@ -153,18 +157,9 @@ ScreenSaverApp::QuitRequested()
void void
ScreenSaverApp::_Shutdown() ScreenBlanker::_Shutdown()
{ {
if (fThread) { delete fRunner;
fThread->Quit(fThreadID);
delete fThread;
} else if (fThreadID > -1) {
// ?!?
kill_thread(fThreadID);
}
fThread = NULL;
fThreadID = -1;
if (fWindow) if (fWindow)
fWindow->Hide(); fWindow->Hide();
@@ -177,7 +172,7 @@ ScreenSaverApp::_Shutdown()
int int
main(int, char**) main(int, char**)
{ {
ScreenSaverApp app; ScreenBlanker app;
app.Run(); app.Run();
return 0; return 0;
} }
@@ -12,21 +12,22 @@
#include "PasswordWindow.h" #include "PasswordWindow.h"
#include "ScreenSaverPrefs.h" #include "ScreenSaverPrefs.h"
#include "ScreenSaverThread.h" #include "ScreenSaverRunner.h"
#include "ScreenSaverWindow.h" #include "ScreenSaverWindow.h"
#include <Application.h> #include <Application.h>
#include <MessageRunner.h> #include <MessageRunner.h>
class ScreenSaverApp : public BApplication { class ScreenBlanker : public BApplication {
public: public:
ScreenSaverApp(); ScreenBlanker();
~ScreenBlanker();
virtual void ReadyToRun(); virtual void ReadyToRun();
virtual bool QuitRequested(); virtual bool QuitRequested();
virtual void MessageReceived(BMessage *message); virtual void MessageReceived(BMessage* message);
private: private:
bool _LoadAddOn(); bool _LoadAddOn();
@@ -37,12 +38,11 @@ class ScreenSaverApp : public BApplication {
ScreenSaverPrefs fPrefs; ScreenSaverPrefs fPrefs;
ScreenSaverWindow *fWindow; ScreenSaverWindow *fWindow;
BScreenSaver *fSaver; BScreenSaver *fSaver;
ScreenSaverThread *fThread; ScreenSaverRunner *fRunner;
PasswordWindow *fPasswordWindow; PasswordWindow *fPasswordWindow;
thread_id fThreadID;
bigtime_t fBlankTime; bigtime_t fBlankTime;
BMessageRunner *fRunner; BMessageRunner *fResumeRunner;
}; };
#endif // SCREEN_SAVER_APP_H #endif // SCREEN_SAVER_APP_H
+4 -62
View File
@@ -1,66 +1,9 @@
#ifndef __CONSTANTS__ #ifndef CONSTANTS_H
#define __CONSTANTS__ #define CONSTANTS_H
int secondsToSlider(int val);
inline BPoint
scaleDirect(float x, float y,BRect area)
{
return BPoint(area.Width()*x+area.left,area.Height()*y+area.top);
}
inline BRect scaleDirect (float x1,float x2,float y1,float y2,BRect area) #include <GraphicsDefs.h>
{
return BRect(area.Width()*x1+area.left,area.Height()*y1+area.top, area.Width()*x2+area.left,area.Height()*y2+area.top);
}
static const float kPositionalX[]= {0,.1,.25,.3,.7,.75,.9,1.0};
static const float kPositionalY[]= {0,.1,.7,.8,.9,1.0};
inline BPoint
scale(int x, int y,BRect area)
{
return scaleDirect(kPositionalX[x],kPositionalY[y],area);
}
inline BRect
scale(int x1, int x2, int y1, int y2,BRect area)
{
return scaleDirect(kPositionalX[x1],kPositionalX[x2],kPositionalY[y1],kPositionalY[y2],area);
}
inline BPoint
scale3(int x, int y,BRect area,bool invertX,bool invertY)
{
float arrowX[]= {0,.25,.5,.66667,.90,.9};
float arrowY[]= {0,.15,.25,.3333333,.6666667,1.0};
return scaleDirect(((invertX)?1-arrowX[x]:arrowX[x]),((invertY)?1-arrowY[y]:arrowY[y]),area);
}
const int32 kTab1_chg ='TAB1';
const int32 kTab2_chg ='TAB2';
const int32 kPwbutton ='PWBT';
const int32 kDone_clicked ='DONE';
const int32 kCancel_clicked ='CNCL';
const int32 kButton_changed ='BTNC';
const int32 kShow ='SHOW';
const int32 kPopulate ='POPU';
const int32 kUtilize ='UTIL';
const int32 kSaver_sel ='SSEL';
const int32 kTest_btn ='TEST';
const int32 kAdd_btn ='ADD ';
const int32 kUpdatelist ='UPDL';
const int32 kPasswordCheckbox = 'PWCB';
const int32 kRunSliderChanged = 'RSCG';
const int32 kPasswordSliderChanged = 'PWCG';
const int32 kTurnOffSliderChanged = 'TUCG';
const int32 kEnableScreenSaverChanged = 'ESCH';
const rgb_color kBlack = {0,0,0,0}; const rgb_color kBlack = {0,0,0,0};
const rgb_color kDarkGrey = {150,150,150,0}; const rgb_color kDarkGrey = {150,150,150,0};
@@ -68,5 +11,4 @@ const rgb_color kGrey = {200,200,200,0};
const rgb_color kLightBlue = {200,200,255,0}; const rgb_color kLightBlue = {200,200,255,0};
const rgb_color kLightGreen = {255,200,200,0}; const rgb_color kLightGreen = {255,200,200,0};
#endif // CONSTANTS_H
#endif
+1 -7
View File
@@ -6,21 +6,15 @@ UsePrivateHeaders screen_saver ;
SubDirSysHdrs $(SUBDIR) ; SubDirSysHdrs $(SUBDIR) ;
Preference ScreenSaver : Preference ScreenSaver :
ScreenSaverPrefsApp.cpp ScreenSaverApp.cpp
ScreenSaverWindow.cpp ScreenSaverWindow.cpp
PasswordWindow.cpp PasswordWindow.cpp
PreviewView.cpp PreviewView.cpp
MouseAreaView.cpp MouseAreaView.cpp
ScreenSaver.cpp
: tracker libscreensaver.so be $(TARGET_LIBSTDC++) : tracker libscreensaver.so be $(TARGET_LIBSTDC++)
: ScreenSaver.rdef : ScreenSaver.rdef
; ;
SEARCH on [ FGristFiles
ScreenSaver.cpp
] = [ FDirName $(HAIKU_TOP) src kits screensaver ] ;
Package haiku-screensaverkit-cvs : Package haiku-screensaverkit-cvs :
ScreenSaver : ScreenSaver :
# boot beos preferences ;
boot home Desktop haiku-screensaverkit ; boot home Desktop haiku-screensaverkit ;
+95 -59
View File
@@ -1,40 +1,59 @@
/* /*
* Copyright 2003, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
*/ */
#include "MouseAreaView.h" #include "MouseAreaView.h"
#include "Constants.h" #include "Constants.h"
#include "Utility.h"
#include <Rect.h> #include <Rect.h>
#include <Point.h> #include <Point.h>
#include <Shape.h> #include <Shape.h>
#include <stdio.h> #include <stdio.h>
MouseAreaView::MouseAreaView(BRect frame, const char *name)
: BView (frame,name,B_FOLLOW_NONE,B_WILL_DRAW)
inline BPoint
scale_arrow(int x, int y, BRect area, bool invertX, bool invertY)
{ {
SetViewColor(216,216,216); float arrowX[] = {0, .25, .5, .66667, .90, .9};
fCurrentDirection = NONE; float arrowY[] = {0, .15, .25, .3333333, .6666667, 1.0};
return scale_direct(invertX ? 1 - arrowX[x] : arrowX[x],
invertY ? 1 - arrowY[y] : arrowY[y], area);
} }
void // #pragma mark -
MouseAreaView::MouseAreaView(BRect frame, const char *name)
: BView (frame, name, B_FOLLOW_NONE, B_WILL_DRAW),
fCurrentCorner(NONE)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
}
void
MouseAreaView::Draw(BRect update) MouseAreaView::Draw(BRect update)
{ {
SetViewColor(216,216,216);
// Top of monitor // Top of monitor
SetHighColor(kGrey); SetHighColor(kGrey);
FillRoundRect(scale(0,7,0,3,Bounds()),4,4); FillRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4);
SetHighColor(kBlack); SetHighColor(kBlack);
StrokeRoundRect(scale(0,7,0,3,Bounds()),4,4); StrokeRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4);
SetHighColor(kLightBlue); SetHighColor(kLightBlue);
fScreenArea=scale(1,6,1,2,Bounds()); fMonitorFrame = scale(1, 6, 1, 2, Bounds());
FillRect(fScreenArea); FillRect(fMonitorFrame);
SetHighColor(kDarkGrey); SetHighColor(kDarkGrey);
StrokeRect(fScreenArea); StrokeRect(fMonitorFrame);
// Base of monitor // Base of monitor
SetHighColor(kGrey); SetHighColor(kGrey);
FillTriangle(scale(1,5,Bounds()),scale(3,4,Bounds()),scale(3,5,Bounds())); FillTriangle(scale(1,5,Bounds()),scale(3,4,Bounds()),scale(3,5,Bounds()));
@@ -50,68 +69,85 @@ MouseAreaView::Draw(BRect update)
} }
BRect void
getArrowSize(BRect area,bool isCentered) MouseAreaView::SetCorner(screen_corner corner)
{ {
int areaWidth=area.IntegerWidth(); fCurrentCorner = corner;
int areaHeight=area.IntegerHeight(); Invalidate();
if (areaHeight<areaWidth)
areaWidth=areaHeight;
areaWidth /= 3;
BRect foo(0,0,areaWidth,areaWidth);
if (isCentered)
foo.OffsetBy(area.left+area.Width()/2-(areaWidth/2),area.top+area.Height()/2-(areaWidth/2));
return (foo);
} }
void BRect
MouseAreaView::DrawArrow(void) MouseAreaView::_ArrowSize(BRect monitorRect, bool isCentered)
{ {
if (fCurrentDirection!=NONE) { int arrowSize = monitorRect.IntegerWidth();
BRect area(getArrowSize(fScreenArea,false)); if (monitorRect.IntegerHeight() < arrowSize)
bool invertX=(fCurrentDirection==UPRIGHT||fCurrentDirection==DOWNRIGHT); arrowSize = monitorRect.IntegerHeight();
bool invertY=(fCurrentDirection==UPRIGHT||fCurrentDirection==UPLEFT);
arrowSize /= 3;
float size=area.Width();
MovePenTo(((invertX)?fScreenArea.right-size-2:2+fScreenArea.left),((!invertY)?fScreenArea.bottom-size-2:2+fScreenArea.top)); BRect arrowRect(0, 0, arrowSize, arrowSize);
if (isCentered) {
arrowRect.OffsetBy(monitorRect.left + (monitorRect.Width() - arrowSize) / 2,
monitorRect.top + (monitorRect.Height() - arrowSize) / 2);
}
return arrowRect;
}
void
MouseAreaView::DrawArrow()
{
PushState();
BRect rect(_ArrowSize(fMonitorFrame, fCurrentCorner == NONE));
if (fCurrentCorner != NONE) {
bool invertX = fCurrentCorner == UPRIGHT || fCurrentCorner == DOWNRIGHT;
bool invertY = fCurrentCorner == UPRIGHT || fCurrentCorner == UPLEFT;
float size = rect.Width();
MovePenTo(invertX ? fMonitorFrame.right - size - 2 : 2 + fMonitorFrame.left,
!invertY ? fMonitorFrame.bottom - size - 2 : 2 + fMonitorFrame.top);
BShape arrow; BShape arrow;
arrow.MoveTo(scale3(0,1,area,invertX,invertY)); arrow.MoveTo(scale_arrow(0, 1, rect, invertX, invertY));
arrow.LineTo(scale3(0,5,area,invertX,invertY)); arrow.LineTo(scale_arrow(0, 5, rect, invertX, invertY));
arrow.LineTo(scale3(4,5,area,invertX,invertY)); arrow.LineTo(scale_arrow(4, 5, rect, invertX, invertY));
arrow.LineTo(scale3(3,4,area,invertX,invertY)); arrow.LineTo(scale_arrow(3, 4, rect, invertX, invertY));
arrow.LineTo(scale3(5,3,area,invertX,invertY)); arrow.LineTo(scale_arrow(5, 3, rect, invertX, invertY));
arrow.LineTo(scale3(2,0,area,invertX,invertY)); arrow.LineTo(scale_arrow(2, 0, rect, invertX, invertY));
arrow.LineTo(scale3(1,2,area,invertX,invertY)); arrow.LineTo(scale_arrow(1, 2, rect, invertX, invertY));
arrow.LineTo(scale3(0,1,area,invertX,invertY)); arrow.LineTo(scale_arrow(0, 1, rect, invertX, invertY));
arrow.Close(); arrow.Close();
SetHighColor(kBlack); SetHighColor(kBlack);
FillShape(&arrow,B_SOLID_HIGH); FillShape(&arrow, B_SOLID_HIGH);
} else { } else {
PushState(); SetHighColor(255, 0, 0);
BRect area(getArrowSize(fScreenArea,true));
SetHighColor(255,0,0);
SetPenSize(2); SetPenSize(2);
StrokeEllipse(area); StrokeEllipse(rect);
StrokeLine(BPoint(area.right,area.top),BPoint(area.left,area.bottom)); StrokeLine(BPoint(rect.right, rect.top), BPoint(rect.left, rect.bottom));
PopState();
} }
PopState();
} }
void MouseAreaView::MouseUp(BPoint point) void
MouseAreaView::MouseUp(BPoint point)
{ {
if (fScreenArea.Contains(point)) { if (fMonitorFrame.Contains(point)) {
if (getArrowSize(fScreenArea,true).Contains(point)) if (_ArrowSize(fMonitorFrame, true).Contains(point))
fCurrentDirection=NONE; fCurrentCorner = NONE;
else { else {
float centerX=fScreenArea.left+(fScreenArea.Width()/2); float centerX = fMonitorFrame.left + fMonitorFrame.Width() / 2;
float centerY=fScreenArea.top+(fScreenArea.Height()/2); float centerY = fMonitorFrame.top + fMonitorFrame.Height() / 2;
if (point.x<centerX) if (point.x < centerX)
fCurrentDirection=((point.y<centerY)?UPLEFT:DOWNLEFT); fCurrentCorner = point.y < centerY ? UPLEFT : DOWNLEFT;
else else
fCurrentDirection=((point.y<centerY)?UPRIGHT:DOWNRIGHT); fCurrentCorner = point.y < centerY ? UPRIGHT : DOWNRIGHT;
} }
Draw(fScreenArea); Draw(fMonitorFrame);
} }
} }
+22 -16
View File
@@ -1,29 +1,35 @@
/* /*
* Copyright 2003, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
*/ */
#ifndef MOUSEAREAVIEW_H #ifndef MOUSEAREAVIEW_H
#define MOUSEAREAVIEW_H #define MOUSEAREAVIEW_H
#include <View.h>
#include "ScreenSaverPrefs.h" #include "ScreenSaverPrefs.h"
class MouseAreaView : public BView #include <View.h>
{
public:
MouseAreaView(BRect frame, const char *name);
virtual void Draw(BRect update);
virtual void MouseUp(BPoint point); class MouseAreaView : public BView {
void DrawArrow(); public:
inline arrowDirection getDirection(void) { return fCurrentDirection;} MouseAreaView(BRect frame, const char *name);
void setDirection(arrowDirection direction) { fCurrentDirection = direction; Invalidate(); }
private: virtual void Draw(BRect update);
BRect fScreenArea; virtual void MouseUp(BPoint point);
arrowDirection fCurrentDirection;
void DrawArrow();
inline screen_corner Corner() { return fCurrentCorner; }
void SetCorner(screen_corner direction);
private:
BRect _ArrowSize(BRect monitorRect, bool isCentered);
BRect fMonitorFrame;
screen_corner fCurrentCorner;
}; };
#endif // MOUSEAREAVIEW_H #endif // MOUSEAREAVIEW_H
+71 -56
View File
@@ -1,26 +1,37 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#include "PasswordWindow.h" #include "PasswordWindow.h"
#include <stdio.h>
#include <unistd.h>
#include <Alert.h> #include <Alert.h>
#include <Box.h> #include <Box.h>
#include <Button.h>
#include <RadioButton.h> #include <RadioButton.h>
#include <Screen.h> #include <Screen.h>
#include <TextControl.h>
#include <stdio.h>
#include <unistd.h>
const uint32 kMsgDone = 'done';
const uint32 kMsgPasswordTypeChanged = 'pwtp';
PasswordWindow::PasswordWindow(ScreenSaverPrefs &prefs) PasswordWindow::PasswordWindow(ScreenSaverPrefs &prefs)
: BWindow(BRect(100,100,380,249),"",B_MODAL_WINDOW_LOOK,B_MODAL_APP_WINDOW_FEEL,B_NOT_RESIZABLE), : BWindow(BRect(100, 100, 380, 249), "Password Window", B_MODAL_WINDOW_LOOK,
B_MODAL_APP_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE),
fPrefs(prefs) fPrefs(prefs)
{ {
Setup(); _Setup();
BRect screenFrame = BScreen(B_MAIN_SCREEN_ID).Frame(); BRect screenFrame = BScreen(B_MAIN_SCREEN_ID).Frame();
BPoint point; BPoint point;
point.x = (screenFrame.Width() - Bounds().Width()) / 2; point.x = (screenFrame.Width() - Bounds().Width()) / 2;
@@ -32,34 +43,38 @@ PasswordWindow::PasswordWindow(ScreenSaverPrefs &prefs)
void void
PasswordWindow::Setup() PasswordWindow::_Setup()
{ {
BBox *owner=new BBox(Bounds(),"ownerView",B_FOLLOW_NONE,B_WILL_DRAW, B_PLAIN_BORDER); BView* topView = new BView(Bounds(), "mainView", B_FOLLOW_ALL, B_WILL_DRAW);
AddChild(owner); topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fUseNetwork=new BRadioButton(BRect(14,10,159,20),"useNetwork","Use Network password",new BMessage(kButton_changed),B_FOLLOW_NONE); AddChild(topView);
owner->AddChild(fUseNetwork);
fUseCustom=new BRadioButton(BRect(30,50,130,60),"fUseCustom","Use custom password",new BMessage(kButton_changed),B_FOLLOW_NONE); fUseNetwork=new BRadioButton(BRect(14,10,159,20),"useNetwork","Use Network password",new BMessage(kMsgPasswordTypeChanged),B_FOLLOW_NONE);
topView->AddChild(fUseNetwork);
fUseCustom=new BRadioButton(BRect(30,50,130,60),"fUseCustom","Use custom password",new BMessage(kMsgPasswordTypeChanged),B_FOLLOW_NONE);
BBox *customBox=new BBox(BRect(9,30,269,105),"custBeBox",B_FOLLOW_NONE); BBox *customBox=new BBox(BRect(9,30,269,105),"custBeBox",B_FOLLOW_NONE);
customBox->SetLabel(fUseCustom); customBox->SetLabel(fUseCustom);
fPassword=new BTextControl(BRect(10,20,251,35),"pwdCntrl","Password:",NULL,B_FOLLOW_NONE); fPasswordControl=new BTextControl(BRect(10,20,251,35),"pwdCntrl","Password:",NULL,B_FOLLOW_NONE);
fConfirm=new BTextControl(BRect(10,45,251,60),"fConfirmCntrl","Confirm password:",NULL,B_FOLLOW_NONE); fConfirmControl=new BTextControl(BRect(10,45,251,60),"fConfirmCntrl","Confirm password:",NULL,B_FOLLOW_NONE);
fPassword->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); fPasswordControl->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT);
float divider = be_plain_font->StringWidth("Confirm password:") + 5.0; float divider = be_plain_font->StringWidth("Confirm password:") + 5.0;
fPassword->SetDivider(divider); fPasswordControl->SetDivider(divider);
fPassword->TextView()->HideTyping(true); fPasswordControl->TextView()->HideTyping(true);
fConfirm->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); fConfirmControl->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT);
fConfirm->SetDivider(divider); fConfirmControl->SetDivider(divider);
fConfirm->TextView()->HideTyping(true); fConfirmControl->TextView()->HideTyping(true);
customBox->AddChild(fPassword); customBox->AddChild(fPasswordControl);
customBox->AddChild(fConfirm); customBox->AddChild(fConfirmControl);
owner->AddChild(customBox); topView->AddChild(customBox);
BButton* button = new BButton(BRect(194,118,269,129),"done","Done",new BMessage(kMsgDone),B_FOLLOW_NONE);
topView->AddChild(button);
button->MakeDefault(true);
button = new BButton(BRect(109,118,184,129),"cancel","Cancel",new BMessage(B_CANCEL),B_FOLLOW_NONE);
topView->AddChild(button);
fDone = new BButton(BRect(194,118,269,129),"done","Done",new BMessage (kDone_clicked),B_FOLLOW_NONE);
fCancel = new BButton(BRect(109,118,184,129),"cancel","Cancel",new BMessage (kCancel_clicked),B_FOLLOW_NONE);
owner->AddChild(fDone);
owner->AddChild(fCancel);
fDone->MakeDefault(true);
Update(); Update();
} }
@@ -72,43 +87,43 @@ PasswordWindow::Update()
else else
fUseCustom->SetValue(B_CONTROL_ON); fUseCustom->SetValue(B_CONTROL_ON);
bool useNetPassword=(fUseCustom->Value()>0); bool useNetPassword=(fUseCustom->Value()>0);
fConfirm->SetEnabled(useNetPassword); fConfirmControl->SetEnabled(useNetPassword);
fPassword->SetEnabled(useNetPassword); fPasswordControl->SetEnabled(useNetPassword);
} }
void void
PasswordWindow::MessageReceived(BMessage *message) PasswordWindow::MessageReceived(BMessage *message)
{ {
switch(message->what) { switch (message->what) {
case kDone_clicked: case kMsgDone:
fPrefs.SetLockMethod(fUseCustom->Value() ? "custom" : "network"); fPrefs.SetLockMethod(fUseCustom->Value() ? "custom" : "network");
if (fUseCustom->Value()) { if (fUseCustom->Value()) {
if (strcmp(fPassword->Text(),fConfirm->Text())) { if (strcmp(fPasswordControl->Text(),fConfirmControl->Text())) {
BAlert *alert=new BAlert("noMatch","Passwords don't match. Try again.","OK"); BAlert *alert=new BAlert("noMatch","Passwords don't match. Try again.","OK");
alert->Go(); alert->Go();
break; break;
} }
fPrefs.SetPassword(crypt(fPassword->Text(), fPassword->Text())); fPrefs.SetPassword(crypt(fPasswordControl->Text(), fPasswordControl->Text()));
} else { } else {
fPrefs.SetPassword(""); fPrefs.SetPassword("");
} }
fPassword->SetText(""); fPasswordControl->SetText("");
fConfirm->SetText(""); fConfirmControl->SetText("");
Hide();
break;
case B_CANCEL:
fPasswordControl->SetText("");
fConfirmControl->SetText("");
Hide(); Hide();
break; break;
case kCancel_clicked:
fPassword->SetText(""); case kMsgPasswordTypeChanged:
fConfirm->SetText(""); fPrefs.SetLockMethod(fUseCustom->Value() > 0 ? "custom" : "network");
Hide();
break;
case kButton_changed:
fPrefs.SetLockMethod(fUseCustom->Value()>0 ? "custom" : "network");
Update(); Update();
break; break;
case kShow:
Show();
break;
default: default:
BWindow::MessageReceived(message); BWindow::MessageReceived(message);
break; break;
+19 -21
View File
@@ -1,38 +1,36 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#ifndef PASSWORDWINDOW_H #ifndef PASSWORDWINDOW_H
#define PASSWORDWINDOW_H #define PASSWORDWINDOW_H
#include <Button.h>
#include <Constants.h>
#include <RadioButton.h>
#include <String.h>
#include <TextControl.h>
#include <Window.h>
#include "ScreenSaverPrefs.h" #include "ScreenSaverPrefs.h"
class PasswordWindow : public BWindow #include <Window.h>
{
class BRadioButton;
class BTextControl;
class PasswordWindow : public BWindow {
public: public:
PasswordWindow(ScreenSaverPrefs &prefs); PasswordWindow(ScreenSaverPrefs &prefs);
void Setup();
void Update();
virtual void MessageReceived(BMessage *message); virtual void MessageReceived(BMessage *message);
private: void Update();
BRadioButton *fUseNetwork,*fUseCustom;
BTextControl *fPassword,*fConfirm;
BButton *fCancel,*fDone;
BString fThePassword;
ScreenSaverPrefs &fPrefs;
private:
void _Setup();
BRadioButton *fUseNetwork, *fUseCustom;
BTextControl *fPasswordControl, *fConfirmControl;
ScreenSaverPrefs &fPrefs;
}; };
#endif // PASSWORDWINDOW_H #endif // PASSWORDWINDOW_H
+54 -62
View File
@@ -1,107 +1,99 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#include "PreviewView.h" #include "PreviewView.h"
#include "Constants.h" #include "Constants.h"
#include <Rect.h> #include "Utility.h"
#include <Point.h> #include <Point.h>
#include <Shape.h> #include <Rect.h>
#include <iostream>
#include <ScreenSaver.h>
#include <Errors.h>
#include <Screen.h> #include <Screen.h>
#include <ScreenSaver.h>
#include <Shape.h>
#include <String.h> #include <String.h>
#include <iostream>
static float sampleX[]= {0,.05,.15,.7,.725,.8,.825,.85,.950,1.0}; static float sampleX[]= {0,.05,.15,.7,.725,.8,.825,.85,.950,1.0};
static float sampleY[]= {0,.05,.90,.95,.966,.975,1.0}; static float sampleY[]= {0,.05,.90,.95,.966,.975,1.0};
inline BPoint inline BPoint
scale2(int x, int y,BRect area) scale2(int x, int y,BRect area)
{ {
return scaleDirect(sampleX[x],sampleY[y],area); return scale_direct(sampleX[x],sampleY[y],area);
} }
inline BRect inline BRect
scale2(int x1, int x2, int y1, int y2,BRect area) scale2(int x1, int x2, int y1, int y2,BRect area)
{ {
return scaleDirect(sampleX[x1],sampleX[x2],sampleY[y1],sampleY[y2],area); return scale_direct(sampleX[x1],sampleX[x2],sampleY[y1],sampleY[y2],area);
} }
PreviewView::PreviewView(BRect frame, const char *name,ScreenSaverPrefs *prefp) PreviewView::PreviewView(BRect frame, const char *name)
: BView (frame,name,B_FOLLOW_NONE,B_WILL_DRAW), : BView(frame, name, B_FOLLOW_NONE, B_WILL_DRAW),
fSaver(NULL), fSaverView(NULL)
fConfigView(NULL),
fSst(NULL),
fThreadID(-1),
fPrefPtr(prefp)
{ {
SetViewColor(216,216,216); SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
}
PreviewView::~PreviewView()
{
if (fThreadID>=0)
kill_thread(fThreadID);
delete fSst;
}
void
PreviewView::SetScreenSaver(BString name)
{
if (fThreadID>=0) {
kill_thread(fThreadID);
fThreadID = -1;
}
if (fSst)
delete fSst;
if (fConfigView) {
RemoveChild(fConfigView);
delete fConfigView;
}
fConfigView = new BView(scale2(1,8,1,2,Bounds()),"previewArea",B_FOLLOW_NONE,B_WILL_DRAW);
fConfigView->SetViewColor(0,0,0);
AddChild(fConfigView);
fSst = new ScreenSaverThread(Window(),fConfigView,fPrefPtr);
fSaver = fSst->LoadAddOn();
if (fSaver) {
fThreadID = spawn_thread(ScreenSaverThread::ThreadFunc, "ScreenSaverRenderer", B_LOW_PRIORITY, fSst);
resume_thread(fThreadID);
}
} }
void
PreviewView::Draw(BRect update)
{
SetViewColor(216,216,216);
SetHighColor(184,184,184); PreviewView::~PreviewView()
{
}
BView*
PreviewView::AddPreview()
{
fSaverView = new BView(scale2(1,8,1,2,Bounds()),"previewArea",B_FOLLOW_NONE,B_WILL_DRAW);
fSaverView->SetViewColor(0, 0, 0);
AddChild(fSaverView);
return fSaverView;
}
BView*
PreviewView::RemovePreview()
{
if (fSaverView != NULL)
RemoveChild(fSaverView);
return fSaverView;
}
void
PreviewView::Draw(BRect update)
{
SetHighColor(184, 184, 184);
FillRoundRect(scale2(0,9,0,3,Bounds()),4,4);// Outer shape FillRoundRect(scale2(0,9,0,3,Bounds()),4,4);// Outer shape
FillRoundRect(scale2(2,7,3,6,Bounds()),2,2);// control console outline FillRoundRect(scale2(2,7,3,6,Bounds()),2,2);// control console outline
SetHighColor(96,96,96); SetHighColor(96, 96, 96);
StrokeRoundRect(scale2(2,7,3,6,Bounds()),2,2);// control console outline StrokeRoundRect(scale2(2,7,3,6,Bounds()),2,2);// control console outline
StrokeRoundRect(scale2(0,9,0,3,Bounds()),4,4); // Outline outer shape StrokeRoundRect(scale2(0,9,0,3,Bounds()),4,4); // Outline outer shape
SetHighColor(kBlack); SetHighColor(kBlack);
SetHighColor(184,184,184); SetHighColor(184, 184, 184);
BRect outerShape = scale2(2,7,2,6,Bounds()); BRect outerShape = scale2(2,7,2,6,Bounds());
outerShape.InsetBy(1,1); outerShape.InsetBy(1,1);
FillRoundRect(outerShape,4,4);// Outer shape FillRoundRect(outerShape,4,4);// Outer shape
SetHighColor(0,255,0); SetHighColor(0, 255, 0);
FillRect(scale2(3,4,4,5,Bounds())); FillRect(scale2(3,4,4,5,Bounds()));
SetHighColor(96,96,96); SetHighColor(96,96,96);
FillRect(scale2(5,6,4,5,Bounds())); FillRect(scale2(5,6,4,5,Bounds()));
} }
+21 -23
View File
@@ -1,37 +1,35 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#ifndef PREVIEW_VIEW_H
#define PREVIEW_VIEW_H
#ifndef PREVIEWVIEW_H
#define PREVIEWVIEW_H
#include <View.h> #include <View.h>
#include <Box.h> #include <Box.h>
#include <ScreenSaverThread.h> #include <ScreenSaverRunner.h>
#include <ScreenSaverPrefs.h> #include <ScreenSaverPrefs.h>
class BScreenSaver; class BScreenSaver;
class PreviewView : public BView
{
public:
PreviewView(BRect frame, const char *name,ScreenSaverPrefs *prefp);
~PreviewView();
void Draw(BRect update);
void SetScreenSaver(BString name);
BScreenSaver *ScreenSaver() {return fSaver;}
private:
BScreenSaver* fSaver;
BView *fConfigView;
ScreenSaverThread *fSst;
thread_id fThreadID;
ScreenSaverPrefs *fPrefPtr;
}; // end class PreviewView
#endif // PREVIEWVIEW_H class PreviewView : public BView {
public:
PreviewView(BRect frame, const char *name);
virtual ~PreviewView();
virtual void Draw(BRect update);
BView* AddPreview();
BView* RemovePreview();
private:
BView* fSaverView;
};
#endif // PREVIEW_VIEW_H
@@ -0,0 +1,78 @@
/*
* Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
*/
#include "ScreenSaverWindow.h"
#include <Application.h>
#include <Entry.h>
#include <Path.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
class ScreenSaverApp : public BApplication {
public:
ScreenSaverApp();
virtual void RefsReceived(BMessage *message);
private:
BWindow *fScreenSaverWindow;
};
ScreenSaverApp::ScreenSaverApp()
: BApplication("application/x-vnd.haiku.ScreenSaver")
{
fScreenSaverWindow = new ScreenSaverWindow();
fScreenSaverWindow->Show();
}
void
ScreenSaverApp::RefsReceived(BMessage *message)
{
entry_ref ref;
if (message->FindRef("refs", &ref) != B_OK)
return;
// Install the screen saver by copying it to the add-ons directory
// TODO: the translator have a similar mechanism - this could be cleaned
// up and have one nicely working solution
// TODO: should test if the dropped ref is really a screen saver!
// TODO: you can receive more than one ref at a time...
BEntry entry;
entry.SetTo(&ref, true);
if (entry.InitCheck() != B_OK)
return;
BPath path;
entry.GetPath(&path);
// TODO: find_directory() anyone??
char temp[2*B_PATH_NAME_LENGTH];
sprintf(temp,"cp %s '/boot/home/config/add-ons/Screen Savers/'\n", path.Path());
system(temp);
fScreenSaverWindow->PostMessage(kMsgUpdateList);
}
// #pragma mark -
int
main()
{
ScreenSaverApp app;
app.Run();
return 0;
}
@@ -1,49 +0,0 @@
/*
* Copyright 2003-2005, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
*/
#include <Application.h>
#include <Entry.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <Path.h>
#include "ScreenSaverPrefsApp.h"
const char *APP_SIG = "application/x-vnd.haiku.ScreenSaver";
ScreenSaverPrefsApp::ScreenSaverPrefsApp() : BApplication(APP_SIG)
{
fScreenSaverWin = new ScreenSaverWin();
fScreenSaverWin->Show();
}
void
ScreenSaverPrefsApp::RefsReceived(BMessage *msg)
{
entry_ref ref;
BEntry e;
BPath p;
msg->FindRef("refs", &ref);
e.SetTo(&ref, true);
e.GetPath(&p);
char temp[2*B_PATH_NAME_LENGTH];
sprintf (temp,"cp %s '/boot/home/config/add-ons/Screen Savers/'\n",p.Path());
system(temp);
fScreenSaverWin->PostMessage(kUpdatelist);
}
int main(void) {
ScreenSaverPrefsApp app;
app.Run();
return 0;
}
@@ -1,23 +0,0 @@
/*
* Copyright 2003-2005, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
*/
#ifndef _ScreenSaverPrefsApp_H
#define _ScreenSaverPrefsApp_H
#include "ScreenSaverWindow.h"
class ScreenSaverPrefsApp : public BApplication
{
public:
ScreenSaverPrefsApp();
virtual void RefsReceived(BMessage *);
private:
ScreenSaverWin *fScreenSaverWin;
};
#endif // _ScreenSaverPrefsApp_H
File diff suppressed because it is too large Load Diff
+56 -62
View File
@@ -1,82 +1,76 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
* Axel Dörfler, [email protected]
*/ */
#ifndef SCREEN_SAVER_WINDOW_H
#define SCREEN_SAVER_WINDOW_H
#include "PasswordWindow.h"
#include "ScreenSaverPrefs.h"
#ifndef _ScreenSaverWindow_H
#define _ScreenSaverWindow_H
#include <Box.h> #include <Box.h>
#include <CheckBox.h> #include <CheckBox.h>
#include <FilePanel.h> #include <FilePanel.h>
#include <Slider.h> #include <Slider.h>
#include <ListView.h> #include <ListView.h>
#include <StringView.h> #include <StringView.h>
#include "PasswordWindow.h"
#include "ScreenSaverPrefs.h"
class BButton;
class ModulesView;
class MouseAreaView; class MouseAreaView;
class PreviewView; class ScreenSaverRunner;
class TimeSlider;
class ScreenSaverWin: public BWindow { class ScreenSaverWindow : public BWindow {
public: public:
ScreenSaverWin(); ScreenSaverWindow();
virtual void MessageReceived(BMessage *message); virtual ~ScreenSaverWindow();
virtual bool QuitRequested();
void PopulateScreenSaverList();
void LoadSettings();
virtual ~ScreenSaverWin();
void SelectCurrentModule();
private:
void SetupForm();
void SetupTab1();
void SetupTab2();
void UpdateStatus();
void SaverSelected();
static int CompareScreenSaverItems(const void* left, const void* right); virtual void MessageReceived(BMessage *message);
virtual void ScreenChanged(BRect frame, color_space colorSpace);
virtual bool QuitRequested();
ScreenSaverPrefs fPrefs; void LoadSettings();
int fFadeState,fNoFadeState;
BView *fSampleView;
BView *fTab1,*fTab2;
BTabView *fTabView;
BBox *fModuleSettingsBox;
PreviewView *fPreviewDisplay; private:
BListView *fListView1; void _SetupFadeTab(BRect frame);
BString fSelectedAddonFileName; void _UpdateTurnOffScreen();
image_id fCurrentAddon; void _UpdateStatus();
BButton *fTestButton; ScreenSaverPrefs fPrefs;
BButton *fAddButton; uint32 fTurnOffScreenFlags;
BBox *fEnableScreenSaverBox;
BSlider *fPasswordSlider; BView* fFadeView;
BSlider *fTurnOffSlider; ModulesView* fModulesView;
BSlider *fRunSlider; BTabView* fTabView;
BStringView *fStringView1;
BCheckBox *fEnableCheckbox; BCheckBox* fEnableCheckBox;
BCheckBox *fPasswordCheckbox; TimeSlider* fRunSlider;
BCheckBox *fTurnOffScreenCheckBox;
BStringView *fTurnOffMinutes; BCheckBox* fTurnOffCheckBox;
BStringView *fRunMinutes; TimeSlider* fTurnOffSlider;
BStringView *fPasswordMinutes;
BButton *fPasswordButton; BCheckBox* fPasswordCheckBox;
BStringView *fFadeNowString; TimeSlider* fPasswordSlider;
BStringView *fFadeNowString2; BButton* fPasswordButton;
BStringView *fDontFadeString; PasswordWindow* fPasswordWindow;
BStringView *fDontFadeString2;
MouseAreaView *fFadeNow,*fFadeNever; BStringView *fFadeNowString;
PasswordWindow *fPwWin; BStringView *fFadeNowString2;
BMessenger *fPwMessenger; BStringView *fDontFadeString;
BStringView *fDontFadeString2;
BMessage fSettings;
BFilePanel *fFilePanel; MouseAreaView* fFadeNow;
BView *fSettingsArea; MouseAreaView* fFadeNever;
}; };
#endif // _ScreenSaverWindow_H static const int32 kMsgUpdateList = 'UPDL';
#endif // SCREEN_SAVER_WINDOW_H
+40
View File
@@ -0,0 +1,40 @@
#ifndef UTILITY_H
#define UTILITY_H
#include <Rect.h>
int secondsToSlider(int val);
inline BPoint
scale_direct(float x, float y, BRect area)
{
return BPoint(area.Width()*x+area.left,area.Height()*y+area.top);
}
inline BRect
scale_direct(float x1,float x2,float y1,float y2,BRect area)
{
return BRect(area.Width()*x1+area.left,area.Height()*y1+area.top, area.Width()*x2+area.left,area.Height()*y2+area.top);
}
static const float kPositionalX[] = {0,.1,.25,.3,.7,.75,.9,1.0};
static const float kPositionalY[] = {0,.1,.7,.8,.9,1.0};
inline BPoint
scale(int x, int y,BRect area)
{
return scale_direct(kPositionalX[x],kPositionalY[y],area);
}
inline BRect
scale(int x1, int x2, int y1, int y2,BRect area)
{
return scale_direct(kPositionalX[x1], kPositionalX[x2],
kPositionalY[y1], kPositionalY[y2], area);
}
#endif // UTILITY_H