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

时间:2015-07-19 04:52:35

标签: c++ linux sleep screensaver xorg

在使用C ++开发小型跨平台游戏时,我遇到了以下问题:当玩家在没有触摸键盘或鼠标的情况下玩USB游戏手柄时,计算机会在玩游戏时自动进入睡眠状态。

在Windows中,可以使用SetThreadExecutionState功能轻松完成。在OS X中,我认为可以使用UpdateSystemActivity完成但尚未测试。

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

  

那么,是否存在以编程方式交叉DE方式(或非DE方式,例如,如果用户使用dwmawesome wm之类的方式)来阻止 Linux 系统(使用 Xorg ,当然没有root访问权限)从睡眠或打开屏幕保护程序而不更改用户配置文件?

PS:不要以为它太复杂了,但不知道有多么不幸。

3 个答案:

答案 0 :(得分:8)

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

  • 在程序期间禁用它:
    • 使用XScreenSaverSuspend
    • 使用DBus,调用org.freedesktop.ScreenSaver.Inhibit
  • 定期Ping:
    • 使用XResetScreenSaver
    • 使用DBus,调用org.freedesktop.ScreenSaver.SimulateUserActivity

答案 1 :(得分:2)

据我所知,名称中包含xdg的内容是跨桌面环境功能的方法。似乎有a commandline utility called xdg-screensaver。它似乎有一堆屏幕保护程序硬连线,然后回退到xset s off / xset s default,所以你可能只想在它安装时调用它,或者当它不是时复制它的部分逻辑...

答案 2 :(得分: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();   
    }
  }
}
相关问题