如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐?
问题
是否有方法可以防止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"
相关文章