From 7cae4a1ee0a7e8f1214e6fa410efe9f5a0c7cecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 6 Jun 2006 08:16:46 +0000 Subject: [PATCH] * 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 --- headers/os/add-ons/screen_saver/ScreenSaver.h | 107 +- .../private/screen_saver/ScreenSaverPrefs.h | 145 ++- .../private/screen_saver/ScreenSaverRunner.h | 56 + .../private/screen_saver/ScreenSaverThread.h | 43 - .../filters/screensaver/ScreenSaverFilter.cpp | 178 +-- .../filters/screensaver/ScreenSaverFilter.h | 57 +- src/bin/screen_blanker/Jamfile | 7 +- .../{ScreenSaverApp.cpp => ScreenBlanker.cpp} | 85 +- .../{ScreenSaverApp.h => ScreenBlanker.h} | 14 +- src/preferences/screensaver/Constants.h | 66 +- src/preferences/screensaver/Jamfile | 8 +- src/preferences/screensaver/MouseAreaView.cpp | 154 ++- src/preferences/screensaver/MouseAreaView.h | 38 +- .../screensaver/PasswordWindow.cpp | 127 +- src/preferences/screensaver/PasswordWindow.h | 40 +- src/preferences/screensaver/PreviewView.cpp | 116 +- src/preferences/screensaver/PreviewView.h | 44 +- .../screensaver/ScreenSaverApp.cpp | 78 ++ .../screensaver/ScreenSaverPrefsApp.cpp | 49 - .../screensaver/ScreenSaverPrefsApp.h | 23 - .../screensaver/ScreenSaverWindow.cpp | 1096 ++++++++++------- .../screensaver/ScreenSaverWindow.h | 118 +- src/preferences/screensaver/Utility.h | 40 + 23 files changed, 1478 insertions(+), 1211 deletions(-) create mode 100644 headers/private/screen_saver/ScreenSaverRunner.h delete mode 100644 headers/private/screen_saver/ScreenSaverThread.h rename src/bin/screen_blanker/{ScreenSaverApp.cpp => ScreenBlanker.cpp} (67%) rename src/bin/screen_blanker/{ScreenSaverApp.h => ScreenBlanker.h} (76%) create mode 100644 src/preferences/screensaver/ScreenSaverApp.cpp delete mode 100644 src/preferences/screensaver/ScreenSaverPrefsApp.cpp delete mode 100644 src/preferences/screensaver/ScreenSaverPrefsApp.h create mode 100644 src/preferences/screensaver/Utility.h diff --git a/headers/os/add-ons/screen_saver/ScreenSaver.h b/headers/os/add-ons/screen_saver/ScreenSaver.h index 13b9fc1844..1e517b90b2 100644 --- a/headers/os/add-ons/screen_saver/ScreenSaver.h +++ b/headers/os/add-ons/screen_saver/ScreenSaver.h @@ -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 + #include -#include // for direct_buffer_info +#include #include #include class BView; -class BScreenSaver -{ -public: - BScreenSaver(BMessage *archive, image_id); - virtual ~BScreenSaver(); - // Return an error if something goes wrong or if you don't - // like the running environment (lack of 3D acceleration, - // lack of sound, ...). - virtual status_t InitCheck(); +class BScreenSaver { + public: + BScreenSaver(BMessage* archive, image_id thisImage); + virtual ~BScreenSaver(); - // Animation start and stop. The view is not yet visible when - // StartSaver is called. - virtual status_t StartSaver(BView *view, bool preview); - virtual void StopSaver(); + virtual status_t InitCheck(); - // This hook is called periodically, you should - // override it to do the drawing. Notice that you - // should clear the screen when frame == 0 if you - // don't want to paint over the desktop. - virtual void Draw(BView *view, int32 frame); + virtual status_t StartSaver(BView* view, bool preview); + virtual void StopSaver(); - // These hooks are for direct screen access, the first is - // 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); + virtual void Draw(BView* view, int32 frame); - // configuration dialog methods - virtual void StartConfig(BView *configView); - virtual void StopConfig(); + // direct screen access + virtual void DirectConnected(direct_buffer_info* info); + virtual void DirectDraw(int32 frame); - // Module should fill this in with metadata - // example: randomizable = true - virtual void SupplyInfo(BMessage *info) const; + // configuration dialog methods + virtual void StartConfig(BView* configView); + virtual void StopConfig(); - // Send all the metadata info to the module - virtual void ModulesChanged(const BMessage *info); + // Module should fill this in with metadata + // example: randomizable = true + virtual void SupplyInfo(BMessage* info) const; - // BArchivable like parameter saver method - virtual status_t SaveState(BMessage *into) const; + // Send all the metadata info to the module + virtual void ModulesChanged(const BMessage* info); - // These methods can be used to control drawing frequency. - void SetTickSize(bigtime_t ts); - bigtime_t TickSize() const; + // BArchivable like parameter saver method + virtual status_t SaveState(BMessage* into) const; - // These methods can be used to control animation loop cycles - void SetLoop(int32 on_count, int32 off_count); - int32 LoopOnCount() const; - int32 LoopOffCount() const; + // These methods can be used to control drawing frequency. + void SetTickSize(bigtime_t tickSize); + bigtime_t TickSize() const; -private: - virtual void _ReservedScreenSaver1(); - virtual void _ReservedScreenSaver2(); - virtual void _ReservedScreenSaver3(); - virtual void _ReservedScreenSaver4(); - virtual void _ReservedScreenSaver5(); - virtual void _ReservedScreenSaver6(); - virtual void _ReservedScreenSaver7(); - virtual void _ReservedScreenSaver8(); + // These methods can be used to control animation loop cycles + void SetLoop(int32 onCount, int32 offCount); + int32 LoopOnCount() const; + int32 LoopOffCount() const; - bigtime_t ticksize; - int32 looponcount; - int32 loopoffcount; + private: + virtual void _ReservedScreenSaver1(); + 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); -#endif +#endif // _SCREENSAVER_H diff --git a/headers/private/screen_saver/ScreenSaverPrefs.h b/headers/private/screen_saver/ScreenSaverPrefs.h index 97bf620e85..1f5476c50a 100644 --- a/headers/private/screen_saver/ScreenSaverPrefs.h +++ b/headers/private/screen_saver/ScreenSaverPrefs.h @@ -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. */ - #ifndef SCREEN_SAVER_PREFS_H #define SCREEN_SAVER_PREFS_H + + #include #include #include -enum arrowDirection { + +enum screen_corner { NONE = -1, UPLEFT, UPRIGHT, @@ -18,69 +20,82 @@ enum arrowDirection { 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 -{ -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; + ENABLE_DPMS_MASK = ENABLE_DPMS_STAND_BY | ENABLE_DPMS_SUSPEND | ENABLE_DPMS_OFF }; +#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 diff --git a/headers/private/screen_saver/ScreenSaverRunner.h b/headers/private/screen_saver/ScreenSaverRunner.h new file mode 100644 index 0000000000..8376c4e412 --- /dev/null +++ b/headers/private/screen_saver/ScreenSaverRunner.h @@ -0,0 +1,56 @@ +/* + * Copyright 2003-2006, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de + */ +#ifndef SCREEN_SAVER_RUNNER_H +#define SCREEN_SAVER_RUNNER_H + + +#include +#include + +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 diff --git a/headers/private/screen_saver/ScreenSaverThread.h b/headers/private/screen_saver/ScreenSaverThread.h deleted file mode 100644 index 21c8e3d5ae..0000000000 --- a/headers/private/screen_saver/ScreenSaverThread.h +++ /dev/null @@ -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 -#include - -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 diff --git a/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.cpp b/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.cpp index eb174975f9..ea8ec1c1b4 100644 --- a/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.cpp +++ b/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.cpp @@ -5,22 +5,29 @@ * Authors: * Michael Phipps * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de */ +#include "ScreenSaverFilter.h" + +#include +#include #include #include #include #include -#include -#include "ScreenSaverFilter.h" #include + #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 kMsgCornerInvoke = 'Scin'; extern "C" _EXPORT BInputServerFilter* instantiate_input_filter(); @@ -68,10 +75,18 @@ ScreenSaverController::MessageReceived(BMessage *message) break; } + case kMsgSuspendScreenSaver: + //fFilter->Suspend(msg); + break; + case kMsgCheckTime: fFilter->CheckTime(); break; + case kMsgCornerInvoke: + fFilter->CheckCornerInvoke(); + break; + default: BLooper::MessageReceived(message); } @@ -82,15 +97,16 @@ ScreenSaverController::MessageReceived(BMessage *message) ScreenSaverFilter::ScreenSaverFilter() - : fLastEventTime(0), - fBlankTime(0), - fSnoozeTime(0), - fCurrent(NONE), - fEnabled(false), - fFrameNum(0), - fRunner(NULL), - fWatchingDirectory(false), - fWatchingFile(false) + : + fLastEventTime(0), + fBlankTime(0), + fSnoozeTime(0), + fCurrentCorner(NONE), + fEnabled(false), + fFrameNum(0), + fRunner(NULL), + fWatchingDirectory(false), + fWatchingFile(false) { CALLED(); fController = new ScreenSaverController(this); @@ -116,9 +132,9 @@ ScreenSaverFilter::~ScreenSaverFilter() void -ScreenSaverFilter::WatchPreferences() +ScreenSaverFilter::_WatchPreferences() { - BEntry entry(fPrefs.GetPath().Path()); + BEntry entry(fPrefs.Path().Path()); if (entry.Exists()) { if (fWatchingFile) return; @@ -145,24 +161,21 @@ ScreenSaverFilter::WatchPreferences() } -void -ScreenSaverFilter::Invoke() +void +ScreenSaverFilter::_Invoke() { CALLED(); - if ((fKeep != NONE && fCurrent == fKeep) - || fEnabled + if (fCurrentCorner == fNeverBlankCorner || fEnabled || fPrefs.TimeFlags() != 1 - || be_roster->IsRunning(SCREEN_BLANKER_SIG)) { - // If mouse is in this corner, never invoke. + || be_roster->IsRunning(SCREEN_BLANKER_SIG)) return; - } SERIAL_PRINT(("we run screenblanker\n")); be_roster->Launch(SCREEN_BLANKER_SIG); } -void +void ScreenSaverFilter::ReloadSettings() { CALLED(); @@ -170,24 +183,24 @@ ScreenSaverFilter::ReloadSettings() SERIAL_PRINT(("preferences loading failed: going to defaults\n")); } - fBlank = fPrefs.GetBlankCorner(); - fKeep = fPrefs.GetNeverBlankCorner(); + fBlankCorner = fPrefs.GetBlankCorner(); + fNeverBlankCorner = fPrefs.GetNeverBlankCorner(); fBlankTime = fSnoozeTime = fPrefs.BlankTime(); CheckTime(); delete fRunner; fRunner = new BMessageRunner(BMessenger(NULL, fController), - new BMessage(kMsgCheckTime), fSnoozeTime, -1); + new BMessage(kMsgCheckTime), fSnoozeTime); if (fRunner->InitCheck() != B_OK) { SERIAL_PRINT(("fRunner init failed\n")); } - WatchPreferences(); + _WatchPreferences(); } -void -ScreenSaverFilter::Banish() +void +ScreenSaverFilter::_Banish() { CALLED(); if (!fEnabled) @@ -201,13 +214,13 @@ ScreenSaverFilter::Banish() } -void +void ScreenSaverFilter::CheckTime() { CALLED(); bigtime_t now = system_time(); if (now >= fLastEventTime + fBlankTime) - Invoke(); + _Invoke(); // TODO: this doesn't work correctly - since the BMessageRunner is not // restarted, the next check will be too far away @@ -226,35 +239,55 @@ ScreenSaverFilter::CheckTime() } -void -ScreenSaverFilter::UpdateRectangles() +void +ScreenSaverFilter::CheckCornerInvoke() +{ + if (fCurrentCorner == fBlankCorner) + _Invoke(); +} + + +void +ScreenSaverFilter::_UpdateRectangles() { // TODO: make this better if possible at all (in a clean way) CALLED(); + + fBlankRect = _ScreenCorner(fBlankCorner, kBlankCornerSize); + fNeverBlankRect = _ScreenCorner(fNeverBlankCorner, kNeverBlankCornerSize); +} + + +BRect +ScreenSaverFilter::_ScreenCorner(screen_corner corner, uint32 cornerSize) +{ BRect frame = BScreen().Frame(); - fTopLeft.Set(frame.left, frame.top, - frame.left + kCornerSize, frame.top + kCornerSize); - fTopRight.Set(frame.right - kCornerSize, frame.top, - frame.right, frame.top + kCornerSize); - fBottomLeft.Set(frame.left, frame.bottom - kCornerSize, - frame.left + kCornerSize, frame.bottom); - fBottomRight.Set(frame.right - kCornerSize, frame.bottom - kCornerSize, - frame.right, frame.bottom); + switch (corner) { + case UPLEFT: + return BRect(frame.left, frame.top, frame.left + cornerSize - 1, + frame.top + cornerSize - 1); + + case UPRIGHT: + return BRect(frame.right, frame.top, frame.right - cornerSize + 1, + 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 -ScreenSaverFilter::Cornered(arrowDirection pos) -{ - //CALLED(); - fCurrent = pos; - if (fBlank != NONE && pos == fBlank) - Invoke(); -} - - -filter_result +filter_result ScreenSaverFilter::Filter(BMessage *message, BList *outList) { fLastEventTime = system_time(); @@ -264,21 +297,28 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList) { BPoint pos; message->FindPoint("where", &pos); - if ((fFrameNum++ % 32) == 0) // Every so many frames, update - UpdateRectangles(); - - if (fTopLeft.Contains(pos)) - Cornered(UPLEFT); - else if (fTopRight.Contains(pos)) - Cornered(UPRIGHT); - else if (fBottomLeft.Contains(pos)) - Cornered(DOWNLEFT); - else if (fBottomRight.Contains(pos)) - Cornered(DOWNRIGHT); - else { - Cornered(NONE); - Banish(); + if ((fFrameNum++ % 32) == 0) { + // Every so many frames, update + // 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. + _UpdateRectangles(); } + + 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; } @@ -289,15 +329,11 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList) // screen savers possible int32 key; if (fEnabled && message->FindInt32("key", &key) == B_OK && key == 0xe) - break; - - // supposed to fall through + return B_DISPATCH_MESSAGE; } - default: - Banish(); - break; } + _Banish(); return B_DISPATCH_MESSAGE; } diff --git a/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.h b/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.h index e5528cbdf0..2ab626fee6 100644 --- a/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.h +++ b/src/add-ons/input_server/filters/screensaver/ScreenSaverFilter.h @@ -1,25 +1,26 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: * Michael Phipps * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de */ #ifndef SCREEN_SAVER_FILTER_H #define SCREEN_SAVER_FILTER_H -#include -#include -#include -#include -#include -#include -#include #include "ScreenSaverPrefs.h" +#include +#include +#include + +static const uint32 kMsgSuspendScreenSaver = 'susp'; + +class BMessageRunner; class ScreenSaverFilter; class ScreenSaverController : public BLooper { @@ -38,32 +39,34 @@ class ScreenSaverFilter : public BInputServerFilter { virtual filter_result Filter(BMessage *message, BList *outList); + void Suspend(BMessage *message); + void CheckTime(); + void CheckCornerInvoke(); + uint32 SnoozeTime() {return fSnoozeTime;} void ReloadSettings(); void SetEnabled(bool enabled) { fEnabled = enabled; } private: - bigtime_t fLastEventTime, fBlankTime, fSnoozeTime; - arrowDirection fBlank, fKeep, fCurrent; - bool fEnabled; - 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. + void _WatchPreferences(); + void _UpdateRectangles(); + BRect _ScreenCorner(screen_corner pos, uint32 cornerSize); - ScreenSaverController *fController; - node_ref fPrefsNodeRef, fPrefsDirNodeRef; - BMessageRunner *fRunner; - bool fWatchingDirectory, fWatchingFile; - - void WatchPreferences(); - void UpdateRectangles(); - void Cornered(arrowDirection pos); - void Invoke(); - void Banish(); + void _Invoke(); + void _Banish(); + + bigtime_t fLastEventTime, fBlankTime, fSnoozeTime; + screen_corner fBlankCorner, fNeverBlankCorner, fCurrentCorner; + BRect fBlankRect, fNeverBlankRect; + bool fEnabled; + ScreenSaverPrefs fPrefs; + uint32 fFrameNum; + + ScreenSaverController* fController; + node_ref fPrefsNodeRef, fPrefsDirNodeRef; + BMessageRunner* fRunner; + bool fWatchingDirectory, fWatchingFile; }; #endif /* SCREEN_SAVER_FILTER_H */ diff --git a/src/bin/screen_blanker/Jamfile b/src/bin/screen_blanker/Jamfile index 91c5335af9..feebfc8ea4 100644 --- a/src/bin/screen_blanker/Jamfile +++ b/src/bin/screen_blanker/Jamfile @@ -5,18 +5,13 @@ SetSubDirSupportedPlatformsBeOSCompatible ; UsePrivateHeaders interface screen_saver ; BinCommand screen_blanker : - ScreenSaverApp.cpp + ScreenBlanker.cpp ScreenSaverWindow.cpp PasswordWindow.cpp - ScreenSaver.cpp : be game libscreensaver.so : screen_blanker.rdef ; -SEARCH on [ FGristFiles - ScreenSaver.cpp - ] = [ FDirName $(HAIKU_TOP) src kits screensaver ] ; - Package haiku-screensaverkit-cvs : screen_blanker : boot home config bin ; diff --git a/src/bin/screen_blanker/ScreenSaverApp.cpp b/src/bin/screen_blanker/ScreenBlanker.cpp similarity index 67% rename from src/bin/screen_blanker/ScreenSaverApp.cpp rename to src/bin/screen_blanker/ScreenBlanker.cpp index 6050511e09..46f470f5bd 100644 --- a/src/bin/screen_blanker/ScreenSaverApp.cpp +++ b/src/bin/screen_blanker/ScreenBlanker.cpp @@ -8,38 +8,45 @@ */ -#include "ScreenSaverApp.h" +#include "ScreenBlanker.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + const static int32 RESUME_SAVER = 'RSSV'; -ScreenSaverApp::ScreenSaverApp() +ScreenBlanker::ScreenBlanker() : BApplication(SCREEN_BLANKER_SIG), fWindow(NULL), fSaver(NULL), - fThread(NULL), + fRunner(NULL), fPasswordWindow(NULL), - fThreadID(-1), - fRunner(NULL) + fResumeRunner(NULL) { fBlankTime = system_time(); } +ScreenBlanker::~ScreenBlanker() +{ + delete fResumeRunner; +} + + void -ScreenSaverApp::ReadyToRun() +ScreenBlanker::ReadyToRun() { if (!fPrefs.LoadSettings()) { fprintf(stderr, "could not load settings\n"); @@ -50,14 +57,12 @@ ScreenSaverApp::ReadyToRun() BScreen screen(B_MAIN_SCREEN_ID); fWindow = new ScreenSaverWindow(screen.Frame()); 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) { fWindow->SetSaver(fSaver); - fThreadID = spawn_thread(ScreenSaverThread::ThreadFunc, - "ScreenSaverRenderer", B_LOW_PRIORITY, fThread); - resume_thread(fThreadID); + fRunner->Run(); } else { fprintf(stderr, "could not load the screensaver addon\n"); } @@ -69,11 +74,10 @@ ScreenSaverApp::ReadyToRun() void -ScreenSaverApp::_ShowPasswordWindow() +ScreenBlanker::_ShowPasswordWindow() { if (fWindow->Lock()) { - if (fThreadID > -1) - suspend_thread(fThreadID); + fRunner->Suspend(); if (fWindow->SetFullScreen(false) == B_OK) { fWindow->Sync(); @@ -89,19 +93,19 @@ ScreenSaverApp::_ShowPasswordWindow() void -ScreenSaverApp::_ResumeScreenSaver() +ScreenBlanker::_ResumeScreenSaver() { - delete fRunner; - fRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), + delete fResumeRunner; + fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), fPrefs.BlankTime(), 1); - if (fRunner->InitCheck() != B_OK) { + if (fResumeRunner->InitCheck() != B_OK) { fprintf(stderr, "fRunner init failed\n"); } } void -ScreenSaverApp::MessageReceived(BMessage *message) +ScreenBlanker::MessageReceived(BMessage *message) { switch (message->what) { case UNLOCK_MESSAGE: @@ -125,8 +129,8 @@ ScreenSaverApp::MessageReceived(BMessage *message) HideCursor(); fPasswordWindow->Hide(); } - if (fThreadID > -1) - resume_thread(fThreadID); + + fRunner->Resume(); fWindow->Unlock(); } break; @@ -139,10 +143,10 @@ ScreenSaverApp::MessageReceived(BMessage *message) bool -ScreenSaverApp::QuitRequested() +ScreenBlanker::QuitRequested() { if (fPrefs.LockEnable() - && (system_time() - fBlankTime > (fPrefs.PasswordTime() - fPrefs.BlankTime()))) { + && system_time() - fBlankTime > fPrefs.PasswordTime() - fPrefs.BlankTime()) { _ShowPasswordWindow(); return false; } @@ -153,18 +157,9 @@ ScreenSaverApp::QuitRequested() void -ScreenSaverApp::_Shutdown() +ScreenBlanker::_Shutdown() { - if (fThread) { - fThread->Quit(fThreadID); - delete fThread; - } else if (fThreadID > -1) { - // ?!? - kill_thread(fThreadID); - } - - fThread = NULL; - fThreadID = -1; + delete fRunner; if (fWindow) fWindow->Hide(); @@ -177,7 +172,7 @@ ScreenSaverApp::_Shutdown() int main(int, char**) { - ScreenSaverApp app; + ScreenBlanker app; app.Run(); return 0; } diff --git a/src/bin/screen_blanker/ScreenSaverApp.h b/src/bin/screen_blanker/ScreenBlanker.h similarity index 76% rename from src/bin/screen_blanker/ScreenSaverApp.h rename to src/bin/screen_blanker/ScreenBlanker.h index 2e8b59a6a8..1d7c76fdc9 100644 --- a/src/bin/screen_blanker/ScreenSaverApp.h +++ b/src/bin/screen_blanker/ScreenBlanker.h @@ -12,21 +12,22 @@ #include "PasswordWindow.h" #include "ScreenSaverPrefs.h" -#include "ScreenSaverThread.h" +#include "ScreenSaverRunner.h" #include "ScreenSaverWindow.h" #include #include -class ScreenSaverApp : public BApplication { +class ScreenBlanker : public BApplication { public: - ScreenSaverApp(); + ScreenBlanker(); + ~ScreenBlanker(); virtual void ReadyToRun(); virtual bool QuitRequested(); - virtual void MessageReceived(BMessage *message); + virtual void MessageReceived(BMessage* message); private: bool _LoadAddOn(); @@ -37,12 +38,11 @@ class ScreenSaverApp : public BApplication { ScreenSaverPrefs fPrefs; ScreenSaverWindow *fWindow; BScreenSaver *fSaver; - ScreenSaverThread *fThread; + ScreenSaverRunner *fRunner; PasswordWindow *fPasswordWindow; - thread_id fThreadID; bigtime_t fBlankTime; - BMessageRunner *fRunner; + BMessageRunner *fResumeRunner; }; #endif // SCREEN_SAVER_APP_H diff --git a/src/preferences/screensaver/Constants.h b/src/preferences/screensaver/Constants.h index a3c6bdd7f3..e38409309b 100644 --- a/src/preferences/screensaver/Constants.h +++ b/src/preferences/screensaver/Constants.h @@ -1,66 +1,9 @@ -#ifndef __CONSTANTS__ -#define __CONSTANTS__ - -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); -} +#ifndef CONSTANTS_H +#define CONSTANTS_H -inline BRect scaleDirect (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); -} +#include -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 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 kLightGreen = {255,200,200,0}; - -#endif +#endif // CONSTANTS_H diff --git a/src/preferences/screensaver/Jamfile b/src/preferences/screensaver/Jamfile index 92f875d0ae..759f23c857 100644 --- a/src/preferences/screensaver/Jamfile +++ b/src/preferences/screensaver/Jamfile @@ -6,21 +6,15 @@ UsePrivateHeaders screen_saver ; SubDirSysHdrs $(SUBDIR) ; Preference ScreenSaver : - ScreenSaverPrefsApp.cpp + ScreenSaverApp.cpp ScreenSaverWindow.cpp PasswordWindow.cpp PreviewView.cpp MouseAreaView.cpp - ScreenSaver.cpp : tracker libscreensaver.so be $(TARGET_LIBSTDC++) : ScreenSaver.rdef ; -SEARCH on [ FGristFiles - ScreenSaver.cpp - ] = [ FDirName $(HAIKU_TOP) src kits screensaver ] ; - Package haiku-screensaverkit-cvs : ScreenSaver : -# boot beos preferences ; boot home Desktop haiku-screensaverkit ; diff --git a/src/preferences/screensaver/MouseAreaView.cpp b/src/preferences/screensaver/MouseAreaView.cpp index 670b7a9b91..680cc4f51f 100644 --- a/src/preferences/screensaver/MouseAreaView.cpp +++ b/src/preferences/screensaver/MouseAreaView.cpp @@ -1,40 +1,59 @@ /* - * Copyright 2003, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps + * Michael Phipps */ #include "MouseAreaView.h" #include "Constants.h" +#include "Utility.h" + #include #include #include + #include -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); - fCurrentDirection = NONE; + float arrowX[] = {0, .25, .5, .66667, .90, .9}; + 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) { - SetViewColor(216,216,216); // Top of monitor SetHighColor(kGrey); - FillRoundRect(scale(0,7,0,3,Bounds()),4,4); + FillRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4); SetHighColor(kBlack); - StrokeRoundRect(scale(0,7,0,3,Bounds()),4,4); + StrokeRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4); SetHighColor(kLightBlue); - fScreenArea=scale(1,6,1,2,Bounds()); - FillRect(fScreenArea); + fMonitorFrame = scale(1, 6, 1, 2, Bounds()); + FillRect(fMonitorFrame); SetHighColor(kDarkGrey); - StrokeRect(fScreenArea); + StrokeRect(fMonitorFrame); + // Base of monitor SetHighColor(kGrey); FillTriangle(scale(1,5,Bounds()),scale(3,4,Bounds()),scale(3,5,Bounds())); @@ -50,68 +69,85 @@ MouseAreaView::Draw(BRect update) } -BRect -getArrowSize(BRect area,bool isCentered) +void +MouseAreaView::SetCorner(screen_corner corner) { - int areaWidth=area.IntegerWidth(); - int areaHeight=area.IntegerHeight(); - if (areaHeight + #include "ScreenSaverPrefs.h" -class MouseAreaView : public BView -{ -public: - MouseAreaView(BRect frame, const char *name); +#include - virtual void Draw(BRect update); - virtual void MouseUp(BPoint point); - void DrawArrow(); - inline arrowDirection getDirection(void) { return fCurrentDirection;} - void setDirection(arrowDirection direction) { fCurrentDirection = direction; Invalidate(); } -private: - BRect fScreenArea; - arrowDirection fCurrentDirection; + +class MouseAreaView : public BView { + public: + MouseAreaView(BRect frame, const char *name); + + virtual void Draw(BRect update); + virtual void MouseUp(BPoint point); + + 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 diff --git a/src/preferences/screensaver/PasswordWindow.cpp b/src/preferences/screensaver/PasswordWindow.cpp index d870a96622..fac30296d8 100644 --- a/src/preferences/screensaver/PasswordWindow.cpp +++ b/src/preferences/screensaver/PasswordWindow.cpp @@ -1,26 +1,37 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr */ + #include "PasswordWindow.h" -#include -#include + #include #include +#include #include #include +#include + +#include +#include + + +const uint32 kMsgDone = 'done'; +const uint32 kMsgPasswordTypeChanged = 'pwtp'; 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) { - Setup(); + _Setup(); + BRect screenFrame = BScreen(B_MAIN_SCREEN_ID).Frame(); BPoint point; point.x = (screenFrame.Width() - Bounds().Width()) / 2; @@ -32,34 +43,38 @@ PasswordWindow::PasswordWindow(ScreenSaverPrefs &prefs) void -PasswordWindow::Setup() +PasswordWindow::_Setup() { - BBox *owner=new BBox(Bounds(),"ownerView",B_FOLLOW_NONE,B_WILL_DRAW, B_PLAIN_BORDER); - AddChild(owner); - fUseNetwork=new BRadioButton(BRect(14,10,159,20),"useNetwork","Use Network password",new BMessage(kButton_changed),B_FOLLOW_NONE); - owner->AddChild(fUseNetwork); - fUseCustom=new BRadioButton(BRect(30,50,130,60),"fUseCustom","Use custom password",new BMessage(kButton_changed),B_FOLLOW_NONE); + BView* topView = new BView(Bounds(), "mainView", B_FOLLOW_ALL, B_WILL_DRAW); + topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + AddChild(topView); + + 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); customBox->SetLabel(fUseCustom); - fPassword=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); - fPassword->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); + fPasswordControl=new BTextControl(BRect(10,20,251,35),"pwdCntrl","Password:",NULL,B_FOLLOW_NONE); + fConfirmControl=new BTextControl(BRect(10,45,251,60),"fConfirmCntrl","Confirm password:",NULL,B_FOLLOW_NONE); + fPasswordControl->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); float divider = be_plain_font->StringWidth("Confirm password:") + 5.0; - fPassword->SetDivider(divider); - fPassword->TextView()->HideTyping(true); - fConfirm->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); - fConfirm->SetDivider(divider); - fConfirm->TextView()->HideTyping(true); - customBox->AddChild(fPassword); - customBox->AddChild(fConfirm); - owner->AddChild(customBox); + fPasswordControl->SetDivider(divider); + fPasswordControl->TextView()->HideTyping(true); + fConfirmControl->SetAlignment(B_ALIGN_RIGHT,B_ALIGN_LEFT); + fConfirmControl->SetDivider(divider); + fConfirmControl->TextView()->HideTyping(true); + customBox->AddChild(fPasswordControl); + customBox->AddChild(fConfirmControl); + 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(); } @@ -72,43 +87,43 @@ PasswordWindow::Update() else fUseCustom->SetValue(B_CONTROL_ON); bool useNetPassword=(fUseCustom->Value()>0); - fConfirm->SetEnabled(useNetPassword); - fPassword->SetEnabled(useNetPassword); + fConfirmControl->SetEnabled(useNetPassword); + fPasswordControl->SetEnabled(useNetPassword); } void PasswordWindow::MessageReceived(BMessage *message) { - switch(message->what) { - case kDone_clicked: - fPrefs.SetLockMethod(fUseCustom->Value() ? "custom" : "network"); - if (fUseCustom->Value()) { - if (strcmp(fPassword->Text(),fConfirm->Text())) { - BAlert *alert=new BAlert("noMatch","Passwords don't match. Try again.","OK"); - alert->Go(); - break; - } - fPrefs.SetPassword(crypt(fPassword->Text(), fPassword->Text())); - } else { - fPrefs.SetPassword(""); - } - fPassword->SetText(""); - fConfirm->SetText(""); + switch (message->what) { + case kMsgDone: + fPrefs.SetLockMethod(fUseCustom->Value() ? "custom" : "network"); + if (fUseCustom->Value()) { + if (strcmp(fPasswordControl->Text(),fConfirmControl->Text())) { + BAlert *alert=new BAlert("noMatch","Passwords don't match. Try again.","OK"); + alert->Go(); + break; + } + fPrefs.SetPassword(crypt(fPasswordControl->Text(), fPasswordControl->Text())); + } else { + fPrefs.SetPassword(""); + } + fPasswordControl->SetText(""); + fConfirmControl->SetText(""); + Hide(); + break; + + case B_CANCEL: + fPasswordControl->SetText(""); + fConfirmControl->SetText(""); Hide(); break; - case kCancel_clicked: - fPassword->SetText(""); - fConfirm->SetText(""); - Hide(); - break; - case kButton_changed: - fPrefs.SetLockMethod(fUseCustom->Value()>0 ? "custom" : "network"); + + case kMsgPasswordTypeChanged: + fPrefs.SetLockMethod(fUseCustom->Value() > 0 ? "custom" : "network"); Update(); break; - case kShow: - Show(); - break; + default: BWindow::MessageReceived(message); break; diff --git a/src/preferences/screensaver/PasswordWindow.h b/src/preferences/screensaver/PasswordWindow.h index 720f0b431a..3b89c51400 100644 --- a/src/preferences/screensaver/PasswordWindow.h +++ b/src/preferences/screensaver/PasswordWindow.h @@ -1,38 +1,36 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr */ #ifndef PASSWORDWINDOW_H #define PASSWORDWINDOW_H -#include -#include -#include -#include -#include -#include + #include "ScreenSaverPrefs.h" -class PasswordWindow : public BWindow -{ +#include + +class BRadioButton; +class BTextControl; + +class PasswordWindow : public BWindow { public: PasswordWindow(ScreenSaverPrefs &prefs); - void Setup(); - void Update(); + virtual void MessageReceived(BMessage *message); - private: - BRadioButton *fUseNetwork,*fUseCustom; - BTextControl *fPassword,*fConfirm; - BButton *fCancel,*fDone; - BString fThePassword; - ScreenSaverPrefs &fPrefs; + void Update(); + private: + void _Setup(); + + BRadioButton *fUseNetwork, *fUseCustom; + BTextControl *fPasswordControl, *fConfirmControl; + ScreenSaverPrefs &fPrefs; }; -#endif // PASSWORDWINDOW_H - +#endif // PASSWORDWINDOW_H diff --git a/src/preferences/screensaver/PreviewView.cpp b/src/preferences/screensaver/PreviewView.cpp index d419f0fe6a..27c0dda09e 100644 --- a/src/preferences/screensaver/PreviewView.cpp +++ b/src/preferences/screensaver/PreviewView.cpp @@ -1,107 +1,99 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr */ + #include "PreviewView.h" #include "Constants.h" -#include +#include "Utility.h" + #include -#include -#include -#include -#include +#include #include +#include +#include #include +#include + + 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}; + + inline BPoint scale2(int x, int y,BRect area) { - return scaleDirect(sampleX[x],sampleY[y],area); + return scale_direct(sampleX[x],sampleY[y],area); } inline BRect 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) - : BView (frame,name,B_FOLLOW_NONE,B_WILL_DRAW), - fSaver(NULL), - fConfigView(NULL), - fSst(NULL), - fThreadID(-1), - fPrefPtr(prefp) +PreviewView::PreviewView(BRect frame, const char *name) + : BView(frame, name, B_FOLLOW_NONE, B_WILL_DRAW), + fSaverView(NULL) { - SetViewColor(216,216,216); -} - - -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); - } - + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); } -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(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(0,9,0,3,Bounds()),4,4); // Outline outer shape SetHighColor(kBlack); - SetHighColor(184,184,184); + SetHighColor(184, 184, 184); BRect outerShape = scale2(2,7,2,6,Bounds()); outerShape.InsetBy(1,1); FillRoundRect(outerShape,4,4);// Outer shape - SetHighColor(0,255,0); + SetHighColor(0, 255, 0); FillRect(scale2(3,4,4,5,Bounds())); SetHighColor(96,96,96); FillRect(scale2(5,6,4,5,Bounds())); } + diff --git a/src/preferences/screensaver/PreviewView.h b/src/preferences/screensaver/PreviewView.h index 3170e24bcb..72ff9768f8 100644 --- a/src/preferences/screensaver/PreviewView.h +++ b/src/preferences/screensaver/PreviewView.h @@ -1,37 +1,35 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr */ +#ifndef PREVIEW_VIEW_H +#define PREVIEW_VIEW_H -#ifndef PREVIEWVIEW_H -#define PREVIEWVIEW_H #include #include -#include +#include #include 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 diff --git a/src/preferences/screensaver/ScreenSaverApp.cpp b/src/preferences/screensaver/ScreenSaverApp.cpp new file mode 100644 index 0000000000..44a79964de --- /dev/null +++ b/src/preferences/screensaver/ScreenSaverApp.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2003-2006, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr + */ + + +#include "ScreenSaverWindow.h" + +#include +#include +#include + +#include +#include +#include + + +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; +} diff --git a/src/preferences/screensaver/ScreenSaverPrefsApp.cpp b/src/preferences/screensaver/ScreenSaverPrefsApp.cpp deleted file mode 100644 index f21f1f62d4..0000000000 --- a/src/preferences/screensaver/ScreenSaverPrefsApp.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2003-2005, Haiku. - * Distributed under the terms of the MIT License. - * - * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr - */ - -#include -#include -#include -#include -#include -#include - -#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; -} diff --git a/src/preferences/screensaver/ScreenSaverPrefsApp.h b/src/preferences/screensaver/ScreenSaverPrefsApp.h deleted file mode 100644 index c06dadd9d9..0000000000 --- a/src/preferences/screensaver/ScreenSaverPrefsApp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2003-2005, Haiku. - * Distributed under the terms of the MIT License. - * - * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr - */ - -#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 diff --git a/src/preferences/screensaver/ScreenSaverWindow.cpp b/src/preferences/screensaver/ScreenSaverWindow.cpp index c4a6cdb658..4009f141f9 100644 --- a/src/preferences/screensaver/ScreenSaverWindow.cpp +++ b/src/preferences/screensaver/ScreenSaverWindow.cpp @@ -1,528 +1,724 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de */ -#include + +#include "MouseAreaView.h" +#include "PreviewView.h" +#include "ScreenSaverItem.h" +#include "ScreenSaverWindow.h" + #include -#include #include -#include -#include +#include #include #include #include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include +#include -#include "ScreenSaverWindow.h" -#include "ScreenSaverItem.h" -#include "MouseAreaView.h" -#include "PreviewView.h" +#include #include #define CALLED() PRINT(("%s\n", __PRETTY_FUNCTION__)) -static const char *kTimes[]={"30 seconds", "1 minute", "1 minute 30 seconds", - "2 minutes", "2 minutes 30 seconds", "3 minutes", - "4 minutes", "5 minutes", "6 minutes", - "7 minutes", "8 minutes", "9 minutes", - "10 minutes", "15 minutes", "20 minutes", - "25 minutes", "30 minutes", "40 minutes", - "50 minutes", "1 hour", "1 hour 30 minutes", - "2 hours", "2 hours 30 minutes", "3 hours", - "4 hours", "5 hours"}; -static const int32 kTimeInUnits[]={ 30, 60, 90, - 120, 150, 180, - 240, 300, 360, - 420, 480, 540, - 600, 900, 1200, - 1500, 1800, 2400, - 3000, 3600, 5400, - 7200, 9000, 10800, - 14400, 18000}; +const int32 kMsgSaverSelected = 'SSEL'; +const int32 kMsgTestSaver = 'TEST'; +const int32 kMsgAddSaver = 'ADD '; +const int32 kMsgPasswordCheckBox = 'PWCB'; +const int32 kMsgRunSliderChanged = 'RSCG'; +const int32 kMsgPasswordSliderChanged = 'PWCG'; +const int32 kMsgChangePassword = 'PWBT'; +const int32 kMsgEnableScreenSaverBox = 'ESCH'; -int32 -UnitsToSlider(bigtime_t val) -{ - int count = sizeof(kTimeInUnits)/sizeof(int); - for (int t=0; tSelectCurrentModule(); + SetTarget(this); } -ScreenSaverWin::ScreenSaverWin() - : BWindow(BRect(50,50,496,375),"Screen Saver", - B_TITLED_WINDOW,B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE) , - fFadeState(0),fNoFadeState(0), fListView1(NULL), - fSelectedAddonFileName(NULL), - fCurrentAddon(NULL), fTestButton(NULL), - fEnableCheckbox(NULL), - fTurnOffMinutes(NULL), fRunMinutes(NULL), - fPasswordMinutes(NULL), fPasswordButton(NULL), - fFadeNowString(NULL), - fFadeNowString2(NULL), - fDontFadeString(NULL), fDontFadeString2(NULL), - fFadeNow(NULL),fFadeNever(NULL), - fPwMessenger(NULL), fFilePanel(NULL), - fSettingsArea(NULL) - +void +TimeSlider::MessageReceived(BMessage* message) { - SetupForm(); + switch (message->what) { + case kTimeSliderChanged: + Window()->PostMessage(fModificationMessage); + break; + + default: + BSlider::MessageReceived(message); + } } -ScreenSaverWin::~ScreenSaverWin() +void +TimeSlider::SetValue(int32 value) +{ + int32 oldValue = Value(); + BSlider::SetValue(value); + + if (oldValue != Value()) { + BString label; + _TimeToString(kTimeInUnits[Value()] * 1000000LL, label); + SetLabel(label.String()); + } +} + + +void +TimeSlider::SetTime(bigtime_t useconds) +{ + for (int t = 0; t < kTimeUnitCount; t++) { + if (kTimeInUnits[t] * 1000000LL == useconds) { + SetValue(t); + break; + } + } +} + + +bigtime_t +TimeSlider::Time() +{ + return 1000000LL * kTimeInUnits[Value()]; +} + + +void +TimeSlider::_TimeToString(bigtime_t useconds, BString& string) +{ + useconds /= 1000000LL; + // convert to seconds + + string = ""; + + // hours + uint32 hours = useconds / 3600; + if (hours != 0) + string << hours << " hours"; + + useconds %= 3600; + + // minutes + uint32 minutes = useconds / 60; + if (hours != 0) + string << " "; + if (minutes != 0) + string << minutes << " minutes"; + + useconds %= 60; + + // seconds + uint32 seconds = useconds / 60; + if (hours != 0 || minutes != 0) + string << " "; + if (seconds != 0) + string << seconds << " seconds"; +} + + +// #pragma mark - + + +ModulesView::ModulesView(BRect rect, const char* name, ScreenSaverPrefs& prefs) + : BView(rect, name, B_FOLLOW_ALL, B_WILL_DRAW), + fPrefs(prefs), + fSaverRunner(NULL), + fSettingsView(NULL) +{ + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + + AddChild(fSettingsBox = new BBox(BRect(183,11,434,285), + "ModuleSettingsBox", B_FOLLOW_NONE, B_WILL_DRAW)); + fSettingsBox->SetLabel("Module settings"); + + fListView = new BListView(BRect(8,136,156,255), "SaversListView", + B_SINGLE_SELECTION_LIST); + fListView->SetSelectionMessage(new BMessage(kMsgSaverSelected)); + AddChild(new BScrollView("scroll_list", fListView, + B_FOLLOW_ALL, 0, false, true)); + + fTestButton = new BButton(BRect(8,260,88,277), "TestButton", "Test", + new BMessage(kMsgTestSaver)); + AddChild(fTestButton); + + fAddButton = new BButton(BRect(98,260,173,277), "AddButton", "Add" B_UTF8_ELLIPSIS, + new BMessage(kMsgAddSaver)); + AddChild(fAddButton); + + AddChild(fPreviewDisplay = new PreviewView(BRect(20, 15, 150, 120), "preview")); + + PopulateScreenSaverList(); + fFilePanel = new BFilePanel(); +} + + +ModulesView::~ModulesView() { delete fFilePanel; } -void -ScreenSaverWin::SaverSelected() +void +ModulesView::DetachedFromWindow() { - CALLED(); - UpdateStatus(); - fPrefs.SaveSettings(); - if (fListView1->CurrentSelection()>=0) { - if (fPreviewDisplay->ScreenSaver()) - fPreviewDisplay->ScreenSaver()->StopConfig(); - ScreenSaverItem* item = reinterpret_cast(fListView1->ItemAt(fListView1->CurrentSelection())); - BString settingsMsgName(item->Path()); - fPreviewDisplay->SetScreenSaver(settingsMsgName); - if (fSettingsArea) { - fModuleSettingsBox->RemoveChild(fSettingsArea); - delete fSettingsArea; + _CloseSaver(); +} + + +void +ModulesView::AttachedToWindow() +{ + _OpenSaver(); + + fListView->SetTarget(this); + fTestButton->SetTarget(this); + fAddButton->SetTarget(this); +} + + +void +ModulesView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMsgSaverSelected: + { + int selection = fListView->CurrentSelection(); + if (selection < 0) + break; + + ScreenSaverItem* item = (ScreenSaverItem *)fListView->ItemAt(selection); + if (item == NULL) + break; + + if (!strcmp(fPrefs.ModuleName(), "Blackness")) + fPrefs.SetModuleName(""); + else + fPrefs.SetModuleName(item->Text()); + + _CloseSaver(); + _OpenSaver(); + break; } - BRect bnds = fModuleSettingsBox->Bounds(); - bnds.left = 3; - bnds.right -= 7; - bnds.top = 21; - bnds.bottom -= 2; - fSettingsArea = new BView(bnds,"settingsArea",B_FOLLOW_NONE,B_WILL_DRAW); - fSettingsArea->SetViewColor(216,216,216); - fModuleSettingsBox->AddChild(fSettingsArea); - - if (fPreviewDisplay->ScreenSaver()) - fPreviewDisplay->ScreenSaver()->StartConfig(fSettingsArea); + + case kMsgTestSaver: + SaveState(); + fPrefs.SaveSettings(); + + be_roster->Launch(SCREEN_BLANKER_SIG, &fPrefs.GetSettings()); + break; + + case kMsgAddSaver: + fFilePanel->Show(); + break; + + default: + BView::MessageReceived(message); } } -void -ScreenSaverWin::MessageReceived(BMessage *msg) +void +ModulesView::SaveState() { - switch(msg->what) { - case kRunSliderChanged: - fRunSlider->SetLabel(kTimes[fRunSlider->Value()]); - if (fRunSlider->Value()>fPasswordSlider->Value()) { - fTurnOffSlider->SetValue(fRunSlider->Value()); - fTurnOffSlider->SetLabel(kTimes[fTurnOffSlider->Value()]); - fPasswordSlider->SetValue(fRunSlider->Value()); - fPasswordSlider->SetLabel(kTimes[fPasswordSlider->Value()]); - } - break; - case kTurnOffSliderChanged: - fTurnOffSlider->SetLabel(kTimes[fTurnOffSlider->Value()]); - break; - case kPasswordSliderChanged: - fPasswordSlider->SetLabel(kTimes[fPasswordSlider->Value()]); - if (fPasswordSlider->Value()Value()) { - fRunSlider->SetValue(fPasswordSlider->Value()); - fRunSlider->SetLabel(kTimes[fRunSlider->Value()]); - } - break; - case kPasswordCheckbox: - case kEnableScreenSaverChanged: - UpdateStatus(); - break; - case kPwbutton: - fPwMessenger->SendMessage(kShow); - break; - case kSaver_sel: - SaverSelected(); - break; - case kTest_btn: - { - BMessage &settings = fPrefs.GetSettings(); - be_roster->Launch(SCREEN_BLANKER_SIG, &settings); - break; + BScreenSaver* saver = _ScreenSaver(); + if (saver == NULL) + return; + + BMessage state; + if (saver->SaveState(&state) == B_OK) + fPrefs.SetState(fCurrentName.String(), &state); +} + + +void +ModulesView::PopulateScreenSaverList() +{ + fListView->DeselectAll(); + while (ScreenSaverItem* item = (ScreenSaverItem *)fListView->RemoveItem((int32)0)) { + delete item; + } + + // Blackness is a built-in screen saver + fListView->AddItem(new ScreenSaverItem("Blackness", "")); + + // Iterate over add-on directories, and add their files to the list view + + directory_which which[] = {B_BEOS_ADDONS_DIRECTORY, B_USER_ADDONS_DIRECTORY}; + ScreenSaverItem* selectItem = NULL; + + for (uint32 i = 0; i < sizeof(which) / sizeof(which[0]); i++) { + BPath basePath; + find_directory(which[i], &basePath); + basePath.Append("Screen Savers", true); + + BDirectory dir(basePath.Path()); + BEntry entry; + while (dir.GetNextEntry(&entry, true) == B_OK) { + char name[B_FILE_NAME_LENGTH]; + if (entry.GetName(name) != B_OK) + continue; + + BPath path = basePath; + path.Append(name); + + ScreenSaverItem* item = new ScreenSaverItem(name, path.Path()); + fListView->AddItem(item); + + if (!strcmp(fPrefs.ModuleName(), item->Text()) + || (!strcmp(fPrefs.ModuleName(), "") + && !strcmp(item->Text(), "Blackness"))) + selectItem = item; } - case kAdd_btn: - fFilePanel->Show(); + } + + fListView->SortItems(_CompareScreenSaverItems); + + fListView->Select(fListView->IndexOf(selectItem)); + fListView->ScrollToSelection(); +} + + +//! sorting function for ScreenSaverItems +int +ModulesView::_CompareScreenSaverItems(const void* left, const void* right) +{ + ScreenSaverItem* leftItem = *(ScreenSaverItem **)left; + ScreenSaverItem* rightItem = *(ScreenSaverItem **)right; + + return strcmp(leftItem->Text(), rightItem->Text()); +} + + +BScreenSaver* +ModulesView::_ScreenSaver() +{ + if (fSaverRunner != NULL) + return fSaverRunner->ScreenSaver(); + + return NULL; +} + + +void +ModulesView::_CloseSaver() +{ + // remove old screen saver preview & config + + BScreenSaver* saver = _ScreenSaver(); + BView* view = fPreviewDisplay->RemovePreview(); + if (fSettingsView != NULL) + fSettingsBox->RemoveChild(fSettingsView); + + if (saver != NULL) + saver->StopConfig(); + + SaveState(); + + delete view; + delete fSettingsView; + delete fSaverRunner; + + fSettingsView = NULL; + fSaverRunner = NULL; +} + + +void +ModulesView::_OpenSaver() +{ + // create new screen saver preview & config + + BView* view = fPreviewDisplay->AddPreview(); + fCurrentName = fPrefs.ModuleName(); + fSaverRunner = new ScreenSaverRunner(Window(), view, true, fPrefs); + BScreenSaver* saver = _ScreenSaver(); + + BRect bnds = fSettingsBox->Bounds(); + bnds.left = 3; + bnds.right -= 7; + bnds.top = 21; + bnds.bottom -= 2; + fSettingsView = new BView(bnds,"settingsArea",B_FOLLOW_NONE,B_WILL_DRAW); + fSettingsView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + fSettingsBox->AddChild(fSettingsView); + + if (saver != NULL) { + fSaverRunner->Run(); + saver->StartConfig(fSettingsView); + } +} + + +// #pragma mark - + + +ScreenSaverWindow::ScreenSaverWindow() + : BWindow(BRect(50, 50, 496, 375), "Screen Saver", + B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE), + fFadeNowString(NULL), + fFadeNowString2(NULL), + fDontFadeString(NULL), + fDontFadeString2(NULL), + fFadeNow(NULL), + fFadeNever(NULL) +{ + fPrefs.LoadSettings(); + + BRect rect = Bounds(); + + // Create a background view + BView *background = new BView(rect, "background", B_FOLLOW_ALL, 0); + background->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + AddChild(background); + + // Add the tab view to the background + rect.top += 4; + fTabView = new BTabView(rect, "tab_view"); + + // Create the controls inside the tabs + rect = fTabView->ContainerView()->Bounds(); + _SetupFadeTab(rect); + fModulesView = new ModulesView(rect, "Modules", fPrefs); + + fTabView->AddTab(fFadeView); + fTabView->AddTab(fModulesView); + background->AddChild(fTabView); + + // Create the password editing window + fPasswordWindow = new PasswordWindow(fPrefs); + fPasswordWindow->Run(); + + MoveTo(fPrefs.WindowFrame().left, fPrefs.WindowFrame().top); + + fEnableCheckBox->SetValue(fPrefs.TimeFlags() & ENABLE_SAVER ? B_CONTROL_ON : B_CONTROL_OFF); + fRunSlider->SetTime(fPrefs.BlankTime()); + fTurnOffSlider->SetTime(fPrefs.OffTime()); + fFadeNow->SetCorner(fPrefs.GetBlankCorner()); + fFadeNever->SetCorner(fPrefs.GetNeverBlankCorner()); + fPasswordCheckBox->SetValue(fPrefs.LockEnable()); + fPasswordSlider->SetTime(fPrefs.PasswordTime()); + + fTabView->Select(fPrefs.WindowTab()); + + _UpdateTurnOffScreen(); + _UpdateStatus(); +} + + +ScreenSaverWindow::~ScreenSaverWindow() +{ +} + + +//! Create the controls for the fade tab +void +ScreenSaverWindow::_SetupFadeTab(BRect rect) +{ + fFadeView = new BView(rect, "Fade", B_FOLLOW_ALL, 0); + fFadeView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + + rect.InsetBy(8, 8); +/* + font_height fontHeight; + be_plain_font->GetHeight(&fontHeight); + float lineHeight = ceilf(fontHeight.ascent + fontHeight.descent); +*/ + fEnableCheckBox = new BCheckBox(BRect(0, 0, 1, 1), "EnableCheckBox", + "Enable Screen Saver", new BMessage(kMsgEnableScreenSaverBox)); + fEnableCheckBox->ResizeToPreferred(); + + BBox* box = new BBox(rect, "EnableScreenSaverBox", B_FOLLOW_ALL); + box->SetLabel(fEnableCheckBox); + fFadeView->AddChild(box); + + // Run Module + rect.top = fEnableCheckBox->Bounds().bottom + 8.0f; + BStringView* stringView = new BStringView(rect, NULL, "Run module"); + stringView->ResizeToPreferred(); + box->AddChild(stringView); + + float topEdge = rect.top; + fRunSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20), + "RunSlider", kMsgRunSliderChanged); + float width, height; + fRunSlider->GetPreferredSize(&width, &height); + fRunSlider->ResizeTo(fRunSlider->Bounds().Width(), height); + box->AddChild(fRunSlider); + + // Turn Off + topEdge += fRunSlider->Bounds().Height() + 4.0f; + fTurnOffCheckBox = new BCheckBox(BRect(20, topEdge-2, 127, topEdge + 20), + "TurnOffScreenCheckBox", "Turn off screen", new BMessage(kMsgTurnOffCheckBox)); + fTurnOffCheckBox->ResizeToPreferred(); + box->AddChild(fTurnOffCheckBox); + + fTurnOffSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20), + "TurnOffSlider", kMsgTurnOffSliderChanged); + fTurnOffSlider->ResizeTo(fTurnOffSlider->Bounds().Width(), height); + box->AddChild(fTurnOffSlider); + + // Password + topEdge += fTurnOffSlider->Bounds().Height() + 4.0f; + fPasswordCheckBox = new BCheckBox(BRect(20, topEdge - 2, 127, topEdge + 20), + "PasswordCheckbox", "Password lock", new BMessage(kMsgPasswordCheckBox)); + fPasswordCheckBox->ResizeToPreferred(); + box->AddChild(fPasswordCheckBox); + + fPasswordSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20), + "PasswordSlider", kMsgPasswordSliderChanged); + fPasswordSlider->ResizeTo(fPasswordSlider->Bounds().Width(), height); + box->AddChild(fPasswordSlider); + + topEdge += fPasswordSlider->Bounds().Height() + 4.0f; + fPasswordButton = new BButton(BRect(390, topEdge, 410, topEdge + 24), "PasswordButton", + "Password" B_UTF8_ELLIPSIS, new BMessage(kMsgChangePassword)); + fPasswordButton->ResizeToPreferred(); + fPasswordButton->MoveBy(-fPasswordButton->Bounds().Width(), 0); + box->AddChild(fPasswordButton); + + // Bottom + + box->AddChild(fFadeNow = new MouseAreaView(BRect(20,205,80,260),"fadeNow")); + box->AddChild(fFadeNever = new MouseAreaView(BRect(220,205,280,260),"fadeNever")); + + box->AddChild(fFadeNowString = new BStringView(BRect(90,215,193,230),"FadeNowString","Fade now when")); + fFadeNowString->SetText("Fade now when"); + fFadeNowString->SetAlignment(B_ALIGN_LEFT); + + box->AddChild(fFadeNowString2 = new BStringView(BRect(90,233,193,248),"FadeNowString2","mouse is here")); + fFadeNowString2->SetText("mouse is here"); + fFadeNowString2->SetAlignment(B_ALIGN_LEFT); + + box->AddChild(fDontFadeString = new BStringView(BRect(290,215,387,230),"DontFadeString","Don't fade when")); + fDontFadeString->SetText("Don't fade when"); + fDontFadeString->SetAlignment(B_ALIGN_LEFT); + + box->AddChild(fDontFadeString2 = new BStringView(BRect(290,233,387,248),"DontFadeString2","mouse is here")); + fDontFadeString2->SetText("mouse is here"); + fDontFadeString2->SetAlignment(B_ALIGN_LEFT); +} + + +void +ScreenSaverWindow::_UpdateTurnOffScreen() +{ + bool enabled = (fPrefs.TimeFlags() & ENABLE_DPMS_MASK) != 0; + + BScreen screen(this); + uint32 dpmsCapabilities = screen.DPMSCapabilites(); + + fTurnOffScreenFlags = 0; + if (dpmsCapabilities & B_DPMS_OFF) + fTurnOffScreenFlags |= ENABLE_DPMS_OFF; + if (dpmsCapabilities & B_DPMS_STAND_BY) + fTurnOffScreenFlags |= ENABLE_DPMS_STAND_BY; + if (dpmsCapabilities & B_DPMS_SUSPEND) + fTurnOffScreenFlags |= ENABLE_DPMS_SUSPEND; + + fTurnOffCheckBox->SetValue(enabled && fTurnOffScreenFlags != 0 + ? B_CONTROL_ON : B_CONTROL_OFF); +} + + +void +ScreenSaverWindow::MessageReceived(BMessage *msg) +{ + switch (msg->what) { + // "Fade" tab + + case kMsgRunSliderChanged: + if (fRunSlider->Value() > fTurnOffSlider->Value()) + fTurnOffSlider->SetValue(fRunSlider->Value()); + + if (fRunSlider->Value() > fPasswordSlider->Value()) + fPasswordSlider->SetValue(fRunSlider->Value()); break; - case kUpdatelist: - PopulateScreenSaverList(); + + case kMsgTurnOffCheckBox: + fTurnOffSlider->SetEnabled(fTurnOffCheckBox->Value() == B_CONTROL_ON); + break; + + case kMsgTurnOffSliderChanged: + if (fRunSlider->Value() > fTurnOffSlider->Value()) + fRunSlider->SetValue(fTurnOffSlider->Value()); + break; + + case kMsgPasswordSliderChanged: + if (fPasswordSlider->Value() < fRunSlider->Value()) + fRunSlider->SetValue(fPasswordSlider->Value()); + break; + + case kMsgPasswordCheckBox: + case kMsgEnableScreenSaverBox: + _UpdateStatus(); + break; + + case kMsgChangePassword: + fPasswordWindow->Show(); + break; + + // "Modules" tab + + case kMsgUpdateList: + fModulesView->PopulateScreenSaverList(); break; } BWindow::MessageReceived(msg); } -bool -ScreenSaverWin::QuitRequested() +void +ScreenSaverWindow::ScreenChanged(BRect frame, color_space colorSpace) { - UpdateStatus(); + _UpdateTurnOffScreen(); +} + + +bool +ScreenSaverWindow::QuitRequested() +{ + _UpdateStatus(); + fModulesView->SaveState(); fPrefs.SaveSettings(); + be_app->PostMessage(B_QUIT_REQUESTED); return true; } -void -ScreenSaverWin::UpdateStatus(void) +void +ScreenSaverWindow::_UpdateStatus() { DisableUpdates(); - // Policy - enable and disable controls as per checkboxes, etc - fPasswordCheckbox->SetEnabled(fEnableCheckbox->Value()); - fTurnOffScreenCheckBox->SetEnabled(fEnableCheckbox->Value()); - fRunSlider->SetEnabled(fEnableCheckbox->Value()); - fTurnOffSlider->SetEnabled(fEnableCheckbox->Value() && fTurnOffScreenCheckBox->Value()); - fTurnOffSlider->SetEnabled(false); // This never seems to turn on in the R5 version - fTurnOffScreenCheckBox->SetEnabled(false); - fPasswordSlider->SetEnabled(fEnableCheckbox->Value() && fPasswordCheckbox->Value()); - fPasswordButton->SetEnabled(fEnableCheckbox->Value() && fPasswordCheckbox->Value()); - // Set the labels for the sliders - fRunSlider->SetLabel(kTimes[fRunSlider->Value()]); - fTurnOffSlider->SetLabel(kTimes[fTurnOffSlider->Value()]); - fPasswordSlider->SetLabel(kTimes[fPasswordSlider->Value()]); + + bool enabled = fEnableCheckBox->Value() == B_CONTROL_ON; + fPasswordCheckBox->SetEnabled(enabled); + fTurnOffCheckBox->SetEnabled(enabled && fTurnOffScreenFlags != 0); + fRunSlider->SetEnabled(enabled); + fTurnOffSlider->SetEnabled(enabled && fTurnOffCheckBox->Value()); + fPasswordSlider->SetEnabled(enabled && fPasswordCheckBox->Value()); + fPasswordButton->SetEnabled(enabled && fPasswordCheckBox->Value()); + EnableUpdates(); + // Update the saved preferences fPrefs.SetWindowFrame(Frame()); fPrefs.SetWindowTab(fTabView->Selection()); - fPrefs.SetTimeFlags(fEnableCheckbox->Value()); - fPrefs.SetBlankTime(1000000LL* kTimeInUnits[fRunSlider->Value()]); - fPrefs.SetOffTime(1000000LL* kTimeInUnits[fTurnOffSlider->Value()]); - fPrefs.SetSuspendTime(1000000LL* kTimeInUnits[fTurnOffSlider->Value()]); - fPrefs.SetStandbyTime(1000000LL* kTimeInUnits[fTurnOffSlider->Value()]); - fPrefs.SetBlankCorner(fFadeNow->getDirection()); - fPrefs.SetNeverBlankCorner(fFadeNever->getDirection()); - fPrefs.SetLockEnable(fPasswordCheckbox->Value()); - fPrefs.SetPasswordTime(1000000LL* kTimeInUnits[fPasswordSlider->Value()]); - int selection = fListView1->CurrentSelection(); - if (selection >= 0) { - fPrefs.SetModuleName(((ScreenSaverItem *)(fListView1->ItemAt(selection)))->Text()); - if (strcmp(fPrefs.ModuleName(), "Blackness") == 0) - fPrefs.SetModuleName(""); - } -// TODO - Tell the password window to update its stuff - BMessage ssState; - if ((fPreviewDisplay->ScreenSaver()) && (fPreviewDisplay->ScreenSaver()->SaveState(&ssState)==B_OK)) - fPrefs.SetState(fPrefs.ModuleName(), &ssState); -}; + fPrefs.SetTimeFlags((enabled ? ENABLE_SAVER : 0) + | (fTurnOffCheckBox->Value() ? fTurnOffScreenFlags : 0)); + fPrefs.SetBlankTime(fRunSlider->Time()); + fPrefs.SetOffTime(fTurnOffSlider->Time()); + fPrefs.SetSuspendTime(fTurnOffSlider->Time()); + fPrefs.SetStandbyTime(fTurnOffSlider->Time()); + fPrefs.SetBlankCorner(fFadeNow->Corner()); + fPrefs.SetNeverBlankCorner(fFadeNever->Corner()); + fPrefs.SetLockEnable(fPasswordCheckBox->Value()); + fPrefs.SetPasswordTime(fPasswordSlider->Time()); - -void -ScreenSaverWin::SetupForm() -{ - fFilePanel = new BFilePanel(); - - BRect r = Bounds(); - BTab *tab1, *tab2; - -// Create a background view - BView *background = new BView(r,"background",B_FOLLOW_NONE,0); - background->SetViewColor(216,216,216,0); - AddChild(background); - -// Add the tab view to the background - r.top += 4; - fTabView = new BTabView(r, "tab_view"); - fTabView->SetViewColor(216,216,216,0); - r = fTabView->Bounds(); - r.InsetBy(0,4); - r.bottom -= fTabView->TabHeight(); - -// Time to load the settings into a message and implement them... - fPrefs.LoadSettings(); - - tab2 = new BTab(); - fTab2 = new BView(r,"Fade",B_FOLLOW_NONE,0); - tab2->SetLabel("Fade"); - - tab1 = new CustomTab(this); - fTab1 = new BView(r,"Modules",B_FOLLOW_NONE,0); - tab1->SetLabel("Modules"); - -// Create the controls inside the tabs - SetupTab2(); - SetupTab1(); - - fTabView->AddTab(fTab2, tab2); - fTabView->AddTab(fTab1, tab1); - background->AddChild(fTabView); - -// Create the password editing window - fPwWin = new PasswordWindow(fPrefs); - fPwMessenger = new BMessenger(NULL,fPwWin); - fPwWin->Run(); - - MoveTo(fPrefs.WindowFrame().left,fPrefs.WindowFrame().top); - - fEnableCheckbox->SetValue(fPrefs.TimeFlags()); - fRunSlider->SetValue(UnitsToSlider(fPrefs.BlankTime())); - fTurnOffSlider->SetValue(UnitsToSlider(fPrefs.OffTime())); - fFadeNow->setDirection(fPrefs.GetBlankCorner()); - fFadeNever->setDirection(fPrefs.GetNeverBlankCorner()); - fPasswordCheckbox->SetValue(fPrefs.LockEnable()); - fPasswordSlider->SetValue(UnitsToSlider(fPrefs.PasswordTime())); - - fTabView->Select(fPrefs.WindowTab()); - SelectCurrentModule(); - UpdateStatus(); -} - - -void -ScreenSaverWin::SelectCurrentModule() -{ - CALLED(); - - int32 count = fListView1->CountItems(); - for (int32 i=0; i(fListView1->ItemAt(i)); - if ((strcmp(fPrefs.ModuleName(), item->Text()) == 0) - || (strcmp(fPrefs.ModuleName(),"") == 0 && strcmp(item->Text(), "Blackness") ==0)) { - fListView1->Select(i); - SaverSelected(); - fListView1->ScrollToSelection(); - break; - } - } + // TODO - Tell the password window to update its stuff } - -// Set the common Look and Feel stuff for a given control -void -commonLookAndFeel(BView *widget,bool isSlider,bool isControl) -{ - {rgb_color clr = {216,216,216,255}; widget->SetViewColor(clr);} - if (isSlider) { - BSlider *slid=dynamic_cast(widget); - {rgb_color clr = {160,160,160,0}; slid->SetBarColor(clr);} - slid->SetHashMarks(B_HASH_MARKS_NONE); - slid->SetHashMarkCount(0); - slid->SetStyle(B_TRIANGLE_THUMB); - slid->SetLimitLabels("",""); - slid->SetLimitLabels(NULL,NULL); - slid->SetLabel("0 minutes"); - slid->SetValue(0); - slid->SetEnabled(true); - } - {rgb_color clr = {0,0,0,0}; widget->SetHighColor(clr);} - widget->SetFlags(B_WILL_DRAW|B_NAVIGABLE); - widget->SetResizingMode(B_FOLLOW_NONE); - widget->SetFontSize(10); - widget->SetFont(be_plain_font); - if (isControl) { - BControl *wid=dynamic_cast(widget); - wid->SetEnabled(true); - } -} - - -// Iterate over a directory, adding the directories files to the list -void -addScreenSaversToList (directory_which dir, BListView *list) -{ - BPath path; - find_directory(dir,&path); - path.Append("Screen Savers",true); - - BDirectory ssDir(path.Path()); - BEntry thisSS; - char thisName[B_FILE_NAME_LENGTH]; - - while (B_OK==ssDir.GetNextEntry(&thisSS,true)) { - thisSS.GetName(thisName); - BString pathname = path.Path(); - pathname += "/"; - pathname += thisName; - list->AddItem(new ScreenSaverItem(thisName, pathname.String())); - } -} - - -// sorting function for ScreenSaverItems -int -ScreenSaverWin::CompareScreenSaverItems(const void* left, const void* right) -{ - ScreenSaverItem* leftItem = *(ScreenSaverItem **)left; - ScreenSaverItem* rightItem = *(ScreenSaverItem **)right; - - return strcmp(leftItem->Text(),rightItem->Text()); -} - - -void -ScreenSaverWin::PopulateScreenSaverList(void) -{ - fListView1->DeselectAll(); - while (void *i=fListView1->RemoveItem((int32)0)) - delete ((ScreenSaverItem *)i); - - fListView1->AddItem(new ScreenSaverItem("Blackness", "")); - addScreenSaversToList(B_BEOS_ADDONS_DIRECTORY, fListView1); - addScreenSaversToList(B_USER_ADDONS_DIRECTORY, fListView1); - - fListView1->SortItems(CompareScreenSaverItems); -} - - -// Create the controls for the first tab -void -ScreenSaverWin::SetupTab1() -{ - {rgb_color clr = {216,216,216,255}; fTab1->SetViewColor(clr);} - fTab1->AddChild( fModuleSettingsBox = new BBox(BRect(183,11,434,285),"ModuleSettingsBox",B_FOLLOW_NONE,B_WILL_DRAW)); - fModuleSettingsBox->SetLabel("Module settings"); - fModuleSettingsBox->SetBorder(B_FANCY_BORDER); - - fListView1 = new BListView(BRect(16,136,156,255),"ListView1",B_SINGLE_SELECTION_LIST); - fTab1->AddChild(new BScrollView("scroll_list",fListView1,B_FOLLOW_NONE,0,false,true)); - commonLookAndFeel(fModuleSettingsBox,false,false); - {rgb_color clr = {255,255,255,0}; fListView1->SetViewColor(clr);} - fListView1->SetListType(B_SINGLE_SELECTION_LIST); - - // selection message for screensaver list - fListView1->SetSelectionMessage( new BMessage( kSaver_sel ) ); - - fTab1->AddChild( fTestButton = new BButton(BRect(13,260,88,277),"TestButton","Test", new BMessage (kTest_btn))); - commonLookAndFeel(fTestButton,false,true); - fTestButton->SetLabel("Test"); - - fTab1->AddChild( fAddButton = new BButton(BRect(98,260,173,277),"AddButton","Add...", new BMessage (kAdd_btn))); - commonLookAndFeel(fAddButton,false,true); - fAddButton->SetLabel("Add..."); - - fTab1->AddChild(fPreviewDisplay = new PreviewView(BRect(20,15,150,120),"preview",&fPrefs)); - PopulateScreenSaverList(); -} - - -// Create the controls for the second tab -void -ScreenSaverWin::SetupTab2() -{ - font_height height; - be_plain_font->GetHeight(&height); - int32 stringHeight = (int32)(height.ascent+height.descent); - int32 sliderHeight = 30; - int topEdge; - {rgb_color clr = {216,216,216,255}; fTab2->SetViewColor(clr);} - fTab2->AddChild( fEnableScreenSaverBox = new BBox(BRect(8,6,436,287),"EnableScreenSaverBox")); - commonLookAndFeel(fEnableScreenSaverBox,false,false); - - fEnableCheckbox = new BCheckBox(BRect(0,0,be_plain_font->StringWidth("Enable Screen Saver")+25,stringHeight),"EnableCheckBox","Enable Screen Saver", new BMessage(kEnableScreenSaverChanged)); - fEnableScreenSaverBox->SetLabel(fEnableCheckbox); - fEnableScreenSaverBox->SetBorder(B_FANCY_BORDER); - - // Run Module - topEdge=32; - fEnableScreenSaverBox->AddChild( fStringView1 = new BStringView(BRect(40,topEdge+2,130,topEdge+2+stringHeight),"StringView1","Run module")); - commonLookAndFeel(fStringView1,false,false); - fStringView1->SetText("Run module"); - fStringView1->SetAlignment(B_ALIGN_LEFT); - - fEnableScreenSaverBox->AddChild( fRunSlider = new BSlider(BRect(135,topEdge,420,topEdge+sliderHeight),"RunSlider","minutes", new BMessage(kRunSliderChanged), 0, 25)); - fRunSlider->SetModificationMessage(new BMessage(kRunSliderChanged)); - commonLookAndFeel(fRunSlider,true,true); - float w,h; - fRunSlider->GetPreferredSize(&w,&h); - sliderHeight= (int32)h - 6; - - // Turn Off - topEdge+=sliderHeight; - fEnableScreenSaverBox->AddChild( fTurnOffScreenCheckBox = new BCheckBox(BRect(20,topEdge-2,127,topEdge-2+stringHeight),"TurnOffScreenCheckBox","Turn off screen", new BMessage (kTab2_chg))); - commonLookAndFeel(fTurnOffScreenCheckBox,false,true); - fTurnOffScreenCheckBox->SetLabel("Turn off screen"); - fTurnOffScreenCheckBox->SetResizingMode(B_FOLLOW_NONE); - - fEnableScreenSaverBox->AddChild( fTurnOffSlider = new BSlider(BRect(135,topEdge,420,topEdge+sliderHeight),"TurnOffSlider","", new BMessage(kTurnOffSliderChanged), 0, 25)); - fTurnOffSlider->SetModificationMessage(new BMessage(kTurnOffSliderChanged)); - commonLookAndFeel(fTurnOffSlider,true,true); - - // Password - topEdge+=sliderHeight; - fEnableScreenSaverBox->AddChild( fPasswordCheckbox = new BCheckBox(BRect(20,topEdge-2,127,topEdge-2+stringHeight),"PasswordCheckbox","Password lock", new BMessage (kPasswordCheckbox))); - commonLookAndFeel(fPasswordCheckbox,false,true); - fPasswordCheckbox->SetLabel("Password lock"); - - fEnableScreenSaverBox->AddChild( fPasswordSlider = new BSlider(BRect(135,topEdge,420,topEdge+sliderHeight),"PasswordSlider","", new BMessage(kPasswordSliderChanged), 0, 25)); - fPasswordSlider->SetModificationMessage(new BMessage(kPasswordSliderChanged)); - commonLookAndFeel(fPasswordSlider,true,true); - - topEdge+=sliderHeight - 6; - fEnableScreenSaverBox->AddChild( fPasswordButton = new BButton(BRect(390 - be_plain_font->StringWidth("Password..."),topEdge,410,topEdge+24),"PasswordButton","Password...", new BMessage (kPwbutton))); - commonLookAndFeel(fPasswordButton,false,true); - fPasswordButton->SetLabel("Password..."); - - // Bottom - - fEnableScreenSaverBox->AddChild(fFadeNow=new MouseAreaView(BRect(20,205,80,260),"fadeNow")); - fEnableScreenSaverBox->AddChild(fFadeNever=new MouseAreaView(BRect(220,205,280,260),"fadeNever")); - - fEnableScreenSaverBox->AddChild( fFadeNowString = new BStringView(BRect(90,215,193,230),"FadeNowString","Fade now when")); - commonLookAndFeel(fFadeNowString,false,false); - fFadeNowString->SetText("Fade now when"); - fFadeNowString->SetAlignment(B_ALIGN_LEFT); - - fEnableScreenSaverBox->AddChild( fFadeNowString2 = new BStringView(BRect(90,233,193,248),"FadeNowString2","mouse is here")); - commonLookAndFeel(fFadeNowString2,false,false); - fFadeNowString2->SetText("mouse is here"); - fFadeNowString2->SetAlignment(B_ALIGN_LEFT); - - fEnableScreenSaverBox->AddChild( fDontFadeString = new BStringView(BRect(290,215,387,230),"DontFadeString","Don't fade when")); - commonLookAndFeel(fDontFadeString,false,false); - fDontFadeString->SetText("Don't fade when"); - fDontFadeString->SetAlignment(B_ALIGN_LEFT); - - fEnableScreenSaverBox->AddChild( fDontFadeString2 = new BStringView(BRect(290,233,387,248),"DontFadeString2","mouse is here")); - commonLookAndFeel(fDontFadeString2,false,false); - fDontFadeString2->SetText("mouse is here"); - fDontFadeString2->SetAlignment(B_ALIGN_LEFT); -} diff --git a/src/preferences/screensaver/ScreenSaverWindow.h b/src/preferences/screensaver/ScreenSaverWindow.h index 045502f68f..9f00c9e9e3 100644 --- a/src/preferences/screensaver/ScreenSaverWindow.h +++ b/src/preferences/screensaver/ScreenSaverWindow.h @@ -1,82 +1,76 @@ /* - * Copyright 2003-2005, Haiku. + * Copyright 2003-2006, Haiku. * Distributed under the terms of the MIT License. * * Authors: - * Michael Phipps - * Jérôme Duval, jerome.duval@free.fr + * Michael Phipps + * Jérôme Duval, jerome.duval@free.fr + * Axel Dörfler, axeld@pinc-software.de */ +#ifndef SCREEN_SAVER_WINDOW_H +#define SCREEN_SAVER_WINDOW_H + + +#include "PasswordWindow.h" +#include "ScreenSaverPrefs.h" -#ifndef _ScreenSaverWindow_H -#define _ScreenSaverWindow_H #include #include #include #include #include #include -#include "PasswordWindow.h" -#include "ScreenSaverPrefs.h" +class BButton; + +class ModulesView; class MouseAreaView; -class PreviewView; +class ScreenSaverRunner; +class TimeSlider; -class ScreenSaverWin: public BWindow { -public: - ScreenSaverWin(); - virtual void MessageReceived(BMessage *message); - virtual bool QuitRequested(); - void PopulateScreenSaverList(); - void LoadSettings(); - virtual ~ScreenSaverWin(); - void SelectCurrentModule(); -private: - void SetupForm(); - void SetupTab1(); - void SetupTab2(); - void UpdateStatus(); - void SaverSelected(); +class ScreenSaverWindow : public BWindow { + public: + ScreenSaverWindow(); + virtual ~ScreenSaverWindow(); - 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; - int fFadeState,fNoFadeState; - BView *fSampleView; - - BView *fTab1,*fTab2; - BTabView *fTabView; - BBox *fModuleSettingsBox; + void LoadSettings(); - PreviewView *fPreviewDisplay; - BListView *fListView1; - BString fSelectedAddonFileName; - image_id fCurrentAddon; - - BButton *fTestButton; - BButton *fAddButton; - BBox *fEnableScreenSaverBox; - BSlider *fPasswordSlider; - BSlider *fTurnOffSlider; - BSlider *fRunSlider; - BStringView *fStringView1; - BCheckBox *fEnableCheckbox; - BCheckBox *fPasswordCheckbox; - BCheckBox *fTurnOffScreenCheckBox; - BStringView *fTurnOffMinutes; - BStringView *fRunMinutes; - BStringView *fPasswordMinutes; - BButton *fPasswordButton; - BStringView *fFadeNowString; - BStringView *fFadeNowString2; - BStringView *fDontFadeString; - BStringView *fDontFadeString2; - MouseAreaView *fFadeNow,*fFadeNever; - PasswordWindow *fPwWin; - BMessenger *fPwMessenger; - - BMessage fSettings; - BFilePanel *fFilePanel; - BView *fSettingsArea; + private: + void _SetupFadeTab(BRect frame); + void _UpdateTurnOffScreen(); + void _UpdateStatus(); + + ScreenSaverPrefs fPrefs; + uint32 fTurnOffScreenFlags; + + BView* fFadeView; + ModulesView* fModulesView; + BTabView* fTabView; + + BCheckBox* fEnableCheckBox; + TimeSlider* fRunSlider; + + BCheckBox* fTurnOffCheckBox; + TimeSlider* fTurnOffSlider; + + BCheckBox* fPasswordCheckBox; + TimeSlider* fPasswordSlider; + BButton* fPasswordButton; + PasswordWindow* fPasswordWindow; + + BStringView *fFadeNowString; + BStringView *fFadeNowString2; + BStringView *fDontFadeString; + BStringView *fDontFadeString2; + + MouseAreaView* fFadeNow; + MouseAreaView* fFadeNever; }; -#endif // _ScreenSaverWindow_H +static const int32 kMsgUpdateList = 'UPDL'; + +#endif // SCREEN_SAVER_WINDOW_H diff --git a/src/preferences/screensaver/Utility.h b/src/preferences/screensaver/Utility.h new file mode 100644 index 0000000000..68ae2edb23 --- /dev/null +++ b/src/preferences/screensaver/Utility.h @@ -0,0 +1,40 @@ +#ifndef UTILITY_H +#define UTILITY_H + + +#include + + +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