CardiacPhase/Git/usr/bin/mintheme

402 lines
11 KiB
Plaintext
Raw Normal View History

2019-05-06 16:34:28 +02:00
#! /bin/sh
#############################################################################
# mintty theme switcher
# features:
# list themes from config directories
# set a theme from config directories
# set a theme from a file
# query current colour configuration as theme
# possible future features:
# set a theme from a URL
# load theme from a URL into config directory
# store current theme into config directory
help() {
echo "Usage:"
echo " `basename $0` [-h|-l]"
echo " `basename $0` THEME"
echo " `basename $0` -f THEMEFILE"
echo " `basename $0` --save [THEME|THEMEFILE]"
echo " `basename $0` [-t|-p|-%] IMAGE"
echo " `basename $0` [-s|-S] [PATTERNS]"
echo " `basename $0` [-d] -q > THEMEFILE"
echo "List/set/query mintty themes in current mintty window."
echo "A theme is a colour scheme to configure the 8 ANSI colours, their "
echo "bright versions, and optionally the foreground/background/cursor colours."
echo
echo "Arguments:"
echo " THEME set theme from config resources"
echo " -f, --file THEMEFILE set theme from themefile"
echo " --save [THEME|THEMEFILE] save theme also in config file"
echo " -t, --texture FILE[,DIM] set background texture (dim 1..255)"
echo " -p, --picture FILE[,DIM] set background picture (dim 1..255)"
echo " -%, --picscale FILE[,DIM] like -p and scale window"
echo " -q, --query query current colour configuration as theme"
echo " -d, --decimal decimal query output"
echo " -l, --list list available themes"
echo " -s, --show [PATTERN...] show (visualize) themes [matching PATTERNs]"
echo " -S, --Show [PATTERN...] show themes double-lined [matching PATTERNs]"
echo " -h, --help show this"
echo
echo "The following directories are considered for locating configured themes:"
echo ' ~/.mintty'
echo ' ~/.config/mintty'
echo ' $APPDATA/mintty'
echo ' /usr/share/mintty'
echo "Note that the command-line option --configdir cannot be considered."
}
showtheme() {
theme="$1"
export theme
sed \
-e 's/^\(ForegroundColour\)[ ]*=/\1=/' \
-e 's/^\(BackgroundColour\)[ ]*=/\1=/' \
-e 's/^\(CursorColour\)[ ]*=/\1=/' \
-e 's/^\(Black\)[ ]*=/\1=/' \
-e 's/^\(Red\)[ ]*=/\1=/' \
-e 's/^\(Green\)[ ]*=/\1=/' \
-e 's/^\(Yellow\)[ ]*=/\1=/' \
-e 's/^\(Blue\)[ ]*=/\1=/' \
-e 's/^\(Magenta\)[ ]*=/\1=/' \
-e 's/^\(Cyan\)[ ]*=/\1=/' \
-e 's/^\(White\)[ ]*=/\1=/' \
-e 's/^\(BoldBlack\)[ ]*=/\1=/' \
-e 's/^\(BoldRed\)[ ]*=/\1=/' \
-e 's/^\(BoldGreen\)[ ]*=/\1=/' \
-e 's/^\(BoldYellow\)[ ]*=/\1=/' \
-e 's/^\(BoldBlue\)[ ]*=/\1=/' \
-e 's/^\(BoldMagenta\)[ ]*=/\1=/' \
-e 's/^\(BoldCyan\)[ ]*=/\1=/' \
-e 's/^\(BoldWhite\)[ ]*=/\1=/' \
-e 't ok' -e d -e ': ok' -e 's/[ ]//g' \
"$1" |
(
cat <<\/EOS
xrgb() {
sed -e "s, , ,g" /usr/share/X11/rgb.txt |
sed -e "s/ *\([0-9][0-9]*\) *\([0-9][0-9]*\) *\([0-9][0-9]*\) *$1 *$/\1;\2;\3/" -e t -e d
}
ForegroundColour=39
BackgroundColour=49
CursorColour=49
Black=40
Red=41
Green=42
Yellow=43
Blue=44
Magenta=45
Cyan=46
White=47
BoldBlack=100
BoldRed=101
BoldGreen=102
BoldYellow=103
BoldBlue=104
BoldMagenta=105
BoldCyan=106
BoldWhite=107
/EOS
# transform colour specs:
# d,d,d
# d;d;d
# #RRGGBB
# 0xRR
# rgb:RR/GG/BB
# 0xRR
# rgb:RRRR/GGGG/BBBB
# 0xRR
# cmy:C.C/M.M/Y.Y
# r = (1 - c) * 255;
# g = (1 - m) * 255;
# b = (1 - y) * 255;
# cmyk:C.C/M.M/Y.Y/K.K
# r = (1 - c) * (1 - k) * 255;
# g = (1 - m) * (1 - k) * 255;
# b = (1 - y) * (1 - k) * 255;
# X11 color names
sed -e 's%=\([0-9]*\),\([0-9]*\),\([0-9]*\)%="\1;\2;\3"%' \
-e 's%=#\([0-9A-Fa-f][0-9A-Fa-f]\)\([0-9A-Fa-f][0-9A-Fa-f]\)\([0-9A-Fa-f][0-9A-Fa-f]\)%="$((0x\1));$((0x\2));$((0x\3))"%' \
-e 's%=rgb:\([0-9A-Fa-f][0-9A-Fa-f]\)/\([0-9A-Fa-f][0-9A-Fa-f]\)/\([0-9A-Fa-f][0-9A-Fa-f]\)%="$((0x\1));$((0x\2));$((0x\3))"%' \
-e 's%=rgb:\([0-9A-Fa-f][0-9A-Fa-f]\)[0-9A-Fa-f][0-9A-Fa-f]/\([0-9A-Fa-f][0-9A-Fa-f]\)[0-9A-Fa-f][0-9A-Fa-f]/\([0-9A-Fa-f][0-9A-Fa-f]\)[0-9A-Fa-f][0-9A-Fa-f]%="$((0x\1));$((0x\2));$((0x\3))"%' \
-e '/=cmy/ s%\([01]\)\.\([0-9]*\)%\1.\2000%g' \
-e '/=cmy/ s%\([01]\)\.\([0-9][0-9][0-9]\)[0-9]*%\1\2%g' \
-e '/=cmy:/ s%cmy:\([0-9/]*\)%cmyk:\1/0000%' \
-e 's%=cmyk:\([01][0-9][0-9][0-9]\)/\([01][0-9][0-9][0-9]\)/\([01][0-9][0-9][0-9]\)/\([01][0-9][0-9][0-9]\)%=cmyk:"$(( (1000 - \1) * (1000 - \4) * 255 / 1000000 ));$(( (1000 - \2) * (1000 - \4) * 255 / 1000000 ));$(( (1000 - \3) * (1000 - \4) * 255 / 1000000 ))"%' \
-e '/=cmyk:/ s%\([^0-9]\)0*\([0-9]\)%\1\2%g' -e 's%=cmyk:%=%' \
-e 's%=\([a-zA-Z][a-zA-Z ]*\)%=`xrgb "\1"`%' \
-e 't ok' -e d -e ': ok' -e 's%="%="48;2;%'
if $show2
then cat <<\/EOS
echo -en "\e[37;${Black}mblk"
echo -en "\e[30;${Red}mred"
echo -en "\e[30;${Green}mgrn"
echo -en "\e[30;${Yellow}mylw"
echo -en "\e[30;${Blue}mblu"
echo -en "\e[30;${Magenta}mmag"
echo -en "\e[30;${Cyan}mcyn"
echo -en "\e[30;${White}mwht"
echo -en "\e[39;${CursorColour}m "
echo -e "\e[m${theme}"
echo -en "\e[37;${BoldBlack}mBLK"
echo -en "\e[30;${BoldRed}mRED"
echo -en "\e[30;${BoldGreen}mGRN"
echo -en "\e[30;${BoldYellow}mYLW"
echo -en "\e[30;${BoldBlue}mBLU"
echo -en "\e[30;${BoldMagenta}mMAG"
echo -en "\e[30;${BoldCyan}mCYN"
echo -en "\e[30;${BoldWhite}mWHT"
echo -en "\e[39;${CursorColour}m "
echo -e "\e[${ForegroundColour};${BackgroundColour}m${theme}\e[m"
/EOS
else cat <<\/EOS
echo -en "\e[${ForegroundColour};${BackgroundColour}mfgbg"
echo -en "\e[39;${CursorColour}mC"
echo -en "\e[37;${Black}mbk"
echo -en "\e[30;${Red}mrd"
echo -en "\e[30;${Green}mgn"
echo -en "\e[30;${Yellow}myl"
echo -en "\e[30;${Blue}mbl"
echo -en "\e[30;${Magenta}mmg"
echo -en "\e[30;${Cyan}mcy"
echo -en "\e[30;${White}mwh"
echo -en "\e[37;${BoldBlack}mBK"
echo -en "\e[30;${BoldRed}mRD"
echo -en "\e[30;${BoldGreen}mGN"
echo -en "\e[30;${BoldYellow}mYL"
echo -en "\e[30;${BoldBlue}mBL"
echo -en "\e[30;${BoldMagenta}mMG"
echo -en "\e[30;${BoldCyan}mCY"
echo -en "\e[30;${BoldWhite}mWH"
echo -e "\e[m $theme"
/EOS
fi
) | sh
}
showthemes() {
for confdir in ~/.mintty ~/.config/mintty "$APPDATA"/mintty /usr/share/mintty
do if [ -d "$confdir/themes" -a -x "$confdir/themes" -a -r "$confdir/themes" ]
then echo "themes in '$confdir':"
(
cd "$confdir/themes"
for th in *[!~]
do for pat in "${@-}"
do case "$th" in
*$pat*) showtheme "$th";;
esac
done
done
)
fi
done
}
settheme() {
sed \
-e 's/^\(ForegroundColour\)[ ]*=/10;/' \
-e 's/^\(BackgroundColour\)[ ]*=/11;/' \
-e 's/^\(CursorColour\)[ ]*=/12;/' \
-e 's/^\(Black\)[ ]*=/4;0;/' \
-e 's/^\(Red\)[ ]*=/4;1;/' \
-e 's/^\(Green\)[ ]*=/4;2;/' \
-e 's/^\(Yellow\)[ ]*=/4;3;/' \
-e 's/^\(Blue\)[ ]*=/4;4;/' \
-e 's/^\(Magenta\)[ ]*=/4;5;/' \
-e 's/^\(Cyan\)[ ]*=/4;6;/' \
-e 's/^\(White\)[ ]*=/4;7;/' \
-e 's/^\(BoldBlack\)[ ]*=/4;8;/' \
-e 's/^\(BoldRed\)[ ]*=/4;9;/' \
-e 's/^\(BoldGreen\)[ ]*=/4;10;/' \
-e 's/^\(BoldYellow\)[ ]*=/4;11;/' \
-e 's/^\(BoldBlue\)[ ]*=/4;12;/' \
-e 's/^\(BoldMagenta\)[ ]*=/4;13;/' \
-e 's/^\(BoldCyan\)[ ]*=/4;14;/' \
-e 's/^\(BoldWhite\)[ ]*=/4;15;/' \
-e 't ok' -e d -e ': ok' -e 's/[ ]//g' \
-e "s/^/]/" -e "s/$//" "$1" |
tr -d '\012'
#]4;A;colour set ANSI colour A=0..15
#]10;colour set foreground colour
#]11;colour set background colour
#]12;colour set cursor colour
# unused:
#]104;A reset ANSI colour A=0..15
#]104 reset colour palette
#]110 reset foreground colour
#]111 reset background colour
#]112 reset cursor colour
}
query() {
len=$(( $1 + 3 ))
echo -n "]$2;?" > /dev/tty
read -s -n$len -t 2 esc < /dev/tty # read ESC ] prefix and colour index
read -s -n18 colour < /dev/tty # read rgb:colour spec
read -s -n1 -t 2 esc < /dev/tty # read ^G suffix
if $decimal
then
eval $( echo $colour | sed -e "s@rgb:\(..\)../\(..\)../\(..\)..@printf '$3=%d,%d,%d' 0x\1 0x\2 0x\3@" -e t -e "s,^,printf $3=," )
echo
else
# 4-digit hex
echo $3=$colour
# 2-digit hex
#echo $3=$colour | sed -e "s,rgb:\(..\)../\(..\)../\(..\)..,rgb:\1/\2/\3,"
fi
}
conftheme() {
themefile=`cygpath -wa "$1"`
for conffile in ~/.minttyrc ~/.config/mintty/config "$APPDATA/mintty/config" /etc/minttyrc
do if [ -w "$conffile" ]
then
newconf=/tmp/minttyrc.$$
# create new config file with modified entry
sed -n -e "/^ThemeFile[ ]*=/ q" -e p "$conffile" > "$newconf"
echo "ThemeFile=$themefile" >> "$newconf"
sed -e "1,/^ThemeFile[ ]*=/ d" "$conffile" >> "$newconf"
# copy new config file back
/bin/cp "$newconf" "$conffile"
/bin/rm "$newconf"
# feedback
echo "saved theme '$themefile'"
echo "in config file '$conffile'"
return
fi
done
}
decimal=false
show2=false
case "$1" in
-d|--decimal)
decimal=true
shift;;
esac
case `uname` in
Linux) if [ -n "$APPDATA" ]
then APPDATA=`wslpath "$APPDATA"`
else echo APPDATA not set >&2
exit
fi;;
esac
case "$1" in
-h|--help|'')
help
;;
-l|--list)
for confdir in ~/.mintty ~/.config/mintty "$APPDATA"/mintty /usr/share/mintty
do if [ -d "$confdir/themes" -a -x "$confdir/themes" -a -r "$confdir/themes" ]
then echo "themes in '$confdir':"
(cd "$confdir/themes"; ls *[!~])
fi
done;;
-s|--show)
shift
showthemes "$@";;
-S|--Show|--SHOW)
shift
show2=true
export show2
showthemes "$@";;
-f|--file)
if [ -z "$2" ]
then help
elif [ -r "$2" ]
then settheme "$2"
else echo cannot read theme file
fi;;
--save)
if [ -z "$2" ]
then help
elif [ -r "$2" ]
then
settheme "$2"
conftheme "$2"
else
for confdir in ~/.mintty ~/.config/mintty "$APPDATA"/mintty /usr/share/mintty
do if [ -r "$confdir/themes/$2" ]
then
echo setting theme from config dir "$confdir"
settheme "$confdir/themes/$2"
conftheme "$confdir/themes/$2"
exit
fi
done
echo theme not found
fi;;
-p|--picture)
if [ -z "$2" ]
then help
elif [ -r "${2/,*/}" ]
then echo "]11;_$2"
else echo cannot read picture file
fi;;
-%|--picscale)
if [ -z "$2" ]
then help
elif [ -r "${2/,*/}" ]
then echo "]11;%$2"
else echo cannot read picture file
fi;;
-t|--texture)
if [ -z "$2" ]
then help
elif [ -r "${2/,*/}" ]
then echo "]11;*$2"
else echo cannot read texture file
fi;;
-q|--query)
# echo "]10;?]11;?]12;?"
test -t 0 && stty=`stty -g`
test -t 0 && stty -echo min 0 time 5 # raw
query 2 "10" ForegroundColour
query 2 "11" BackgroundColour
query 2 "12" CursorColour
query 3 "4;0" Black
query 3 "4;1" Red
query 3 "4;2" Green
query 3 "4;3" Yellow
query 3 "4;4" Blue
query 3 "4;5" Magenta
query 3 "4;6" Cyan
query 3 "4;7" White
query 3 "4;8" BoldBlack
query 3 "4;9" BoldRed
query 4 "4;10" BoldGreen
query 4 "4;11" BoldYellow
query 4 "4;12" BoldBlue
query 4 "4;13" BoldMagenta
query 4 "4;14" BoldCyan
query 4 "4;15" BoldWhite
read -s -n1 -t 1 esc < /dev/tty # swallow final bogus '\'
test -t 0 && stty "$stty"
;;
-*) echo unknown argument;;
*)
if [ -r "$1" ]
then echo setting theme from config dir "$confdir"
settheme "$1"
exit
fi
for confdir in ~/.mintty ~/.config/mintty "$APPDATA"/mintty /usr/share/mintty
do if [ -r "$confdir/themes/$1" ]
then
echo setting theme from config dir "$confdir"
settheme "$confdir/themes/$1"
exit
fi
done
echo theme not found;;
esac
#############################################################################
# end