EMACS-DOCUMENT

=============>随便,谢谢

DPMS的乐趣-基于Emacs的屏幕保护程序

[[2019-02-28-2.png][2019-02-28-2.png]]

我有一堆显示器,有大的有小的,而且(通常)总是开着的。因为我太懒了,不想关来开去的。

这些显示屏上展示了一些有用的信息,但主要是装饰性的。例如,有些显示屏上显示温度数据,有些使用xscreensaver显示正在播放的专辑)。

但是我有很多灯以及其他东西需要在我按墙上的“我要睡觉了”按钮时,就会自动关闭。 我觉得让所有的显示器同时关闭应该很不错?然后我可以按下墙上的“我现在醒了”按钮,然后所有的监视器重新打开。

所以上网络搜索一番。

我原以为这很简单,但是…你知道的…电脑。

首先:关掉屏幕很容易:

$ xset dpms force off

就关了。

$ xset dpms force on; xset -dpms

会再次打开电源并禁用电源管理(以避免监控器自动再次关闭电源)。

到目前为止一切顺利!

但是,有很多东西会将监视器唤醒。

mpv

[[n-p1390339.jpg][n-p1390339.jpg]]

最简单的先来:我有一个小显示器全天候播放Youtube(显示天气数据)。

它会立即重新打开屏幕,因为它使用mpv来显示youtube视频。要关掉它,只要加 -no-stop-screensaver 参数。

Stereo Computer

[[n-p1390335.jpg][n-p1390335.jpg]]

每当歌曲改变时,我用来控制立体声的电脑屏幕就会自动打开,经过反复试验和阅读更多的代码,我发现了这个:

(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

[[n-p1390336.jpg][n-p1390336.jpg]]

许多大型屏幕使用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这样的东西?]