From 7b526b99377431cb08be6ad22bc7ac010ddff25d Mon Sep 17 00:00:00 2001 From: Michael Phipps Date: Wed, 31 Mar 2004 00:32:27 +0000 Subject: [PATCH] Some minor changes to promote code sharing. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7124 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/screensaver/ScreenSaverPrefs.cpp | 9 ++- src/kits/screensaver/ScreenSaverThread.cpp | 84 +++++++++++++++++----- 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/kits/screensaver/ScreenSaverPrefs.cpp b/src/kits/screensaver/ScreenSaverPrefs.cpp index 8a173022b2..6ccc47b315 100755 --- a/src/kits/screensaver/ScreenSaverPrefs.cpp +++ b/src/kits/screensaver/ScreenSaverPrefs.cpp @@ -58,6 +58,7 @@ bool ScreenSaverPrefs::parseSettings (BMessage *msg) { neverBlank=(arrowDirection)temp; setOnValue(msg,"lockdelay",passwordTime); + msg->FindRect("windowframe",&windowFrame); msg->FindBool("lockenable",&lockenable); msg->FindString("lockmethod",&strPtr); isNetworkPWD=(strcmp("custom",strPtr)); @@ -78,12 +79,16 @@ bool ScreenSaverPrefs::parseSettings (BMessage *msg) { } else { msg->FindString("lockpassword",&strPtr); - strcpy(password,strPtr); + if (strPtr) + strncpy(password,strPtr,B_PATH_NAME_LENGTH-1); } if (B_OK != msg->FindString("modulename",&strPtr)) blankTime=-1; // If the module doesn't exist, never blank. - strcpy(moduleName,strPtr); + if (strPtr) + strncpy(moduleName,strPtr,B_PATH_NAME_LENGTH-1); + else + strcpy(moduleName,"Blackness"); BString stateMsgName("modulesettings_"); stateMsgName+=moduleName; msg->FindMessage(stateMsgName.String(),&stateMsg); // Doesn't matter if it fails - stateMsg would just continue to be empty diff --git a/src/kits/screensaver/ScreenSaverThread.cpp b/src/kits/screensaver/ScreenSaverThread.cpp index 1cd7da044b..f2166b7936 100755 --- a/src/kits/screensaver/ScreenSaverThread.cpp +++ b/src/kits/screensaver/ScreenSaverThread.cpp @@ -4,24 +4,18 @@ #include "Screen.h" #include "ScreenSaver.h" #include "ScreenSaverPrefs.h" +#include "FindDirectory.h" +#include int32 threadFunc(void *data) { ScreenSaverThread *ss=(ScreenSaverThread *)data; ss->thread(); + return B_OK; } -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(); - } +ScreenSaverThread::ScreenSaverThread(BWindow *wnd, BView *vw, ScreenSaverPrefs *p) : + saver(NULL),win(wnd),view(vw), pref(p), frame(0),snoozeCount(0),addon_image(0) { + dwin=reinterpret_cast(wnd); } void ScreenSaverThread::quit(void) { @@ -31,6 +25,11 @@ void ScreenSaverThread::quit(void) { } void ScreenSaverThread::thread() { + win->Lock(); + view->SetViewColor(0,0,0); + view->SetLowColor(0,0,0); + saver->StartSaver(view,false); + win->Unlock(); while (1) { snooze(saver->TickSize()); if (snoozeCount) { // If we are sleeping, do nothing @@ -41,17 +40,64 @@ void ScreenSaverThread::thread() { snoozeCount=saver->LoopOffCount(); } else { - if (win) { + win->Lock(); + if (dwin) saver->DirectDraw(frame); - win->Lock(); - } saver->Draw(view,frame); - if (win) { - win->Unlock(); - win->Sync(); - } + win->Unlock(); frame++; } } } +BScreenSaver *ScreenSaverThread::LoadAddOn() { + BScreenSaver *(*instantiate)(BMessage *, image_id ); + if (addon_image) { // This is a new set of preferences. Free up what we did have + unload_add_on(addon_image); + } + char temp[B_PATH_NAME_LENGTH]; + if (B_OK==find_directory(B_BEOS_ADDONS_DIRECTORY,NULL,false,temp,B_PATH_NAME_LENGTH)) { + sprintf (temp,"%s/Screen Savers/%s",temp,pref->ModuleName()); + addon_image = load_add_on(temp); + } + if (addon_image<0) { + //printf ("Unable to open add-on: %s\n",temp); + sprintf (temp,"%s/Screen Savers/%s",temp,pref->ModuleName()); + if (B_OK==find_directory(B_COMMON_ADDONS_DIRECTORY,NULL,false,temp,B_PATH_NAME_LENGTH)) { + sprintf (temp,"%s/Screen Savers/%s",temp,pref->ModuleName()); + addon_image = load_add_on(temp); + } + } + if (addon_image<0) { + //printf ("Unable to open add-on: %s\n",temp); + if (B_OK==find_directory(B_USER_ADDONS_DIRECTORY,NULL,false,temp,B_PATH_NAME_LENGTH)) { + sprintf (temp,"%s/Screen Savers/%s",temp,pref->ModuleName()); + addon_image = load_add_on(temp); + } + } + if (addon_image<0) { + printf ("Unable to open add-on: %s\n",temp); + printf ("add on image = %ld!\n",addon_image); + return NULL; + } + else { + // Look for the one C function that should exist. + status_t retVal; + if (B_OK != (retVal=get_image_symbol(addon_image, "instantiate_screen_saver", B_SYMBOL_TYPE_TEXT,(void **) &instantiate))) { + printf ("Unable to find the instantiator\n"); + printf ("Error = %ld\n",retVal); + return NULL; + } + else + saver=instantiate(pref->GetState(),addon_image); + if (B_OK!=saver->InitCheck()) { + printf ("InitCheck() Failed!\n"); + unload_add_on(addon_image); + delete saver; + saver=NULL; + return NULL; + } + } + return saver; +} +