From be61b99598ba2717e7764ed8c2b16aa4675a221c Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 24 Apr 2013 14:36:01 -0500 Subject: [PATCH] Fix kdesktop_lock interaction with DPMS power save This partially resolves Bug 1475 --- kdesktop/lock/lockprocess.cc | 69 ++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 82952431a..1947793c9 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -130,6 +130,8 @@ Status DPMSInfo ( Display *, CARD16 *, BOOL * ); #define XF86XK_AudioLowerVolume 0x1008FF11 #define XF86XK_Display 0x1008FF59 +#define DPMS_MONITOR_BLANKED(x) ((x == DPMSModeStandby) || (x == DPMSModeSuspend) || (x == DPMSModeOff)) + static Window gVRoot = 0; static Window gVRootData = 0; static Atom gXA_VROOT; @@ -376,7 +378,7 @@ void LockProcess::init(bool child, bool useBlankOnly) connect(&mSuspendTimer, TQT_SIGNAL(timeout()), TQT_SLOT(suspend())); #ifdef HAVE_DPMS - //if the user decided that the screensaver should run independent from + //if the user decided that the screensaver should run independent from //dpms, we shouldn't check for it, aleXXX if (KDesktopSettings::dpmsDependent()) { BOOL on; @@ -1436,15 +1438,34 @@ bool LockProcess::startLock() void LockProcess::closeDialogAndStartHack() { - // Close any active dialogs - DISABLE_CONTINUOUS_LOCKDLG_DISPLAY - mSuspended = true; - if (closeCurrentWindow()) { - TQTimer::singleShot( 0, this, SLOT(closeDialogAndStartHack()) ); - } - else { - resume(true); - } +#ifdef HAVE_DPMS + if (KDesktopSettings::dpmsDependent()) { + BOOL on; + CARD16 state; + if (DPMSInfo(tqt_xdisplay(), &state, &on)) { + //kdDebug() << "checkDPMSActive " << on << " " << state << endl; + if (DPMS_MONITOR_BLANKED(state)) { + // Make sure saver will attempt to start again after DPMS wakeup + // This is related to Bug 1475 + ENABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); + // Should not start saver here, because the DPMS check method below would turn it right back off! + // This is related to Bug 1475 + return; + } + } + } +#endif + + // Close any active dialogs + DISABLE_CONTINUOUS_LOCKDLG_DISPLAY + mSuspended = true; + if (closeCurrentWindow()) { + TQTimer::singleShot( 0, this, SLOT(closeDialogAndStartHack()) ); + } + else { + resume(true); + } } void LockProcess::repaintRootWindowIfNeeded() @@ -2218,19 +2239,21 @@ void LockProcess::stayOnTop() void LockProcess::checkDPMSActive() { #ifdef HAVE_DPMS - BOOL on; - CARD16 state; - DPMSInfo(tqt_xdisplay(), &state, &on); - //kdDebug() << "checkDPMSActive " << on << " " << state << endl; - if (state == DPMSModeStandby || state == DPMSModeSuspend || state == DPMSModeOff) - { - suspend(); - } else if ( mSuspended ) - { - if (mResizingDesktopLock == false) { - resume( true ); - } - } + if (KDesktopSettings::dpmsDependent()) { + BOOL on; + CARD16 state; + if (DPMSInfo(tqt_xdisplay(), &state, &on)) { + //kdDebug() << "checkDPMSActive " << on << " " << state << endl; + if (DPMS_MONITOR_BLANKED(state)) { + suspend(); + } + else if (mSuspended) { + if (mResizingDesktopLock == false) { + resume( true ); + } + } + } + } #endif }