Damn, I forgot to include this directory when committing the screen saver changes.

This should have been part of r17731. Fixes the build.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17747 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-06-06 19:47:23 +00:00
parent a63dcbc187
commit d7b390a6c0
5 changed files with 403 additions and 345 deletions

View File

@ -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 ;

View File

@ -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() {}
}

View File

@ -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 <Debug.h>
#include <File.h>
#include <FindDirectory.h>
#include <Path.h>
#include <StorageDefs.h>
#include <String.h>
#include <string.h>
#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");
}

View File

@ -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 <FindDirectory.h>
#include <Screen.h>
#include <ScreenSaver.h>
#include <View.h>
#include <stdio.h>
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<BDirectWindow *>(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;
}

View File

@ -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 <FindDirectory.h>
#include <Screen.h>
#include <ScreenSaver.h>
#include <View.h>
#include <stdio.h>
#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<BDirectWindow *>(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;
}
}