【问题标题】:How to programmatically prevent linux computer from sleeping or turning on screensaver?如何以编程方式防止 linux 计算机休眠或打开屏幕保护程序?
【发布时间】:2015-07-19 04:52:34
【问题描述】:

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

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

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

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

PS:不要觉得太复杂,但不知道有多遗憾。

【问题讨论】:

  • 听起来实际的问题是操作系统没有将“游戏手柄”视为活动 - 应该在操作系统驱动程序中修复。
  • 垫子是对的。您不应继续修改用户设置。当您的程序崩溃或我必须强行终止它时会发生什么?我记得游戏搞乱了各种设置,比如桌面的亮度/颜色。即使你分叉,我也可能会对机器进行硬重置。您的方法应该是中断暂停,而不是禁用/启用它。
  • @Etherealone 是的,我不会修改用户设置,但如何防止它暂停?我知道X11里面有一个XResetScreensaver的功能,不过只是个屏保,不是休眠,对吧?
  • 我正在解决同样的问题 (askubuntu.com/q/655531/171608)。是否有将游戏手柄输入转换为暂停计时器重置的应用程序?有人做了一个来防止屏幕保护程序启动 (launchpad.net/~foresto/+archive/ubuntu/toys)。但是在 Linux 上使用游戏手柄玩游戏时,我找不到任何可以避免暂停的东西。
  • 这听起来像是 Caffeine 应该处理的事情,所以我提交了一个错误报告:bugs.launchpad.net/caffeine/+bug/1530544 请访问并点击“此错误影响您”。

标签: c++ linux sleep screensaver xorg


【解决方案1】:

快速浏览一下 mplayer 和 SDL 是如何做到这一点的,您可以做两件事来防止屏幕保护程序启动:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 据我了解,xset 是更改用户显示选项的用户偏好实用程序,对吧?当然它会起作用,但是,如果程序崩溃或用户强行禁用它怎么办?它会弄乱用户的设置。
      猜你喜欢
      • 2016-11-11
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多