* 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:
@@ -12,25 +12,32 @@ class BScreenSaver;
|
|||||||
class BView;
|
class BView;
|
||||||
class ScreenSaverPrefs;
|
class ScreenSaverPrefs;
|
||||||
|
|
||||||
class ScreenSaverThread
|
class ScreenSaverThread {
|
||||||
{
|
public:
|
||||||
public:
|
ScreenSaverThread(BWindow* window,
|
||||||
ScreenSaverThread(BWindow *wnd, BView *vw, ScreenSaverPrefs *p);
|
BView* view,
|
||||||
void Thread();
|
ScreenSaverPrefs* prefs);
|
||||||
BScreenSaver *LoadAddOn() ;
|
~ScreenSaverThread();
|
||||||
void Quit();
|
|
||||||
|
|
||||||
static int32 ThreadFunc(void *data);
|
void Thread();
|
||||||
private:
|
BScreenSaver* LoadAddOn();
|
||||||
BScreenSaver *fSaver;
|
void Quit(thread_id thread);
|
||||||
BWindow *fWin;
|
|
||||||
BDirectWindow *fDWin;
|
|
||||||
BView *fView;
|
|
||||||
ScreenSaverPrefs *fPref;
|
|
||||||
|
|
||||||
long fFrame;
|
static int32 ThreadFunc(void* data);
|
||||||
int fSnoozeCount;
|
private:
|
||||||
image_id fAddonImage;
|
void _CleanUp();
|
||||||
|
|
||||||
|
BScreenSaver* fSaver;
|
||||||
|
BWindow* fWin;
|
||||||
|
BDirectWindow* fDWin;
|
||||||
|
BView* fView;
|
||||||
|
ScreenSaverPrefs* fPref;
|
||||||
|
|
||||||
|
long fFrame;
|
||||||
|
int fSnoozeCount;
|
||||||
|
image_id fAddonImage;
|
||||||
|
|
||||||
|
volatile bool fQuitting;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //SCREEN_SAVER_THREAD_H
|
#endif //SCREEN_SAVER_THREAD_H
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,32 +17,46 @@
|
|||||||
int32
|
int32
|
||||||
ScreenSaverThread::ThreadFunc(void *data)
|
ScreenSaverThread::ThreadFunc(void *data)
|
||||||
{
|
{
|
||||||
ScreenSaverThread *ss=(ScreenSaverThread *)data;
|
ScreenSaverThread* ss = (ScreenSaverThread*)data;
|
||||||
ss->Thread();
|
ss->Thread();
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -53,21 +67,24 @@ ScreenSaverThread::Thread()
|
|||||||
fView->SetViewColor(0,0,0);
|
fView->SetViewColor(0,0,0);
|
||||||
fView->SetLowColor(0,0,0);
|
fView->SetLowColor(0,0,0);
|
||||||
if (fSaver)
|
if (fSaver)
|
||||||
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()) {
|
||||||
if (fDWin)
|
// NOTE: R5 really calls DirectDraw()
|
||||||
|
// and then Draw() for the same frame
|
||||||
|
if (fDWin)
|
||||||
fSaver->DirectDraw(fFrame);
|
fSaver->DirectDraw(fFrame);
|
||||||
fSaver->Draw(fView,fFrame);
|
fSaver->Draw(fView, fFrame);
|
||||||
fWin->Unlock();
|
fWin->Unlock();
|
||||||
fFrame++;
|
fFrame++;
|
||||||
}
|
}
|
||||||
@@ -75,22 +92,23 @@ ScreenSaverThread::Thread()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BScreenSaver *
|
BScreenSaver*
|
||||||
ScreenSaverThread::LoadAddOn()
|
ScreenSaverThread::LoadAddOn()
|
||||||
{
|
{
|
||||||
if (strcmp("", fPref->ModuleName()) == 0)
|
if (strcmp("", fPref->ModuleName()) == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
BScreenSaver *(*instantiate)(BMessage *, image_id );
|
// This is a new set of preferences. Free up what we did have
|
||||||
if (fAddonImage) { // This is a new set of preferences. Free up what we did have
|
_CleanUp();
|
||||||
unload_add_on(fAddonImage);
|
|
||||||
}
|
BScreenSaver* (*instantiate)(BMessage*, image_id);
|
||||||
|
|
||||||
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());
|
||||||
fAddonImage = load_add_on(temp);
|
fAddonImage = load_add_on(temp);
|
||||||
}
|
}
|
||||||
if (fAddonImage<0) {
|
if (fAddonImage < 0) {
|
||||||
//printf ("Unable to open add-on: %s\n",temp);
|
//printf ("Unable to open add-on: %s\n",temp);
|
||||||
sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName());
|
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)) {
|
if (B_OK==find_directory(B_COMMON_ADDONS_DIRECTORY, 0, false, temp, B_PATH_NAME_LENGTH)) {
|
||||||
@@ -98,14 +116,14 @@ ScreenSaverThread::LoadAddOn()
|
|||||||
fAddonImage = load_add_on(temp);
|
fAddonImage = load_add_on(temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fAddonImage<0) {
|
if (fAddonImage < 0) {
|
||||||
//printf ("Unable to open add-on: %s\n",temp);
|
//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)) {
|
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());
|
sprintf (temp,"%s/Screen Savers/%s", temp, fPref->ModuleName());
|
||||||
fAddonImage = load_add_on(temp);
|
fAddonImage = load_add_on(temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fAddonImage<0) {
|
if (fAddonImage < 0) {
|
||||||
printf ("Unable to open add-on: %s\n",temp);
|
printf ("Unable to open add-on: %s\n",temp);
|
||||||
printf ("add on image = %ld!\n", fAddonImage);
|
printf ("add on image = %ld!\n", fAddonImage);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user