From 062f3f6d2dbbd30eef37e4679f47221a0b18d9da Mon Sep 17 00:00:00 2001 From: Alik Aslanyan Date: Wed, 31 Mar 2021 16:49:26 +0400 Subject: [PATCH] Implement pause-on-active for Linux --- CMakeLists.txt | 7 ++++ src/base/kernel/Platform_unix.cpp | 54 ++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1f403af7..d28238e27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,6 +166,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() diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp index f5bbc1931..f1c2864d1 100644 --- a/src/base/kernel/Platform_unix.cpp +++ b/src/base/kernel/Platform_unix.cpp @@ -36,7 +36,6 @@ #include #include - #include "base/kernel/Platform.h" #include "version.h" @@ -160,8 +159,61 @@ bool xmrig::Platform::isOnBatteryPower() return false; } +#if defined(XMRIG_OS_LINUX) && defined(XMRIG_X11_FOUND) + +#include +#include + +template +void bind_symbol(T& var, void *library, const char* name) { + var = reinterpret_cast(::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::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::max(); + } + + XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info); + + return info->idle; +} +#else + +uint64_t xmrig::Platform::idleTime() { return std::numeric_limits::max(); } + +#endif \ No newline at end of file