The main problem is: "How to know when the user has been idle (or away) for some minutes and I want to do something in that case?"
The first attempt that came to my mind was to do a "system hook", but after several tries I finally realized that you cannot apply a "windows like" solution in linux... Linux is... just different. So here's how I did the trick:
1. You need to use the "libxss-dev" library, you can install it using:
sudo apt-get install libxss-dev
2. Create the following class:
#include "idledetector.h"
#include
#include
#include
#include
IdleDetector::IdleDetector(int idleMaxSecs)
{
m_idleMaxSecs = idleMaxSecs;
}
void IdleDetector::start() {
timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
timer->start(1000);
}
void IdleDetector::stop() {
timer->stop();
}
void IdleDetector::timeout() {
bool _idleDetectionPossible;
XScreenSaverInfo *_mit_info;
int event_base, error_base;
if(XScreenSaverQueryExtension(QX11Info::display(), &event_base, &error_base))
_idleDetectionPossible = true;
else
_idleDetectionPossible = false;
_mit_info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(QX11Info::display(), QX11Info::appRootWindow(), _mit_info);
long idlesecs = (_mit_info->idle/1000);
if (idlesecs > m_idleMaxSecs) {
timer->stop();
idleTimeOut();
}
}
The "idledetector.h" will be as follows:
#ifndef IDLEDETECTOR_H
#define IDLEDETECTOR_H
#include
#include
class IdleDetector : public QObject
{
Q_OBJECT
public:
IdleDetector(int idleMax);
void start();
void stop();
signals:
void idleTimeOut();
private:
int m_idleMaxSecs;
QTimer* timer;
private slots:
void timeout();
};
#endif // IDLEDETECTOR_H
I'm using Qt to expose the signals and use a signal/slot architecture, but I'm sure the reader is smart enough to convert this class to whatever he wants.
The main idea in here is that every x seconds (1000 ms to be exact) the timeout will check how much time the user has been idle (away) and if it matches the m_maxsecs a signal will be send to any subscriber.
Use this solution as you want, but will be great if you put a link to this site in order to improve the google counter xD
If you need help on how to use it, let me know and I will post the sample code.