Ubuntu – How to lock without turning the screen (monitor) off

locklock-screenmonitorpower-managementunity

Due to a recent bug, each time my screen turns off, I cannot get it back on.

Currently, the screen starts turning off after the computer is locked – which effectively means that I cannot lock my computer without having to completely restart it.

Is there a way to lock it, but without the monitor going to sleep/off?

Best Answer

If you need or want a solution that prevents the screen to fall asleep, but that does dim/lock the screen after a while, there is another solution: instead of the system's own dim/lock option, use the script below to run in the background. You will need to install xprintidle.

How to set up:

  • Disable all dim / lock options in System Settings. (In Brightness & lock AND in "Energy" settings)

  • install xprintidle:

    sudo apt-get install xprintidle
    
  • Find your screen name; run in a terminal:

    xrandr
    

    Look for the name in the line where it says "connected". Your screen name could be for example VGA-1 or DVI-I-1.

  • Copy the script below, set the correct screen_name, the idle time before it should lock/dim the screen, and paste it into an empty file. Save it aslock_dim.py

The script

#!/usr/bin/env python3

import subprocess
import time

seconds = 600 # number of seconds to wait before lock/dim the screen
screen_name = "DVI-I-1" # example, replace it with your screen's name

awake = True

while True:
    curr_idle = subprocess.check_output(["xprintidle"]).decode("utf-8").strip()
    if awake == True:
        if int(curr_idle) > seconds*1000:
            command1 = "gnome-screensaver-command -l"
            command2 = "xrandr --output "+screen_name+" --brightness 0.1"
            subprocess.call(["/bin/bash", "-c", command1])
            subprocess.call(["/bin/bash", "-c", command2])
            awake = False
        else:
            pass
    elif awake == False:
        if int(curr_idle) > seconds*1000:
            pass
        else:
            command3 = "xrandr --output "+screen_name+" --brightness 1"
            subprocess.call(["/bin/bash", "-c", command3])
            awake = True
    time.sleep(2)

Test the script by opening a terminal and type:

python3 /path/to/lock_dim.py

If it works as you like, add it to your startup applications: Open Dash > "Startup Applications" > "Add", add the command:

python3 /path/to/lock_dim.py
Related Question