我正在尝试绑定一个键(使用xbindkeys
)来在 X 下打开/关闭我的显示器。到目前为止,我已将该键绑定到此脚本:
#!/bin/bash
MOUSE="Logitech USB-PS/2 Optical Mouse"
if [[ ! -z $(xset q | grep "Monitor is On") ]]; then
logger "Turning off display"
xinput disable "$MOUSE"
xset s 2 2
xset dpms force off
else
logger "Turning on display"
xinput enable "$MOUSE"
xset s 3600 3600
xset dpms force on
fi
此功能几乎完美运行:如果屏幕处于打开状态,它会禁用鼠标(以防止意外唤醒),将消隐时间设置为 2 秒(以防万一唤醒它)并关闭屏幕。如果屏幕处于关闭状态,它会恢复之前的设置并重新打开屏幕。
不幸的是,当实际绑定到某个键时,这似乎不起作用:它总是认为屏幕是打开的。我怀疑这是因为按下该键会将它们重新打开,然后运行脚本将它们再次关闭。
我找不到任何方法来防止屏幕在按键时自动打开,除非完全禁用键盘(这会使其很难重新打开)。
一个更好的解决方案是,如果我可以在屏幕打开/关闭时运行脚本;那么我仍然可以通过按任意键来重新打开屏幕,而不仅仅是绑定到该脚本的键。
答案1
按下绑定的键后,脚本会立即运行,但只有释放键时屏幕才会重新打开。
您可以通过输入进行测试
xset dpms force off
在您的终端上并按住Enter。
屏幕保持关闭状态,直到您松开按键,然后立即重新打开。
一个简单的解决方法是添加一个小的延迟,以便xset
在释放键后运行命令(sleep
例如,使用命令)。
答案2
我所做的事情是使用xscreensaver
(设置为仅空白屏幕,不运行任何图形黑客),然后使用以下命令观看它xscreensaver-command -watch
:
-watch Prints a line each time the screensaver changes state: when the
screen blanks, locks, unblanks, or when the running hack is
changed. This option never returns; it is intended for use by
shell scripts that want to react to the screensaver in some
way. An example of its output would be:
BLANK Fri Nov 5 01:57:22 1999
RUN 34
RUN 79
RUN 16
LOCK Fri Nov 5 01:57:22 1999
RUN 76
RUN 12
UNBLANK Fri Nov 5 02:05:59 1999
手册页中包含一个值得一看的示例。
不幸的是,库存xscreensaver
坚持不时将 DPMS 设置设置为自己的值。我提交了一个补丁来阻止它这样做,但 jwz 拒绝了。您可能会发现该补丁很有用 - 或者只需使用 编译 xscreensaver 即可--without-dpms-ext
。
或者,检查xscreensaver
代码以寻找有关如何编写自己的观察器的线索也可能会有所启发。