Fal*_*nUA 14 c++ linux sleep screensaver xorg
在使用C++开发小型跨平台游戏时,我遇到了以下问题:当玩家在没有触摸键盘或鼠标的情况下玩USB游戏手柄时,计算机会在玩游戏时自动进入睡眠状态.
在Windows中,可以使用SetThreadExecutionState
功能轻松完成.在OS X中,我认为它可以完成UpdateSystemActivity
但尚未测试.
但问题是,在Linux中,没有像DE之类的通用API.我发现,在GNOME,你可以通过使用电话的DBus停止自动悬浮Inhibit()
和Uninhibit()
,但它仅适用于侏儒.
那么,是否存在以编程方式交叉DE方式(或非DE方式,例如,如果用户使用类似
dwm
或类似的东西awesome wm
)来阻止Linux系统(使用Xorg并且当然没有root访问权限)睡眠或打开屏幕保护程序更改用户配置文件?
PS:不要以为它太复杂了,但不知道有多么不幸.
从快速了解mplayer和SDL如何做到这一点,你可以做两件事来防止屏幕保护程序启动:
XScreenSaverSuspend
org.freedesktop.ScreenSaver.Inhibit
XResetScreenSaver
org.freedesktop.ScreenSaver.SimulateUserActivity
小智 7
我正在使用 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)