在使用C ++开发小型跨平台游戏时,我遇到了以下问题:当玩家在没有触摸键盘或鼠标的情况下玩USB游戏手柄时,计算机会在玩游戏时自动进入睡眠状态。
在Windows中,可以使用SetThreadExecutionState
功能轻松完成。在OS X中,我认为可以使用UpdateSystemActivity
完成但尚未测试。
但问题是,在Linux中没有像DE之类的公共API。我发现在Gnome中你可以使用DBus调用Inhibit()
和Uninhibit()
来停止自动暂停,但它仅适用于Gnome。
PS:不要以为它太复杂了,但不知道有多么不幸。那么,是否存在以编程方式交叉DE方式(或非DE方式,例如,如果用户使用
dwm
或awesome wm
之类的方式)来阻止 Linux 系统(使用 Xorg ,当然没有root访问权限)从睡眠或打开屏幕保护程序而不更改用户配置文件?
答案 0 :(得分:8)
通过快速了解mplayer和SDL如何做到这一点,您可以做两件事来防止屏幕保护程序启动:
XScreenSaverSuspend
org.freedesktop.ScreenSaver.Inhibit
XResetScreenSaver
org.freedesktop.ScreenSaver.SimulateUserActivity
答案 1 :(得分:2)
据我所知,名称中包含xdg的内容是跨桌面环境功能的方法。似乎有a commandline utility called xdg-screensaver。它似乎有一堆屏幕保护程序硬连线,然后回退到xset s off
/ xset s default
,所以你可能只想在它安装时调用它,或者当它不是时复制它的部分逻辑...
答案 2 :(得分:1)
我正在使用QTDBUS
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();
}
}
}