Answers:
好问题。让我们找出答案!
首先研究 “不活动时暂停”的选项,
<property ...>Suspend when inactive for</property> ...
<object ... id="combobox_sleep_ac">
我们可以了解到它设置了一个名为GSettings的键sleep-inactive-ac-timeout
:
widget = GTK_WIDGET (gtk_builder_get_object (..., "combobox_sleep_ac")); ...
g_object_set_data (G_OBJECT(widget), "_gsettings_key", "sleep-inactive-ac-timeout");
该密钥的文档提供了简要说明:
电脑进入睡眠状态之前,必须先关闭交流电源的时间(以秒为单位)。值为0表示从不。
但仍然无法解释“无效”的含义。
搜索为sleep-inactive-ac-timeout
使我们GNOME设置守护进程,
timeout_sleep = g_settings_get_int (..., "sleep-inactive-ac-timeout");
它会定期检查 GNOME Session的一个属性Presence.status
:
result = g_dbus_proxy_get_cached_property (...->session_presence_proxy, "status");
idle_set_mode (..., GSD_POWER_IDLE_MODE_SLEEP);
因此,我们需要学习GNOME Session如何确定系统是否为“空闲”。
从GNOME Session 更新值的位置开始Presence.status
,
gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, ...);
我们可以看到它使用了IDLETIME
Xorg 的计数器:
if (... && strcmp (counters[i].name, "IDLETIME") == 0) {
...->counter = counters[i].counter;
该IDLETIME
计数器的行为总结在博客文章由GNOME电源管理器的作者:
gnome-power-manager在Xorg内部使用一个称为IDLETIME的计数器。仅当用户不移动鼠标或单击某些键时,此计数器才会增加。当用户单击某些内容时,将重置IDLECOUNTER。
这告诉我们,Ubuntu通过测量自上次击键或鼠标移动以来经过的时间来确定不活动状态。不考虑CPU使用率和网络活动。
wake up calls
。