From 1c776bfe37a7c1a382f9720112f19de00c7cff07 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Fri, 15 Nov 2013 21:27:13 -0500 Subject: [PATCH] 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. --- .../private/screen_saver/ScreenSaverRunner.h | 5 ++++- src/bin/screen_blanker/ScreenBlanker.cpp | 2 +- src/bin/screen_blanker/ScreenSaverWindow.cpp | 3 ++- src/kits/screensaver/ScreenSaverRunner.cpp | 22 +++++++------------ .../screensaver/ScreenSaverWindow.cpp | 2 +- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/headers/private/screen_saver/ScreenSaverRunner.h b/headers/private/screen_saver/ScreenSaverRunner.h index f3f717e98e..2e730b7e59 100644 --- a/headers/private/screen_saver/ScreenSaverRunner.h +++ b/headers/private/screen_saver/ScreenSaverRunner.h @@ -14,13 +14,15 @@ #include #include +#include #include "ScreenSaverSettings.h" class ScreenSaverRunner { public: - ScreenSaverRunner(BView* view, + ScreenSaverRunner(BWindow* window, + BView* view, ScreenSaverSettings& settings); ~ScreenSaverRunner(); @@ -38,6 +40,7 @@ private: static status_t _ThreadFunc(void* data); status_t _Run(); + BWindow* fWindow; BView* fView; bool fIsDirectDraw; ScreenSaverSettings& fSettings; diff --git a/src/bin/screen_blanker/ScreenBlanker.cpp b/src/bin/screen_blanker/ScreenBlanker.cpp index 2b6a43c07e..8a5aee732f 100644 --- a/src/bin/screen_blanker/ScreenBlanker.cpp +++ b/src/bin/screen_blanker/ScreenBlanker.cpp @@ -71,7 +71,7 @@ ScreenBlanker::ReadyToRun() fPasswordWindow = new PasswordWindow(); BView* view = fWindow->ChildAt(0); - fSaverRunner = new ScreenSaverRunner(view, fSettings); + fSaverRunner = new ScreenSaverRunner(fWindow, view, fSettings); fWindow->SetSaverRunner(fSaverRunner); BScreenSaver* saver = fSaverRunner->ScreenSaver(); diff --git a/src/bin/screen_blanker/ScreenSaverWindow.cpp b/src/bin/screen_blanker/ScreenSaverWindow.cpp index 60a2d7ae22..f617066e3f 100644 --- a/src/bin/screen_blanker/ScreenSaverWindow.cpp +++ b/src/bin/screen_blanker/ScreenSaverWindow.cpp @@ -89,7 +89,8 @@ ScreenSaverWindow::ScreenSaverWindow(BRect frame) fFilter(NULL) { 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); fFilter = new ScreenSaverFilter(); diff --git a/src/kits/screensaver/ScreenSaverRunner.cpp b/src/kits/screensaver/ScreenSaverRunner.cpp index 799ac65df8..024c28e6d8 100644 --- a/src/kits/screensaver/ScreenSaverRunner.cpp +++ b/src/kits/screensaver/ScreenSaverRunner.cpp @@ -20,12 +20,12 @@ #include -ScreenSaverRunner::ScreenSaverRunner(BView* view, +ScreenSaverRunner::ScreenSaverRunner(BWindow* window, BView* view, ScreenSaverSettings& settings) : + fWindow(window), fView(view), - fIsDirectDraw(view != NULL - && dynamic_cast(view->Window()) != NULL), + fIsDirectDraw(dynamic_cast(window) != NULL), fSettings(settings), fSaver(NULL), fAddonImage(-1), @@ -168,14 +168,6 @@ ScreenSaverRunner::_Run() { 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 // probably be refactored. uint32 tickBase = kInitialTickRate; @@ -203,8 +195,10 @@ ScreenSaverRunner::_Run() if (tick < 0) tick = 0; tickBase = tick; - } else if (tickBase < kInitialTickRate && tick >= kInitialTickRate) + } else if (tickBase < kInitialTickRate + && tick >= kInitialTickRate) { tickBase = kInitialTickRate; + } lastTickTime = system_time(); } @@ -217,7 +211,7 @@ ScreenSaverRunner::_Run() // Time to nap frame = 0; snoozeCount = fSaver->LoopOffCount(); - } else if (fView->Window()->LockWithTimeout(5000LL) == B_OK) { + } else if (fWindow->LockWithTimeout(5000LL) == B_OK) { if (!fQuitting) { // NOTE: BeOS R5 really calls DirectDraw() // and then Draw() for the same frame @@ -227,7 +221,7 @@ ScreenSaverRunner::_Run() fView->Sync(); frame++; } - fView->Window()->Unlock(); + fWindow->Unlock(); } } else snoozeCount = 1000; diff --git a/src/preferences/screensaver/ScreenSaverWindow.cpp b/src/preferences/screensaver/ScreenSaverWindow.cpp index 1762907d2e..e3ae4aefad 100644 --- a/src/preferences/screensaver/ScreenSaverWindow.cpp +++ b/src/preferences/screensaver/ScreenSaverWindow.cpp @@ -810,7 +810,7 @@ ModulesView::_OpenSaver() BView* view = fPreviewView->AddPreview(); fCurrentName = fSettings.ModuleName(); - fSaverRunner = new ScreenSaverRunner(view, fSettings); + fSaverRunner = new ScreenSaverRunner(view->Window(), view, fSettings); #ifdef __HAIKU__ BRect rect = fSettingsBox->InnerFrame().InsetByCopy(4, 4);