diff --git a/client/hostinfo_unix.cpp b/client/hostinfo_unix.cpp
index bab1fe527c..958a2e833d 100644
--- a/client/hostinfo_unix.cpp
+++ b/client/hostinfo_unix.cpp
@@ -15,12 +15,6 @@
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see .
-// XIdleTime:
-// Copyright (C) 2011 Universidade Federal de Campina Grande
-// Initial version: Magnus Henoch
-// Contributors: Danny Kukawka, Eivind Magnus Hvidevold
-// LGPL Version of xidletime: https://github.com/rodrigods/xidletime
-
// There is a reason that having a file called "cpp.h" that includes config.h
// and some of the C++ header files is bad. That reason is because there are
// #defines that alter the behiour of the standard C and C++ headers. In
@@ -1627,7 +1621,6 @@ vector get_tty_list() {
} while (tty_patterns[i].dir != NULL);
return tty_list;
}
-
inline bool all_tty_idle(time_t t) {
static vector tty_list;
@@ -1638,7 +1631,67 @@ inline bool all_tty_idle(time_t t) {
for (i=0; i= t) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+static const struct dir_dev {
+ const char *dir;
+ const char *dev;
+} input_patterns[] = {
+#ifdef unix
+ { "/dev/input","event" },
+ { "/dev/input","mouse" },
+ { "/dev/input/mice","" },
+#endif
+ // add other ifdefs here as necessary.
+ { NULL, NULL },
+};
+
+vector get_input_list() {
+ // Create a list of all terminal devices on the system.
+ char devname[1024];
+ char fullname[1024];
+ int done,i=0;
+ vector input_list;
+
+ do {
+ DIRREF dev=dir_open(input_patterns[i].dir);
+ if (dev) {
+ do {
+ // get next file
+ done=dir_scan(devname,dev,1024);
+ // does it match our tty pattern? If so, add it to the tty list.
+ if (!done && (strstr(devname,input_patterns[i].dev) == devname)) {
+ // don't add anything starting with .
+ if (devname[0] != '.') {
+ sprintf(fullname,"%s/%s",input_patterns[i].dir,devname);
+ input_list.push_back(fullname);
+ }
+ }
+ } while (!done);
+ dir_close(dev);
+ }
+ i++;
+ } while (input_patterns[i].dir != NULL);
+ return input_list;
+}
+
+inline bool all_input_idle(time_t t) {
+ static vector input_list;
+ struct stat sbuf;
+ unsigned int i;
+
+ if (input_list.size()==0) input_list=get_input_list();
+ for (i=0; i= t) {
return false;
}
@@ -1865,91 +1918,6 @@ bool interrupts_idle(time_t t) {
}
return last_irq < t;
}
-
-#if HAVE_XSS
-// Ask the X server for user idle time (using XScreenSaver API)
-// Return true if the idle time exceeds idle_threshold.
-//
-bool xss_idle(long idle_threshold) {
- static XScreenSaverInfo* xssInfo = NULL;
- static Display* disp = NULL;
- static bool error = false;
- // some X call failed - always return not idle
-
- if (error) return false;
-
- long idle_time = 0;
-
- if (disp == NULL) {
- disp = XOpenDisplay(NULL);
- // XOpenDisplay may return NULL if there is no running X
- // or DISPLAY points to wrong/invalid display
- //
- if (disp == NULL) {
- error = true;
- return false;
- }
- int event_base_return, error_base_return;
- xssInfo = XScreenSaverAllocInfo();
- if (!XScreenSaverQueryExtension(
- disp, &event_base_return, &error_base_return
- )){
- error = true;
- return false;
- }
- }
-
- XScreenSaverQueryInfo(disp, DefaultRootWindow(disp), xssInfo);
- idle_time = xssInfo->idle;
-
-#if HAVE_DPMS
- // XIdleTime Detection
- // See header for location and copywrites.
- //
- int dummy;
- CARD16 standby, suspend, off;
- CARD16 state;
- BOOL onoff;
-
- if (DPMSQueryExtension(disp, &dummy, &dummy)) {
- if (DPMSCapable(disp)) {
- DPMSGetTimeouts(disp, &standby, &suspend, &off);
- DPMSInfo(disp, &state, &onoff);
-
- if (onoff) {
- switch (state) {
- case DPMSModeStandby:
- // this check is a littlebit paranoid, but be sure
- if (idle_time < (unsigned) (standby * 1000)) {
- idle_time += (standby * 1000);
- }
- break;
- case DPMSModeSuspend:
- if (idle_time < (unsigned) ((suspend + standby) * 1000)) {
- idle_time += ((suspend + standby) * 1000);
- }
- break;
- case DPMSModeOff:
- if (idle_time < (unsigned) ((off + suspend + standby) * 1000)) {
- idle_time += ((off + suspend + standby) * 1000);
- }
- break;
- case DPMSModeOn:
- default:
- break;
- }
- }
- }
- }
-#endif
-
- // convert from milliseconds to seconds
- //
- idle_time = idle_time / 1000;
-
- return idle_threshold < idle_time;
-}
-#endif // HAVE_XSS
#endif // LINUX_LIKE_SYSTEM
bool HOST_INFO::users_idle(bool check_all_logins, double idle_time_to_run) {
@@ -1976,16 +1944,14 @@ bool HOST_INFO::users_idle(bool check_all_logins, double idle_time_to_run) {
}
// Lets at least check the dev entries which should be correct for
- // USB mice. The tty check will catch keyboards if they are entering
- // data into a tty.
- if (!device_idle(idle_time, "/dev/input/mice")) return false;
-
-#if HAVE_XSS
- if (!xss_idle((long)(idle_time_to_run * 60))) {
+ // USB keyboards and mice. If the linux kernel doc is correct it should
+ // also work for bluetooth input devices as well.
+ //
+ // See: https://www.kernel.org/doc/Documentation/input/input.txt
+ //
+ if (!all_input_idle(idle_time)) {
return false;
}
-#endif
-
#else
// We should find out which of the following are actually relevant
// on which systems (if any)