如何以编程方式防止Linux计算机睡眠或打开屏幕保护程序?

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:不要以为它太复杂了,但不知道有多么不幸.

nin*_*alj 8

从快速了解mplayer和SDL如何做到这一点,你可以做两件事来防止屏幕保护程序启动:

  • 在程序期间禁用它:
    • 运用 XScreenSaverSuspend
    • 使用DBus,调用 org.freedesktop.ScreenSaver.Inhibit
  • 定期ping它:
    • 运用 XResetScreenSaver
    • 使用DBus,调用 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)