mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-04-18 16:17:23 -05:00
Resolve libXss.so symbols at runtime
This enables running the advanced scene switcher in environments in which this library is not available with only minimal loss of functionality (idle detection)
This commit is contained in:
parent
20ba02be8d
commit
cc3ce3f0e0
|
|
@ -39,6 +39,13 @@ typedef int (*keyPressFunc)(Display *, unsigned int, bool, unsigned long);
|
|||
static keyPressFunc pressFunc = nullptr;
|
||||
bool canSimulateKeyPresses = false;
|
||||
|
||||
static QLibrary *libXssHandle = nullptr;
|
||||
typedef XScreenSaverInfo *(*XScreenSaverAllocInfoFunc)();
|
||||
typedef int (*XScreenSaverQueryInfoFunc)(Display *, Window, XScreenSaverInfo *);
|
||||
static XScreenSaverAllocInfoFunc allocSSFunc = nullptr;
|
||||
static XScreenSaverQueryInfoFunc querySSFunc = nullptr;
|
||||
bool canGetIdleTime = false;
|
||||
|
||||
Display *disp()
|
||||
{
|
||||
if (!xdisplay) {
|
||||
|
|
@ -459,18 +466,22 @@ bool isInFocus(const QString &executable)
|
|||
|
||||
int secondsSinceLastInput()
|
||||
{
|
||||
if (!canGetIdleTime) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
time_t idle_time;
|
||||
static XScreenSaverInfo *mit_info;
|
||||
Display *display;
|
||||
int screen;
|
||||
|
||||
mit_info = XScreenSaverAllocInfo();
|
||||
mit_info = allocSSFunc();
|
||||
|
||||
if ((display = disp()) == NULL) {
|
||||
return -1;
|
||||
}
|
||||
screen = DefaultScreen(display);
|
||||
XScreenSaverQueryInfo(display, RootWindow(display, screen), mit_info);
|
||||
querySSFunc(display, RootWindow(display, screen), mit_info);
|
||||
idle_time = (mit_info->idle) / 1000;
|
||||
XFree(mit_info);
|
||||
|
||||
|
|
@ -636,17 +647,26 @@ void PressKeys(const std::vector<HotkeyType> keys, int duration)
|
|||
|
||||
void PlatformInit()
|
||||
{
|
||||
libXtstHandle = new QLibrary("libXtst.so", nullptr);
|
||||
libXtstHandle = new QLibrary("libXtst", nullptr);
|
||||
pressFunc = (keyPressFunc)libXtstHandle->resolve("XTestFakeKeyEvent");
|
||||
int _;
|
||||
canSimulateKeyPresses = pressFunc &&
|
||||
!XQueryExtension(disp(), "XTEST", &_, &_, &_);
|
||||
XQueryExtension(disp(), "XTEST", &_, &_, &_);
|
||||
|
||||
libXssHandle = new QLibrary("libXss", nullptr);
|
||||
allocSSFunc = (XScreenSaverAllocInfoFunc)libXssHandle->resolve(
|
||||
"XScreenSaverAllocInfo");
|
||||
querySSFunc = (XScreenSaverQueryInfoFunc)libXssHandle->resolve(
|
||||
"XScreenSaverQueryInfo");
|
||||
canGetIdleTime = allocSSFunc && querySSFunc &&
|
||||
XQueryExtension(disp(), ScreenSaverName, &_, &_, &_);
|
||||
}
|
||||
|
||||
void PlatformCleanup()
|
||||
{
|
||||
delete libXtstHandle;
|
||||
libXtstHandle = nullptr;
|
||||
|
||||
delete libXssHandle;
|
||||
libXssHandle = nullptr;
|
||||
cleanupDisplay();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user