
Хочу запустить Ubuntu 16.04 с Unity.
- когда я оставляю свой ноутбук нетронутым в течение 5 минут, выключаю экран
Через 1 минуту после отключения экрана при бездействии заблокируйте экран.
когда я закрываю крышку ноутбука, НЕ блокируйте экран сразу, а действуйте так, как будто крышка все еще открыта, и блокируйте ее через 5+1 минуту (или около того).
ВСистемные настройки → Яркость и блокировка, если установленоЗамоки ONнастроить соответствующее время (1 минута), он блокирует экран соответственно после того, как он был выключен из-за бездействия. Однако он также немедленно блокирует экран при закрытии крышки, что мне не нужно.
Установка его на OFFделает так, что он не блокирует экран при закрытии крышки, но также оставляет его разблокированным после выключения экрана из-за бездействия.
Я уже установил оба параметра «lid-close-actions» на «nothing» в 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 блокировал экран только после определенного времени бездействия пользователя, независимо от положения крышки?
решение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
Если все работает нормально, добавьте его в Startup Applications: Dash > Startup Applications > Add. Добавьте команду:
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
выключит экран через пять минут, заблокирует экран через шесть минут.
Дополнительная нагрузка сценария равна нулю.