diff --git a/src/kits/screensaver/Jamfile b/src/kits/screensaver/Jamfile index 3f4a08b551..fc1736e0e5 100644 --- a/src/kits/screensaver/Jamfile +++ b/src/kits/screensaver/Jamfile @@ -2,12 +2,15 @@ SubDir HAIKU_TOP src kits screensaver ; SetSubDirSupportedPlatformsBeOSCompatible ; +UseHeaders [ FDirName headers os add-ons screen_saver ] ; + # we also need our headers when build for BeOS + UsePrivateHeaders screen_saver ; SharedLibrary libscreensaver.so : ScreenSaver.cpp ScreenSaverPrefs.cpp - ScreenSaverThread.cpp + ScreenSaverRunner.cpp : be game ; @@ -17,4 +20,4 @@ Package haiku-screensaverkit-cvs : boot home config lib ; Packages haiku-screensaverkit-cvs : - README ; + README ; diff --git a/src/kits/screensaver/ScreenSaver.cpp b/src/kits/screensaver/ScreenSaver.cpp index e134d7ac4d..88df134723 100644 --- a/src/kits/screensaver/ScreenSaver.cpp +++ b/src/kits/screensaver/ScreenSaver.cpp @@ -1,189 +1,167 @@ /* - * Copyright 2003, Michael Phipps. All rights reserved. + * Copyright 2003-2006, Michael Phipps. All rights reserved. * Distributed under the terms of the MIT License. */ + #include "ScreenSaver.h" -BScreenSaver::BScreenSaver(BMessage *archive, - image_id) : ticksize(50000),looponcount(0),loopoffcount(0) + +BScreenSaver::BScreenSaver(BMessage *archive, image_id thisImage) + : + fTickSize(50000), + fLoopOnCount(0), + fLoopOffCount(0) { } -BScreenSaver::~BScreenSaver() +BScreenSaver::~BScreenSaver() { } status_t -BScreenSaver::InitCheck() +BScreenSaver::InitCheck() { - return B_OK; // This method is meant to be overridden + // This method is meant to be overridden + return B_OK; } status_t -BScreenSaver::StartSaver(BView *view, bool preview) +BScreenSaver::StartSaver(BView *view, bool preview) { - return B_OK; // This method is meant to be overridden + // This method is meant to be overridden + return B_OK; } void -BScreenSaver::StopSaver() +BScreenSaver::StopSaver() { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void BScreenSaver::Draw(BView *view, int32 frame) { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::DirectConnected(direct_buffer_info *info) +BScreenSaver::DirectConnected(direct_buffer_info *info) { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::DirectDraw(int32 frame) +BScreenSaver::DirectDraw(int32 frame) { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::StartConfig(BView *configView) +BScreenSaver::StartConfig(BView *configView) { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::StopConfig() +BScreenSaver::StopConfig() { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::SupplyInfo(BMessage *info) const +BScreenSaver::SupplyInfo(BMessage* info) const { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } void -BScreenSaver::ModulesChanged(const BMessage *info) +BScreenSaver::ModulesChanged(const BMessage* info) { - return; // This method is meant to be overridden + // This method is meant to be overridden + return; } status_t -BScreenSaver::SaveState(BMessage *into) const +BScreenSaver::SaveState(BMessage *into) const { - return B_ERROR; // This method is meant to be overridden + // This method is meant to be overridden + return B_ERROR; } void -BScreenSaver::SetTickSize(bigtime_t ts) +BScreenSaver::SetTickSize(bigtime_t tickSize) { - ticksize = ts; + fTickSize = tickSize; } bigtime_t -BScreenSaver::TickSize() const +BScreenSaver::TickSize() const { - return ticksize; + return fTickSize; } void -BScreenSaver::SetLoop(int32 on_count, int32 off_count) +BScreenSaver::SetLoop(int32 onCount, int32 offCount) { - looponcount = on_count; - loopoffcount = off_count; + fLoopOnCount = onCount; + fLoopOffCount = offCount; } int32 -BScreenSaver::LoopOnCount() const +BScreenSaver::LoopOnCount() const { - return looponcount; + return fLoopOnCount; } int32 -BScreenSaver::LoopOffCount() const +BScreenSaver::LoopOffCount() const { - return loopoffcount; + return fLoopOffCount; } -void -BScreenSaver::_ReservedScreenSaver1() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver2() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver3() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver4() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver5() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver6() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver7() -{ -} - - -void -BScreenSaver::_ReservedScreenSaver8() -{ -} - +void BScreenSaver::_ReservedScreenSaver1() {} +void BScreenSaver::_ReservedScreenSaver2() {} +void BScreenSaver::_ReservedScreenSaver3() {} +void BScreenSaver::_ReservedScreenSaver4() {} +void BScreenSaver::_ReservedScreenSaver5() {} +void BScreenSaver::_ReservedScreenSaver6() {} +void BScreenSaver::_ReservedScreenSaver7() {} +void BScreenSaver::_ReservedScreenSaver8() {} +// for compatibility with older BeOS versions extern "C" { -void ReservedScreenSaver1__12BScreenSaver () {} -void ReservedScreenSaver2__12BScreenSaver () {} -void ReservedScreenSaver3__12BScreenSaver () {} -void ReservedScreenSaver4__12BScreenSaver () {} -void ReservedScreenSaver5__12BScreenSaver () {} -void ReservedScreenSaver6__12BScreenSaver () {} -void ReservedScreenSaver7__12BScreenSaver () {} -void ReservedScreenSaver8__12BScreenSaver () {} +void ReservedScreenSaver1__12BScreenSaver() {} +void ReservedScreenSaver2__12BScreenSaver() {} +void ReservedScreenSaver3__12BScreenSaver() {} +void ReservedScreenSaver4__12BScreenSaver() {} +void ReservedScreenSaver5__12BScreenSaver() {} +void ReservedScreenSaver6__12BScreenSaver() {} +void ReservedScreenSaver7__12BScreenSaver() {} +void ReservedScreenSaver8__12BScreenSaver() {} } diff --git a/src/kits/screensaver/ScreenSaverPrefs.cpp b/src/kits/screensaver/ScreenSaverPrefs.cpp index 8b1e439153..d076c2055d 100644 --- a/src/kits/screensaver/ScreenSaverPrefs.cpp +++ b/src/kits/screensaver/ScreenSaverPrefs.cpp @@ -1,82 +1,92 @@ /* - * 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 + * Jérôme Duval, jerome.duval@free.fr */ + + +#include "ScreenSaverPrefs.h" + #include #include #include #include #include #include + #include -#include "ScreenSaverPrefs.h" ScreenSaverPrefs::ScreenSaverPrefs() { - find_directory(B_USER_SETTINGS_DIRECTORY,&fSSPath); - find_directory(B_USER_SETTINGS_DIRECTORY,&fNetworkPath); - fSSPath.Append("ScreenSaver_settings",true); - fNetworkPath.Append("network",true); + BPath path; + find_directory(B_USER_SETTINGS_DIRECTORY, &path); + + fSettingsPath = path; + fSettingsPath.Append("ScreenSaver_settings", true); + fNetworkPath = path; + fNetworkPath.Append("network", true); Defaults(); } -// Load the flattened settings BMessage from disk and parse it. -bool +//! Load the flattened settings BMessage from disk and parse it. +bool ScreenSaverPrefs::LoadSettings() { - BFile ssSettings(fSSPath.Path(),B_READ_ONLY); - if (B_OK==ssSettings.InitCheck()) { // File exists. Unflatten the message and call the settings parser. - if (fSettings.Unflatten(&ssSettings)!=B_OK) - return false; - - PRINT_OBJECT(fSettings); - - fSettings.FindRect("windowframe", &fWindowFrame); - fSettings.FindInt32("windowtab", &fWindowTab); - fSettings.FindInt32("timeflags", &fTimeFlags); - - int32 blank_time, standByTime, suspendTime, offTime, passwordTime; - if (fSettings.FindInt32("timefade", &blank_time) == B_OK) - fBlankTime = blank_time * 1000000LL; - if (fSettings.FindInt32("timestandby", &standByTime) == B_OK) - fStandByTime = standByTime * 1000000LL; - if (fSettings.FindInt32("timesuspend", &suspendTime) == B_OK) - fSuspendTime = suspendTime * 1000000LL; - if (fSettings.FindInt32("timeoff", &offTime) == B_OK) - fOffTime = offTime * 1000000LL; - fSettings.FindInt32("cornernow", (int32*)&fBlankCorner); - fSettings.FindInt32("cornernever", (int32*)&fNeverBlankCorner); - fSettings.FindBool("lockenable", &fLockEnabled); - if (fSettings.FindInt32("lockdelay", &passwordTime) == B_OK) - fPasswordTime = passwordTime * 1000000LL; - fSettings.FindString("lockpassword", &fPassword); - fSettings.FindString("lockmethod", &fLockMethod); - fSettings.FindString("modulename", &fModuleName); - - if (IsNetworkPassword()) { - FILE *networkFile=NULL; - char buffer[512],*start; - // This ugly piece opens the networking file and reads the password, if it exists. - if ((networkFile=fopen(fNetworkPath.Path(),"r"))) - while (buffer==fgets(buffer,512,networkFile)) - if ((start=strstr(buffer,"PASSWORD = "))) { - char password[14]; - strncpy(password, start+11,strlen(start+11)-1); - password[strlen(start+11)-1] = 0; - fPassword = password; - break; - } - } - return true; - } else + BFile file(fSettingsPath.Path(), B_READ_ONLY); + if (file.InitCheck() != B_OK) return false; + + // File exists. Unflatten the message and call the settings parser. + if (fSettings.Unflatten(&file) != B_OK) + return false; + + PRINT_OBJECT(fSettings); + + fSettings.FindRect("windowframe", &fWindowFrame); + fSettings.FindInt32("windowtab", &fWindowTab); + fSettings.FindInt32("timeflags", &fTimeFlags); + + int32 blank_time, standByTime, suspendTime, offTime, passwordTime; + if (fSettings.FindInt32("timefade", &blank_time) == B_OK) + fBlankTime = blank_time * 1000000LL; + if (fSettings.FindInt32("timestandby", &standByTime) == B_OK) + fStandByTime = standByTime * 1000000LL; + if (fSettings.FindInt32("timesuspend", &suspendTime) == B_OK) + fSuspendTime = suspendTime * 1000000LL; + if (fSettings.FindInt32("timeoff", &offTime) == B_OK) + fOffTime = offTime * 1000000LL; + fSettings.FindInt32("cornernow", (int32*)&fBlankCorner); + fSettings.FindInt32("cornernever", (int32*)&fNeverBlankCorner); + fSettings.FindBool("lockenable", &fLockEnabled); + if (fSettings.FindInt32("lockdelay", &passwordTime) == B_OK) + fPasswordTime = passwordTime * 1000000LL; + fSettings.FindString("lockpassword", &fPassword); + fSettings.FindString("lockmethod", &fLockMethod); + fSettings.FindString("modulename", &fModuleName); + + if (IsNetworkPassword()) { + FILE *networkFile = NULL; + char buffer[512], *start; + // This ugly piece opens the networking file and reads the password, if it exists. + if ((networkFile = fopen(fNetworkPath.Path(),"r"))) + while (fgets(buffer, 512, networkFile) != NULL) { + if ((start = strstr(buffer,"PASSWORD = ")) != NULL) { + char password[14]; + strncpy(password, start+11,strlen(start+11)-1); + password[strlen(start+11)-1] = 0; + fPassword = password; + break; + } + } + } + + return true; } @@ -85,7 +95,7 @@ ScreenSaverPrefs::Defaults() { fWindowFrame = BRect(96.5, 77.0, 542.5, 402); fWindowTab = 0; - fTimeFlags = 0; + fTimeFlags = SAVER_DISABLED; fBlankTime = 120*1000000LL; fStandByTime = 120*1000000LL; fSuspendTime = 120*1000000LL; @@ -103,38 +113,41 @@ ScreenSaverPrefs::Defaults() BMessage & ScreenSaverPrefs::GetSettings() { - fSettings.RemoveName("windowframe"); - fSettings.RemoveName("windowtab"); - fSettings.RemoveName("timeflags"); - fSettings.RemoveName("timefade"); - fSettings.RemoveName("timestandby"); - fSettings.RemoveName("timesuspend"); - fSettings.RemoveName("timeoff"); - fSettings.RemoveName("cornernow"); - fSettings.RemoveName("cornernever"); - fSettings.RemoveName("lockenable"); - fSettings.RemoveName("lockdelay"); - fSettings.RemoveName("lockpassword"); - fSettings.RemoveName("lockmethod"); - fSettings.RemoveName("modulename"); - fSettings.AddRect("windowframe", fWindowFrame); - fSettings.AddInt32("windowtab", fWindowTab); - fSettings.AddInt32("timeflags", fTimeFlags); - fSettings.AddInt32("timefade", fBlankTime/1000000); - fSettings.AddInt32("timestandby", fStandByTime/1000000); - fSettings.AddInt32("timesuspend", fSuspendTime/1000000); - fSettings.AddInt32("timeoff", fOffTime/1000000); - fSettings.AddInt32("cornernow", fBlankCorner); - fSettings.AddInt32("cornernever", fNeverBlankCorner); - fSettings.AddBool("lockenable", fLockEnabled); - fSettings.AddInt32("lockdelay", fPasswordTime/1000000); - if (IsNetworkPassword()) - fSettings.AddString("lockpassword", ""); - else - fSettings.AddString("lockpassword", fPassword); - fSettings.AddString("lockmethod", fLockMethod); - fSettings.AddString("modulename", fModuleName); - + // We can't just empty the message, because the module states are stored + // in this message as well. + + if (fSettings.ReplaceRect("windowframe", fWindowFrame) != B_OK) + fSettings.AddRect("windowframe", fWindowFrame); + if (fSettings.ReplaceInt32("windowtab", fWindowTab) != B_OK) + fSettings.AddInt32("windowtab", fWindowTab); + if (fSettings.ReplaceInt32("timeflags", fTimeFlags) != B_OK) + fSettings.AddInt32("timeflags", fTimeFlags); + if (fSettings.ReplaceInt32("timefade", fBlankTime / 1000000LL) != B_OK) + fSettings.AddInt32("timefade", fBlankTime / 1000000LL); + if (fSettings.ReplaceInt32("timestandby", fStandByTime / 1000000LL) != B_OK) + fSettings.AddInt32("timestandby", fStandByTime / 1000000LL); + if (fSettings.ReplaceInt32("timesuspend", fSuspendTime / 1000000LL) != B_OK) + fSettings.AddInt32("timesuspend", fSuspendTime / 1000000LL); + if (fSettings.ReplaceInt32("timeoff", fOffTime / 1000000LL) != B_OK) + fSettings.AddInt32("timeoff", fOffTime / 1000000LL); + if (fSettings.ReplaceInt32("cornernow", fBlankCorner) != B_OK) + fSettings.AddInt32("cornernow", fBlankCorner); + if (fSettings.ReplaceInt32("cornernever", fNeverBlankCorner) != B_OK) + fSettings.AddInt32("cornernever", fNeverBlankCorner); + if (fSettings.ReplaceBool("lockenable", fLockEnabled) != B_OK) + fSettings.AddBool("lockenable", fLockEnabled); + if (fSettings.ReplaceInt32("lockdelay", fPasswordTime / 1000000LL) != B_OK) + fSettings.AddInt32("lockdelay", fPasswordTime / 1000000LL); + if (fSettings.ReplaceString("lockmethod", fLockMethod) != B_OK) + fSettings.AddString("lockmethod", fLockMethod); + + const char* password = IsNetworkPassword() ? "" : fPassword.String(); + if (fSettings.ReplaceString("lockpassword", password) != B_OK) + fSettings.AddString("lockpassword", password); + + if (fSettings.ReplaceString("modulename", fModuleName) != B_OK) + fSettings.AddString("modulename", fModuleName); + return fSettings; } @@ -163,8 +176,8 @@ ScreenSaverPrefs::SaveSettings() { BMessage &settings = GetSettings(); PRINT_OBJECT(settings); - BFile file(fSSPath.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); - if ((file.InitCheck()!=B_OK) || (settings.Flatten(&file)!=B_OK)) + BFile file(fSettingsPath.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); + if (file.InitCheck() != B_OK || settings.Flatten(&file) != B_OK) fprintf(stderr, "Problem while saving screensaver preferences file!\n"); } diff --git a/src/kits/screensaver/ScreenSaverRunner.cpp b/src/kits/screensaver/ScreenSaverRunner.cpp new file mode 100644 index 0000000000..5f5f286019 --- /dev/null +++ b/src/kits/screensaver/ScreenSaverRunner.cpp @@ -0,0 +1,227 @@ +/* + * 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 + */ + + +#include "ScreenSaverRunner.h" +#include "ScreenSaverPrefs.h" + +#include +#include +#include +#include + +#include + + +ScreenSaverRunner::ScreenSaverRunner(BWindow* window, BView* view, + bool preview, ScreenSaverPrefs& prefs) + : + fSaver(NULL), + fWindow(window), + fView(view), + fPrefs(prefs), + fPreview(preview), + fAddonImage(-1), + fThread(-1), + fQuitting(false) +{ + fDirectWindow = dynamic_cast(fWindow); + _LoadAddOn(); +} + + +ScreenSaverRunner::~ScreenSaverRunner() +{ + if (!fQuitting) + Quit(); + + _CleanUp(); +} + + +BScreenSaver* +ScreenSaverRunner::ScreenSaver() const +{ + return fSaver; +} + + +bool +ScreenSaverRunner::HasStarted() const +{ + return fHasStarted; +} + + +status_t +ScreenSaverRunner::Run() +{ + fThread = spawn_thread(&_ThreadFunc, "ScreenSaverRenderer", B_LOW_PRIORITY, this); + Resume(); + + return fThread >= B_OK ? B_OK : fThread; +} + + +void +ScreenSaverRunner::Quit() +{ + fQuitting = true; + Resume(); + + if (fThread >= 0) { + status_t returnValue; + wait_for_thread(fThread, &returnValue); + } +} + + +void +ScreenSaverRunner::Suspend() +{ + suspend_thread(fThread); +} + + +void +ScreenSaverRunner::Resume() +{ + resume_thread(fThread); +} + + +void +ScreenSaverRunner::_LoadAddOn() +{ + // This is a new set of preferences. Free up what we did have + // TODO: this is currently not meant to be used after creation + if (fThread >= B_OK) { + Suspend(); + if (fSaver != NULL) + fSaver->StopSaver(); + } + _CleanUp(); + + if (!strcmp("", fPrefs.ModuleName())) { + Resume(); + return; + } + + BScreenSaver* (*instantiate)(BMessage*, image_id); + + // try all directories until the first one succeeds + + directory_which which[] = {B_BEOS_ADDONS_DIRECTORY, B_COMMON_ADDONS_DIRECTORY, + B_USER_ADDONS_DIRECTORY}; + BPath path; + + for (uint32 i = 0; i < sizeof(which) / sizeof(which[0]); i++) { + if (find_directory(which[i], &path, false) != B_OK) + continue; + + path.Append("Screen Savers"); + path.Append(fPrefs.ModuleName()); + + fAddonImage = load_add_on(path.Path()); + if (fAddonImage >= B_OK) + break; + } + + if (fAddonImage < B_OK) { + printf("Unable to open add-on: %s: %s\n", path.Path(), strerror(fAddonImage)); + } else { + // Look for the one C function that should exist. + if (get_image_symbol(fAddonImage, "instantiate_screen_saver", + B_SYMBOL_TYPE_TEXT, (void **)&instantiate) != B_OK) { + printf("Unable to find the instantiator\n"); + } else { + BMessage state; + fPrefs.GetState(fPrefs.ModuleName(), &state); + fSaver = instantiate(&state, fAddonImage); + } + + if (fSaver->InitCheck() != B_OK) { + printf("ScreenSaver initialization failed: %s!\n", strerror(fSaver->InitCheck())); + _CleanUp(); + } + } + + Resume(); +} + + +void +ScreenSaverRunner::_CleanUp() +{ + delete fSaver; + fSaver = NULL; + + if (fAddonImage >= 0) { + unload_add_on(fAddonImage); + fAddonImage = -1; + } +} + + +void +ScreenSaverRunner::_Run() +{ + if (fWindow->Lock()) { + fView->SetViewColor(0, 0, 0); + fView->SetLowColor(0, 0, 0); + if (fSaver) + fHasStarted = fSaver->StartSaver(fView, fPreview) == B_OK; + fWindow->Unlock(); + } + + int32 snoozeCount = 0; + int32 frame = 0; + + while (!fQuitting) { + bigtime_t tick = fSaver ? fSaver->TickSize() : 50000; + snooze(tick); + + if (snoozeCount) { + // if we are sleeping, do nothing + snoozeCount--; + } else if (fSaver != NULL && fHasStarted) { + if (fSaver->LoopOnCount() && frame >= fSaver->LoopOnCount()) { + // Time to nap + frame = 0; + snoozeCount = fSaver->LoopOffCount(); + } else if (fWindow->LockWithTimeout(5000LL) == B_OK) { + if (!fQuitting) { + // NOTE: R5 really calls DirectDraw() + // and then Draw() for the same frame + if (fDirectWindow) + fSaver->DirectDraw(frame); + fSaver->Draw(fView, frame); + fView->Sync(); + frame++; + } + fWindow->Unlock(); + } + } else + snoozeCount = 1000; + } + + if (fSaver) + fSaver->StopSaver(); +} + + +status_t +ScreenSaverRunner::_ThreadFunc(void *data) +{ + ScreenSaverRunner* runner = (ScreenSaverRunner*)data; + runner->_Run(); + return B_OK; +} + diff --git a/src/kits/screensaver/ScreenSaverThread.cpp b/src/kits/screensaver/ScreenSaverThread.cpp deleted file mode 100644 index 5dfc39327c..0000000000 --- a/src/kits/screensaver/ScreenSaverThread.cpp +++ /dev/null @@ -1,163 +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 "ScreenSaverThread.h" -#include "ScreenSaverPrefs.h" - -int32 -ScreenSaverThread::ThreadFunc(void *data) -{ - ScreenSaverThread* ss = (ScreenSaverThread*)data; - ss->Thread(); - return B_OK; -} - - -ScreenSaverThread::ScreenSaverThread(BWindow* window, - BView* view, - ScreenSaverPrefs* prefs) - : fSaver(NULL), - fWin(window), - fView(view), - fPref(prefs), - fFrame(0), - fSnoozeCount(0), - fAddonImage(-1), - - fQuitting(false) -{ - fDWin = dynamic_cast(fWin); -} - - -ScreenSaverThread::~ScreenSaverThread() -{ - _CleanUp(); -} - - -void -ScreenSaverThread::Quit(thread_id id) -{ - fQuitting = true; - if (id >= 0) { - status_t threadRetValue; - wait_for_thread(id, &threadRetValue); - } - - if (fSaver) - fSaver->StopSaver(); -} - - -void -ScreenSaverThread::Thread() -{ - if (fWin->Lock()) { - fView->SetViewColor(0,0,0); - fView->SetLowColor(0,0,0); - if (fSaver) - fSaver->StartSaver(fView, false); - fWin->Unlock(); - } - while (!fQuitting) { - snooze(fSaver->TickSize()); - if (fSnoozeCount) { - // if we are sleeping, do nothing - fSnoozeCount--; - return; - } else if (fSaver->LoopOnCount() && (fFrame >= fSaver->LoopOnCount())) { // Time to nap - fFrame = 0; - fSnoozeCount = fSaver->LoopOffCount(); - } else if (fWin->Lock()) { - // NOTE: R5 really calls DirectDraw() - // and then Draw() for the same frame - if (fDWin) - fSaver->DirectDraw(fFrame); - fSaver->Draw(fView, fFrame); - fWin->Unlock(); - fFrame++; - } - } -} - - -BScreenSaver* -ScreenSaverThread::LoadAddOn() -{ - if (strcmp("", fPref->ModuleName()) == 0) - return NULL; - - // This is a new set of preferences. Free up what we did have - _CleanUp(); - - BScreenSaver* (*instantiate)(BMessage*, image_id); - - char temp[B_PATH_NAME_LENGTH]; - if (B_OK==find_directory(B_BEOS_ADDONS_DIRECTORY, 0, false, temp, B_PATH_NAME_LENGTH)) { - sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName()); - fAddonImage = load_add_on(temp); - } - if (fAddonImage < 0) { - //printf ("Unable to open add-on: %s\n",temp); - sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName()); - if (B_OK==find_directory(B_COMMON_ADDONS_DIRECTORY, 0, false, temp, B_PATH_NAME_LENGTH)) { - sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName()); - fAddonImage = load_add_on(temp); - } - } - if (fAddonImage < 0) { - //printf ("Unable to open add-on: %s\n",temp); - if (B_OK==find_directory(B_USER_ADDONS_DIRECTORY, 0, false, temp, B_PATH_NAME_LENGTH)) { - sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName()); - fAddonImage = load_add_on(temp); - } - } - if (fAddonImage < 0) { - printf ("Unable to open add-on: %s\n",temp); - printf ("add on image = %ld!\n", fAddonImage); - return NULL; - } else { - // Look for the one C function that should exist. - status_t retVal; - if (B_OK != (retVal=get_image_symbol(fAddonImage, "instantiate_screen_saver", B_SYMBOL_TYPE_TEXT,(void **) &instantiate))) { - printf ("Unable to find the instantiator\n"); - printf ("Error = %ld\n",retVal); - return NULL; - } else { - BMessage state; - fPref->GetState(fPref->ModuleName(), &state); - fSaver = instantiate(&state, fAddonImage); - } - if (B_OK != fSaver->InitCheck()) { - printf ("InitCheck() Failed!\n"); - unload_add_on(fAddonImage); - delete fSaver; - fSaver = NULL; - return NULL; - } - } - return fSaver; -} - - -void -ScreenSaverThread::_CleanUp() -{ - delete fSaver; - fSaver = NULL; - if (fAddonImage >= 0) { - unload_add_on(fAddonImage); - fAddonImage = -1; - } -}