39
39
#include < vector>
40
40
#include < string>
41
41
#include < cstring>
42
+
42
43
#endif
43
44
44
45
#ifdef __GLIBC__
@@ -179,6 +180,12 @@ extern "C" {
179
180
//
180
181
#if (defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(__HAIKU__)
181
182
#define LINUX_LIKE_SYSTEM 1
183
+ // not sure if that's the correct place to put it
184
+ #include < libevdev/libevdev.h>
185
+ #include < libevdev/libevdev-uinput.h>
186
+ #include < fcntl.h>
187
+ // #include <unistd.h> || library already included
188
+ #include < glob.h>
182
189
#endif
183
190
184
191
#if WASM
@@ -2003,6 +2010,75 @@ const vector<string> X_display_values_initialize() {
2003
2010
return display_values;
2004
2011
}
2005
2012
2013
+ void getIdleTime () {
2014
+ long idleTime = 0 ;
2015
+ // Use glob to enumerate input devices in /dev/input/
2016
+ glob_t globbuf;
2017
+ if (glob (" /dev/input/event*" , GLOB_NOSORT, nullptr , &globbuf) != 0 ) {
2018
+ std::cerr << " Failed to enumerate input devices. " << std::endl;
2019
+ return ;
2020
+ }
2021
+
2022
+ // Create libevdev structures for each device
2023
+ libevdev* devices[globbuf.gl_pathc ];
2024
+
2025
+ // Open and initialize each device
2026
+ for (size_t i = 0 ; i < globbuf.gl_pathc ; ++i) {
2027
+ const char * devicePath = globbuf.gl_pathv [i];
2028
+ int fd = open (devicePath, O_RDONLY | O_NONBLOCK);
2029
+ if (fd < 0 ) {
2030
+ std::cerr << " Failed to open device (Permission denied?): " << devicePath << std::endl;
2031
+ return ;
2032
+ }
2033
+
2034
+ if (libevdev_new_from_fd (fd, &devices[i]) < 0 ) {
2035
+ std::cerr << " Failed to initialize libevdev for device: " << devicePath << std::endl;
2036
+ return ;
2037
+ }
2038
+ }
2039
+
2040
+ // Main loop to monitor input events
2041
+ while (true ) {
2042
+ bool systemInUse = false ;
2043
+
2044
+ // Read events from all devices
2045
+ for (size_t i = 0 ; i < globbuf.gl_pathc ; ++i) {
2046
+ struct input_event ev;
2047
+ int rc;
2048
+
2049
+ while ((rc = libevdev_next_event (devices[i], LIBEVDEV_READ_FLAG_NORMAL, &ev)) == 1 ) {
2050
+ // Handle input events as needed
2051
+ // For this example, we simply print event information
2052
+ std::cout << " Event type: " << ev.type << " , code: " << ev.code << " , value: " << ev.value << std::endl;
2053
+
2054
+ // Set systemInUse to true if an event is detected
2055
+ systemInUse = true ;
2056
+ }
2057
+
2058
+ if (rc < 0 && rc != -EAGAIN) {
2059
+ std::cerr << " Error reading from device: " << globbuf.gl_pathv [i] << std::endl;
2060
+ return ;
2061
+ }
2062
+ }
2063
+ if (systemInUse) {
2064
+ std::cout << " System is being used." << std::endl;
2065
+ idleTime = 0 ;
2066
+ } else {
2067
+ std::cout << " System is not being used." << std::endl;
2068
+ idleTime += 5 ;
2069
+ }
2070
+ // You can add a sleep here to reduce CPU usage
2071
+ sleep (5 );
2072
+ printf (" Idle time: %ld\n " , idleTime);
2073
+ }
2074
+ for (size_t i = 0 ; i < globbuf.gl_pathc ; ++i) {
2075
+ libevdev_free (devices[i]);
2076
+ }
2077
+ globfree (&globbuf);
2078
+
2079
+ return ;
2080
+ }
2081
+
2006
2082
// Ask the X server for user idle time (using XScreenSaver API)
2007
2083
// Return min of idle times.
2008
2084
// This function assumes that the boinc user has been
@@ -2011,6 +2087,7 @@ const vector<string> X_display_values_initialize() {
2011
2087
// One may drop a file in /etc/X11/Xsession.d/ that runs the xhost command
2012
2088
// for all Xservers on a machine when the Xservers start up.
2013
2089
//
2090
+
2014
2091
long xss_idle () {
2015
2092
long idle_time = USER_IDLE_TIME_INF;
2016
2093
const vector<string> display_values = X_display_values_initialize ();
0 commit comments