如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐?

2022-02-27 00:00:00 gtk c++ x11

问题

是否有方法可以防止X会话启动屏幕保护程序、进入省电模式或从代码执行屏幕消隐?

我使用的内容

语言:C/C++ GUI框架:GTK3 硬件:覆盆子PI 3B 软件:Raspbian 10-Buster

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

我知道的内容

GTK3可以确定屏幕保护程序是否处于活动状态

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

Raspbian使用屏幕消隐

Raspbian未随xscreensaver或其他软件包一起安装以控制关闭屏幕时间。相反,它主要依赖于X到空白屏幕。这可以作为超级用户使用xset命令进行管理。执行此操作的规范方法在特定于硬件的堆栈交换(here)中报告。

无法信任最终用户

在我的情况下,该程序将由几乎不懂计算机的人使用。结果必须是用户友好的,并且不期望用户触摸终端,更不用说永久更改X的启动配置了。虽然一种选择是将程序作为自定义的Raspbian磁盘映像分发,但我想探索其他选择。

我需要查看示例

虽然有一些地方可以开始使用this question,但实现它们是有问题的。当我尝试在带有和不带有注释行的情况下使用下面的MWE时,没有任何反应。我无法模拟屏幕消隐功能。

#include <X11/extensions/scrnsaver.h>

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

解决方案

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

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"

相关文章