diff --git a/src/kits/screensaver/Jamfile b/src/kits/screensaver/Jamfile index 0131e4c674..0a116f7fff 100644 --- a/src/kits/screensaver/Jamfile +++ b/src/kits/screensaver/Jamfile @@ -4,8 +4,10 @@ UsePrivateHeaders screensaver ; SharedLibrary screensaver : ScreenSaver.cpp + ScreenSaverPrefs.cpp + ScreenSaverThread.cpp ; LinkSharedOSLibs libscreensaver.so : - be + be game ; diff --git a/src/kits/screensaver/ScreenSaver.cpp b/src/kits/screensaver/ScreenSaver.cpp index ddca14df12..ef19f85911 100644 --- a/src/kits/screensaver/ScreenSaver.cpp +++ b/src/kits/screensaver/ScreenSaver.cpp @@ -1,157 +1,127 @@ #include "ScreenSaver.h" +#include BScreenSaver::BScreenSaver(BMessage *archive, - image_id) -{ - ticksize = 50000; - looponcount = 0; - loopoffcount = 0; + image_id) : ticksize(50000),looponcount(0),loopoffcount(0) { } -BScreenSaver::~BScreenSaver() -{ +BScreenSaver::~BScreenSaver() { } status_t -BScreenSaver::InitCheck() -{ +BScreenSaver::InitCheck() { return B_OK; // This method is meant to be overridden } status_t -BScreenSaver::StartSaver(BView *view, - bool preview) -{ +BScreenSaver::StartSaver(BView *view, bool preview) { return B_OK; // This method is meant to be overridden } void -BScreenSaver::StopSaver() +BScreenSaver::StopSaver() { + return; // This method is meant to be overridden +} + +void +BScreenSaver::Draw(BView *view, int32 frame) { return; // This method is meant to be overridden } void -BScreenSaver::Draw(BView *view, - int32 frame) -{ +BScreenSaver::DirectConnected(direct_buffer_info *info) { return; // This method is meant to be overridden } void -BScreenSaver::DirectConnected(direct_buffer_info *info) -{ +BScreenSaver::DirectDraw(int32 frame) { return; // This method is meant to be overridden } void -BScreenSaver::DirectDraw(int32 frame) -{ +BScreenSaver::StartConfig(BView *configView) { return; // This method is meant to be overridden } void -BScreenSaver::StartConfig(BView *configView) -{ +BScreenSaver::StopConfig() { return; // This method is meant to be overridden } void -BScreenSaver::StopConfig() -{ +BScreenSaver::SupplyInfo(BMessage *info) const { return; // This method is meant to be overridden } void -BScreenSaver::SupplyInfo(BMessage *info) const -{ - return; // This method is meant to be overridden -} - -void -BScreenSaver::ModulesChanged(const BMessage *info) -{ +BScreenSaver::ModulesChanged(const BMessage *info) { return; // This method is meant to be overridden } status_t -BScreenSaver::SaveState(BMessage *into) const -{ - return -1; +BScreenSaver::SaveState(BMessage *into) const { + return B_ERROR; // This method is meant to be overridden } void -BScreenSaver::SetTickSize(bigtime_t ts) -{ - ticksize = ts; +BScreenSaver::SetTickSize(bigtime_t ts) { + ticksize = ts; } bigtime_t -BScreenSaver::TickSize() const -{ +BScreenSaver::TickSize() const { return ticksize; } void -BScreenSaver::SetLoop(int32 on_count, - int32 off_count) -{ - looponcount = on_count; - loopoffcount = off_count; +BScreenSaver::SetLoop(int32 on_count, int32 off_count) { + looponcount = on_count; + loopoffcount = off_count; } int32 -BScreenSaver::LoopOnCount() const -{ +BScreenSaver::LoopOnCount() const { return looponcount; } int32 -BScreenSaver::LoopOffCount() const -{ +BScreenSaver::LoopOffCount() const { return loopoffcount; } void -BScreenSaver::_ReservedScreenSaver1() -{ +BScreenSaver::_ReservedScreenSaver1() { } void -BScreenSaver::_ReservedScreenSaver2() -{ +BScreenSaver::_ReservedScreenSaver2() { } void -BScreenSaver::_ReservedScreenSaver3() -{ +BScreenSaver::_ReservedScreenSaver3() { } void -BScreenSaver::_ReservedScreenSaver4() -{ +BScreenSaver::_ReservedScreenSaver4() { } void -BScreenSaver::_ReservedScreenSaver5() -{ +BScreenSaver::_ReservedScreenSaver5() { } void -BScreenSaver::_ReservedScreenSaver6() -{ +BScreenSaver::_ReservedScreenSaver6() { } void -BScreenSaver::_ReservedScreenSaver7() -{ +BScreenSaver::_ReservedScreenSaver7() { } void -BScreenSaver::_ReservedScreenSaver8() -{ +BScreenSaver::_ReservedScreenSaver8() { } diff --git a/src/kits/screensaver/ScreenSaverPrefs.cpp b/src/kits/screensaver/ScreenSaverPrefs.cpp new file mode 100755 index 0000000000..8a173022b2 --- /dev/null +++ b/src/kits/screensaver/ScreenSaverPrefs.cpp @@ -0,0 +1,116 @@ +#include "ScreenSaverPrefs.h" +#include "StorageDefs.h" +#include "FindDirectory.h" +#include "File.h" +#include "Path.h" +#include "string.h" // Posix string functions +#include "String.h" // BString def +#include + +ScreenSaverPrefs::ScreenSaverPrefs(void) { +} + +// Load the flattened settings BMessage from disk and parse it. +bool ScreenSaverPrefs::LoadSettings(void) { + bool ok; + char pathAndFile[B_PATH_NAME_LENGTH]; + BPath path; + + status_t found=find_directory(B_USER_SETTINGS_DIRECTORY,&path); + if (ok=(found==B_OK)) { + strncpy(pathAndFile,path.Path(),B_PATH_NAME_LENGTH-1); + strncat(pathAndFile,"/ScreenSaver_settings",B_PATH_NAME_LENGTH-1); + BFile ssSettings(pathAndFile,B_READ_ONLY); + if (B_OK==ssSettings.InitCheck()) + { // File exists. Unflatten the message and call the settings parser. + BMessage settings; + settings.Unflatten(&ssSettings); + ok=parseSettings (&settings); + } + } + return ok; +} + +void setOnValue(BMessage *msg, char *name, int &result) { + int32 value; + if (B_OK == msg->FindInt32(name,&value)) // If screen saving is even enabled + result=value; +} + +bool ScreenSaverPrefs::parseSettings (BMessage *msg) { + int temp; + const char *strPtr; + char pathAndFile[B_PATH_NAME_LENGTH]; + BPath path; + + // Set some defaults + blankTime=passwordTime=-1; + // Set the easy (integer) ones: + setOnValue(msg,"windowtab",windowTab); + setOnValue(msg,"timeflags",timeFlags); + setOnValue(msg,"timefade",blankTime); + setOnValue(msg,"timestandby",standbyTime); + setOnValue(msg,"timesuspend",suspendTime); + setOnValue(msg,"timeoff",offTime); + setOnValue(msg,"cornernow",temp); + blank=(arrowDirection)temp; + setOnValue(msg,"cornernever",temp); + neverBlank=(arrowDirection)temp; + setOnValue(msg,"lockdelay",passwordTime); + + msg->FindBool("lockenable",&lockenable); + msg->FindString("lockmethod",&strPtr); + isNetworkPWD=(strcmp("custom",strPtr)); + // Get the password. Either from the settings file or the networking file. + if (isNetworkPWD) { + status_t found=find_directory(B_USER_SETTINGS_DIRECTORY,&path); + if (found==B_OK) { + FILE *networkFile=NULL; + char buffer[512],*start; + strncpy(pathAndFile,path.Path(),B_PATH_NAME_LENGTH-1); + strncat(pathAndFile,"/network",B_PATH_NAME_LENGTH-1); + // This ugly piece opens the networking file and reads the password, if it exists. + if ((networkFile=fopen(pathAndFile,"r"))) + while (buffer==fgets(buffer,512,networkFile)) + if ((start=strstr(buffer,"PASSWORD ="))) + strncpy(password, start+10,strlen(start-11)); + } + } + else { + msg->FindString("lockpassword",&strPtr); + strcpy(password,strPtr); + } + + if (B_OK != msg->FindString("modulename",&strPtr)) + blankTime=-1; // If the module doesn't exist, never blank. + strcpy(moduleName,strPtr); + BString stateMsgName("modulesettings_"); + stateMsgName+=moduleName; + msg->FindMessage(stateMsgName.String(),&stateMsg); // Doesn't matter if it fails - stateMsg would just continue to be empty + + return true; +} + +void ScreenSaverPrefs::SaveSettings (void) { + BMessage msg; + msg.AddRect("windowframe",windowFrame); + msg.AddInt32("windowtab",windowTab); + msg.AddInt32("timeflags",timeFlags); + msg.AddInt32("timefade", blankTime); + msg.AddInt32("timestandby", standbyTime); + msg.AddInt32("timesuspend", suspendTime); + msg.AddInt32("timeoff", offTime); + msg.AddInt32("cornernow", blank); + msg.AddInt32("cornernever", neverBlank); + msg.AddBool("lockenable", lockenable); + msg.AddInt32("lockdelay", passwordTime); + msg.AddString("modulename", moduleName); + BString stateMsgName("modulesettings_"); + stateMsgName+=moduleName; + msg.AddMessage(stateMsgName.String(),&stateMsg); + BPath path; + find_directory(B_USER_SETTINGS_DIRECTORY,&path); + path.Append("OBOS_Screen_Saver",true); + BFile file(path.Path(),B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); + msg.Flatten(&file); +} diff --git a/src/kits/screensaver/ScreenSaverThread.cpp b/src/kits/screensaver/ScreenSaverThread.cpp new file mode 100755 index 0000000000..1cd7da044b --- /dev/null +++ b/src/kits/screensaver/ScreenSaverThread.cpp @@ -0,0 +1,57 @@ +#ifndef SCREEN_SAVER_THREAD_H +#include "ScreenSaverThread.h" +#endif +#include "Screen.h" +#include "ScreenSaver.h" +#include "ScreenSaverPrefs.h" + +int32 threadFunc(void *data) { + ScreenSaverThread *ss=(ScreenSaverThread *)data; + ss->thread(); +} + +ScreenSaverThread::ScreenSaverThread(BScreenSaver *svr, BDirectWindow *wnd, BView *vw, ScreenSaverPrefs *p) : + saver(svr),win(wnd),view(vw), pref(p), frame(0),snoozeCount(0) { + if (win) { // Running in full screen mode + saver->StartSaver(view,false); + win->SetFullScreen(true); + win->Show(); + win->Lock(); + view->SetViewColor(0,0,0); + view->SetLowColor(0,0,0); + win->Unlock(); + win->Sync(); + } +} + +void ScreenSaverThread::quit(void) { + saver->StopSaver(); + if (win) + win->Hide(); +} + +void ScreenSaverThread::thread() { + while (1) { + snooze(saver->TickSize()); + if (snoozeCount) { // If we are sleeping, do nothing + snoozeCount--; + return; + } else if (saver->LoopOnCount() && (frame>=saver->LoopOnCount())) { // Time to nap + frame=0; + snoozeCount=saver->LoopOffCount(); + } + else { + if (win) { + saver->DirectDraw(frame); + win->Lock(); + } + saver->Draw(view,frame); + if (win) { + win->Unlock(); + win->Sync(); + } + frame++; + } + } +} +