2015-07-19 6 views
13

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

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

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

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

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

+3

Похоже, актуальной проблемой является то, что ОС Безразлично» так как «игровой пульт» как активность - должен быть исправлен в драйверах ОС. –

+0

Маты правы. Вы не должны продолжать и изменять настройки пользователя. Что произойдет, когда ваша программа выйдет из строя или я вынужден ее принудительно прекратить? Я помню, как игры испортили все настройки, такие как яркость/цвет рабочего стола. Даже если вы вилкой, я могу сделать жесткий сброс на машине. Ваш подход должен быть * прерыванием * приостановки, а не отключением/включением. – Etherealone

+0

@Etherealone yep, я не буду изменять настройки пользователя, но как предотвратить его приостановку? Я знаю, что в 'X11' есть функция XResetScreensaver', но это просто экранная заставка, а не спать, не так ли? – FalconUA

ответ

7

От быстрый взгляд на то, как 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

Насколько я понимаю, xset - это утилита пользовательских настроек, которая меняет параметры отображения пользователя, не так ли? Конечно, это сработает, но что, если программа выйдет из строя или пользователь принудительно отключит ее? Это испортит настройки пользователя. – FalconUA