已经有很多与此类似的问题,但我能找到的所有问题都有建议投票方法的答案(1,2)或者看起来像极端黑客(3),所以我想问同样的问题,但附加警告,解决方案不得使用轮询:
我正在寻找的是 Linux 桌面系统上常用(或易于安装)的某种 API,它可以让您监听这两个事件:
- 用户已经“空闲”了
N
几秒钟(没有移动鼠标、没有在键盘上打字等)(您可以在其中指定N
)。 - 在之前触发 (1) 后(并且只有在那时!),用户现在已经执行了一些活动,不应再被视为空闲。在此事件之后,可以重新触发 (1),从而重复该循环。
对于 (1),它在没有轮询的情况下发生对我来说并不是很重要,因为在我的用例中,对第一种类型的事件做出反应时的延迟容忍度足够高,我可以每 10 秒轮询一次。但对于事件 (2),反应应该是即时的,因此使用轮询方法时,我必须每隔 0.1 秒左右轮询一次,这对 CPU 时间来说是一种不可接受的浪费。1
因此,我认为(1)通过建议使用类似xprintidle
轮询方式的方式“解决”了,但由于(2)的定义依赖于(1),我觉得无论如何都应该在这里列出它。
对于实现 (2) 的 API 有什么想法吗?屏保等是如何做到的?
1 要了解这里的动机,请比较如果dpms
在 10 分 10 秒(而不是您配置的 10 分钟)后关闭屏幕,与检测到后延迟 10 秒再次打开屏幕,您的感觉如何活动...在我看来,大多数用例都意味着对“空闲检测”比“非空闲检测”有更大的容忍度。