summaryrefslogtreecommitdiffstats
path: root/src/inactivity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/inactivity.cpp')
-rw-r--r--src/inactivity.cpp56
1 files changed, 43 insertions, 13 deletions
diff --git a/src/inactivity.cpp b/src/inactivity.cpp
index 8d7205e..977161e 100644
--- a/src/inactivity.cpp
+++ b/src/inactivity.cpp
@@ -18,7 +18,7 @@
***************************************************************************/
/*! \file inactivity.cpp
- * \brief In this file can be found the inactivity related code.
+ * \brief In this file can be found the inactivity related code.
* \author Danny Kukawka, <dkukawka@suse.de>, <danny.kukawka@web.de>
* \date 2006-2007
*/
@@ -37,7 +37,8 @@ extern "C" {
#include <tdelocale.h>
/*! The default constructor of the class autosuspend */
-inactivity::inactivity() {
+inactivity::inactivity(screen *disp) : display(disp),
+ prev_screensaver_enabled(false), prev_idle_time(0), correction_value(0) {
kdDebugFuncIn(trace);
proc = NULL;
@@ -71,11 +72,11 @@ inactivity::~inactivity() {
/*!
* This function start the monitoring of inactivity of user on the X-Server.
- * Here wee set the time for the signal \ref inactivityTimeExpired() and start
+ * Here we set the time for the signal \ref inactivityTimeExpired() and start
* the needed TQTimer.
- * \param timeToExpire Integer value representing the time of inactivity which need
+ * \param timeToExpire Integer value representing the time of inactivity which need
* to elapse befor send signal. The time is in seconds.
- * \param blacked TQStringList with blacklisted programs which if detected with
+ * \param blacked TQStringList with blacklisted programs which if detected with
* pidof() as running prevent the autosuspend.
*/
void inactivity::start( int timeToExpire, TQStringList blacked ) {
@@ -86,6 +87,9 @@ void inactivity::start( int timeToExpire, TQStringList blacked ) {
if(timeToExpire > 0 && has_XSC_Extension){
stop();
timeToInactivity = (unsigned long) (timeToExpire * 1000);
+ prev_screensaver_enabled = false;
+ prev_idle_time = 0;
+ correction_value = 0;
checkInactivity->start(CHECK_for_INACTIVITY, true);
}
@@ -198,7 +202,7 @@ unsigned long inactivity::getXInactivity(){
if (!mitInfo) mitInfo = XScreenSaverAllocInfo ();
XScreenSaverQueryInfo (tqt_xdisplay(), DefaultRootWindow (tqt_xdisplay()), mitInfo);
kdDebugFuncOut(trace);
- return workaroundCreepyXServer(mitInfo->idle);
+ return workaroundCreepyXServer(mitInfo);
}
else {
kdDebugFuncOut(trace);
@@ -219,12 +223,36 @@ unsigned long inactivity::getXInactivity(){
* current timeout for this state and add this value to
* the current idle time and return.
*
- * \param _idleTime a unsigned long value with the current ideletime fromm
- * XScreenSaverInfo->idle
+ * \param _mitInfo a pointer to a structure containing the current XScreenSaver state
* \return a unsigned long with the corrected idletime
*/
-unsigned long inactivity::workaroundCreepyXServer( unsigned long _idleTime ){
+unsigned long inactivity::workaroundCreepyXServer(XScreenSaverInfo *_mitInfo){
kdDebugFuncOut(trace);
+ unsigned long _idleTime = _mitInfo->idle;
+
+ // Detect whether the screensaver has become active since the last time,
+ // because the idle time returned by XScreenSaverQueryInfo() is resetted
+ // to 0 when the screensaver kicks in. Correct the idle time value if the
+ // screensaver is active
+ bool screensaver_enabled = false;
+ if (display->checkScreenSaverActive())
+ {
+ screensaver_enabled = true;
+ }
+ if (!prev_screensaver_enabled && screensaver_enabled)
+ {
+ correction_value = prev_idle_time + CHECK_for_INACTIVITY - _idleTime;
+ }
+ prev_idle_time = _idleTime;
+ if (screensaver_enabled)
+ {
+ _idleTime += correction_value;
+ }
+ else
+ {
+ correction_value = 0;
+ }
+ prev_screensaver_enabled = screensaver_enabled;
int dummy;
CARD16 standby, suspend, off;
@@ -235,6 +263,8 @@ unsigned long inactivity::workaroundCreepyXServer( unsigned long _idleTime ){
kdDebug() << "Current idleTime: " << _idleTime << endl;
+ // Idle time is reset when the screensaver kicks in. Need to correct with the right offset
+
if (DPMSQueryExtension(dpy, &dummy, &dummy)) {
if (DPMSCapable(dpy)) {
DPMSGetTimeouts(dpy, &standby, &suspend, &off);
@@ -245,7 +275,7 @@ unsigned long inactivity::workaroundCreepyXServer( unsigned long _idleTime ){
case DPMSModeStandby:
kdDebug() << "DPMS enabled. Monitor in Standby. Standby: "
<< standby << " sec" << endl;
- // this check is a littlebit paranoid, but be sure
+ // this check is a little bit paranoid, but be sure
if (_idleTime < (unsigned) (standby * 1000))
_idleTime += (standby * 1000);
break;
@@ -266,7 +296,7 @@ unsigned long inactivity::workaroundCreepyXServer( unsigned long _idleTime ){
break;
}
}
- }
+ }
}
kdDebug() << "Corrected idleTime: " << _idleTime << endl;
@@ -323,7 +353,7 @@ void inactivity::getPIDs(TDEProcess */*proc*/, char *buffer, int /*length*/) {
if(pids.isEmpty() || pids == "\n" ) {
kdDebug() << "NO! BLACKLISTED IS RUNNING" << endl;
blacklisted_running = false;
- }
+ }
else {
if (pids.contains(TQRegExp("[0-9]"))) {
kdDebug() << "BLACKLISTED IS RUNNING" << endl;
@@ -359,7 +389,7 @@ void inactivity::getPIDsExited(TDEProcess *proc){
kdDebugFuncOut(trace);
return;
}
- }
+ }
// if something crashed/failed
pidof_call_failed = true;
kdDebugFuncOut(trace);