Подтвердить что ты не робот

Как программно предотвратить спящий режим Linux или включить скринсейвер?

При разработке небольшой кросс-платформенной игры на С++ я столкнулся со следующей проблемой: когда игроки играют с геймпадом USB, не касаясь клавиатуры или мыши, компьютер автоматически спит во время игры.

В Windows это можно сделать легко, используя SetThreadExecutionState. В OS X я думаю, что это можно сделать с помощью UpdateSystemActivity, но пока не проверено.

Но проблема в том, что в Linux нет ничего похожего на общий API между DE. Я обнаружил, что в Gnome вы можете остановить автоматическое приостановку, используя вызовы DBus Inhibit() и Uninhibit(), но он работает только для Gnome.

Итак, существует ли программный путь перекрестного DE (или не-DE), например, если пользователь использует что-то вроде dwm или awesome wm), чтобы предотвратить систему Linux (используя Xorg и без root доступ конечно) от сна или включения скринсейвера без изменения файлов конфигурации пользователя?

PS: Не думайте, что это слишком сложно, но не знаю, как, к сожалению.

4b9b3361

Ответ 1

Из быстрого взгляда на то, как это делают mplayer и SDL, есть две возможности, которые вы можете сделать, чтобы предотвратить запуск скринсейвера:

  • Отключите его на время работы программы:
    • Использование XScreenSaverSuspend
    • Использование DBus, вызов org.freedesktop.ScreenSaver.Inhibit
  • Пинг его периодически:
    • Использование XResetScreenSaver
    • Использование DBus, вызов org.freedesktop.ScreenSaver.SimulateUserActivity

Ответ 2

Насколько я могу судить, все, что связано с xdg в названии, - это путь для работы в межсетевой среде. Как представляется, утилита командной строки, называемая xdg-screensaver. Кажется, у него есть куча скринсейверов, а затем возвращается к xset s off/xset s default, поэтому вы можете просто вызвать его, когда он установлен, или вернуться к копированию части своей логики, когда он не...

Ответ 3

Я использую 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();   
        }
    }
}