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:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user