在开发上的C ++小跨平台游戏,我被困具有以下问题:当玩家使用USB游戏手柄玩不接触键盘或鼠标,计算机睡眠时间他们正在玩时自动。
在Windows中,可以很容易地使用SetThreadExecutionState
函数来完成。在OS X中,我认为它可以与UpdateSystemActivity
做,但尚未测试。
但问题是,在Linux中有没有像DE的之间的公共API。我发现,在GNOME,你可以停止使用的DBus调用Inhibit()
和Uninhibit()
自动悬挂,但它仅适用于侏儒。
因此,(如果用户使用的是类似
dwm
或awesome wm
或非DE方式,例如),以防止Linux系统(使用Xorg和当然没有root访问权限)从睡眠或打开时存在一个编程跨DE路屏幕不用改变用户的配置文件?
PS:不要认为这是太复杂了,但不知道如何不幸。
从快速浏览一下MPlayer和SDL是怎么做的,有两件事情可以做,以防止屏幕保护程序从发射了:
XScreenSaverSuspend
使用的DBus,呼吁org.freedesktop.ScreenSaver.Inhibit
XResetScreenSaver
使用的DBus,呼吁org.freedesktop.ScreenSaver.SimulateUserActivity
据我所知,事情在名称XDG是去跨桌面环境功能的方式。似乎有a commandline utility called xdg-screensaver。它似乎有一堆硬屏保,然后回落到xset s off
/ xset s default
,所以你可能要叫它它的安装时,或退回到复制其逻辑的一部分时,它不是...
我使用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();
}
}
}