* Implemented DPMS support.

* Cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17754 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-06-07 12:31:28 +00:00
parent c038c9de95
commit af55bae2f6
6 changed files with 189 additions and 62 deletions

View File

@ -45,7 +45,7 @@ class ScreenSaverPrefs {
int32 WindowTab() { return fWindowTab; }
int32 TimeFlags() { return fTimeFlags; }
bigtime_t BlankTime() { return fBlankTime; }
bigtime_t StandbyTime() { return fStandByTime; }
bigtime_t StandByTime() { return fStandByTime; }
bigtime_t SuspendTime() { return fSuspendTime; }
bigtime_t OffTime() { return fOffTime; }
@ -63,7 +63,7 @@ class ScreenSaverPrefs {
void SetWindowTab(int32 tab) { fWindowTab = tab; }
void SetTimeFlags(int32 tf) { fTimeFlags = tf; }
void SetBlankTime(bigtime_t bt) { fBlankTime = bt; }
void SetStandbyTime(bigtime_t time) { fStandByTime = time; }
void SetStandByTime(bigtime_t time) { fStandByTime = time; }
void SetSuspendTime(bigtime_t time) { fSuspendTime = time; }
void SetOffTime(bigtime_t intime) { fOffTime = intime; }
void SetBlankCorner(screen_corner in) { fBlankCorner = in; }

View File

@ -1,44 +1,65 @@
/*
* 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
*/
#include <Application.h>
#include <Screen.h>
#include <StringView.h>
#include "PasswordWindow.h"
#include <Application.h>
#include <Box.h>
#include <Button.h>
#include <Screen.h>
#include <StringView.h>
void
PasswordWindow::Setup()
PasswordWindow::PasswordWindow()
: BWindow(BRect(100, 100, 400, 230), "Enter Password", B_NO_BORDER_WINDOW_LOOK,
B_FLOATING_ALL_WINDOW_FEEL,
B_NOT_MOVABLE | B_NOT_CLOSABLE |B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE
| B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS ,
B_ALL_WORKSPACES)
{
BScreen theScreen(this);
MoveTo((theScreen.Frame().IntegerWidth()-Bounds().IntegerWidth())/2,(theScreen.Frame().IntegerHeight()-Bounds().IntegerHeight())/2);
fBgd=new BView (Bounds(),"fBgdView",0,0);
fBgd->SetHighColor(ui_color(B_MENU_BACKGROUND_COLOR));
fBgd->SetLowColor(ui_color(B_MENU_BACKGROUND_COLOR));
fBgd->SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR));
AddChild(fBgd);
BRect bounds(fBgd->Bounds());
bounds.InsetBy(5,5);
fCustomBox = new BBox(bounds, "custBeBox", B_FOLLOW_NONE);
BStringView *label = new BStringView(BRect(0,0,60,15), "labelView", "Unlock screen saver");
fCustomBox->SetLabel(label);
fBgd->AddChild(fCustomBox);
BScreen screen(this);
MoveTo(screen.Frame().left + (screen.Frame().Width() - Bounds().Width()) / 2,
screen.Frame().top + (screen.Frame().Height() - Bounds().Height()) / 2);
fPassword = new BTextControl(BRect(10,28,260,47),"pwdCntrl","Enter password:", NULL, B_FOLLOW_NONE);
BView* topView = new BView(Bounds(), "top", B_FOLLOW_ALL, B_WILL_DRAW);
topView->SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR));
AddChild(topView);
BRect bounds(Bounds());
bounds.InsetBy(5, 5);
BBox* box = new BBox(bounds, NULL, B_FOLLOW_NONE);
box->SetLabel("Unlock screen saver");
topView->AddChild(box);
fPassword = new BTextControl(BRect(10,28,260,47), NULL, "Enter password:",
NULL, B_FOLLOW_NONE);
fPassword->TextView()->HideTyping(true);
fPassword->SetDivider(100);
fCustomBox->AddChild(fPassword);
box->AddChild(fPassword);
fPassword->MakeFocus(true);
fUnlock = new BButton(BRect(160,70,255,85), "fUnlock", "Unlock", new BMessage(UNLOCK_MESSAGE), B_FOLLOW_NONE);
fUnlock->SetTarget(NULL, be_app);
fCustomBox->AddChild(fUnlock);
fUnlock->MakeDefault(true);
BButton* button = new BButton(BRect(160,70,255,85), "fUnlock", "Unlock",
new BMessage(kMsgUnlock), B_FOLLOW_NONE);
button->SetTarget(NULL, be_app);
box->AddChild(button);
button->MakeDefault(true);
}
void
PasswordWindow::SetPassword(const char* text)
{
if (Lock()) {
fPassword->SetText(text);
fPassword->MakeFocus(true);
Unlock();
}
}

View File

@ -1,39 +1,30 @@
/*
* 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
*/
#ifndef PASSWORD_WINDOW_H
#define PASSWORD_WINDOW_H
#ifndef PASSWORDWINDOW_H
#define PASSWORDWINDOW_H
#include <Window.h>
#include <Box.h>
#include <TextControl.h>
#include <Button.h>
#include <Window.h>
const static int32 UNLOCK_MESSAGE = 'ULMS';
class PasswordWindow : public BWindow
{
const static int32 kMsgUnlock = 'ULMS';
class PasswordWindow : public BWindow{
public:
PasswordWindow() : BWindow(BRect(100,100,400,230),"pwView",B_NO_BORDER_WINDOW_LOOK, B_FLOATING_ALL_WINDOW_FEEL ,
B_NOT_MOVABLE | B_NOT_CLOSABLE |B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE | B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS ,
B_ALL_WORKSPACES), fDie(false) { Setup(); }
PasswordWindow();
void Setup(void);
const char *GetPassword(void) {return fPassword->Text();}
void SetPassword(const char* text) { if (Lock()) { fPassword->SetText(text); fPassword->MakeFocus(true); Unlock();} }
const char *Password() { return fPassword->Text(); }
void SetPassword(const char* text);
bool fDie;
private:
BView *fBgd;
BBox *fCustomBox;
BTextControl *fPassword;
BButton *fUnlock;
};
#endif // PASSWORDWINDOW_H

View File

@ -5,6 +5,7 @@
* Authors:
* Michael Phipps
* Jérôme Duval, jerome.duval@free.fr
* Axel Dörfler, axeld@pinc-software.de
*/
@ -22,9 +23,13 @@
#include <stdio.h>
#include <string.h>
#include <syslog.h>
const static int32 RESUME_SAVER = 'RSSV';
const static uint32 kMsgResumeSaver = 'RSSV';
const static uint32 kMsgTurnOffScreen = 'tofs';
const static uint32 kMsgSuspendScreen = 'suss';
const static uint32 kMsgStandByScreen = 'stbs';
ScreenBlanker::ScreenBlanker()
@ -33,7 +38,10 @@ ScreenBlanker::ScreenBlanker()
fSaver(NULL),
fRunner(NULL),
fPasswordWindow(NULL),
fResumeRunner(NULL)
fResumeRunner(NULL),
fStandByScreenRunner(NULL),
fSuspendScreenRunner(NULL),
fTurnOffScreenRunner(NULL)
{
fBlankTime = system_time();
}
@ -42,6 +50,7 @@ ScreenBlanker::ScreenBlanker()
ScreenBlanker::~ScreenBlanker()
{
delete fResumeRunner;
_TurnOnScreen();
}
@ -54,6 +63,7 @@ ScreenBlanker::ReadyToRun()
}
// create a BDirectWindow and start the render thread.
// TODO: we need a window per screen...
BScreen screen(B_MAIN_SCREEN_ID);
fWindow = new ScreenSaverWindow(screen.Frame());
fPasswordWindow = new PasswordWindow();
@ -70,12 +80,43 @@ ScreenBlanker::ReadyToRun()
fWindow->SetFullScreen(true);
fWindow->Show();
HideCursor();
_QueueTurnOffScreen();
}
void
ScreenBlanker::_TurnOnScreen()
{
delete fStandByScreenRunner;
delete fSuspendScreenRunner;
delete fTurnOffScreenRunner;
fStandByScreenRunner = fSuspendScreenRunner = fTurnOffScreenRunner = NULL;
BScreen screen;
screen.SetDPMS(B_DPMS_ON);
}
void
ScreenBlanker::_SetDPMSMode(uint32 mode)
{
BScreen screen;
screen.SetDPMS(mode);
if (fWindow->Lock()) {
fRunner->Suspend();
fWindow->Unlock();
}
}
void
ScreenBlanker::_ShowPasswordWindow()
{
_TurnOnScreen();
if (fWindow->Lock()) {
fRunner->Suspend();
@ -88,33 +129,88 @@ ScreenBlanker::_ShowPasswordWindow()
fWindow->Unlock();
}
_ResumeScreenSaver();
_QueueResumeScreenSaver();
}
void
ScreenBlanker::_ResumeScreenSaver()
ScreenBlanker::_QueueResumeScreenSaver()
{
delete fResumeRunner;
fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER),
fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(kMsgResumeSaver),
fPrefs.BlankTime(), 1);
if (fResumeRunner->InitCheck() != B_OK) {
fprintf(stderr, "fRunner init failed\n");
if (fResumeRunner->InitCheck() != B_OK)
syslog(LOG_ERR, "resume screen saver runner failed\n");
}
void
ScreenBlanker::_QueueTurnOffScreen()
{
// stop running notifiers
delete fStandByScreenRunner;
delete fSuspendScreenRunner;
delete fTurnOffScreenRunner;
fStandByScreenRunner = fSuspendScreenRunner = fTurnOffScreenRunner = NULL;
// figure out which notifiers we need and which of them are supported
uint32 flags = fPrefs.TimeFlags();
BScreen screen;
uint32 capabilities = screen.DPMSCapabilites();
if ((capabilities & B_DPMS_OFF) == 0)
flags &= ENABLE_DPMS_OFF;
if ((capabilities & B_DPMS_SUSPEND) == 0)
flags &= ENABLE_DPMS_SUSPEND;
if ((capabilities & B_DPMS_STAND_BY) == 0)
flags &= ENABLE_DPMS_STAND_BY;
if ((flags & ENABLE_DPMS_MASK) == 0)
return;
if (fPrefs.OffTime() == fPrefs.SuspendTime())
flags &= ENABLE_DPMS_SUSPEND;
if (fPrefs.SuspendTime() == fPrefs.StandByTime())
flags &= ENABLE_DPMS_STAND_BY;
// start them off again
if (flags & ENABLE_DPMS_STAND_BY) {
fStandByScreenRunner = new BMessageRunner(BMessenger(this),
new BMessage(kMsgStandByScreen), fPrefs.StandByTime(), 1);
if (fStandByScreenRunner->InitCheck() != B_OK)
syslog(LOG_ERR, "standby screen saver runner failed\n");
}
if (flags & ENABLE_DPMS_SUSPEND) {
fSuspendScreenRunner = new BMessageRunner(BMessenger(this),
new BMessage(kMsgSuspendScreen), fPrefs.SuspendTime(), 1);
if (fSuspendScreenRunner->InitCheck() != B_OK)
syslog(LOG_ERR, "turn off screen saver runner failed\n");
}
if (flags & ENABLE_DPMS_OFF) {
fTurnOffScreenRunner = new BMessageRunner(BMessenger(this),
new BMessage(kMsgTurnOffScreen), fPrefs.OffTime(), 1);
if (fTurnOffScreenRunner->InitCheck() != B_OK)
syslog(LOG_ERR, "turn off screen saver runner failed\n");
}
}
void
ScreenBlanker::MessageReceived(BMessage *message)
ScreenBlanker::MessageReceived(BMessage* message)
{
switch (message->what) {
case UNLOCK_MESSAGE:
case kMsgUnlock:
{
if (strcmp(fPrefs.Password(), crypt(fPasswordWindow->GetPassword(),
if (strcmp(fPrefs.Password(), crypt(fPasswordWindow->Password(),
fPrefs.Password())) != 0) {
beep();
fPasswordWindow->SetPassword("");
_ResumeScreenSaver();
_QueueResumeScreenSaver();
} else {
PRINT(("Quitting!\n"));
_Shutdown();
@ -123,7 +219,7 @@ ScreenBlanker::MessageReceived(BMessage *message)
break;
}
case RESUME_SAVER:
case kMsgResumeSaver:
if (fWindow->Lock()) {
if (fWindow->SetFullScreen(true) == B_OK) {
HideCursor();
@ -133,6 +229,18 @@ ScreenBlanker::MessageReceived(BMessage *message)
fRunner->Resume();
fWindow->Unlock();
}
_QueueTurnOffScreen();
break;
case kMsgTurnOffScreen:
_SetDPMSMode(B_DPMS_OFF);
break;
case kMsgSuspendScreen:
_SetDPMSMode(B_DPMS_SUSPEND);
break;
case kMsgStandByScreen:
_SetDPMSMode(B_DPMS_STAND_BY);
break;
default:

View File

@ -32,7 +32,10 @@ class ScreenBlanker : public BApplication {
private:
bool _LoadAddOn();
void _ShowPasswordWindow();
void _ResumeScreenSaver();
void _QueueResumeScreenSaver();
void _TurnOnScreen();
void _SetDPMSMode(uint32 mode);
void _QueueTurnOffScreen();
void _Shutdown();
ScreenSaverPrefs fPrefs;
@ -42,7 +45,11 @@ class ScreenBlanker : public BApplication {
PasswordWindow *fPasswordWindow;
bigtime_t fBlankTime;
BMessageRunner *fResumeRunner;
BMessageRunner* fResumeRunner;
BMessageRunner* fStandByScreenRunner;
BMessageRunner* fSuspendScreenRunner;
BMessageRunner* fTurnOffScreenRunner;
};
#endif // SCREEN_SAVER_APP_H

View File

@ -774,7 +774,7 @@ ScreenSaverWindow::_UpdateStatus()
bigtime_t offTime = fTurnOffSlider->Time() - fPrefs.BlankTime();
fPrefs.SetOffTime(offTime);
fPrefs.SetSuspendTime(offTime);
fPrefs.SetStandbyTime(offTime);
fPrefs.SetStandByTime(offTime);
fPrefs.SetBlankCorner(fFadeNow->Corner());
fPrefs.SetNeverBlankCorner(fFadeNever->Corner());
fPrefs.SetLockEnable(fPasswordCheckBox->Value());