From af55bae2f690f138d18dc982b7535840bd12b805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 7 Jun 2006 12:31:28 +0000 Subject: [PATCH] * Implemented DPMS support. * Cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17754 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../private/screen_saver/ScreenSaverPrefs.h | 4 +- src/bin/screen_blanker/PasswordWindow.cpp | 73 ++++++---- src/bin/screen_blanker/PasswordWindow.h | 29 ++-- src/bin/screen_blanker/ScreenBlanker.cpp | 132 ++++++++++++++++-- src/bin/screen_blanker/ScreenBlanker.h | 11 +- .../screensaver/ScreenSaverWindow.cpp | 2 +- 6 files changed, 189 insertions(+), 62 deletions(-) diff --git a/headers/private/screen_saver/ScreenSaverPrefs.h b/headers/private/screen_saver/ScreenSaverPrefs.h index 1f5476c50a..b264aeedbb 100644 --- a/headers/private/screen_saver/ScreenSaverPrefs.h +++ b/headers/private/screen_saver/ScreenSaverPrefs.h @@ -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; } diff --git a/src/bin/screen_blanker/PasswordWindow.cpp b/src/bin/screen_blanker/PasswordWindow.cpp index 7a38ca6a3f..3aa5066d79 100644 --- a/src/bin/screen_blanker/PasswordWindow.cpp +++ b/src/bin/screen_blanker/PasswordWindow.cpp @@ -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 -#include -#include + + #include "PasswordWindow.h" +#include +#include +#include +#include +#include -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(); + } +} diff --git a/src/bin/screen_blanker/PasswordWindow.h b/src/bin/screen_blanker/PasswordWindow.h index 1d5d7b14ba..dbea9b679a 100644 --- a/src/bin/screen_blanker/PasswordWindow.h +++ b/src/bin/screen_blanker/PasswordWindow.h @@ -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 -#include #include -#include +#include -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 diff --git a/src/bin/screen_blanker/ScreenBlanker.cpp b/src/bin/screen_blanker/ScreenBlanker.cpp index 46f470f5bd..17e10121f0 100644 --- a/src/bin/screen_blanker/ScreenBlanker.cpp +++ b/src/bin/screen_blanker/ScreenBlanker.cpp @@ -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 #include +#include -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: diff --git a/src/bin/screen_blanker/ScreenBlanker.h b/src/bin/screen_blanker/ScreenBlanker.h index 1d7c76fdc9..10675f8aa5 100644 --- a/src/bin/screen_blanker/ScreenBlanker.h +++ b/src/bin/screen_blanker/ScreenBlanker.h @@ -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 diff --git a/src/preferences/screensaver/ScreenSaverWindow.cpp b/src/preferences/screensaver/ScreenSaverWindow.cpp index 75e5b9233a..31e8008804 100644 --- a/src/preferences/screensaver/ScreenSaverWindow.cpp +++ b/src/preferences/screensaver/ScreenSaverWindow.cpp @@ -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());