The Cookie Machine - Click here to drag window

DUMMY TEXT - Real text set in assets/js/theCookieMachine.js

If you can read me, I'm broken!

Views: 2,357β€…    Votes:  4β€…
Tags: 18.04   xubuntu   notification   eyesome  
Link: πŸ” See Original Answer on Ask Ubuntu ⧉ πŸ”—

URL: https://askubuntu.com/q/1092835
Title: I'm looking for a command to flash screens (if possible in colors)
ID: /2018/11/14/I_m-looking-for-a-command-to-flash-screens-_if-possible-in-colors_
Created: November 14, 2018    Edited:  November 16, 2018
Upload: March 26, 2024    Layout:  post
TOC: false    Navigation:  false    Copy to clipboard:  false


I made a bash script to meet the objective:

flash-primary-screen.sh.gif

flash-primary-screen.sh bash script

Copy this bash script to your computer:

#!/bin/bash

# NAME: flash-primary-screen.sh
# PATH: ~/bin
# DESC: Flashes primary screen colours to alert timer has ended.
# DATE: November 15, 2018

# NOTE: Written for: https://askubuntu.com/a/1092835/307523
#       I'm looking for a command to flash screens (if possible in colors)

# Change 6 variables below to control screen flashing levels
MaxBright="1.5"
MinBright=".5"
MaxRed="2.0"
MaxGreen="2.0"
MaxBlue="2.0"
MinGamma=".5"

declare aXrandr=()

# Next two functions lifted from: eyesome internet sunrise/sunset time screen
# brightness and gamma controller: https://github.com/WinEunuuchs2Unix/eyesome

InitXrandrArray () {

    # Array is used for each monitor and searched by name.
    # Save time to search on connected/disconnected, primary monitor,
    # brightness level, gamma level.

    mapfile -t aXrandr < <(xrandr --verbose --current)
    
} # InitXrandrArray

SearchXrandrArray () {

    # Parms: $MonXrandrName = xrandr monitor name to search for.

    # NOTE: Entries in array follow predicatble order from xrandr --verbose:

    #       <MONITOR-NAME> connected / disconnected (line 1 of monitor entry)
    #       Gamma:      0.99:0.99:0.99              (line 5 of entry)
    #       Brightness: 0.99                        (line 6 of entry)
    #       CRTC:       9                           (line 8 of entry)

    fNameFnd=false
    fBrightnessFnd=false
    fGammaFnd=false
    fCrtcFnd=false
    XrandrConnection=disconnected
    XrandrPrimary=false
    XrandrGamma=""
    XrandrBrightness=""
    XrandrCRTC=""           # Laptop lid open value=0, lid closed=blank

    for (( i=0; i<"${#aXrandr[*]}"; i++ )) ; do

        line="${aXrandr[$i]}"
        # Have we looped to next monitor and not found search string?
        if [[ "$line" =~ " connected " ]] && [[ $fNameFnd == true ]] ; then
            break
        fi

        if [[ "$line" =~ ^"$MonXrandrName connected" ]]; then
            fNameFnd=true
            XrandrConnection=connected
            [[ "$line" =~ "primary" ]] && XrandrPrimary=true
        fi

        if [[ $fNameFnd == true ]] && [[ $fGammaFnd == false ]] ; then
            if [[ "$line" =~ "Gamma: " ]]; then
                fGammaFnd=true
                XrandrGamma="${line##* }"
                # TODO: Use `xgamma` for accuracy
            fi
        fi

        if [[ $fGammaFnd == true ]] && [[ $fBrightnessFnd == false ]] ; then
            if [[ "$line" =~ "Brightness: " ]]; then
                fBrightnessFnd=true
                XrandrBrightness="${line##* }"
            fi
        fi

        if [[ $fBrightnessFnd == true ]] && [[ $fCrtcFnd == false ]] ; then
            if [[ "$line" =~ "CRTC: " ]]; then
                fCrtcFnd=true
                XrandrCRTC="${line##* }"
                break
            fi
        fi
        
    done
    
} # SearchXrandrArray

FlipBright () {

    if [[ $NewBrightness == "$MaxBright" ]] ; then
        NewBrightness="$MinBright"
    else
        NewBrightness="$MaxBright"
    fi
    
} # FlipBright

CleanUp() {

    xrandr --output "$MonXrandrName" --gamma "$SaveGamma" \
           --brightness "$SaveBrightness"

    # Compensate for bug in Xrandr as of Nov 15, 2018 with second call
    InitXrandrArray
    SearchXrandrArray
    xrandr --output "$MonXrandrName" --gamma "$XrandrGamma"
    exit 0

} # CleanUp

Main () {

    trap CleanUp INT TERM

    # Get primary monitor current settings
    XrandrName=$(xrandr --current | grep primary)
    MonXrandrName="${XrandrName%% *}"
    InitXrandrArray
    SearchXrandrArray

    # Did we find primary monitor ok?
    if [[ $fBrightnessFnd == false ]] || [[ $fGammaFnd == false ]] ; then
        echo "Internal Error: Could not find Primary Screen brightness or gamma"
        echo XrandrPrimary: "$XrandrPrimary"
        echo aXrandr[0]: "${aXrandr[0]}"
        echo Brightness: "$XrandrBrightness"
        echo Gamma: "$XrandrGamma"
        exit 2
    fi

    # Restore these values when CleanUping program
    SaveBrightness="$XrandrBrightness"
    SaveGamma="$XrandrGamma"

    # Wait for <Ctrl>+C or until parent kills us.
    while true ; do
        if [[ $Red == true ]] ; then
            Red=false
            Green=true
            NewGamma="$MaxRed:$MinGamma:$MinGamma"
            FlipBright
        elif [[ $Green == true ]] ; then
            Green=false
            NewGamma="$MinGamma:$MaxGreen:$MinGamma"
            FlipBright
        else
            Red=true
            NewGamma="$MinGamma:$MinGamma:$MaxBlue"
            FlipBright
        fi

        xrandr --output "$MonXrandrName" --gamma "$NewGamma" \
       --brightness "$NewBrightness"

        sleep .2

    done

} # Main

Main "$@"

Mark the script as executable using:

chmod a+x /path/flash-primary-screen.sh

Where /path is the directory you placed the script.

Call the script from your program (or even the command line). To end the script press Ctrl+C.

Change the first 6 variables defined to manipulate the brightness level and color level changes.

Don’t hesitate to ask questions or post suggestions in comment section below!


You can also have color flashing ASCII Art text in the terminal:

bashVTcodes.gif

Here is the script:

#!/bin/bash

From: http://wiki.bash-hackers.org/scripting/terminalcodes
DATA[0]="     _/  _/    _/                            _/    "
DATA[1]="  _/_/_/_/_/  _/_/_/      _/_/_/    _/_/_/  _/_/_/ "
DATA[2]="   _/  _/    _/    _/  _/    _/  _/_/      _/    _/"
DATA[3]="_/_/_/_/_/  _/    _/  _/    _/      _/_/  _/    _/ "
DATA[4]=" _/  _/    _/_/_/      _/_/_/  _/_/_/    _/    _/  "

# virtual coordinate system is X*Y ${#DATA} * 5

REAL_OFFSET_X=0
REAL_OFFSET_Y=0

draw_char() {
  V_COORD_X=$1
  V_COORD_Y=$2

  tput cup $((REAL_OFFSET_Y + V_COORD_Y)) $((REAL_OFFSET_X + V_COORD_X))

  printf %c ${DATA[V_COORD_Y]:V_COORD_X:1}
}


trap 'exit 1' INT TERM
trap 'tput setaf 9; tput cvvis; clear' EXIT

tput civis
clear

while :; do

for ((c=1; c <= 7; c++)); do
  tput setaf $c
  for ((x=0; x<${#DATA[0]}; x++)); do
    for ((y=0; y<=4; y++)); do
      draw_char $x $y
    done
  done
done

done

To generate the ASCII Art you can use Figlet or Toilet. See: When terminal is opened can I get current calendar and time displayed?

⇧ How to run script after resuming from sleep? How can one copy the entire contents of a Linux Terminal / "man" pages to a a text editor (gedit in this instance)?  β‡©