Skip to content

Instantly share code, notes, and snippets.

@jessicah
Created August 14, 2014 20:58
Show Gist options
  • Save jessicah/ac706c16504db0e2ebe9 to your computer and use it in GitHub Desktop.
Save jessicah/ac706c16504db0e2ebe9 to your computer and use it in GitHub Desktop.
From 3b6ab51c087d0d2aac9b2b59c85bd5bb50957945 Mon Sep 17 00:00:00 2001
From: Jessica Hamilton <jessica.l.hamilton@gmail.com>
Date: Sat, 2 Aug 2014 22:28:52 +1200
Subject: [PATCH] Only suspend the screensaver for non-GL screensavers.
When the password prompt is displayed, if the screensaver is
using a BGLView, then it won't draw on top of the password
dialog, so we don't need to stop the screensaver, which is
more visually pleasing.
---
src/bin/screen_blanker/Jamfile | 3 +++
src/bin/screen_blanker/ScreenBlanker.cpp | 20 ++++++++++++++++----
src/bin/screen_blanker/ScreenBlanker.h | 2 ++
3 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/bin/screen_blanker/Jamfile b/src/bin/screen_blanker/Jamfile
index 89f5893..8672e85 100644
--- a/src/bin/screen_blanker/Jamfile
+++ b/src/bin/screen_blanker/Jamfile
@@ -7,6 +7,8 @@ UseHeaders [ FDirName headers os add-ons screen_saver ] ;
UsePrivateHeaders interface screen_saver ;
+UseBuildFeatureHeaders mesa ;
+
BinCommand screen_blanker :
ScreenBlanker.cpp
ScreenSaverWindow.cpp
@@ -17,6 +19,7 @@ BinCommand screen_blanker :
# link against libscreensaver.so
: be game localestub libscreensaver.so $(TARGET_LIBSUPC++)
+ [ BuildFeatureAttribute mesa : library ]
: screen_blanker.rdef
;
diff --git a/src/bin/screen_blanker/ScreenBlanker.cpp b/src/bin/screen_blanker/ScreenBlanker.cpp
index 83fdc6a..5b37283 100644
--- a/src/bin/screen_blanker/ScreenBlanker.cpp
+++ b/src/bin/screen_blanker/ScreenBlanker.cpp
@@ -17,6 +17,7 @@
#include <Debug.h>
#include <File.h>
#include <FindDirectory.h>
+#include <GLView.h>
#include <Path.h>
#include <Screen.h>
#include <StorageDefs.h>
@@ -42,6 +43,7 @@ ScreenBlanker::ScreenBlanker()
fWindow(NULL),
fSaverRunner(NULL),
fPasswordWindow(NULL),
+ fNeedsSuspend(true),
fResumeRunner(NULL),
fStandByScreenRunner(NULL),
fSuspendScreenRunner(NULL),
@@ -75,9 +77,17 @@ ScreenBlanker::ReadyToRun()
fWindow->SetSaverRunner(fSaverRunner);
BScreenSaver* saver = fSaverRunner->ScreenSaver();
- if (saver != NULL && saver->StartSaver(view, false) == B_OK)
+ if (saver != NULL && saver->StartSaver(view, false) == B_OK) {
+ view = view->ChildAt(0);
+ while (view != NULL) {
+ if (dynamic_cast<BGLView*>(view) != NULL) {
+ fNeedsSuspend = false;
+ break;
+ }
+ view = view->NextSibling();
+ }
fSaverRunner->Run();
- else {
+ } else {
fprintf(stderr, "could not load the screensaver addon\n");
view->SetViewColor(0, 0, 0);
// needed for Blackness saver
@@ -124,7 +134,8 @@ ScreenBlanker::_ShowPasswordWindow()
_TurnOnScreen();
if (fWindow->Lock()) {
- fSaverRunner->Suspend();
+ if (fNeedsSuspend)
+ fSaverRunner->Suspend();
fWindow->Sync();
// TODO: is that needed?
@@ -241,7 +252,8 @@ ScreenBlanker::MessageReceived(BMessage* message)
fPasswordWindow->SetPassword("");
fPasswordWindow->Hide();
- fSaverRunner->Resume();
+ if (fNeedsSuspend)
+ fSaverRunner->Resume();
fWindow->Unlock();
}
diff --git a/src/bin/screen_blanker/ScreenBlanker.h b/src/bin/screen_blanker/ScreenBlanker.h
index b190e73..0010853 100644
--- a/src/bin/screen_blanker/ScreenBlanker.h
+++ b/src/bin/screen_blanker/ScreenBlanker.h
@@ -49,6 +49,8 @@ private:
ScreenSaverRunner* fSaverRunner;
PasswordWindow* fPasswordWindow;
+ bool fNeedsSuspend;
+
bigtime_t fBlankTime;
BMessageRunner* fResumeRunner;
--
1.9.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment