This commit is contained in:
Alik Aslanyan 2024-11-03 18:25:44 +01:00 committed by GitHub
commit c35af0adff
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 60 additions and 1 deletions

View file

@ -187,6 +187,13 @@ else()
)
set(EXTRA_LIBS pthread rt dl)
find_package(X11)
if(X11_FOUND)
include_directories(${X11_INCLUDE_DIR})
add_definitions(-DXMRIG_X11_FOUND)
endif()
elseif (XMRIG_OS_FREEBSD)
set(EXTRA_LIBS kvm pthread)
endif()

View file

@ -38,7 +38,6 @@
#include <fstream>
#include <limits>
#include "base/kernel/Platform.h"
#include "version.h"
@ -172,8 +171,61 @@ bool xmrig::Platform::isOnBatteryPower()
return false;
}
#if defined(XMRIG_OS_LINUX) && defined(XMRIG_X11_FOUND)
#include <dlfcn.h>
#include <X11/extensions/scrnsaver.h>
template<typename T>
void bind_symbol(T& var, void *library, const char* name) {
var = reinterpret_cast<T>(::dlsym(library, name));
}
uint64_t xmrig::Platform::idleTime()
{
// libX11
static Display* (*XOpenDisplay)(const char *name) = {};
// libXss
static XScreenSaverInfo* (*XScreenSaverAllocInfo)() = {};
static Status (*XScreenSaverQueryInfo)(Display *dpy, Drawable drawable,
XScreenSaverInfo *saver_info) = {};
static bool initialized = false;
static Display *dpy = {};
static XScreenSaverInfo *info = {};
if(!initialized) {
static void *libx11 = dlopen("/usr/lib/libX11.so", RTLD_LAZY);
static void *libxss = dlopen("/usr/lib/libXss.so", RTLD_LAZY);
if(!libxss || !libx11) {
initialized = true;
return std::numeric_limits<uint64_t>::max();
}
bind_symbol(XOpenDisplay, libx11, "XOpenDisplay");
bind_symbol(XScreenSaverAllocInfo, libxss, "XScreenSaverAllocInfo");
bind_symbol(XScreenSaverQueryInfo, libxss, "XScreenSaverQueryInfo");
dpy = XOpenDisplay(nullptr);
info = XScreenSaverAllocInfo();
initialized = true;
}
if (!dpy) {
return std::numeric_limits<uint64_t>::max();
}
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
return info->idle;
}
#else
uint64_t xmrig::Platform::idleTime() {
return std::numeric_limits<uint64_t>::max();
}
#endif