* 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
@@ -45,7 +45,7 @@ class ScreenSaverPrefs {
int32 WindowTab() { return fWindowTab; } int32 WindowTab() { return fWindowTab; }
int32 TimeFlags() { return fTimeFlags; } int32 TimeFlags() { return fTimeFlags; }
bigtime_t BlankTime() { return fBlankTime; } bigtime_t BlankTime() { return fBlankTime; }
bigtime_t StandbyTime() { return fStandByTime; } bigtime_t StandByTime() { return fStandByTime; }
bigtime_t SuspendTime() { return fSuspendTime; } bigtime_t SuspendTime() { return fSuspendTime; }
bigtime_t OffTime() { return fOffTime; } bigtime_t OffTime() { return fOffTime; }
@@ -63,7 +63,7 @@ class ScreenSaverPrefs {
void SetWindowTab(int32 tab) { fWindowTab = tab; } void SetWindowTab(int32 tab) { fWindowTab = tab; }
void SetTimeFlags(int32 tf) { fTimeFlags = tf; } void SetTimeFlags(int32 tf) { fTimeFlags = tf; }
void SetBlankTime(bigtime_t bt) { fBlankTime = bt; } 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 SetSuspendTime(bigtime_t time) { fSuspendTime = time; }
void SetOffTime(bigtime_t intime) { fOffTime = intime; } void SetOffTime(bigtime_t intime) { fOffTime = intime; }
void SetBlankCorner(screen_corner in) { fBlankCorner = in; } void SetBlankCorner(screen_corner in) { fBlankCorner = in; }
+47 -26
View File
@@ -1,44 +1,65 @@
/* /*
* 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 <Application.h>
#include <Screen.h>
#include <StringView.h>
#include "PasswordWindow.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); BScreen screen(this);
MoveTo((theScreen.Frame().IntegerWidth()-Bounds().IntegerWidth())/2,(theScreen.Frame().IntegerHeight()-Bounds().IntegerHeight())/2); MoveTo(screen.Frame().left + (screen.Frame().Width() - Bounds().Width()) / 2,
fBgd=new BView (Bounds(),"fBgdView",0,0); screen.Frame().top + (screen.Frame().Height() - Bounds().Height()) / 2);
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);
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->TextView()->HideTyping(true);
fPassword->SetDivider(100); fPassword->SetDivider(100);
fCustomBox->AddChild(fPassword); box->AddChild(fPassword);
fPassword->MakeFocus(true); fPassword->MakeFocus(true);
fUnlock = new BButton(BRect(160,70,255,85), "fUnlock", "Unlock", new BMessage(UNLOCK_MESSAGE), B_FOLLOW_NONE); BButton* button = new BButton(BRect(160,70,255,85), "fUnlock", "Unlock",
fUnlock->SetTarget(NULL, be_app); new BMessage(kMsgUnlock), B_FOLLOW_NONE);
fCustomBox->AddChild(fUnlock); button->SetTarget(NULL, be_app);
fUnlock->MakeDefault(true); box->AddChild(button);
button->MakeDefault(true);
} }
void
PasswordWindow::SetPassword(const char* text)
{
if (Lock()) {
fPassword->SetText(text);
fPassword->MakeFocus(true);
Unlock();
}
}
+10 -19
View File
@@ -1,39 +1,30 @@
/* /*
* 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 PASSWORD_WINDOW_H
#define PASSWORD_WINDOW_H
#ifndef PASSWORDWINDOW_H
#define PASSWORDWINDOW_H
#include <Window.h>
#include <Box.h>
#include <TextControl.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: public:
PasswordWindow() : BWindow(BRect(100,100,400,230),"pwView",B_NO_BORDER_WINDOW_LOOK, B_FLOATING_ALL_WINDOW_FEEL , PasswordWindow();
B_NOT_MOVABLE | B_NOT_CLOSABLE |B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE | B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS ,
B_ALL_WORKSPACES), fDie(false) { Setup(); }
void Setup(void); const char *Password() { return fPassword->Text(); }
const char *GetPassword(void) {return fPassword->Text();} void SetPassword(const char* text);
void SetPassword(const char* text) { if (Lock()) { fPassword->SetText(text); fPassword->MakeFocus(true); Unlock();} }
bool fDie;
private: private:
BView *fBgd;
BBox *fCustomBox;
BTextControl *fPassword; BTextControl *fPassword;
BButton *fUnlock;
}; };
#endif // PASSWORDWINDOW_H #endif // PASSWORDWINDOW_H
+120 -12
View File
@@ -5,6 +5,7 @@
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Jérôme Duval, [email protected] * Jérôme Duval, [email protected]
* Axel Dörfler, [email protected]
*/ */
@@ -22,9 +23,13 @@
#include <stdio.h> #include <stdio.h>
#include <string.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() ScreenBlanker::ScreenBlanker()
@@ -33,7 +38,10 @@ ScreenBlanker::ScreenBlanker()
fSaver(NULL), fSaver(NULL),
fRunner(NULL), fRunner(NULL),
fPasswordWindow(NULL), fPasswordWindow(NULL),
fResumeRunner(NULL) fResumeRunner(NULL),
fStandByScreenRunner(NULL),
fSuspendScreenRunner(NULL),
fTurnOffScreenRunner(NULL)
{ {
fBlankTime = system_time(); fBlankTime = system_time();
} }
@@ -42,6 +50,7 @@ ScreenBlanker::ScreenBlanker()
ScreenBlanker::~ScreenBlanker() ScreenBlanker::~ScreenBlanker()
{ {
delete fResumeRunner; delete fResumeRunner;
_TurnOnScreen();
} }
@@ -54,6 +63,7 @@ ScreenBlanker::ReadyToRun()
} }
// create a BDirectWindow and start the render thread. // create a BDirectWindow and start the render thread.
// TODO: we need a window per screen...
BScreen screen(B_MAIN_SCREEN_ID); BScreen screen(B_MAIN_SCREEN_ID);
fWindow = new ScreenSaverWindow(screen.Frame()); fWindow = new ScreenSaverWindow(screen.Frame());
fPasswordWindow = new PasswordWindow(); fPasswordWindow = new PasswordWindow();
@@ -70,12 +80,43 @@ ScreenBlanker::ReadyToRun()
fWindow->SetFullScreen(true); fWindow->SetFullScreen(true);
fWindow->Show(); fWindow->Show();
HideCursor(); 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 void
ScreenBlanker::_ShowPasswordWindow() ScreenBlanker::_ShowPasswordWindow()
{ {
_TurnOnScreen();
if (fWindow->Lock()) { if (fWindow->Lock()) {
fRunner->Suspend(); fRunner->Suspend();
@@ -88,33 +129,88 @@ ScreenBlanker::_ShowPasswordWindow()
fWindow->Unlock(); fWindow->Unlock();
} }
_ResumeScreenSaver(); _QueueResumeScreenSaver();
} }
void void
ScreenBlanker::_ResumeScreenSaver() ScreenBlanker::_QueueResumeScreenSaver()
{ {
delete fResumeRunner; delete fResumeRunner;
fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(RESUME_SAVER), fResumeRunner = new BMessageRunner(BMessenger(this), new BMessage(kMsgResumeSaver),
fPrefs.BlankTime(), 1); fPrefs.BlankTime(), 1);
if (fResumeRunner->InitCheck() != B_OK) { if (fResumeRunner->InitCheck() != B_OK)
fprintf(stderr, "fRunner init failed\n"); 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 void
ScreenBlanker::MessageReceived(BMessage *message) ScreenBlanker::MessageReceived(BMessage* message)
{ {
switch (message->what) { 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) { fPrefs.Password())) != 0) {
beep(); beep();
fPasswordWindow->SetPassword(""); fPasswordWindow->SetPassword("");
_ResumeScreenSaver(); _QueueResumeScreenSaver();
} else { } else {
PRINT(("Quitting!\n")); PRINT(("Quitting!\n"));
_Shutdown(); _Shutdown();
@@ -123,7 +219,7 @@ ScreenBlanker::MessageReceived(BMessage *message)
break; break;
} }
case RESUME_SAVER: case kMsgResumeSaver:
if (fWindow->Lock()) { if (fWindow->Lock()) {
if (fWindow->SetFullScreen(true) == B_OK) { if (fWindow->SetFullScreen(true) == B_OK) {
HideCursor(); HideCursor();
@@ -133,6 +229,18 @@ ScreenBlanker::MessageReceived(BMessage *message)
fRunner->Resume(); fRunner->Resume();
fWindow->Unlock(); 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; break;
default: default:
+9 -2
View File
@@ -32,7 +32,10 @@ class ScreenBlanker : public BApplication {
private: private:
bool _LoadAddOn(); bool _LoadAddOn();
void _ShowPasswordWindow(); void _ShowPasswordWindow();
void _ResumeScreenSaver(); void _QueueResumeScreenSaver();
void _TurnOnScreen();
void _SetDPMSMode(uint32 mode);
void _QueueTurnOffScreen();
void _Shutdown(); void _Shutdown();
ScreenSaverPrefs fPrefs; ScreenSaverPrefs fPrefs;
@@ -42,7 +45,11 @@ class ScreenBlanker : public BApplication {
PasswordWindow *fPasswordWindow; PasswordWindow *fPasswordWindow;
bigtime_t fBlankTime; bigtime_t fBlankTime;
BMessageRunner *fResumeRunner; BMessageRunner* fResumeRunner;
BMessageRunner* fStandByScreenRunner;
BMessageRunner* fSuspendScreenRunner;
BMessageRunner* fTurnOffScreenRunner;
}; };
#endif // SCREEN_SAVER_APP_H #endif // SCREEN_SAVER_APP_H
@@ -774,7 +774,7 @@ ScreenSaverWindow::_UpdateStatus()
bigtime_t offTime = fTurnOffSlider->Time() - fPrefs.BlankTime(); bigtime_t offTime = fTurnOffSlider->Time() - fPrefs.BlankTime();
fPrefs.SetOffTime(offTime); fPrefs.SetOffTime(offTime);
fPrefs.SetSuspendTime(offTime); fPrefs.SetSuspendTime(offTime);
fPrefs.SetStandbyTime(offTime); fPrefs.SetStandByTime(offTime);
fPrefs.SetBlankCorner(fFadeNow->Corner()); fPrefs.SetBlankCorner(fFadeNow->Corner());
fPrefs.SetNeverBlankCorner(fFadeNever->Corner()); fPrefs.SetNeverBlankCorner(fFadeNever->Corner());
fPrefs.SetLockEnable(fPasswordCheckBox->Value()); fPrefs.SetLockEnable(fPasswordCheckBox->Value());