运行带有 Unity 的 Ubuntu 16.04,我想要
- 当我 5 分钟内没有碰过笔记本电脑时,就关闭屏幕
关闭屏幕 1 分钟后,如果因不活动而关闭屏幕,则锁定屏幕。
当我合上笔记本电脑盖时,不会立即锁定屏幕,而是像盖子仍然打开一样,并在 5+1 分钟后锁定(或类似时间)。
在系统设置 → 亮度和锁定,如果设置锁并ON配置适当的时间(1 分钟),它会在因不活动而关闭屏幕后相应地锁定屏幕。但是,它也会立即在合上盖子时锁定屏幕,这是我不想要的。将
其设置为OFF使其在合上盖子时不锁定屏幕,但在因不活动而关闭屏幕后仍保持解锁状态。
我已在 dconf 中将“lid-close-actions”都设置为“nothing”:
$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action
'nothing'
$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-battery-action
'nothing'
如何让 Ubuntu 仅在用户不活动特定时间后锁定屏幕,而不管盖子位置如何?
答案1
下面的背景脚本将完全按照你描述的方式执行
- x 秒后关闭屏幕
- y 秒后锁定屏幕
剧本
#!/usr/bin/env python3
import subprocess
import time
# set screen off after x seconds
off = 300
# lock screen after x seconds
lock = 360
# check idle every x seconds
res = 3
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def test(t, threshold):
return int(t)/1000 < threshold
testoff1 = True
testlock1 = True
t1 = 0
while True:
time.sleep(res)
t2 = get("xprintidle")
testoff2 = test(t2, off); testlock2 = test(t2, lock)
if (testoff2, testoff1) == (False, True):
subprocess.Popen(["xset", "dpms", "force", "off"])
if (testlock2, testlock1) == (False, True):
subprocess.Popen(["gnome-screensaver-command", "-l"])
testoff1 = testoff2; testlock1 = testlock2
如何使用
正如您提到的,您需要关闭现有的盖子动作:
gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
和:
gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
此外:
gsettings set org.gnome.desktop.screensaver lock-enabled false
和
gsettings set org.gnome.desktop.session idle-delay 0
因为我们现在负责我们自己的程序。
然后:
该脚本使用
xprintidle
, 检查空闲时间sudo apt-get install xprintidle
- 将脚本复制到一个空文件中,另存为
set_times.py
在脚本的头部部分,设置关闭屏幕的空闲时间(以秒为单位):
# set screen off after x seconds off = 300
以及锁定屏幕的时间:
# lock screen after x seconds lock = 360
这些时间是彼此独立设置的,您可以按照您喜欢的任何顺序进行设置(先锁定,然后关闭,或反过来)
你能设置时间“分辨率”,检查空闲时间的频率(从而对设置的时间进行四舍五入):
# check idle every x seconds res = 3
但你最好
测试运行:
python3 /path/to/set_times.py
如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
python3 /path/to/set_times.py
概念解释
- 该命令
xprintidle
返回当前空闲时间(没有鼠标或键盘输入) - 然后脚本测试设置时间小于定义的阈值,并与几秒前的状态进行比较。
如果状态发生变化(True --> False),则可以采取任何措施。这适用于关闭屏幕,运行:
xset dpms force off
并锁定屏幕,运行:
gnome-screensaver-command -l
笔记
当然,我们也可以设置关闭和锁定屏幕的时间参数使用以下命令运行脚本:
#!/usr/bin/env python3 import subprocess import time import sys off = int(sys.argv[1]) if len(sys.argv) > 1 else 300 lock = int(sys.argv[2]) if len(sys.argv) > 2 else off + 60 # check idle every x seconds res = int(sys.argv[3]) if len(sys.argv) > 3 else 5 def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip() def test(t, threshold): return int(t)/1000 < threshold testoff1 = True testlock1 = True t1 = 0 while True: time.sleep(res) t2 = get("xprintidle") testoff2 = test(t2, off); testlock2 = test(t2, lock) if (testoff2, testoff1) == (False, True): subprocess.Popen(["xset", "dpms", "force", "off"]) if (testlock2, testlock1) == (False, True): subprocess.Popen(["gnome-screensaver-command", "-l"]) testoff1 = testoff2; testlock1 = testlock2
然后运行:
python3 /path/to/set_times.py 300 360
五分钟后关闭屏幕,六分钟后锁定屏幕。
脚本的额外负担为零。