一段时间不活动后锁定屏幕,但合上盖子时不会锁定

一段时间不活动后锁定屏幕,但合上盖子时不会锁定

运行带有 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

因为我们现在负责我们自己的程序。

然后:

  1. 该脚本使用xprintidle, 检查空闲时间

    sudo apt-get install xprintidle
    
  2. 将脚本复制到一个空文件中,另存为set_times.py
  3. 在脚本的头部部分,设置关闭屏幕的空闲时间(以秒为单位):

    # set screen off after x seconds
    off = 300
    

    以及锁定屏幕的时间:

    # lock screen after x seconds
    lock = 360
    

    这些时间是彼此独立设置的,您可以按照您喜欢的任何顺序进行设置(先锁定,然后关闭,或反过来)

    设置时间“分辨率”,检查空闲时间的频率(从而对设置的时间进行四舍五入):

    # check idle every x seconds
    res = 3
    

    但你最好

  4. 测试运行:

    python3 /path/to/set_times.py
    
  5. 如果一切正常,请将其添加到启动应用程序: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
    

    五分钟后关闭屏幕,六分钟后锁定屏幕。

  • 脚本的额外负担为零。

相关内容