web-dev-qa-db-ja.com

非アクティブな期間の後、画面をロックしますが、蓋を閉じたときはロックしません

Ubuntu 16.04をUnityで実行します。

  • ノートパソコンを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で画面をロックするにはどうすればよいですか?

2
Byte Commander

以下のバックグラウンドスクリプトは、説明したとおりに正確に機能します。

  • 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

私たちは今、私たち自身の手順を大事にしているからです。

then:

  1. スクリプトはxprintidleを使用して、アイドル時間を確認します

    Sudo apt-get install xprintidle
    
  2. スクリプトを空のファイルにコピーし、set_times.pyとして保存します
  3. スクリプトのheadセクションで、画面をオフにするアイドル時間(秒単位)を設定します。

    # set screen off after x seconds
    off = 300
    

    そして、画面をロックする時間:

    # lock screen after x seconds
    lock = 360
    

    これらの時間は互いに独立して設定されます。両方を好きな順序で設定できます(最初にロックしてから、スイッチを切る、またはその逆)

    あなたはcan時間「解像度」、アイドル時間をチェックする頻度を設定します(したがって、設定時間は四捨五入されます):

    # check idle every x seconds
    res = 3
    

    あなたもそうかもしれない

  4. テスト実行:

    python3 /path/to/set_times.py
    
  5. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加コマンドを追加します。

    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
    

    5分後に画面をオフにし、6分後に画面をロックします。

  • スクリプトの追加の負担はゼロです。

2
Jacob Vlijm