Reputation: 10400
While developing a small cross-platform game on C++, I got stuck with following issue: when players are playing with a USB gamepad without touching a keyboard or mouse, the computer sleeps automatically while they're playing.
In Windows, it can be done easily using SetThreadExecutionState
function. In OS X, I think it can be done with UpdateSystemActivity
but not tested yet.
But the problem is, in Linux there's nothing like a common API between DE's. I've found that in Gnome you can stop the auto-suspending by using DBus calls Inhibit()
and Uninhibit()
, but it works only for Gnome.
So, is there exists a programatically cross-DE way (or non-DE way, for example if user is using something like
dwm
orawesome wm
) to prevent a Linux system (using Xorg and without root access of course) from sleeping or turning on screensaver without changing user configuration files?
PS: Don't think that it's too complicated, but don't know how unfortunately.
Upvotes: 23
Views: 6134
Reputation: 336
I've put together code to disable idle sleep for Ubuntu, Mac OS and Windows:
https://gist.github.com/Vineg/eca223fbf478a3c806444a13e538a9fc
It is based on Virupaksha answer.
Upvotes: 1
Reputation: 71
I'm using QTDBUS using that
QDBusConnection bus = QDBusConnection::sessionBus();
if(bus.isConnected())
{
QString services[MAX_SERVICES] = {
"org.freedesktop.ScreenSaver",
"org.gnome.SessionManager"
};
QString paths[MAX_SERVICES] = {
"/org/freedesktop/ScreenSaver",
"/org/gnome/SessionManager"
};
for(int i = 0; i < MAX_SERVICES ; i++)
{
QDBusInterface screenSaverInterface(
services[i], paths[i],services[i], bus, this);
if (!screenSaverInterface.isValid())
continue;
QDBusReply<uint> reply = screenSaverInterface.call(
"Inhibit", "YOUR_APP_NAME", "REASON");
if (reply.isValid())
{
cookieID = reply.value();
qDebug()<<"succesful"
} else {
QDBusError error =reply.error();
qDebug()<<error.message()<<error.name();
}
}
}
Upvotes: 7
Reputation: 43688
From a quick look at how mplayer and SDL do it, there are two things you can do to prevent the screensaver from firing up:
XScreenSaverSuspend
org.freedesktop.ScreenSaver.Inhibit
XResetScreenSaver
org.freedesktop.ScreenSaver.SimulateUserActivity
Upvotes: 10
Reputation: 2014
As far as I can tell, things with xdg in the name are the way to go for cross-desktop-environment functionality. There appears to be a commandline utility called xdg-screensaver. It seems to have a bunch of screensavers hardwired and then fall back to xset s off
/xset s default
, so you might want to just call it when it's installed, or fall back to copying part of its logic when it's not...
Upvotes: 3