Экран блокировки после периода неактивности, но не при закрытии крышки

Под управлением Ubuntu 16.04 с Единицей, я хочу это

  • когда я оставляю свой ноутбук нетронутым в течение 5 минут, выключаю экран
  • Спустя 1 минуту после выключения экрана для неактивности, заблокируйте экран.

  • когда я закрываю крышку ноутбука, сразу не блокируйте экран, но действуйте как то, если крышка была все еще открыта и блокировка после 5+1 минуты (или подобна).

В Параметрах настройки системы → Яркость и Блокировка, если установленная Блокировка к НА и настраивают подходящее время (1 минута), она блокирует экран соответственно после того, как она была выключена для неактивности. Однако это также immeidately блокирует экран при закрытии крышки, которую я не хочу.
Установка его к ПРОЧЬ заставляет его не заблокировать экран при закрытии крышки, но также и оставляет разблокированным после выключения экрана для неактивности.

Я ни на "что" уже установил оба "близких действия крышки" в dconf:

$ 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 заблокировать экран только после определенного времени пользовательской неактивности, независимо от положения крышки?

2
задан 6 January 2017 в 17:04

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. Если все хорошо работает, добавьте его для Запущения Приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

    python3 /path/to/set_times.py
    

Объяснение на понятии

  • Команда xprintidle возвращает текущее время простоя (никакой вход от мыши или клавиатуры)
  • Сценарий затем тестирует, если время набора меньше затем определенный порог и сравнивает состояние с несколько секунд назад.
  • Если существует изменение в состоянии (Верный-> Ложь), любые меры могут быть приняты. Это сделано для обоих, выключают экран, работая:

    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
    

    выключит экран после пяти минут, заблокирует экран после шесть.

  • Дополнительная нагрузка сценария является нулем.

2
ответ дан 2 December 2019 в 03:43

Другие вопросы по тегам:

Похожие вопросы: