summaryrefslogtreecommitdiffstats
path: root/karm/idletimedetector.cpp
blob: bd0b253c2660d7e87d9eea4c7bab36339d23c5e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "idletimedetector.h"

#include <tqdatetime.h>
#include <tqmessagebox.h>
#include <tqtimer.h>

#include <kglobal.h>
#include <klocale.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(qt_xdisplay(), &event_base, &error_base)) 
  {
    _idleDetectionPossible = true;
  }
  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)
  {
    _mit_info = XScreenSaverAllocInfo ();
    XScreenSaverQueryInfo(qt_xdisplay(), qt_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();

  TQDateTime idleStart = TQDateTime::currentDateTime().addSecs(-idleSeconds);
  TQString idleStartTQString = KGlobal::locale()->formatTime(idleStart.time());

  int id =  TQMessageBox::warning( 0, i18n("Idle Detection"),
                                     i18n("Desktop has been idle since %1."
                                          " What should we do?").arg(idleStartTQString),
                                     i18n("Revert && Stop"),
                                     i18n("Revert && Continue"),
                                     i18n("Continue Timing"),0,2);
  TQDateTime end = TQDateTime::currentDateTime();
  int diff = idleStart.secsTo(end)/secsPerMinute;

  if (id == 0) 
  {
    // Revert And Stop
    kdDebug(5970) << "Now it is " << TQDateTime::currentDateTime() << endl;
    kdDebug(5970) << "Reverting timer to " << KGlobal::locale()->formatTime(idleStart.time()).ascii() << endl;
    emit(extractTime(idleSeconds/60+diff)); // we need to subtract the time that has been added during idleness.
    emit(stopAllTimersAt(idleStart));
  }
  else if (id == 1) 
  {
    // Revert and Continue
    emit(extractTime(idleSeconds/60+diff));
    _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"