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