A timer that automatically locks the screen to take a break away from the computer?

TakeaBreak

TakeaBreak is now on launchpad

sudo add-apt-repository ppa:vlijm/takeabreak
sudo apt-get update
sudo apt-get install takeabreak

Recently (also) pushed for 18.04 / 18.10 / 19.04


Disclaimer: I am the author

Feel free to file bugs etc. here, or comment here. Thanks to orschiro for the nice question, and Rinzwind for the encouragement!


remaining break- seconds (using countdown- option)

enter image description here

Settings

enter image description here

enter image description here


EDIT

An integrated & modernized version for Ubuntu Budgie is now available:

enter image description here enter image description here


enter image description here


This applet will most likely be available by default in Ubuntu Budgie 19.04, but can now be achieved here as an experimental one.


You may also want to consider Workrave. I found it easy to use and highly customizable. It also has some preatty nice stats about how you use the computer and how many breaks you take. Lastly, I believe it can also sync itself between many computers, which is useful if, for example, you work both on the laptop and on a school computer.

workrave rest break prompt

EDIT: It has many other features that I haven't mentioned, like suggesting some exercises for you to do while the screen is blocked. And it can take into account only the time you're using the computer, so it won't prompt you with a break when you come back from the toilet :)

EDIT 2:

Make sure you check out the "Reading" mode!

The above feature of only counting the time you've been actively using the computer can be seen as a bug if you're not doing much (no mouse, no keyboard events) because it will only prompt your break when you cumulate 1h of usage (or how much time you've set up). In these situations, enabling the "Reading" mode will make it prompt at the exact time, regardless of usage.


Crude, minimalist, command-line way:

sleep 1500; gnome-screensaver-command -l; sleep 300; killall gnome-screensaver

That can also be turned into a desktop shortcut or turned into function in .bashrc

Why 1500 and 300? because that's seconds, 1500 seconds /60 seconds per minute = 25 minutes.


Below is a script for a timer that allows setting variable session and break time, as well as methods of signalling the break.

Remember that any script on linux must be saved as a file and have executable permissions set with chmod +x /path/to/script.sh. Once that is done, you can bind the script to a shortcut as show in How do I bind .sh files to keyboard combination? or create a desktop shortcut as shown in How can I create launchers on my desktop?

When you launch the script you should see a menu like this:

enter image description here

#!/bin/bash

# Author: Serg Kolo
# Date : Nov 17th, 2015
# Purpose: pomodoro timer script,
# with bunch of options
# Written for: https://askubuntu.com/q/696620/295286

#####################################################
# screenSaver function
# this one uses gnome-screensaver-command for locking
# and killall for unlocking the screen;
# $1 is provided from chooseBreakMethod function
#####################################################

function screenSaver
{
  gnome-screensaver-command -l; sleep $1 ; killall gnome-screensaver 
}


##############################################
# dialogBreak function
# this serves as "screensaver". The screen is never 
# actually locked but rather we open terminal window 
# with a simple command line dialog
# in full sccrean mode
# $1 provided in chooseBreakMethod function
##################################################
function dialogBreak
{
 gnome-terminal --full-screen  -e  "bash -c 'sleep $1 | dialog --progressbox \"TAKE A BREAK\" 100 100 ' "
}

#################################################################
# dimScreen function 
# dims the screen using xrandr; the --brightness 
# can be configured
# for full or partial dimming using decimal values
# from 1 to 0
# $1 is provided from chooseBreakMethod function
################################################################

function dimScreen
{
  xrandr  | awk '$2 == "connected" {print $1}' | xargs -I % xrandr --output % --brightness 0.5
  notify-send 'Take a Break'
  sleep $1
  xrandr  | awk '$2 == "connected" {print $1}' | xargs -I % xrandr --output % --brightness 1
}

##############################
# getSettings function
# This is where the user enters 
# the settings they want
# All the values must be integers
#############################
function getSettings
{
  FORM=$(zenity --forms \ --title="Sergiy's Tomato Script" --text="Choose this session options" \
   --add-entry="Number of Sessions (how many loops)" \
   --add-entry="Session time (minutes)" \
   --add-entry="Break time (minutes)" \
   --add-entry="Dim,dialog,or screensaver? (1,2,3)" \
   --separator=" " )  

  [ $? -eq 0 ] || exit 1

   echo $FORM
}

################################
# chooseBreakMethod function
# A helper function that calls appropriate
# break method, based on the value we got
# from getSettings function
# Because dialogBreak calls gnome-terminal
# this function exits, so it doesn't wait
# Therefore we need to add additional sleep
# command
###############################

function chooseBreakMethod
{

 # $1 is method passed from  ${SETS[3]}
 # $2 is break time passed from ${SETS[2]}
  case $1 in
    1) dimScreen $2 ;;
        2) dialogBreak $2 ; sleep $2 ;;
    3) screenSaver $2 ;;
  esac

}


function minutesToSeconds
{
  echo $(($1*60))
}

#################
# MAIN
#################

# get user settings and store them into array
# Item 0 : num sessions
# Item 1 : session duration
# Item 2 : break duration
# Item 3 : break method - lockscreen, dialog, or just
# turn off the screen 
# SETS == settings
SETS=( $(getSettings) )

COUNTER=${SETS[0]}

#######################################
# This is where most of the job is done
# we loop according to number of session
# specified in the  getSettings function
#########################################

notify-send 'Session started'
while [ $COUNTER -ne 0  ]; do

  sleep $( minutesToSeconds ${SETS[1]} ) # session timer
  chooseBreakMethod ${SETS[3]} $( minutesToSeconds ${SETS[2]} )
  COUNTER=$(($COUNTER-1))
done

notify-send "tomatoScript is done"
####### END OF SCRIT ###########