DPMS的乐趣-基于Emacs的屏幕保护程序
[[][]]
我有一堆显示器,有大的有小的,而且(通常)总是开着的。因为我太懒了,不想关来开去的。
这些显示屏上展示了一些有用的信息,但主要是装饰性的。例如,有些显示屏上显示温度数据,有些使用xscreensaver显示正在播放的专辑)。
但是我有很多灯以及其他东西需要在我按墙上的“我要睡觉了”按钮时,就会自动关闭。 我觉得让所有的显示器同时关闭应该很不错?然后我可以按下墙上的“我现在醒了”按钮,然后所有的监视器重新打开。
所以上网络搜索一番。
我原以为这很简单,但是…你知道的…电脑。
首先:关掉屏幕很容易:
$ xset dpms force off
就关了。
$ xset dpms force on; xset -dpms
会再次打开电源并禁用电源管理(以避免监控器自动再次关闭电源)。
到目前为止一切顺利!
但是,有很多东西会将监视器唤醒。
mpv
[[][]]
最简单的先来:我有一个小显示器全天候播放Youtube(显示天气数据)。
它会立即重新打开屏幕,因为它使用mpv来显示youtube视频。要关掉它,只要加 -no-stop-screensaver 参数。
Stereo Computer
[[][]]
每当歌曲改变时,我用来控制立体声的电脑屏幕就会自动打开,经过反复试验和阅读更多的代码,我发现了这个:
(set-mouse-pixel-position (selected-frame) 2000 0)
这段代码的目的是将鼠标指针移出屏幕。而导致X唤醒了屏幕!
我猜……这挺有道理的?我的意思是,移动鼠标应该会唤醒屏幕,所以……
我加了如下的保护:
(defun jukebox-monitor-on-p () (with-temp-buffer (call-process "xset" nil t nil "q") (goto-char (point-min)) (search-forward "Monitor is On" nil t)))
xscreensaver
[[][]]
许多大型屏幕使用xscreensaver来显示正在播放的专辑套面,而xscreensaver 会在几秒钟内唤醒屏幕。这不是讽刺吗!
你不觉得吗?
就像一个屏幕保护程序,打开已经受到保护的屏幕
哦,我在哪……
xscreensaver有很多与pmds相关的选项:
dpmsEnabled: False dpmsQuickOff: False dpmsStandby: 24:00:00 dpmsSuspend: 24:00:00 dpmsOff: 24:00:00
但似乎没有一个能解决这个问题。xscreensaver 依然顽固地唤醒屏幕。怎么回事,jwz?
所以。
这个问题的唯一解决方案是编写一个基于emacs的屏幕保护程序。
很明显。
它使用xelb库来查询空闲状态(调度何时开始保护屏幕),并在关闭屏保窗口后查询/恢复焦点。
天哪。如果有人能为xelb编写一个手册就太好了。用它工作真是有点令人沮丧的,因为你只能到处闲逛,看看例子,直到你突然得到一些有用的东西。 我花了大约七千小时(大约)来摆脱这种无所事事的状态,直到我猜出(通过查看exwm对randr扩展所做的操作)要写的内容。
在调用xcb:screensaver:QueryInfo函数之前执行
(xcb:get-extension-data x 'xcb:screensaver)
[编辑:Emacs给我几乎所有的事件都是关于famer(鼠标和击键)的,但当用户按下shift等操作却没有触发事件。有没有办法从xelb库中获取类似xcb_wait_for_event这样的东西?]