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 <View.h>
#include <Window.h>
#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;
+1 -1
View File
@@ -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();
+2 -1
View File
@@ -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();
+8 -14
View File
@@ -20,12 +20,12 @@
#include <Window.h>
ScreenSaverRunner::ScreenSaverRunner(BView* view,
ScreenSaverRunner::ScreenSaverRunner(BWindow* window, BView* view,
ScreenSaverSettings& settings)
:
fWindow(window),
fView(view),
fIsDirectDraw(view != NULL
&& dynamic_cast<BDirectWindow*>(view->Window()) != NULL),
fIsDirectDraw(dynamic_cast<BDirectWindow*>(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;
@@ -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);