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

问题描述 投票:13回答:3

在开发上的C ++小跨平台游戏,我被困具有以下问题:当玩家使用USB游戏手柄玩不接触键盘或鼠标,计算机睡眠时间他们正在玩时自动。

在Windows中,可以很容易地使用SetThreadExecutionState函数来完成。在OS X中,我认为它可以与UpdateSystemActivity做,但尚未测试。

但问题是,在Linux中有没有像DE的之间的公共API。我发现,在GNOME,你可以停止使用的DBus调用Inhibit()Uninhibit()自动悬挂,但它仅适用于侏儒。

因此,(如果用户使用的是类似dwmawesome wm或非DE方式,例如),以防止Linux系统(使用Xorg和当然没有root访问权限)从睡眠或打开时存在一个编程跨DE路屏幕不用改变用户的配置文件?

PS:不要认为这是太复杂了,但不知道如何不幸。

c++ linux sleep screensaver xorg
3个回答
8
投票

从快速浏览一下MPlayer和SDL是怎么做的,有两件事情可以做,以防止屏幕保护程序从发射了:

  • 禁用该计划的持续时间: 使用XScreenSaverSuspend 使用的DBus,呼吁org.freedesktop.ScreenSaver.Inhibit
  • 定期ping到它: 使用XResetScreenSaver 使用的DBus,呼吁org.freedesktop.ScreenSaver.SimulateUserActivity

2
投票

据我所知,事情在名称XDG是去跨桌面环境功能的方式。似乎有a commandline utility called xdg-screensaver。它似乎有一堆硬屏保,然后回落到xset s off / xset s default,所以你可能要叫它它的安装时,或退回到复制其逻辑的一部分时,它不是...


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();   
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.