X11 - 如何确定是什么阻止了 DPMS 暂停我的显示器?

X11 - 如何确定是什么阻止了 DPMS 暂停我的显示器?

[笔记: 注意到了类似的问题但从未收到回复。]

我正在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 窗口,它一定认为它已聚焦,但实际上并未聚焦。因此,请继续关闭窗口,直到找到阻止挂起的窗口。

相关内容