* The screen saver window is now a kWindowScreenFeel, and thus should always be

in front of all other windows.
* Added TODO items where the code is strange or messy.
* Big cleanup (renamed files and variables like "fPww" to something more
  meaningful).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17126 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-04-13 15:46:06 +00:00
parent 20ad5fdfba
commit cbb7d5038a
7 changed files with 213 additions and 163 deletions
+2 -2
View File
@@ -2,11 +2,11 @@ SubDir HAIKU_TOP src bin screen_blanker ;
SetSubDirSupportedPlatformsBeOSCompatible ; SetSubDirSupportedPlatformsBeOSCompatible ;
UsePrivateHeaders screen_saver ; UsePrivateHeaders interface screen_saver ;
BinCommand screen_blanker : BinCommand screen_blanker :
ScreenSaverApp.cpp ScreenSaverApp.cpp
SSAwindow.cpp ScreenSaverWindow.cpp
PasswordWindow.cpp PasswordWindow.cpp
ScreenSaver.cpp ScreenSaver.cpp
: be game libscreensaver.so : be game libscreensaver.so
-44
View File
@@ -1,44 +0,0 @@
/*
* Copyright 2003-2005, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
*/
#include "SSAwindow.h"
#include <View.h>
// This is the BDirectWindow subclass that rendering occurs in.
// A view is added to it so that BView based screensavers will work.
SSAwindow::SSAwindow(BRect frame)
: BDirectWindow(frame, "ScreenSaver Window",
B_BORDERED_WINDOW, B_NOT_RESIZABLE|B_NOT_ZOOMABLE) , fSaver(NULL)
{
frame.OffsetTo(0,0);
fView = new BView(frame,"ScreenSaver View",B_FOLLOW_ALL,B_WILL_DRAW);
fView->SetViewColor(0,0,0);
AddChild(fView);
}
SSAwindow::~SSAwindow()
{
Hide();
}
bool
SSAwindow::QuitRequested()
{
return true;
}
void
SSAwindow::DirectConnected(direct_buffer_info *info)
{
if (fSaver)
fSaver->DirectConnected(info);
}
-21
View File
@@ -1,21 +0,0 @@
/*
* Copyright 2003, Michael Phipps. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <DirectWindow.h>
#include "ScreenSaver.h"
class SSAwindow : public BDirectWindow {
public:
SSAwindow(BRect frame);
~SSAwindow();
virtual bool QuitRequested();
virtual void DirectConnected(direct_buffer_info *info);
void SetSaver(BScreenSaver *s) {fSaver = s;}
BView *fView;
private:
BScreenSaver *fSaver;
};
+80 -58
View File
@@ -1,11 +1,15 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#include "ScreenSaverApp.h"
#include <Debug.h> #include <Debug.h>
#include <stdio.h> #include <stdio.h>
#include <Screen.h> #include <Screen.h>
@@ -18,27 +22,15 @@
#include <string.h> #include <string.h>
#include <Beep.h> #include <Beep.h>
#include "ScreenSaverApp.h"
const static int32 RESUME_SAVER = 'RSSV'; const static int32 RESUME_SAVER = 'RSSV';
// Start the server application. Set pulse to fire once per second.
// Run until the application quits.
int main(int, char**)
{
ScreenSaverApp myApplication;
myApplication.Run();
return(0);
}
// Construct the server app. Doesn't do much, at this point.
ScreenSaverApp::ScreenSaverApp() ScreenSaverApp::ScreenSaverApp()
: BApplication(SCREEN_BLANKER_SIG), : BApplication(SCREEN_BLANKER_SIG),
fWin(NULL), fWindow(NULL),
fSaver(NULL), fSaver(NULL),
fThrd(NULL), fThread(NULL),
fPww(NULL), fPasswordWindow(NULL),
fThreadID(-1), fThreadID(-1),
fRunner(NULL) fRunner(NULL)
{ {
@@ -49,46 +41,59 @@ ScreenSaverApp::ScreenSaverApp()
void void
ScreenSaverApp::ReadyToRun() ScreenSaverApp::ReadyToRun()
{ {
if (!fPref.LoadSettings()) { if (!fPrefs.LoadSettings()) {
fprintf(stderr, "could not load settings\n"); fprintf(stderr, "could not load settings\n");
exit(1); exit(1);
} else { // If everything works OK, create a BDirectWindow and start the render thread. }
BScreen theScreen(B_MAIN_SCREEN_ID);
fWin = new SSAwindow(theScreen.Frame());
fPww = new PasswordWindow();
fThrd = new ScreenSaverThread(fWin ,fWin->fView, &fPref);
fSaver = fThrd->LoadAddOn(); // create a BDirectWindow and start the render thread.
BScreen screen(B_MAIN_SCREEN_ID);
fWindow = new ScreenSaverWindow(screen.Frame());
fPasswordWindow = new PasswordWindow();
fThread = new ScreenSaverThread(fWindow, fWindow->ChildAt(0), &fPrefs);
fSaver = fThread->LoadAddOn();
if (fSaver) { if (fSaver) {
fWin->SetSaver(fSaver); fWindow->SetSaver(fSaver);
fThreadID = spawn_thread(ScreenSaverThread::ThreadFunc,"ScreenSaverRenderer", B_LOW_PRIORITY,fThrd); fThreadID = spawn_thread(ScreenSaverThread::ThreadFunc,
"ScreenSaverRenderer", B_LOW_PRIORITY, fThread);
resume_thread(fThreadID); resume_thread(fThreadID);
} else { } else {
fprintf(stderr, "could not load the screensaver addon\n"); fprintf(stderr, "could not load the screensaver addon\n");
} }
fWin->SetFullScreen(true);
fWin->Show(); fWindow->SetFullScreen(true);
fWindow->Show();
HideCursor(); HideCursor();
} }
}
void void
ScreenSaverApp::ShowPW() ScreenSaverApp::_ShowPasswordWindow()
{ {
if (fWin->Lock()) { if (fWindow->Lock()) {
if (fThreadID > -1) if (fThreadID > -1)
suspend_thread(fThreadID); suspend_thread(fThreadID);
if (B_OK==fWin->SetFullScreen(false)) {
fWin->Sync(); if (fWindow->SetFullScreen(false) == B_OK) {
fWindow->Sync();
// TODO: is that needed?
ShowCursor(); ShowCursor();
fPww->Show(); fPasswordWindow->Show();
fPww->Sync();
} }
fWin->Unlock(); fWindow->Unlock();
} }
_ResumeScreenSaver();
}
void
ScreenSaverApp::_ResumeScreenSaver()
{
delete fRunner; delete fRunner;
fRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), fPref.BlankTime(), 1); fRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER),
fPrefs.BlankTime(), 1);
if (fRunner->InitCheck() != B_OK) { if (fRunner->InitCheck() != B_OK) {
fprintf(stderr, "fRunner init failed\n"); fprintf(stderr, "fRunner init failed\n");
} }
@@ -101,30 +106,30 @@ ScreenSaverApp::MessageReceived(BMessage *message)
switch (message->what) { switch (message->what) {
case UNLOCK_MESSAGE: case UNLOCK_MESSAGE:
{ {
if (strcmp(fPref.Password(), crypt(fPww->GetPassword(), fPref.Password())) != 0) { if (strcmp(fPrefs.Password(), crypt(fPasswordWindow->GetPassword(),
fPrefs.Password())) != 0) {
beep(); beep();
fPww->SetPassword(""); fPasswordWindow->SetPassword("");
delete fRunner; _ResumeScreenSaver();
fRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), fPref.BlankTime(), 1);
if (fRunner->InitCheck()!=B_OK) {
fprintf(stderr, "fRunner init failed\n");
}
} else { } else {
PRINT(("Quitting!\n")); PRINT(("Quitting!\n"));
Shutdown(); _Shutdown();
} }
break; break;
} }
case RESUME_SAVER: case RESUME_SAVER:
if (fWin->Lock()) { if (fWindow->Lock()) {
if (B_OK==fWin->SetFullScreen(true)) { if (fWindow->SetFullScreen(true) == B_OK) {
HideCursor(); HideCursor();
fPww->Hide(); fPasswordWindow->Hide();
} }
if (fThreadID > -1) if (fThreadID > -1)
resume_thread(fThreadID); resume_thread(fThreadID);
fWin->Unlock(); fWindow->Unlock();
} }
break;
default: default:
BApplication::MessageReceived(message); BApplication::MessageReceived(message);
break; break;
@@ -135,23 +140,40 @@ ScreenSaverApp::MessageReceived(BMessage *message)
bool bool
ScreenSaverApp::QuitRequested() ScreenSaverApp::QuitRequested()
{ {
if (fPref.LockEnable() && (system_time()-fBlankTime > (fPref.PasswordTime()-fPref.BlankTime()))) { if (fPrefs.LockEnable()
ShowPW(); && (system_time() - fBlankTime > (fPrefs.PasswordTime() - fPrefs.BlankTime()))) {
_ShowPasswordWindow();
return false; return false;
} else } else
Shutdown(); _Shutdown();
return BApplication::QuitRequested();
return true;
} }
void void
ScreenSaverApp::Shutdown(void) ScreenSaverApp::_Shutdown(void)
{ {
if (fWin) if (fWindow)
fWin->Hide(); fWindow->Hide();
if (fThreadID > -1) if (fThreadID > -1) {
// TODO: kill_thread()? How about doing this right??
kill_thread(fThreadID); kill_thread(fThreadID);
if (fThrd) }
delete fThrd; if (fThread)
delete fThread;
Quit(); Quit();
} }
// #pragma mark -
int
main(int, char**)
{
ScreenSaverApp app;
app.Run();
return 0;
}
+22 -17
View File
@@ -1,43 +1,48 @@
/* /*
* Copyright 2003-2005, Haiku. * Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
*/ */
#ifndef SCREEN_SAVER_APP_H #ifndef SCREEN_SAVER_APP_H
#define SCREEN_SAVER_APP_H #define SCREEN_SAVER_APP_H
#include <Application.h>
#include <MessageRunner.h> #include "PasswordWindow.h"
#include "SSAwindow.h"
#include "ScreenSaverPrefs.h" #include "ScreenSaverPrefs.h"
#include "ScreenSaverThread.h" #include "ScreenSaverThread.h"
#include "PasswordWindow.h" #include "ScreenSaverWindow.h"
class ScreenSaverApp : public BApplication #include <Application.h>
{ #include <MessageRunner.h>
class ScreenSaverApp : public BApplication {
public: public:
ScreenSaverApp(); ScreenSaverApp();
bool LoadAddOn();
void ReadyToRun(); virtual void ReadyToRun();
virtual bool QuitRequested(); virtual bool QuitRequested();
virtual void MessageReceived(BMessage *message); virtual void MessageReceived(BMessage *message);
void ShowPW();
private: private:
ScreenSaverPrefs fPref; bool _LoadAddOn();
SSAwindow *fWin; void _ShowPasswordWindow();
void _ResumeScreenSaver();
void _Shutdown();
ScreenSaverPrefs fPrefs;
ScreenSaverWindow *fWindow;
BScreenSaver *fSaver; BScreenSaver *fSaver;
ScreenSaverThread *fThrd; ScreenSaverThread *fThread;
PasswordWindow *fPww; PasswordWindow *fPasswordWindow;
thread_id fThreadID; thread_id fThreadID;
bigtime_t fBlankTime; bigtime_t fBlankTime;
BMessageRunner *fRunner; BMessageRunner *fRunner;
void Shutdown();
}; };
#endif // SCREEN_SAVER_APP_H #endif // SCREEN_SAVER_APP_H
@@ -0,0 +1,59 @@
/*
* Copyright 2003-2006, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, [email protected]
*/
#include "ScreenSaverWindow.h"
#include <View.h>
#include <WindowPrivate.h>
/*!
This is the BDirectWindow subclass that rendering occurs in.
A view is added to it so that BView based screensavers will work.
*/
ScreenSaverWindow::ScreenSaverWindow(BRect frame)
: BDirectWindow(frame, "ScreenSaver Window",
B_NO_BORDER_WINDOW_LOOK, kWindowScreenFeel, B_NOT_RESIZABLE | B_NOT_ZOOMABLE),
fSaver(NULL)
{
frame.OffsetTo(0, 0);
fTopView = new BView(frame, "ScreenSaver View", B_FOLLOW_ALL, B_WILL_DRAW);
fTopView->SetViewColor(0, 0, 0);
AddChild(fTopView);
}
ScreenSaverWindow::~ScreenSaverWindow()
{
Hide();
}
void
ScreenSaverWindow::SetSaver(BScreenSaver *saver)
{
fSaver = saver;
}
bool
ScreenSaverWindow::QuitRequested()
{
return true;
}
void
ScreenSaverWindow::DirectConnected(direct_buffer_info *info)
{
if (fSaver)
fSaver->DirectConnected(info);
}
@@ -0,0 +1,29 @@
/*
* Copyright 2003, Michael Phipps. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef SCREEN_SAVER_WINDOW_H
#define SCREEN_SAVER_WINDOW_H
#include "ScreenSaver.h"
#include <DirectWindow.h>
class ScreenSaverWindow : public BDirectWindow {
public:
ScreenSaverWindow(BRect frame);
~ScreenSaverWindow();
void SetSaver(BScreenSaver *saver);
virtual bool QuitRequested();
virtual void DirectConnected(direct_buffer_info *info);
private:
BView *fTopView;
BScreenSaver *fSaver;
};
#endif // SCREEN_SAVER_WINDOW_H