Files
mabox-colorizer/bin/w2theme
2026-02-05 01:58:08 +01:00

544 lines
16 KiB
Bash
Executable File

#!/bin/bash
#
# colorizer - set of tools for Mabox (auto)theming
# Copyright (C) 2022-2025 Daniel Napora <napcok@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# w2theme - generate themes from wallpaper colors
WALLPALDIR="$HOME/.cache/colorizer/palettes"
mkdir -p "$WALLPALDIR"
read WALLPATH<<< $(grep file "$HOME"/.config/nitrogen/bg-saved.cfg | tail -1 | cut -d'=' -f2)
NAME=${WALLPATH////_}
if [[ "${NAME}" =~ ^_home_.* ]]; then
n=${#HOME}
((n++))
NAME=${NAME:${n}}
fi
if [ ! -f "$WALLPALDIR/$NAME.clr" ]; then
if [ "$ext" == "avif" ];then
magick ${WALLPATH} -resize 25% /tmp/out.jpg
magick /tmp/out.jpg -colors 12 -unique-colors txt:- |grep -v '^#'| awk '{print substr($3,1,7)}' |pastel sort-by brightness |pastel format hex > "$WALLPALDIR/$NAME.clr"
else
magick ${WALLPATH} -resize 25% -colors 12 -unique-colors txt:- |grep -v '^#'| awk '{print substr($3,1,7)}' |pastel sort-by brightness |pastel format hex > "$WALLPALDIR/$NAME.clr"
fi
fi
mapfile -t w < "$WALLPALDIR/$NAME.clr"
if [[ "${#w[@]}" -lt 8 ]]; then
w+=("#2e3440" "#4c566a" "#5e81ac" "#bf616b" "#b48ead" "#a3be8c" "#ebcb8b" "#d8dee9" "#eceff4")
fi
accents=("#e93d57" "#c7162b" "#e9633a" "#e95620" "#f4a300" "#e8cc2d" "#3cd425" "#0e8420" "#00d3b7" "#18b0b0" "#3dade9" "#686b6f" "#3584e4" "#916ee4" "#b875dc" "#77216e" "#c748ba" "#e93a9a")
menu_theme () {
jgctl theme MBcolors
case "$1" in
dark2) #dark bg
ITEM_FG=$(pastel textcolor ${w[1]}|pastel format hex)
if [[ "${ITEM_FG}" == *"ffffff"* ]];then
ITEM_FGCOLOR="#c0c0c0"
else
ITEM_FGCOLOR="#222222"
fi
jgctl color_menu_bg "${w[1]}"
jgctl color_menu_bg_to "${w[2]}"
jgctl color_menu_border "${w[2]}"
jgctl color_norm_fg "${ITEM_FGCOLOR}"
jgctl color_title_bg "${w[0]}"
jgctl color_title_fg "${w[-1]}"
jgctl color_title_border "${w[0]}"
jgctl color_sel_bg "${w[3]}"
jgctl color_sel_fg "${ITEM_FG}"
jgctl color_sel_border "${w[2]}"
jgctl color_sep_fg "${w[2]}"
jgctl color_norm_bg "${w[1]}"
#sleep 1
;;
dark) #dark bg
ITEM_FG=$(pastel textcolor ${w[0]}|pastel format hex)
if [[ "${ITEM_FG}" == *"ffffff"* ]];then
ITEM_FGCOLOR="#c0c0c0"
else
ITEM_FGCOLOR="#222222"
fi
jgctl color_menu_bg "${w[0]}"
jgctl color_menu_bg_to "${w[1]}"
jgctl color_menu_border "${w[2]}"
jgctl color_norm_fg "${ITEM_FGCOLOR}"
jgctl color_title_bg "${w[1]}"
jgctl color_title_fg "${w[-1]}"
jgctl color_title_border "${w[0]}"
jgctl color_sel_bg "${w[5]}"
jgctl color_sel_fg "${ITEM_FG}"
jgctl color_sel_border "${w[2]}"
jgctl color_sep_fg "${w[2]}"
jgctl color_norm_bg "${w[0]}"
#sleep 1
;;
light) #light bg
ITEM_FG=$(pastel textcolor ${w[-1]}|pastel format hex)
if [[ "${ITEM_FG}" == *"ffffff"* ]];then
ITEM_FGCOLOR="#c0c0c0"
else
ITEM_FGCOLOR="#222222"
fi
jgctl color_menu_bg "${w[-1]}"
jgctl color_menu_bg_to "${w[-2]}"
jgctl color_menu_border "${w[-3]}"
jgctl color_norm_fg "${ITEM_FGCOLOR}"
jgctl color_title_bg "${w[-3]}"
jgctl color_title_fg "${w[0]}"
jgctl color_title_border "${w[-3]}"
jgctl color_sel_bg "${w[-2]}"
jgctl color_sel_fg "${ITEM_FG}"
jgctl color_sel_border "${w[-3]}"
jgctl color_sep_fg "${w[-3]}"
jgctl color_norm_bg "${w[-1]}"
#sleep 1
;;
light2) #light bg
ITEM_FG=$(pastel textcolor ${w[-1]}|pastel format hex)
if [[ "${ITEM_FG}" == *"ffffff"* ]];then
ITEM_FGCOLOR="#c0c0c0"
else
ITEM_FGCOLOR="#222222"
fi
jgctl color_menu_bg "${w[-2]}"
jgctl color_menu_bg_to "${w[-3]}"
jgctl color_menu_border "${w[-4]}"
jgctl color_norm_fg "${ITEM_FGCOLOR}"
jgctl color_title_bg "${w[-1]}"
jgctl color_title_fg "${w[0]}"
jgctl color_title_border "${w[-3]}"
jgctl color_sel_bg "${w[-1]}"
jgctl color_sel_fg "${ITEM_FG}"
jgctl color_sel_border "${w[-3]}"
jgctl color_sep_fg "${w[-3]}"
jgctl color_norm_bg "${w[-2]}"
#sleep 1
;;
esac
case "$2" in
show)
colorizer-menus -s
;;
*):;;
esac
}
conky_colors() {
needrestart=0
if pgrep -u $USER -f "conky -c" ;then
conky_toggle stop
needrestart=1
fi
source ~/.config/colorizer/colorizer.conf
case "$1" in
dark) #dark bg
conkyctl win_bgcolor_all "${w[0]}"
conkyctl default_color_all "${w[-2]}"
conkyctl color0_all "${w[-4]}"
conkyctl color1_all "${w[-5]}"
conkyctl color2_all "${w[-3]}"
conkyctl color3_all "${w[-2]}"
;;
*) #light bg
conkyctl win_bgcolor_all "${w[-1]}"
conkyctl default_color_all "${w[1]}"
conkyctl color0_all "${w[2]}"
conkyctl color1_all "${w[5]}"
conkyctl color2_all "${w[3]}"
conkyctl color3_all "${w[2]}"
;;
esac
#bars/graphs color
#random
#conkyctl color2_all "${accents[ $RANDOM % ${#accents[@]} ]}"
conkyctl fix_transparent_conkies
sleep 1
[[ "$needrestart" == "1" ]] && conky_toggle start
}
conky_colorsone () {
source ~/.config/colorizer/colorizer.conf
case "$1" in
dark) #dark bg
conkyctl win_bgcolor "${w[0]}" "${2}"
conkyctl default_color "${w[-2]}" "${2}"
conkyctl color0 "${w[-4]}" "${2}"
conkyctl color1 "${w[-5]}" "${2}"
conkyctl color2 "${w[-3]}" "${2}"
conkyctl color3 "${w[-2]}" "${2}"
;;
*) #light bg
conkyctl win_bgcolor "${w[-1]}" "${2}"
conkyctl default_color "${w[1]}" "${2}"
conkyctl color0 "${w[2]}" "${2}"
conkyctl color1 "${w[5]}" "${2}"
conkyctl color2 "${w[3]}" "${2}"
conkyctl color3 "${w[2]}" "${2}"
;;
esac
#conkyctl color2_all "${accents[ $RANDOM % ${#accents[@]} ]}" "${2}"
}
pyradio_theme() {
case "$1" in
dark) #dark bg
prtctl stations "${w[-3]}" "${w[0]}"
prtctl active_station "${w[-1]}"
prtctl status_bar "${w[0]}" "${w[-3]}"
prtctl normal_cursor "${w[1]}" "${w[-4]}"
prtctl active_cursor "${w[2]}" "${w[-3]}"
prtctl edit_cursor "${w[2]}" "${w[-3]}"
prtctl extra_func "${w[6]}"
prtctl pyradio_url "${w[2]}"
prtctl messages_border "${w[2]}"
;;
*) # light bg
prtctl stations "${w[4]}" "${w[-1]}"
prtctl active_station "${w[0]}"
prtctl status_bar "${w[0]}" "${w[-3]}"
prtctl normal_cursor "${w[4]}" "${w[-3]}"
prtctl active_cursor "${w[2]}" "${w[-3]}"
prtctl edit_cursor "${w[2]}" "${w[-3]}"
prtctl extra_func "${w[6]}"
prtctl pyradio_url "${w[2]}"
prtctl messages_border "${w[4]}"
;;
esac
}
cava () {
case "$1" in
light) #light bottom
cavactl gradientcolors "${w[-3]}" "${w[3]}"
cavactl foregroundcolor "${w[-3]}"
cavactl reload_colors
;;
dark) #dark bottom
cavactl gradientcolors "${w[3]}" "${w[-3]}"
cavactl foregroundcolor "${w[3]}"
cavactl reload_colors
;;
*)
:
;;
esac
}
accent () {
#obtctl clractivebg ${1}
#colorTo=$(pastel darken 0.2 "${1}"|pastel format hex)
#obtctl clractivebgto ${colorTo}
# JGMENU based menus, sidepanels and tools
#jgctl color_title_bg ${1}
#TITLE_FG=$(pastel textcolor ${colorTo}|pastel format hex)
#TITLE_FG=$(pastel textcolor ${1}|pastel format hex)
#notify-send.sh "title_fg $TITLE_FG" "${w[1]} ${w[-1]}"
#if [[ "${TITLE_FG}" == *"ffffff"* ]];then
#FG=${w[-2]}
#BBG=${w[1]}
#else
#FG=${w[2]}
#BBG=${w[1]}
#fi
SEL_FG=$(pastel textcolor ${1}|pastel format hex)
#jgctl color_title_fg ${FG}
#jgctl color_title_border ${BBG}
jgctl color_sel_bg ${1}
jgctl color_sel_bg 100
jgctl color_sel_fg ${SEL_FG}
}
gradient () {
source ~/.config/colorizer/colorizer.conf
#notify-send.sh "zmiennne" "${1} ${2}"
if [ "$gradient_obtheme" = "yes" ]; then
obtctl activegradient "${1}" "${2}"
fi
if [ "$gradient_menu" = "yes" ]; then
jgctl gradient "${1}" "${2}"
fi
if [ "$gradient_conkies" = "yes" ]; then
conkygradient "${1}" "${2}"
fi
}
conkygradient () {
CONKYDIR="$HOME"/.config/conky
for i in "$CONKYDIR"/*_mbcolor*; do
if [[ "$i" = *"sysinfo_graph"* ]];then
conkyctl win_bgcolor ${1} ${i}
FG_COLOR=$(pastel textcolor ${1}|pastel format hex)
if [[ "${FG_COLOR}" == *"ffffff"* ]]; then
conkyctl default_color ${w[-1]} ${i}
conkyctl color0 ${w[-2]} ${i}
conkyctl color1 ${w[-3]} ${i}
else
conkyctl default_color ${w[0]} ${i}
conkyctl color0 ${w[1]} ${i}
conkyctl color1 ${w[2]} ${i}
fi
conkyctl color2 ${2} ${i}
elif [[ "$i" = *"sysinfo_mb"* ]];then
conkyctl win_bgcolor ${2} ${i}
FG_COLOR=$(pastel textcolor ${2}|pastel format hex)
if [[ "${FG_COLOR}" == *"ffffff"* ]]; then
conkyctl default_color ${w[-1]} ${i}
conkyctl color0 ${w[-2]} ${i}
conkyctl color1 ${w[-3]} ${i}
else
conkyctl default_color ${w[0]} ${i}
conkyctl color0 ${w[1]} ${i}
conkyctl color1 ${w[2]} ${i}
fi
conkyctl color2 ${1} ${i}
elif [[ "$i" == *"logo"* ]];then
:
else
ran="$((RANDOM % 8))"
rand=$((ran + 1))
BG=$(pastel mix -f 0.${rand} ${1} ${2}|pastel format hex)
conkyctl win_bgcolor ${BG} ${i}
FG_COLOR=$(pastel textcolor ${BG}|pastel format hex)
if [[ "${FG_COLOR}" == *"ffffff"* ]]; then
conkyctl default_color ${w[-1]} ${i}
conkyctl color0 ${w[-2]} ${i}
conkyctl color1 ${w[-3]} ${i}
else
conkyctl default_color ${w[0]} ${i}
conkyctl color0 ${w[1]} ${i}
conkyctl color1 ${w[2]} ${i}
fi
fi
done
}
obtheme () {
case "$1" in
dark)
obtctl clractivebg ${w[2]}
TITLE_FG=$(pastel textcolor ${w[2]}|pastel format hex)
if [[ "$TITLE_FG" == *"ffffff"* ]];then
obtctl activetextcolor "#E5E5E5"
#obtctl activetextcolor ${w[-1]}
#obtctl activebuttonscolors ${w[-1]}
else
obtctl activetextcolor "#222222"
#obtctl activetextcolor ${w[0]}
#obtctl activebuttonscolors ${w[0]}
fi
obtctl clractivebgto ${w[4]}
obtctl clrnormalbg ${w[0]}
obtctl clrnormalbgto "$(pastel darken 0.1 "${w[0]}"|pastel format hex)"
;;
light)
obtctl clractivebg ${w[-2]}
TITLE_FG=$(pastel textcolor ${w[-2]}|pastel format hex)
if [[ "$TITLE_FG" == *"ffffff"* ]];then
obtctl activetextcolor "#E5E5E5"
#obtctl activetextcolor ${w[-1]}
#obtctl activebuttonscolors ${w[-1]}
else
obtctl activetextcolor "#222222"
#obtctl activetextcolor ${w[0]}
#obtctl activebuttonscolors ${w[0]}
fi
obtctl clractivebgto ${w[-4]}
obtctl clrnormalbg ${w[1]}
obtctl clrnormalbgto "$(pastel darken 0.1 "${w[1]}"|pastel format hex)"
;;
esac
obtctl shadow 0
}
notify_colorize(){
case "$LANG" in
pl*)
_TITLE="Auto theming wykonany!"
_THEME_MODIFIED="\nMotywy pokolorowano zgodnie z konfiguracją.\n
<b>Następna tapeta</b> - ustaw kolejną, losową tapetę
<b>Ustawienia</b> - konfiguraj Auto theming
<b>Reset</b> - reset tapety oraz motywów \n"
_NEXT="Następna tapeta"
_SETTINGS="Ustawienia"
_RESET="Reset"
;;
*)
_TITLE="Auto theming applied!"
_THEME_MODIFIED="\nThemes colorized according to configuration.\n
<b>Next wallpaper</b> - try with next random wallpaper
<b>Settings</b> - configure Auto theming
<b>Reset </b> - reset wallpaper and themes to defaults \n"
_NEXT="Next wallpaper"
_SETTINGS="Settings"
_RESET="Reset"
;;
esac
notify-send.sh -t 5000 -i ~/.config/mabox/wpicon_wide.png --replace-file=/tmp/colorize_notid "$_TITLE" "$_THEME_MODIFIED" \
-o "$_NEXT:mbwallpaper -o" -o "$_SETTINGS:jgwallpaperchanger -s autoth" -o "$_RESET:w2theme resetall"
}
colorize () {
source ~/.config/colorizer/colorizer.conf
#
# CONKY
case "$wall2themes_conky" in
dark) conky_colors dark;;
light) conky_colors light;;
*) : ;;
esac
#show_desktop
#sleep 1
#show_desktop
# PYRADIO THEME
case "$wall2themes_pyradio" in
dark) pyradio_theme dark;;
light) pyradio_theme light;;
*) : ;;
esac
# Openbox (TUTAJ WARUNEK)
case "$wall2themes_ob" in
dark) obtheme dark;;
light) obtheme light;;
*) : ;;
esac
# ACCENT_COLOR
case "$wall2themes_accent" in
dark)
obtctl theme MBcolors
accent ${w[1]}
;;
light)
obtctl theme MBcolors
accent ${w[-1]}
;;
*) : ;;
esac
# MENUS
case "$wall2themes_menu" in
dark) menu_theme dark;;
light) menu_theme light;;
*) : ;;
esac
notify_colorize
}
reverse () {
source ~/.config/colorizer/colorizer.conf
# Openbox (TUTAJ WARUNEK)
case "$wall2themes_ob" in
dark) obtheme light;;
light) obtheme dark;;
*) : ;;
esac
# PYRADIO THEME
case "$wall2themes_pyradio" in
dark) pyradio_theme light;;
light) pyradio_theme dark;;
*) : ;;
esac
# CONKY
case "$wall2themes_conky" in
dark) conky_colors light
;;
light) conky_colors dark
;;
*) : ;;
esac
# ACCENT_COLOR
case "$wall2themes_accent" in
dark)
obtctl theme MBcolors
accent ${w[-1]}
;;
light)
obtctl theme MBcolors
accent ${w[1]}
;;
*) : ;;
esac
# MENUS
case "$wall2themes_menu" in
dark) menu_theme light;;
light) menu_theme dark;;
*) : ;;
esac
notify_colorize
}
genthumb () {
#$1 - filename with full path
NAME=${1////_}
if [[ "${NAME}" =~ ^_home_.* ]]; then
n=${#HOME}
((n++))
NAME=${NAME:${n}}
fi
# GENERATE THUMBNAIL
THUMBDIR="$HOME/.cache/colorizer/thumbs"
mkdir -p ${THUMBDIR}
THUMB="${THUMBDIR}/${NAME}.png"
if [[ ! -f "$THUMB" ]]; then
magick ${1} -resize 270x150^ -gravity center -extent 270x150 ${THUMB}
fi
}
pin () {
#get wallpaper path and filename without ext
# mkdir for colorscheme
mkdir -p ~/.config/colorizer/pinned/$WALLNAME
# if dir exist then action is update so remove old content
rm -rf ~/.config/colorizer/pinned/$WALLNAME
# get menu themename jgmenu_theme= ( it is always MBcolors ????)
. ~/.config/mabox/mabox.conf
}
resetall(){
nitrogen default
conkyctl resetcolorsall
obtctl resetMBcolors
jgctl resetMBcolors
}
case "$1" in
ob) obtheme "$2";;
menu) menu_theme "$2" "$3";;
conky) conky_colors "$2";;
conkyone) conky_colorsone "$2" "$3";;
pyradio) pyradio_theme "$2";;
cava) cava "$2";;
accent) accent "$2";;
gradient) gradient "$2" "$3";;
colorize) colorize;;
reverse) reverse;;
resetall) resetall;;
genthumb)genthumb "$2";;
pin) pin;;
*) ;;
esac