You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/karm/idletimedetector.cpp

133 lines
3.3 KiB

#include <time.h>
#include "idletimedetector.h"
#include <tqdatetime.h>
#include <tqmessagebox.h>
#include <tqtimer.h>
#include <tdeglobal.h>
#include <tdelocale.h> // i18n
IdleTimeDetector::IdleTimeDetector(int maxIdle)
// Trigger a warning after maxIdle minutes
{
kdDebug(5970) << "Entering IdleTimeDetector::IdleTimeDetector" << endl;
_maxIdle = maxIdle;
#ifdef HAVE_LIBXSS
kdDebug(5970) << "IdleTimeDetector: LIBXSS detected @ compile time" << endl;
int event_base, error_base;
if(XScreenSaverQueryExtension(tqt_xdisplay(), &event_base, &error_base))
{
_idleDetectionPossible = true;
_mit_info = XScreenSaverAllocInfo ();
}
else
{
_idleDetectionPossible = false;
}
_timer = new TQTimer(this);
connect(_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(check()));
#else
_idleDetectionPossible = false;
#endif // HAVE_LIBXSS
}
bool IdleTimeDetector::isIdleDetectionPossible()
{
return _idleDetectionPossible;
}
void IdleTimeDetector::check()
{
kdDebug(5970) << "Entering IdleTimeDetector::check" << endl;
#ifdef HAVE_LIBXSS
if (_idleDetectionPossible)
{
XScreenSaverQueryInfo(tqt_xdisplay(), tqt_xrootwin(), _mit_info);
int idleSeconds = (_mit_info->idle/1000);
if (idleSeconds >= _maxIdle)
informOverrun(idleSeconds);
}
#endif // HAVE_LIBXSS
}
void IdleTimeDetector::setMaxIdle(int maxIdle)
{
_maxIdle = maxIdle;
}
#ifdef HAVE_LIBXSS
void IdleTimeDetector::informOverrun(int idleSeconds)
{
kdDebug(5970) << "Entering IdleTimeDetector::informOverrun" << endl;
if (!_overAllIdleDetect)
return; // preferences say the user does not want idle detection.
_timer->stop();
struct timespec tm;
clock_gettime(CLOCK_MONOTONIC, &tm);
int start = tm.tv_sec - idleSeconds;
TQDateTime idleStart = TQDateTime::currentDateTime().addSecs(-idleSeconds);
int id = TQMessageBox::warning( 0, i18n("Idle Detection"),
i18n("Desktop has been idle since %1."
" What should we do?").arg(TDEGlobal::locale()->formatTime(idleStart.time())),
i18n("Revert && Stop"),
i18n("Revert && Continue"),
i18n("Continue Timing"),0,2);
clock_gettime(CLOCK_MONOTONIC, &tm);
int diff = tm.tv_sec - start;
if (id == 0)
{
// Revert And Stop
kdDebug(5970) << "Now it is " << TQDateTime::currentDateTime() << endl;
kdDebug(5970) << "Reverting timer to " << TDEGlobal::locale()->formatTime(idleStart.time()).ascii() << endl;
emit(extractTime(diff/60));
emit(stopAllTimersAt(idleStart));
}
else if (id == 1)
{
// Revert and Continue
emit(extractTime(diff/60));
_timer->start(testInterval);
}
else
{
// Continue
_timer->start(testInterval);
}
}
#endif // HAVE_LIBXSS
void IdleTimeDetector::startIdleDetection()
{
kdDebug(5970) << "Entering IdleTimeDetector::startIdleDetection" << endl;
#ifdef HAVE_LIBXSS
kdDebug(5970) << "Starting Timer" << endl;
if (!_timer->isActive())
_timer->start(testInterval);
#endif //HAVE_LIBXSS
}
void IdleTimeDetector::stopIdleDetection()
{
#ifdef HAVE_LIBXSS
if (_timer->isActive())
_timer->stop();
#endif // HAVE_LIBXSS
}
void IdleTimeDetector::toggleOverAllIdleDetection(bool on)
{
_overAllIdleDetect = on;
}
#include "idletimedetector.moc"