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

How to programmatically prevent linux computer from sleeping or turning on screensaver?

在用 C++ 开发一个小型跨平台游戏时,我遇到了以下问题:当玩家使用 USB 游戏手柄玩游戏时没有接触键盘或鼠标,电脑在玩游戏时会自动休眠。

在Windows中,使用SetThreadExecutionState function. In OS X, I think it can be done with UpdateSystemActivity可以轻松完成,但尚未测试。

但问题是,在 Linux 中,DE 之间没有共同点 API。我发现在 Gnome 中,您可以通过使用 DBus 调用 Inhibit()Uninhibit() 来停止自动挂起,但它仅适用于 Gnome。

So, is there exists a programatically cross-DE way (or non-DE way, for example if user is using something like dwm or awesome 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: 别以为太复杂了,可惜不知道怎么办。

据我所知,名称中带有 xdg 的东西是实现跨桌面环境功能的方式。似乎有a commandline utility called xdg-screensaver。它似乎有一堆硬连线的屏幕保护程序,然后回退到 xset s off/xset s default,因此您可能只想在安装时调用它,或者在未安装时回退到复制其部分逻辑...

通过快速了解 mplayer 和 SDL 的工作原理,您可以采取两种措施来防止屏幕保护程序启动:

  • 在节目期间禁用它:
    • 使用XScreenSaverSuspend
    • 使用DBus,调用org.freedesktop.ScreenSaver.Inhibit
  • 定期对其执行 Ping 操作:
    • 使用XResetScreenSaver
    • 使用DBus,调用org.freedesktop.ScreenSaver.SimulateUserActivity

我正在使用 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();   
        }
    }
}