dotfiles/.scripts/set-wallpaper.sh

357 lines
9.4 KiB
Bash
Raw Normal View History

#!/bin/bash
2023-09-26 17:12:28 +02:00
wp_base_dir="$HOME/Images/Wallpapers/Desktop"
declare -A wp_dirs=([SFW]="$wp_base_dir/SFW"
[NSFW]="$wp_base_dir/( ͡° ͜ʖ ͡°)"
[BONK]="$wp_base_dir/Bonk")
function pick_random_wallpaper {
if [[ ${#wp_opts[@]} -eq 0 ]]; then
target_wp_dirs=("${wp_dirs[SFW]}")
else
for opt in "${!wp_opts[@]}"; do
opt_value=${wp_opts[$opt]}
if [[ $opt_value -eq 1 ]]; then
target_wp_dirs+=("${wp_dirs[$opt]}")
fi
done
fi
echo "Picking a random wallpaper from ${target_wp_dirs[@]}."
wallpaper="$(find "${target_wp_dirs[@]}" -type f | shuf -n 1)"
wallpaper="$wallpaper"
}
function help {
cat <<- EOF
Usage: $(basename "$0") [options...]
-h, --help Show this message and quit.
-r, --random Change the theme by picking a random wallpaper.
-w, --wallpaper <path> Change the theme using this wallpaper.
-s, --sfw Pick a wallpaper from SFW folder (default).
-n, --nsfw Pick a wallpaper from NSFW folder.
-b, --bonk U horny dog ¬‿¬.
Options -s and -n can be used together.
If no option is specified, reloads the current theme.
EOF
}
declare -A wp_opts
while getopts "hrw:snb" opt; do
case $opt in
h)
help
exit
;;
r)
opt_random=1
;;
w)
opt_wallpaper=1
opt_wallpaper_arg="$OPTARG"
;;
s)
wp_opts[SFW]=1
;;
n)
wp_opts[NSFW]=1
;;
b)
wp_opts[BONK]=1
;;
\?)
echo "Invalid option: $opt."
exit 1
;;
esac
done
# Set/pick wallpaper accordingly to arguments passed
2023-09-26 17:12:28 +02:00
if [[ $opt_random -eq 1 && $opt_wallpaper -eq 1 ]]; then
echo "Option -r and -w can't be used together."
exit 1
elif [[ $opt_random -eq 1 ]]; then
pick_random_wallpaper
elif [[ $opt_wallpaper -eq 1 ]]; then
if [[ -f "$opt_wallpaper_arg" ]]; then
wallpaper="$opt_wallpaper_arg"
else
echo "Error: $opt_wallpaper_arg is not a valid path."
exit 1
fi
else
if [[ $# -gt 0 ]]; then
echo "Warning: Neither -r or -w were specified, ignoring option(s): $*."
fi
# To get the current wallpaper
source "$HOME/.cache/wal/colors.sh"
fi
echo "Selected wallpaper: $wallpaper"
# Create the colors scheme
echo "Generating color scheme using pywal."
wal -qni "$wallpaper" --saturate 0.75
# Replace apostrophes around the wallpaper path with quotes
# in case there is an apostrophe in the file name
sed -iE "/^wallpaper=/,/#/ s/='/=\"/" "$HOME/.cache/wal/colors.sh"
sed -iE "/^wallpaper=/,/#/ s/'$/\"/" "$HOME/.cache/wal/colors.sh"
2023-09-26 17:12:28 +02:00
# Source colors scheme generated
source "$HOME/.cache/wal/colors.sh"
# Set additional colors
accent1_dark_hsl="$(pastel darken 1 "$color5" | pastel format hsl)"
accent2_dark_hsl="$(pastel darken 1 "$color6" | pastel format hsl)"
declare -A colors=(
[foreground]="$foreground"
[good]="#00BB66"
[bad]="#AA2222"
[urgent]="$color4"
[accent1]="$color5"
[accent2]="$color6"
[background1]="$(pastel lighten 0.2 "$accent1_dark_hsl" | pastel format hex)"
[background2]="$(pastel lighten 0.2 "$accent2_dark_hsl" | pastel format hex)"
[hovered]="$(pastel lighten 0.25 "$accent1_dark_hsl" | pastel format hex)"
[selected]="$(pastel lighten 0.35 "$accent1_dark_hsl" | pastel format hex)"
[disabled]="$(pastel lighten 0.35 "$accent1_dark_hsl" | pastel format hex)"
[disabled2]="$(pastel lighten 0.35 "$accent2_dark_hsl" | pastel format hex)"
)
declare -A params=(
[border_radius]=4
[border_size]=2
[gaps_out]=15
[gaps_in]=8
[font]="'JetBrainsMono NF'"
2023-09-26 17:12:28 +02:00
)
# Display accent colors
# pastel color "${colors[accent1]}"
# pastel color "${colors[accent2]}"
2023-09-26 17:12:28 +02:00
# Clear colors/params files
echo -n '' > "$HOME/.config/gtk-3.0/colors-gtk.css"
echo -n '' > "$HOME/.config/hypr/colors.conf"
echo "wallpaper=\"$wallpaper\"" > "$HOME/.cache/colors.sh"
2023-09-26 17:12:28 +02:00
# Set colors variables in files
echo "Writing theme colors in files."
2023-09-26 17:12:28 +02:00
for key in "${!colors[@]}"; do
value="${colors[$key]}"
# Hyprland
echo '$'"$key=rgb(${value:1})" >> "$HOME/.config/hypr/colors.conf"
# GTK
echo "@define-color $key $value;" >> "$HOME/.config/gtk-3.0/colors-gtk.css"
# Shell
echo "${key}=$value" >> "$HOME/.cache/colors.sh"
# i3
sed -i "s/^set \$$key.*/set \$$key $value/" "$HOME/.config/i3/config"
2023-09-26 17:12:28 +02:00
done
# Add Hyprland/i3 params
echo "Writing parameters to Hyprland & i3 files."
2023-09-26 17:12:28 +02:00
for key in "${!params[@]}"; do
value="${params[$key]}"
# Hyprland
2023-09-26 17:12:28 +02:00
echo '$'"$key=$value" >> "$HOME/.config/hypr/colors.conf"
# i3
sed -i "s/^set \$$key.*/set \$$key $value/" "$HOME/.config/i3/config"
2023-09-26 17:12:28 +02:00
done
# Set Kitty params
echo "Changing colors/params in Kitty config file."
2023-09-26 17:12:28 +02:00
declare -A kitty_vars=(
[font_family]="${params[font]}"
[url_color]="${colors[accent1]}"
[tab_bar_background]="${colors[background1]}"
[active_tab_background]="${colors[selected]}"
[inactive_tab_background]="${colors[hovered]}"
[active_tab_foreground]="${colors[foreground]}"
[inactive_tab_foreground]="${colors[foreground]}"
)
for key in "${!kitty_vars[@]}"; do
value="${kitty_vars[$key]}"
sed -i "s/^$key.*/$key $value/" "$HOME/.config/kitty/kitty.conf"
done
# Set Waybar params
echo "Changing params in Waybar styling file."
2023-09-26 17:12:28 +02:00
declare -A waybar_vars=(
[font-family]="${params[font]}"
[border-bottom]="${params[border_size]}px solid transparent"
[margin-bottom]="${params[border_size]}px"
)
for key in "${!waybar_vars[@]}"; do
value="${waybar_vars[$key]}"
sed -i "s~$key:[^;]*~$key: $value~" "$HOME/.config/waybar/style.css"
done
# Set Wofi params
echo "Changing params in Wofi styling file."
2023-09-26 17:12:28 +02:00
declare -A wofi_vars_window=(
[font-family]="${params[font]}"
[border]="${params[border_size]}px solid transparent"
[border-radius]="${params[border_radius]}px"
)
for key in "${!wofi_vars_window[@]}"; do
value="${wofi_vars_window[$key]}"
sed -i "/^window/,/$key:/ s~$key:[^;]*~$key: $value~" "$HOME/.config/wofi/style.css"
done
declare -A wofi_vars_input=(
[margin]="${params[border_size]}px"
[border-radius]="${params[border_radius]}px ${params[border_radius]}px 0 0"
)
for key in "${!wofi_vars_input[@]}"; do
value="${wofi_vars_input[$key]}"
sed -i "/^#input/,/$key:/ s~$key:[^;]*~$key: $value~" "$HOME/.config/wofi/style.css"
done
# Set entry:selected border-radius
sed -i "/^#entry:selected/,/border-radius:/ s/border-radius:[^;]*/border-radius: $(( params[border_radius]/2 ))px/" "$HOME/.config/wofi/style.css"
# Set Mako params
echo "Changing colors/params in Mako config file."
declare -A mako_vars=(
[font]="${params[font]} 11"
[border-radius]="${params[border_radius]}"
[border-size]="${params[border_size]}"
[outer-margin]="$((params[gaps_out]*2)),$((params[gaps_out]*2)),0,0"
[text-color]="${colors[foreground]}"
[background-color]="${colors[background1]}"
[border-color]="${colors[accent1]}"
)
for key in "${!mako_vars[@]}"; do
value="${mako_vars[$key]}"
sed -i "s/$key=.*/$key=$value/" "$HOME/.config/mako/config"
done
2023-09-26 17:12:28 +02:00
# BetterDiscord
if [[ -x /bin/betterdiscordctl ]]; then
echo "Executable found for betterdiscordctl."
2023-09-26 17:12:28 +02:00
if [[ ! -f "$HOME/.config/BetterDiscord/data/stable/custom.css" ]]; then
echo "Downloading ClearVision theme for BetterDiscord."
mkdir -p "$HOME/.config/BetterDiscord/data/stable"
wget -O "$HOME/.config/BetterDiscord/data/stable/custom.css" "https://betterdiscord.app/Download?id=23"
fi
echo "Changing BetterDiscord theme colors."
2023-09-26 17:12:28 +02:00
declare -A bd_vars=(
[main-color]="${colors[accent1]}"
[hover-color]="${colors[accent2]}"
[text-normal]="${colors[foreground]}"
[background-shading]='0%'
[background-overlay]='rgba(0, 0, 0, 0)'
[background-image]="linear-gradient(160deg, ${colors[background1]}, ${colors[background2]})"
)
for key in "${!bd_vars[@]}"; do
value="${bd_vars[$key]}"
sed -i "s~--$key:[^;]*~--$key: $value~" "$HOME/.config/BetterDiscord/data/stable/custom.css"
done
else
echo "No executable found for betterdiscordctl, skipping."
2023-09-26 17:12:28 +02:00
fi
# Change Wlogout icons color
echo "Changing wlogout icons colors."
wlogout_img=('lock' 'reboot' 'shutdown' 'logout')
for img in "${wlogout_img[@]}"; do
convert "$HOME/.config/wlogout/$img.png" -fill "${colors[accent1]}" -colorize 100 "$HOME/.config/wlogout/$img.png"
convert "$HOME/.config/wlogout/$img-focus.png" -fill "${colors[accent2]}" -colorize 100 "$HOME/.config/wlogout/$img-focus.png"
done
# Reload/restart stuff
if [[ -z "$WAYLAND_DISPLAY" ]]; then
echo "Reloading i3."
i3-msg reload > /dev/null &
echo "Changing wallpaper using feh."
feh --no-fehbg --bg-fill "$wallpaper" &
else
echo "Reloading Hyprland."
hyprctl reload > /dev/null &
if grep -q 1 "$HOME/.cache/weeb-mode"; then
echo "Changing wallpaper using swaybg."
pkill -u "$USER" swaybg &> /dev/null
hyprctl dispatch exec "swaybg -i \"$wallpaper\"" > /dev/null &
fi
if pgrep -u "$USER" waybar > /dev/null; then
echo "Reloading Waybar."
killall -SIGUSR2 waybar &
else
echo "Starting Waybar."
hyprctl dispatch exec waybar > /dev/null &
fi
if pgrep -u "$USER" mako > /dev/null; then
echo "Reloading Mako."
makoctl reload &
2023-11-13 13:29:58 +01:00
else
echo "Starting mako."
hyprctl dispatch exec mako > /dev/null &
fi
2023-09-26 17:12:28 +02:00
fi
# Reload Kitty
echo "Reloading opened Kitty windows."
killall -SIGUSR1 kitty &> /dev/null &
# Reload pywalfox
#if pgrep -u "$USER" firefox &> /dev/null; then
# echo "Reloading pywalfox."
# pywalfox update &
#fi
2023-09-26 17:12:28 +02:00
# OpenRGB
if [[ -x /bin/openrgb ]]; then
echo "Changing OpenRGB colors."
openrgb --noautoconnect -c "${colors[accent1]:1}" > /dev/null &
2023-09-26 17:12:28 +02:00
fi
# Generate blurred wallpaper to use with swaylock/i3lock
convert "$wallpaper" -blur 0x5 -resize 1920x1080 "$HOME/.cache/wallpaper-blurred.jpg" &
[[ -f "$HOME/.cache/wallpaper-hypr-blurred.jpg" ]] || convert /usr/share/hyprland/wall_2K.png -blur 0x5 -resize 1920x1080 "$HOME/.cache/wallpaper-hypr-blurred.jpg" &