191 lines
5.9 KiB
Bash
Executable File
191 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#=======================================================================================
|
|
#
|
|
# Transforms cava music visualizer in a cool desktop decoration
|
|
#
|
|
# Author: Guido_Fe
|
|
#
|
|
# Dependencies (and credits):
|
|
# xdotool
|
|
# cava
|
|
# URxvt
|
|
# devilspie
|
|
#
|
|
# Usage:
|
|
#
|
|
# To start, execute this script. To stop, execute this sctipt again.
|
|
#
|
|
# Description:
|
|
#
|
|
# This script starts the cava music visualizer on a transparent backround through URxvt
|
|
# ('cause it's easy to customize and support transparent foreground and background). It
|
|
# then uses devilspie to strip it of his window decorations and rules, move it to the
|
|
# right place and resize it.
|
|
# Problem: the panel doesn't allow you to focus the windows below it.
|
|
# My solution: move cava under the screen when the mouse pointer go over
|
|
# it, and reset its position when I move the pointer away. I accomplished this
|
|
# behavior with xdotool.
|
|
#
|
|
#========================================================================================
|
|
|
|
#=============
|
|
# PARAMETERS TO SET
|
|
#
|
|
# Remember to don't leave spaces before and after the equal symbol
|
|
|
|
# X value of the screen resolution
|
|
Xscreen=1366
|
|
|
|
# Y value
|
|
Yscreen=768
|
|
|
|
# Offset applied to the window's vertical position
|
|
offset=5
|
|
|
|
# Height of the cava panel
|
|
h=200
|
|
|
|
# If you want to use a different cava config, set this parameter to the respective path or
|
|
# leave '' if you don't want to change it
|
|
cavaConf=''
|
|
|
|
# Set these parameters if you want to transform a default terminal color to another one.
|
|
# This is useful if you want to have semitransparent cava bars. To do so, first set the
|
|
# cava bar colors to a default one, different to the background (white, red, green...),
|
|
# form the cava config file, and assign it's color number to the inColor variable.
|
|
# The numbers are:
|
|
#
|
|
# black='0', red='1', green='2', yellow='3', blue='4', magenta='5', cyan='6', white='7'
|
|
#
|
|
# then set the outColor variable to the color you
|
|
# want. Examples: inColor='2' outColor='[80]#223454', where 80 is the alpha level. The
|
|
# alpha level can be '0' (fully transparent), '100' (fully opaque, or a value in between.
|
|
# For outCol you can also use normal color definitions, like '#223454'.
|
|
# As usual, leave both blank ('') if you don't want to set them.
|
|
inCol='5'
|
|
outCol='[80]#fd971f'
|
|
|
|
# Set after how much time this program will check your mouse coordinates, in seconds. Higher the value, slower
|
|
# the response, but less cpu usage
|
|
mouseDelay=0.3
|
|
|
|
# After how much time the program will read a file in a loop (seconds). It will directly influence how
|
|
# fast the window under the cava panel will regain focus after hiding the panel.
|
|
fileCheck=0.1
|
|
|
|
# Time between each frame of the panel transition animation (seconds). Can be 0
|
|
trTime=0.01
|
|
|
|
# How much the panel move in each frame of the transition animation (pixels).
|
|
# It must be positive
|
|
trPixel=10
|
|
#=============
|
|
|
|
# Process parameters
|
|
|
|
|
|
if [ ! $cavaConf = '' ]; then
|
|
cavaConf=" -p $cavaConf"
|
|
fi
|
|
if [ ! $inCol = '' -a ! $outCol = '' ]; then
|
|
inCol=" --color$inCol"
|
|
outCol=" $outCol"
|
|
else
|
|
inCol=''
|
|
outCol=''
|
|
fi
|
|
#Check if it's already running
|
|
if [ $# -eq 0 ]; then
|
|
if [ `cat /tmp/processesToKill 2> /dev/null | wc -l` -ne 0 ]; then
|
|
#Kills the processes of the other instance and itself
|
|
echo "Found another $0 running, killig it and terminating..."
|
|
kill -15 `cat /tmp/processesToKill` > /dev/null 2>&1
|
|
rm /tmp/processesToKill
|
|
killall cava
|
|
exit
|
|
else
|
|
#It hasn't found other instances, call himself with the argument 'start'
|
|
#to start cava
|
|
echo "Starting the visualizer..."
|
|
#$0 start
|
|
#UNCOMMENT THE LINE ABOVE and comment the line below if you want to debug
|
|
setsid $0 'start' >/dev/null 2>&1 < /dev/null &
|
|
# focus on the right window
|
|
eval $(xdotool getmouselocation --shell)
|
|
sleep 0.1
|
|
xdotool windowfocus $WINDOW
|
|
exit
|
|
fi
|
|
elif [ "$1" = 'start' ]; then
|
|
#The core of the program
|
|
echo $$ >> /tmp/processesToKill
|
|
#File that xdotool uses to communicate when the mouse go over the panel
|
|
isTriggeredFile='/tmp/isTriggered'
|
|
echo 0 > $isTriggeredFile
|
|
#Write the conf file for devilspie
|
|
echo '(and
|
|
(is (window_name) "cava")
|
|
(is (window_class) "URxvt")
|
|
(begin
|
|
(stick)
|
|
(above)
|
|
(pin)
|
|
(undecorate)
|
|
(skip_pager)
|
|
(skip_tasklist)
|
|
(wintype "dock")
|
|
(geometry "'$Xscreen'x'$h'+0+'`expr $Yscreen - $h + $offset`'")
|
|
)
|
|
)' > /tmp/cava.ds
|
|
#Start urxvt and execute cava in it. Change the color white to the one chosen
|
|
urxvt -bg "[0]red"$inCol$outCol -b 0 -depth 32 +sb -e cava$cavaConf &
|
|
wPid=$!
|
|
echo $wPid >> /tmp/processesToKill
|
|
# Starts devilspie, that will move and resize the window
|
|
devilspie /tmp/cava.ds > /dev/null &
|
|
echo $! >> /tmp/processesToKill
|
|
# Get the window id (!= pid) of the instance
|
|
sleep 0.5
|
|
pids=`xdotool search --class "URxvt"`
|
|
for pid in $pids; do
|
|
name=`xdotool getwindowname $pid`
|
|
if [[ $name == *"cava"* ]]; then
|
|
wId=$pid
|
|
fi
|
|
done
|
|
# Wait that the mouse go over the window. When it does, write 1 to $isTriggeredFile
|
|
# and move the window over the bottom edge of the screen, hiding it
|
|
xdotool behave $wId mouse-enter windowmove x $Yscreen exec sh -c "echo 1 > $isTriggeredFile" > /dev/null &
|
|
echo $! >> /tmp/processesToKill
|
|
# Infinite loop hide/show
|
|
while [ 0 -eq 0 ]; do
|
|
# what for the mouse to go over the panel
|
|
while [ `cat $isTriggeredFile` = 0 ]
|
|
do
|
|
sleep $fileCheck
|
|
done
|
|
echo 0 > $isTriggeredFile
|
|
# focus on the right window
|
|
eval $(xdotool getmouselocation --shell)
|
|
xdotool windowfocus $WINDOW
|
|
cursorExited=0;
|
|
# wait for the mouse to leave the bottom of the screen
|
|
while [ $cursorExited -eq 0 ]; do
|
|
eval $(xdotool getmouselocation --shell)
|
|
if [ $Y -lt `expr $Yscreen - $h + $offset` ]; then
|
|
# Reset cava position
|
|
cursorExited=1
|
|
Yd=$Yscreen
|
|
Ydefault=`expr $Yscreen - $h + $offset`
|
|
while [ $Yd -gt $Ydefault ]; do
|
|
Yd=`expr $Yd - $trPixel`
|
|
sleep $trTime
|
|
xdotool windowmove $wId x $Yd
|
|
done
|
|
xdotool windowmove $wId x $Ydefault
|
|
fi
|
|
sleep $mouseDelay
|
|
done
|
|
done
|
|
fi
|