【问题标题】:How to disable screensaver/power-management/screen-blanking when a GTK program is running?如何在 GTK 程序运行时禁用屏幕保护程序/电源管理/屏幕黑屏?
【发布时间】:2020-10-30 13:12:39
【问题描述】:

问题

有没有一种方法可以防止 X 会话启动屏幕保护程序、进入省电模式或从代码中执行屏幕空白?

我在做什么

语言:C/C++ 图形界面框架:GTK3 硬件:树莓派 3B 软件:Raspbian 10 - Buster

我的程序需要在没有用户交互的情况下运行 GUI 长时间(最长 12 小时)在屏幕上运行。 GUI 充当现场系统的状态监视器(如果屏幕变黑,说明出现问题)。

我知道的

GTK3 可以判断屏保是否开启

GTK3 有一个布尔属性来报告系统的屏幕保护程序是否处于活动状态(请参阅here),但文档中没有其他参考。

Raspbian 使用屏幕消隐

Raspbian 没有安装xscreensaver 或其他包来控制屏幕关闭时间。相反,它主要依靠 X 来“黑屏”。这可以作为超级用户使用xset 命令进行管理。在特定于硬件的 Stack Exchange (here) 中报告了执行此操作的规范方法。

不能信任最终用户

就我而言,该程序将由几乎不具备计算机知识的人使用。结果必须是用户友好的,并且不希望用户触摸终端,更不用说对X 的启动配置进行永久更改。虽然一种选择是将程序作为定制的 Raspbian 磁盘映像分发,但我想探索其他选择。

我需要看一个例子

虽然有一些地方可以开始使用this question,但实施它们是有问题的。当我尝试使用带有和不带有注释行的以下 MWE 时,什么都没有发生。我无法模拟屏幕空白功能。

#include <X11/extensions/scrnsaver.h>

int main() {
    // XScreenSaverSuspend;
    XForceScreenSaver;
    usleep(1000000);
    return 0;
}

【问题讨论】:

    标签: c++ gtk x11


    【解决方案1】:

    你必须将参数传递给函数:

    void XScreenSaverSuspend(Display *dpy, Bool suspend);
    
    #include <X11/extensions/scrnsaver.h>
    
    int main() {
        XScreenSaverSuspend (display, True);
        usleep(1000000);
        return 0;
    }
    

    但我认为您没有时间查看该程序的结果,并且当程序结束时,屏幕保护程序会返回到之前的状态。

    对于您的 GTK 框架,您可以获取Display 使用:

    Display *
    gdk_x11_display_get_xdisplay (GdkDisplay *display);
    

    文档here.

    对于 X:

    /* use the information from the environment variable DISPLAY 
       to create the X connection:
    */  
    Display * dis = XOpenDisplay((char *)0); // or ":0.0"
    

    【讨论】:

    • 短时间应该通过我的MWE中的注释行来解决。但是我如何拉入display?假设我的显示器地址是:0,我该如何将它传达给代码?懒惰并在那里投射int 0 会给我带来愤怒的错误消息。我在寻找如何从 X11 的深奥文档中提取该值时遇到了一些麻烦。
    • 感谢您的有用编辑。不幸的是,这种方法似乎没有产生结果。虽然我可以毫无错误地运行 X11 标头命令,但它似乎对实际屏幕状态或xset 报告的值没有任何影响。
    【解决方案2】:

    一个 hacky、特定于操作系统的解决方案:

    Raspbian 似乎不需要超级用户提升来修改xset。在代码中添加该行:

    system("xset -dpms");
    system("xset s off");
    

    足以关闭电源管理设置和屏幕保护程序。

    这显然是草率的,如果程序在这些有机会重置为默认值之前中断,它可能会使操作系统处于不良状态。鼓励更优雅的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多