#!/usr/bin/env bash XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}" XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" CONFIG_DIR="$XDG_CONFIG_HOME/quickshell" CACHE_DIR="$XDG_CACHE_HOME/quickshell" STATE_DIR="$XDG_STATE_HOME/quickshell" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" terminalscheme="$XDG_CONFIG_HOME/quickshell/scripts/terminal/scheme-base.json" pre_process() { if [ ! -d "$CACHE_DIR"/user/generated ]; then mkdir -p "$CACHE_DIR"/user/generated fi } post_process() { local mode_flag="$1" # Set GNOME color-scheme if mode_flag is dark or light if [[ "$mode_flag" == "dark" ]]; then gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3-dark' elif [[ "$mode_flag" == "light" ]]; then gsettings set org.gnome.desktop.interface color-scheme 'prefer-light' gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3' fi } switch() { imgpath="$1" mode_flag="$2" type_flag="$3" color_flag="$4" color="$5" read scale screenx screeny screensizey < <(hyprctl monitors -j | jq '.[] | select(.focused) | .scale, .x, .y, .height' | xargs) cursorposx=$(hyprctl cursorpos -j | jq '.x' 2>/dev/null) || cursorposx=960 cursorposx=$(bc <<< "scale=0; ($cursorposx - $screenx) * $scale / 1") cursorposy=$(hyprctl cursorpos -j | jq '.y' 2>/dev/null) || cursorposy=540 cursorposy=$(bc <<< "scale=0; ($cursorposy - $screeny) * $scale / 1") cursorposy_inverted=$((screensizey - cursorposy)) if [[ "$color_flag" == "1" ]]; then matugen_args=(color hex "$color") generate_colors_material_args=(--color "$color") else if [[ -z "$imgpath" ]]; then echo 'Aborted' exit 0 fi matugen_args=(image "$imgpath") generate_colors_material_args=(--path "$imgpath") fi # Determine mode if not set if [[ -z "$mode_flag" ]]; then current_mode=$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null | tr -d "'") if [[ "$current_mode" == "prefer-dark" ]]; then mode_flag="dark" else mode_flag="light" fi fi # Dark/light mode, material scheme [[ -n "$mode_flag" ]] && matugen_args+=(--mode "$mode_flag") && generate_colors_material_args+=(--mode "$mode_flag") [[ -n "$type_flag" ]] && matugen_args+=(--type "$type_flag") && generate_colors_material_args+=(--scheme "$type_flag") # Terminal scheme generate_colors_material_args+=(--termscheme "$terminalscheme" --blend_bg_fg) generate_colors_material_args+=(--cache "$STATE_DIR/user/color.txt") pre_process # Generate with matugen matugen "${matugen_args[@]}" # Use custom script for mixing (matugen can't D:) source "$(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate" python "$SCRIPT_DIR/generate_colors_material.py" "${generate_colors_material_args[@]}" \ > "$STATE_DIR"/user/generated/material_colors.scss "$SCRIPT_DIR"/applycolor.sh deactivate post_process "$mode_flag" } main() { imgpath="" mode_flag="" type_flag="" color_flag="" color="" noswitch_flag="" while [[ $# -gt 0 ]]; do case "$1" in --mode) mode_flag="$2" shift 2 ;; --type) type_flag="$2" shift 2 ;; --color) color_flag="1" if [[ "$2" =~ ^#?[A-Fa-f0-9]{6}$ ]]; then color="$2" shift 2 else color=$(hyprpicker --no-fancy) shift fi ;; --noswitch) noswitch_flag="1" imgpath=$(swww query | awk -F 'image: ' '{print $2}') shift ;; *) if [[ -z "$imgpath" ]]; then imgpath="$1" fi shift ;; esac done # Only prompt for wallpaper if not using --color and not using --noswitch and no imgpath set if [[ -z "$imgpath" && -z "$color_flag" && -z "$noswitch_flag" ]]; then cd "$(xdg-user-dir PICTURES)/Wallpapers" 2>/dev/null || cd "$(xdg-user-dir PICTURES)" || return 1 imgpath="$(yad --width 1200 --height 800 --file --add-preview --large-preview --title='Choose wallpaper')" fi switch "$imgpath" "$mode_flag" "$type_flag" "$color_flag" "$color" } main "$@"