* a bit of code clean up

* some fixes to make screen_blanker wait_for_thread() instead of
  killing the screen saver thread, BScreenSaver::Stop() is now called
  as well as its destructor


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17206 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2006-04-22 20:18:52 +00:00
parent bc692d448e
commit 8087170c53
3 changed files with 90 additions and 50 deletions
@@ -12,16 +12,21 @@ class BScreenSaver;
class BView; class BView;
class ScreenSaverPrefs; class ScreenSaverPrefs;
class ScreenSaverThread class ScreenSaverThread {
{
public: public:
ScreenSaverThread(BWindow *wnd, BView *vw, ScreenSaverPrefs *p); ScreenSaverThread(BWindow* window,
BView* view,
ScreenSaverPrefs* prefs);
~ScreenSaverThread();
void Thread(); void Thread();
BScreenSaver* LoadAddOn(); BScreenSaver* LoadAddOn();
void Quit(); void Quit(thread_id thread);
static int32 ThreadFunc(void* data); static int32 ThreadFunc(void* data);
private: private:
void _CleanUp();
BScreenSaver* fSaver; BScreenSaver* fSaver;
BWindow* fWin; BWindow* fWin;
BDirectWindow* fDWin; BDirectWindow* fDWin;
@@ -31,6 +36,8 @@ private:
long fFrame; long fFrame;
int fSnoozeCount; int fSnoozeCount;
image_id fAddonImage; image_id fAddonImage;
volatile bool fQuitting;
}; };
#endif //SCREEN_SAVER_THREAD_H #endif //SCREEN_SAVER_THREAD_H
+14 -10
View File
@@ -114,6 +114,7 @@ ScreenSaverApp::MessageReceived(BMessage *message)
} else { } else {
PRINT(("Quitting!\n")); PRINT(("Quitting!\n"));
_Shutdown(); _Shutdown();
Quit();
} }
break; break;
} }
@@ -144,26 +145,29 @@ ScreenSaverApp::QuitRequested()
&& (system_time() - fBlankTime > (fPrefs.PasswordTime() - fPrefs.BlankTime()))) { && (system_time() - fBlankTime > (fPrefs.PasswordTime() - fPrefs.BlankTime()))) {
_ShowPasswordWindow(); _ShowPasswordWindow();
return false; return false;
} else }
_Shutdown();
_Shutdown();
return true; return true;
} }
void void
ScreenSaverApp::_Shutdown(void) ScreenSaverApp::_Shutdown()
{ {
if (fWindow) if (fThread) {
fWindow->Hide(); fThread->Quit(fThreadID);
if (fThreadID > -1) { delete fThread;
// TODO: kill_thread()? How about doing this right?? } else if (fThreadID > -1) {
// ?!?
kill_thread(fThreadID); kill_thread(fThreadID);
} }
if (fThread)
delete fThread;
Quit(); fThread = NULL;
fThreadID = -1;
if (fWindow)
fWindow->Hide();
} }
+43 -14
View File
@@ -23,26 +23,40 @@ ScreenSaverThread::ThreadFunc(void *data)
} }
ScreenSaverThread::ScreenSaverThread(BWindow *wnd, BView *vw, ScreenSaverPrefs *p) ScreenSaverThread::ScreenSaverThread(BWindow* window,
BView* view,
ScreenSaverPrefs* prefs)
: fSaver(NULL), : fSaver(NULL),
fWin(wnd), fWin(window),
fView(vw), fView(view),
fPref(p), fPref(prefs),
fFrame(0), fFrame(0),
fSnoozeCount(0), fSnoozeCount(0),
fAddonImage(0) fAddonImage(-1),
fQuitting(false)
{ {
fDWin = dynamic_cast<BDirectWindow *>(wnd); fDWin = dynamic_cast<BDirectWindow *>(fWin);
}
ScreenSaverThread::~ScreenSaverThread()
{
_CleanUp();
} }
void void
ScreenSaverThread::Quit() ScreenSaverThread::Quit(thread_id id)
{ {
fQuitting = true;
if (id >= 0) {
status_t threadRetValue;
wait_for_thread(id, &threadRetValue);
}
if (fSaver) if (fSaver)
fSaver->StopSaver(); fSaver->StopSaver();
if (fWin)
fWin->Hide();
} }
@@ -56,15 +70,18 @@ ScreenSaverThread::Thread()
fSaver->StartSaver(fView, false); fSaver->StartSaver(fView, false);
fWin->Unlock(); fWin->Unlock();
} }
while (1) { while (!fQuitting) {
snooze(fSaver->TickSize()); snooze(fSaver->TickSize());
if (fSnoozeCount) { // If we are sleeping, do nothing if (fSnoozeCount) {
// if we are sleeping, do nothing
fSnoozeCount--; fSnoozeCount--;
return; return;
} else if (fSaver->LoopOnCount() && (fFrame >= fSaver->LoopOnCount())) { // Time to nap } else if (fSaver->LoopOnCount() && (fFrame >= fSaver->LoopOnCount())) { // Time to nap
fFrame = 0; fFrame = 0;
fSnoozeCount = fSaver->LoopOffCount(); fSnoozeCount = fSaver->LoopOffCount();
} else if (fWin->Lock()) { } else if (fWin->Lock()) {
// NOTE: R5 really calls DirectDraw()
// and then Draw() for the same frame
if (fDWin) if (fDWin)
fSaver->DirectDraw(fFrame); fSaver->DirectDraw(fFrame);
fSaver->Draw(fView, fFrame); fSaver->Draw(fView, fFrame);
@@ -81,10 +98,11 @@ ScreenSaverThread::LoadAddOn()
if (strcmp("", fPref->ModuleName()) == 0) if (strcmp("", fPref->ModuleName()) == 0)
return NULL; return NULL;
// This is a new set of preferences. Free up what we did have
_CleanUp();
BScreenSaver* (*instantiate)(BMessage*, image_id); BScreenSaver* (*instantiate)(BMessage*, image_id);
if (fAddonImage) { // This is a new set of preferences. Free up what we did have
unload_add_on(fAddonImage);
}
char temp[B_PATH_NAME_LENGTH]; char temp[B_PATH_NAME_LENGTH];
if (B_OK==find_directory(B_BEOS_ADDONS_DIRECTORY, 0, false, 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()); sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName());
@@ -132,3 +150,14 @@ ScreenSaverThread::LoadAddOn()
return fSaver; return fSaver;
} }
void
ScreenSaverThread::_CleanUp()
{
delete fSaver;
fSaver = NULL;
if (fAddonImage >= 0) {
unload_add_on(fAddonImage);
fAddonImage = -1;
}
}