Fix classic mode screensavers

This partially resolves Bug 811
pull/2/head
Timothy Pearson 12 years ago
parent 670343f436
commit 4120a763e7

@ -323,7 +323,14 @@
<label></label> <label></label>
<whatsthis>When disabled the screensaver starts immediately when locking the desktop.</whatsthis> <whatsthis>When disabled the screensaver starts immediately when locking the desktop.</whatsthis>
<!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 -->
<!-- mSaver = config.readEntry("UseUnmanagedLockWindows"); --> <!-- mSaver = config.readEntry("DelaySaverStart"); -->
</entry>
<entry key="HideActiveWindowsFromSaver" type="Bool">
<default>true</default>
<label></label>
<whatsthis>When enabled all active windows are hidden from the screensaver, showing only the desktop background as a result.</whatsthis>
<!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 -->
<!-- mSaver = config.readEntry("HideActiveWindowsFromSaver"); -->
</entry> </entry>
<entry key="PluginsUnlock" type="StringList"> <entry key="PluginsUnlock" type="StringList">
<default></default> <default></default>

@ -111,6 +111,8 @@ Status DPMSInfo ( Display *, CARD16 *, BOOL * );
#define LOCK_GRACE_DEFAULT 5000 #define LOCK_GRACE_DEFAULT 5000
#define AUTOLOGOUT_DEFAULT 600 #define AUTOLOGOUT_DEFAULT 600
#define DESKTOP_WALLPAPER_OBTAIN_TIMEOUT_MS 3000
// Setting this define is INSECURE // Setting this define is INSECURE
// Use it for debugging purposes ONLY // Use it for debugging purposes ONLY
// #define KEEP_MOUSE_UNGRABBED 1 // #define KEEP_MOUSE_UNGRABBED 1
@ -136,6 +138,7 @@ extern Atom tqt_wm_state;
extern bool trinity_desktop_lock_use_system_modal_dialogs; extern bool trinity_desktop_lock_use_system_modal_dialogs;
extern bool trinity_desktop_lock_delay_screensaver_start; extern bool trinity_desktop_lock_delay_screensaver_start;
extern bool trinity_desktop_lock_use_sak; extern bool trinity_desktop_lock_use_sak;
extern bool trinity_desktop_lock_hide_active_windows;
extern bool trinity_desktop_lock_forced; extern bool trinity_desktop_lock_forced;
extern TQXLibWindowList trinity_desktop_lock_hidden_window_list; extern TQXLibWindowList trinity_desktop_lock_hidden_window_list;
@ -218,8 +221,8 @@ LockProcess::LockProcess()
// Try to get the root pixmap // Try to get the root pixmap
if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this); if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this);
m_rootPixmap->setCustomPainting(true);
connect(m_rootPixmap, TQT_SIGNAL(backgroundUpdated(const TQPixmap &)), this, TQT_SLOT(slotPaintBackground(const TQPixmap &))); connect(m_rootPixmap, TQT_SIGNAL(backgroundUpdated(const TQPixmap &)), this, TQT_SLOT(slotPaintBackground(const TQPixmap &)));
m_rootPixmap->setCustomPainting(true);
m_rootPixmap->start(); m_rootPixmap->start();
// Get root window size // Get root window size
@ -1286,6 +1289,27 @@ bool LockProcess::startSaver()
raise(); raise();
XSync(tqt_xdisplay(), False); XSync(tqt_xdisplay(), False);
setVRoot( winId(), winId() ); setVRoot( winId(), winId() );
if (!trinity_desktop_lock_hide_active_windows) {
if (m_rootPixmap) m_rootPixmap->stop();
TQPixmap rootWinSnapShot = TQPixmap::grabWindow(TQApplication::desktop()->winId());
slotPaintBackground(rootWinSnapShot);
}
else {
// Sometimes KRootPixmap fails...make sure the desktop is hidden regardless
if (backingPixmap.isNull()) {
if (!mEnsureScreenHiddenTimer) {
mEnsureScreenHiddenTimer = new TQTimer( this );
connect( mEnsureScreenHiddenTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotForcePaintBackground()) );
mEnsureScreenHiddenTimer->start(DESKTOP_WALLPAPER_OBTAIN_TIMEOUT_MS, true);
}
while ((backingPixmap.isNull()) && (mEnsureScreenHiddenTimer->isActive())) {
kapp->processEvents();
}
}
}
if (((!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) && (!trinity_desktop_lock_in_sec_dlg)) && mHackStartupEnabled) { if (((!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) && (!trinity_desktop_lock_in_sec_dlg)) && mHackStartupEnabled) {
if (backingPixmap.isNull()) { if (backingPixmap.isNull()) {
setBackgroundColor(black); setBackgroundColor(black);
@ -1296,18 +1320,6 @@ bool LockProcess::startSaver()
setGeometry(0, 0, mRootWidth, mRootHeight); setGeometry(0, 0, mRootWidth, mRootHeight);
erase(); erase();
} }
if (trinity_desktop_lock_use_system_modal_dialogs) {
// Try to get the root pixmap
if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this);
m_rootPixmap->setCustomPainting(true);
m_rootPixmap->start();
// Sometimes KRootPixmap fails...make sure the desktop is hidden regardless
if (!mEnsureScreenHiddenTimer) {
mEnsureScreenHiddenTimer = new TQTimer( this );
connect( mEnsureScreenHiddenTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotForcePaintBackground()) );
mEnsureScreenHiddenTimer->start(2000, true);
}
}
if (trinity_desktop_lock_in_sec_dlg == FALSE) { if (trinity_desktop_lock_in_sec_dlg == FALSE) {
if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) {
@ -1433,6 +1445,9 @@ void LockProcess::closeDialogAndStartHack()
if (closeCurrentWindow()) { if (closeCurrentWindow()) {
TQTimer::singleShot( 0, this, SLOT(closeDialogAndStartHack()) ); TQTimer::singleShot( 0, this, SLOT(closeDialogAndStartHack()) );
} }
else {
resume(true);
}
} }
void LockProcess::repaintRootWindowIfNeeded() void LockProcess::repaintRootWindowIfNeeded()
@ -1512,7 +1527,6 @@ bool LockProcess::startHack()
if (!mForbidden) if (!mForbidden)
{ {
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
// Make sure we have a nice clean display to start with! // Make sure we have a nice clean display to start with!
if (backingPixmap.isNull()) { if (backingPixmap.isNull()) {
@ -1686,6 +1700,7 @@ void LockProcess::resume( bool force )
} }
if( !force && (!mDialogs.isEmpty() || !mVisibility )) { if( !force && (!mDialogs.isEmpty() || !mVisibility )) {
// no resuming with dialog visible or when not visible // no resuming with dialog visible or when not visible
if (trinity_desktop_lock_use_system_modal_dialogs) {
if (backingPixmap.isNull()) { if (backingPixmap.isNull()) {
setBackgroundColor(black); setBackgroundColor(black);
} }
@ -1694,6 +1709,10 @@ void LockProcess::resume( bool force )
} }
setGeometry(0, 0, mRootWidth, mRootHeight); setGeometry(0, 0, mRootWidth, mRootHeight);
erase(); erase();
}
else {
setGeometry(0, 0, mRootWidth, mRootHeight);
}
return; return;
} }
if ((mSuspended) && (mHackProc.isRunning())) if ((mSuspended) && (mHackProc.isRunning()))
@ -1810,11 +1829,15 @@ int LockProcess::execDialog( TQDialog *dlg )
} }
mDialogs.prepend( dlg ); mDialogs.prepend( dlg );
fakeFocusIn( dlg->winId()); fakeFocusIn( dlg->winId());
if (backingPixmap.isNull() && trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
if (backingPixmap.isNull()) {
setGeometry(0, 0, mRootWidth, mRootHeight); setGeometry(0, 0, mRootWidth, mRootHeight);
erase(); erase();
} }
else bitBlt(this, 0, 0, &backingPixmap); else {
bitBlt(this, 0, 0, &backingPixmap);
}
}
// dlg->exec may generate BadMatch errors, so make sure they are silently ignored // dlg->exec may generate BadMatch errors, so make sure they are silently ignored
int (*oldHandler)(Display *, XErrorEvent *); int (*oldHandler)(Display *, XErrorEvent *);
oldHandler = XSetErrorHandler(ignoreXError); oldHandler = XSetErrorHandler(ignoreXError);
@ -2011,15 +2034,15 @@ bool LockProcess::x11Event(XEvent *event)
{ // mVisibility == false means the screensaver is not visible at all { // mVisibility == false means the screensaver is not visible at all
// e.g. when switched to text console // e.g. when switched to text console
mVisibility = !(event->xvisibility.state == VisibilityFullyObscured); mVisibility = !(event->xvisibility.state == VisibilityFullyObscured);
if(!mVisibility) if(!mVisibility) {
mSuspendTimer.start(2000, true); mSuspendTimer.start(2000, true);
}
else else
{ {
mSuspendTimer.stop(); mSuspendTimer.stop();
if (mResizingDesktopLock == false) { if (mResizingDesktopLock == false) {
if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY // Do nothing
if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
} }
else { else {
if (mHackStartupEnabled == true) { if (mHackStartupEnabled == true) {
@ -2037,9 +2060,10 @@ bool LockProcess::x11Event(XEvent *event)
} }
} }
} }
if (event->xvisibility.state != VisibilityUnobscured) if (event->xvisibility.state != VisibilityUnobscured) {
stayOnTop(); stayOnTop();
} }
}
break; break;
case ConfigureNotify: // from SubstructureNotifyMask on the root window case ConfigureNotify: // from SubstructureNotifyMask on the root window

@ -53,6 +53,7 @@ TQXLibWindowList trinity_desktop_lock_hidden_window_list;
bool trinity_desktop_lock_use_system_modal_dialogs = FALSE; bool trinity_desktop_lock_use_system_modal_dialogs = FALSE;
bool trinity_desktop_lock_delay_screensaver_start = FALSE; bool trinity_desktop_lock_delay_screensaver_start = FALSE;
bool trinity_desktop_lock_use_sak = FALSE; bool trinity_desktop_lock_use_sak = FALSE;
bool trinity_desktop_lock_hide_active_windows = FALSE;
bool trinity_desktop_lock_forced = FALSE; bool trinity_desktop_lock_forced = FALSE;
@ -195,6 +196,11 @@ static void sigusr5_handler(int)
signalled_run = TRUE; signalled_run = TRUE;
} }
static int trapXErrors(Display *, XErrorEvent *)
{
return 0;
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
int main( int argc, char **argv ) int main( int argc, char **argv )
@ -209,6 +215,8 @@ int main( int argc, char **argv )
KApplication::disableAutoDcopRegistration(); // not needed KApplication::disableAutoDcopRegistration(); // not needed
XSetErrorHandler(trapXErrors);
while (1 == 1) { while (1 == 1) {
signalled_forcelock = FALSE; signalled_forcelock = FALSE;
signalled_dontlock = FALSE; signalled_dontlock = FALSE;
@ -365,6 +373,7 @@ int main( int argc, char **argv )
trinity_desktop_lock_use_sak = false; // If SAK is enabled with unmanaged windows, the SAK dialog will never close and will "burn in" the screen trinity_desktop_lock_use_sak = false; // If SAK is enabled with unmanaged windows, the SAK dialog will never close and will "burn in" the screen
trinity_desktop_lock_delay_screensaver_start = false; // If trinity_desktop_lock_delay_screensaver_start is true with unmanaged windows, the lock dialog may never appear trinity_desktop_lock_delay_screensaver_start = false; // If trinity_desktop_lock_delay_screensaver_start is true with unmanaged windows, the lock dialog may never appear
} }
trinity_desktop_lock_hide_active_windows = KDesktopSettings::hideActiveWindowsFromSaver();
delete tdmconfig; delete tdmconfig;

Loading…
Cancel
Save