Lock screensaver window directly

By passing the window pointer to ScreenSaverRunner contructor and using that
to lock the window when drawing instead of getting the window from the
Window() method of the view. This is safer.
This commit is contained in:
John Scipione
2013-11-15 21:27:13 -05:00
parent c4684f1e0b
commit 1c776bfe37
5 changed files with 16 additions and 18 deletions
@@ -14,13 +14,15 @@
#include <ScreenSaver.h> #include <ScreenSaver.h>
#include <View.h> #include <View.h>
#include <Window.h>
#include "ScreenSaverSettings.h" #include "ScreenSaverSettings.h"
class ScreenSaverRunner { class ScreenSaverRunner {
public: public:
ScreenSaverRunner(BView* view, ScreenSaverRunner(BWindow* window,
BView* view,
ScreenSaverSettings& settings); ScreenSaverSettings& settings);
~ScreenSaverRunner(); ~ScreenSaverRunner();
@@ -38,6 +40,7 @@ private:
static status_t _ThreadFunc(void* data); static status_t _ThreadFunc(void* data);
status_t _Run(); status_t _Run();
BWindow* fWindow;
BView* fView; BView* fView;
bool fIsDirectDraw; bool fIsDirectDraw;
ScreenSaverSettings& fSettings; ScreenSaverSettings& fSettings;
+1 -1
View File
@@ -71,7 +71,7 @@ ScreenBlanker::ReadyToRun()
fPasswordWindow = new PasswordWindow(); fPasswordWindow = new PasswordWindow();
BView* view = fWindow->ChildAt(0); BView* view = fWindow->ChildAt(0);
fSaverRunner = new ScreenSaverRunner(view, fSettings); fSaverRunner = new ScreenSaverRunner(fWindow, view, fSettings);
fWindow->SetSaverRunner(fSaverRunner); fWindow->SetSaverRunner(fSaverRunner);
BScreenSaver* saver = fSaverRunner->ScreenSaver(); BScreenSaver* saver = fSaverRunner->ScreenSaver();
+2 -1
View File
@@ -89,7 +89,8 @@ ScreenSaverWindow::ScreenSaverWindow(BRect frame)
fFilter(NULL) fFilter(NULL)
{ {
frame.OffsetTo(0, 0); frame.OffsetTo(0, 0);
fTopView = new BView(frame, "ScreenSaver View", B_FOLLOW_ALL, B_WILL_DRAW); fTopView = new BView(frame, "ScreenSaver View", B_FOLLOW_ALL,
B_WILL_DRAW);
fTopView->SetViewColor(B_TRANSPARENT_COLOR); fTopView->SetViewColor(B_TRANSPARENT_COLOR);
fFilter = new ScreenSaverFilter(); fFilter = new ScreenSaverFilter();
+8 -14
View File
@@ -20,12 +20,12 @@
#include <Window.h> #include <Window.h>
ScreenSaverRunner::ScreenSaverRunner(BView* view, ScreenSaverRunner::ScreenSaverRunner(BWindow* window, BView* view,
ScreenSaverSettings& settings) ScreenSaverSettings& settings)
: :
fWindow(window),
fView(view), fView(view),
fIsDirectDraw(view != NULL fIsDirectDraw(dynamic_cast<BDirectWindow*>(window) != NULL),
&& dynamic_cast<BDirectWindow*>(view->Window()) != NULL),
fSettings(settings), fSettings(settings),
fSaver(NULL), fSaver(NULL),
fAddonImage(-1), fAddonImage(-1),
@@ -168,14 +168,6 @@ ScreenSaverRunner::_Run()
{ {
static const uint32 kInitialTickRate = 50000; static const uint32 kInitialTickRate = 50000;
if (fView == NULL || fView->Window() == NULL) {
// view is NULL or not connected to app server, bail out
if (fSaver != NULL)
fSaver->StopSaver();
return B_BAD_VALUE;
}
// TODO: This code is getting awfully complicated and should // TODO: This code is getting awfully complicated and should
// probably be refactored. // probably be refactored.
uint32 tickBase = kInitialTickRate; uint32 tickBase = kInitialTickRate;
@@ -203,8 +195,10 @@ ScreenSaverRunner::_Run()
if (tick < 0) if (tick < 0)
tick = 0; tick = 0;
tickBase = tick; tickBase = tick;
} else if (tickBase < kInitialTickRate && tick >= kInitialTickRate) } else if (tickBase < kInitialTickRate
&& tick >= kInitialTickRate) {
tickBase = kInitialTickRate; tickBase = kInitialTickRate;
}
lastTickTime = system_time(); lastTickTime = system_time();
} }
@@ -217,7 +211,7 @@ ScreenSaverRunner::_Run()
// Time to nap // Time to nap
frame = 0; frame = 0;
snoozeCount = fSaver->LoopOffCount(); snoozeCount = fSaver->LoopOffCount();
} else if (fView->Window()->LockWithTimeout(5000LL) == B_OK) { } else if (fWindow->LockWithTimeout(5000LL) == B_OK) {
if (!fQuitting) { if (!fQuitting) {
// NOTE: BeOS R5 really calls DirectDraw() // NOTE: BeOS R5 really calls DirectDraw()
// and then Draw() for the same frame // and then Draw() for the same frame
@@ -227,7 +221,7 @@ ScreenSaverRunner::_Run()
fView->Sync(); fView->Sync();
frame++; frame++;
} }
fView->Window()->Unlock(); fWindow->Unlock();
} }
} else } else
snoozeCount = 1000; snoozeCount = 1000;
@@ -810,7 +810,7 @@ ModulesView::_OpenSaver()
BView* view = fPreviewView->AddPreview(); BView* view = fPreviewView->AddPreview();
fCurrentName = fSettings.ModuleName(); fCurrentName = fSettings.ModuleName();
fSaverRunner = new ScreenSaverRunner(view, fSettings); fSaverRunner = new ScreenSaverRunner(view->Window(), view, fSettings);
#ifdef __HAIKU__ #ifdef __HAIKU__
BRect rect = fSettingsBox->InnerFrame().InsetByCopy(4, 4); BRect rect = fSettingsBox->InnerFrame().InsetByCopy(4, 4);