[笔记: 注意到了类似的问题但从未收到回复。]
我正在i3
使用archlinux
.我已将 DPMS 设置为在 2 分钟不活动后暂停显示 ( xset dpms 0 120 180
)。然而,我注意到它并不总是自动启动。我不认为这是硬件问题,因为执行xset dpms force
工作没有问题。
我的设置:
$ xset q
Keyboard Control:
auto repeat: on key click percent: 0 LED mask: 00000000
XKB indicators:
00: Caps Lock: off 01: Num Lock: off 02: Scroll Lock: off
03: Compose: off 04: Kana: off 05: Sleep: off
06: Suspend: off 07: Mute: off 08: Misc: off
09: Mail: off 10: Charging: off 11: Shift Lock: off
12: Group 2: off 13: Mouse Keys: off
auto repeat delay: 660 repeat rate: 25
auto repeating keys: 00ffffffdffffbbf
fadfffefffedffff
9fffffffffffffff
fff7ffffffffffff
bell percent: 50 bell pitch: 400 bell duration: 100
Pointer Control:
acceleration: 2/1 threshold: 4
Screen Saver:
prefer blanking: yes allow exposures: yes
timeout: 0 cycle: 600
Colors:
default colormap: 0x22 BlackPixel: 0x0 WhitePixel: 0xffffff
Font Path:
/usr/share/fonts/TTF/,/usr/share/fonts/OTF/,built-ins
DPMS (Energy Star):
Standby: 0 Suspend: 120 Off: 180
DPMS is Enabled
Monitor is On
如何根据 DPMS 设置确定是什么阻止了我的显示器暂停?
答案1
您可以使用这个小程序来检查它是否可能是由于某些用户输入(鼠标过于敏感?)或应用程序主动重置 XScreenSaver 扩展空闲计时器造成的:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>
/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */
int main(int argc, char *argv[])
{
Display *display;
int event_base, error_base;
XScreenSaverInfo info;
float seconds;
display = XOpenDisplay("");
if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);
seconds = (float)info.idle/1000.0f;
printf("%f\n",seconds);
return(0);
}
else {
fprintf(stderr,"Error: XScreenSaver Extension not present\n");
return(1);
}
}
答案2
对于 2022 年遇到此问题的任何人,请检查 $HOME 中的 .xsession_errors 并查看是否有某些内容不会阻止待机。就我而言,chrome 中的一个视频阻止了 DPMS 关闭显示器
powerdevil: Enforcing inhibition from ":1.23" "/usr/bin/google-chrome-stable" with cookie 3821 and reason "Video Wake Lock"
powerdevil: Added change screen settings
powerdevil: Added interrupt session
powerdevil: Disabling DPMS due to inhibition
答案3
为了改进@L29Ah的答案,Github上有一个程序可以打印X在没有输入事件的情况下走了多长时间:https://github.com/g0hl1n/xprintidle
因此,要隔离 X 输入是否阻止监视器挂起,您可以执行以下操作:
$ xset dpms 3 3 3 # Set your monitor to turn off after 10 seconds:
$ while true; do sleep 1 && xprintidle; done
如果即使在 3 秒后时间仍然增加,则不是 X 输入阻止了显示器关闭。
就我而言,它是一个杂散的 SMPlayer 窗口,它一定认为它已聚焦,但实际上并未聚焦。因此,请继续关闭窗口,直到找到阻止挂起的窗口。