问题
有没有办法阻止 X 会话启动屏幕保护程序、进入省电模式或通过代码执行屏幕空白?
我正在做什么
语言:C/C++
图形用户界面框架:GTK3
硬件:树莓派3B
软件:Raspbian 10 - Buster
我的程序需要在屏幕上长时间运行(最多 12 小时),并且 GUI 运行而无需用户交互。 GUI 充当现场系统的状态监视器(如果屏幕变黑,则表明出现问题)。
我知道的
GTK3可以判断屏幕保护程序是否处于活动状态
GTK3 有一个布尔属性来报告系统的屏幕保护程序是否处于活动状态(请参阅here https://developer.gnome.org/gtk3/stable/GtkApplication.html#GtkApplication--screensaver-active),但文档中没有提供其他参考。
Raspbian 使用屏幕消隐
Raspbian 没有安装xscreensaver
或其他包来控制屏幕关闭时间。相反,它主要依赖 X 来“黑屏”。这可以通过以下方式进行管理xset
以超级用户身份执行命令。执行此操作的规范方法在特定于硬件的 Stack Exchange 中报告(here https://raspberrypi.stackexchange.com/questions/2059/disable-screen-blanking-in-x-windows-on-raspbian#2079).
最终用户不可信
就我而言,该程序将由几乎不懂计算机的人使用。结果必须是用户友好的,并且不期望用户触摸终端,更不用说对启动配置进行永久更改X
。虽然一种选择是将程序作为自定义的 Raspbian 磁盘映像分发,但我想探索其他选择。
我需要看一个例子
虽然有一些地方可以开始使用这个问题 https://stackoverflow.com/questions/31498114/how-to-programmatically-prevent-linux-computer-from-sleeping-or-turning-on-scree,实施它们是有问题的。当我尝试使用以下带注释行和不带注释行的 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
use:
Display *
gdk_x11_display_get_xdisplay (GdkDisplay *display);
Docs here https://developer.gnome.org/gdk3/stable/gdk3-X-Window-System-Interaction.html#gdk-x11-display-get-xdisplay.
For X:
/* use the information from the environment variable DISPLAY
to create the X connection:
*/
Display * dis = XOpenDisplay((char *)0); // or ":0.0"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)