一定時間操作しないと画面がロックされますが、蓋を閉じてもロックされません。

一定時間操作しないと画面がロックされますが、蓋を閉じてもロックされません。

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 で画面をロックするにはどうすればよいでしょうか?

答え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
    

    5 分後に画面がオフになり、6 分後に画面がロックされます。

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

関連情報