#!/bin/bash # A modified version of Rofi-Theme-Selector, concentrating only on ~/.local and also, applying only 10 @themes in ~/.config/rofi/config.rasi # as opposed to continous adding of //@theme # This code is released in public domain by Dave Davenport iDIR="$HOME/.config/swaync/images" OS="linux" ROFI=$(command -v rofi) SED=$(command -v sed) MKTEMP=$(command -v mktemp) NOTIFY_SEND=$(command -v notify-send) if [ -z "${SED}" ] then echo "Did not find 'sed', script cannot continue." exit 1 fi if [ -z "${MKTEMP}" ] then echo "Did not find 'mktemp', script cannot continue." exit 1 fi if [ -z "${ROFI}" ] then echo "Did not find rofi, there is no point to continue." exit 1 fi if [ -z "${NOTIFY_SEND}" ] then echo "Did not find 'notify-send', notifications won't work." fi TMP_CONFIG_FILE=$(${MKTEMP}).rasi #rofi_theme_dir="${HOME}/.local/share/rofi/themes" rofi_config_file="${XDG_CONFIG_HOME:-${HOME}/.config}/rofi/config.rasi" ## # Array with parts to the found themes. # And array with the printable name. ## declare -a themes declare -a theme_names ## # Function that tries to find all installed rofi themes. # This fills in #themes array and formats a displayable string #theme_names ## # Find themes in defined directories find_themes() { directories=("$HOME/.local/share/rofi/themes" "$HOME/.config/rofi/themes") for TD in "${directories[@]}"; do if [ -d "$TD" ]; then echo "Checking themes in: $TD" for file in "$TD"/*.rasi; do if [ -f "$file" ] && [ ! -L "$file" ]; then themes+=("$file") theme_names+=("$(basename "${file%.*}")") else echo "Skipping symlink: $file" fi done else echo "Directory does not exist: $TD" fi done } ## # Function to add or update theme in the config.rasi ## add_theme_to_config() { local theme_name="$1" local theme_path # Determine the correct path for the theme if [[ -f "$HOME/.local/share/rofi/themes/$theme_name.rasi" ]]; then theme_path="$HOME/.local/share/rofi/themes/$theme_name.rasi" elif [[ -f "$HOME/.config/rofi/themes/$theme_name.rasi" ]]; then theme_path="$HOME/.config/rofi/themes/$theme_name.rasi" else echo "Theme not found: $theme_name" return 1 fi # Resolve symlinks if present if [[ -L "$theme_path" ]]; then theme_path=$(readlink -f "$theme_path") fi # Convert path to use ~ for home directory theme_path_with_tilde="~${theme_path#$HOME}" # Add or update @theme line in config if ! grep -q '^\s*@theme' "$rofi_config_file"; then echo -e "\n\n@theme \"$theme_path_with_tilde\"" >> "$rofi_config_file" echo "Added @theme \"$theme_path_with_tilde\" to $rofi_config_file" else $SED -i "s/^\(\s*@theme.*\)/\/\/\1/" "$rofi_config_file" echo -e "@theme \"$theme_path_with_tilde\"" >> "$rofi_config_file" echo "Updated @theme line to $theme_path_with_tilde" fi # Limit the number of @theme lines to a maximum of 9 max_lines=9 total_lines=$(grep -c '^\s*//@theme' "$rofi_config_file") if [ "$total_lines" -gt "$max_lines" ]; then excess=$((total_lines - max_lines)) for i in $(seq 1 "$excess"); do $SED -i '0,/^\s*\/\/@theme/ { /^\s*\/\/@theme/ {d; q; }}' "$rofi_config_file" done echo "Removed excess //@theme lines" fi } ## # Create a copy of rofi config ## create_config_copy() { ${ROFI} -dump-config > "${TMP_CONFIG_FILE}" # remove theme entry. ${SED} -i 's/^\s*theme:\s\+".*"\s*;//g' "${TMP_CONFIG_FILE}" } ### # Print the list out so it can be displayed by rofi. ## create_theme_list() { OLDIFS=${IFS} IFS='|' for themen in ${theme_names[@]} do echo "${themen}" done IFS=${OLDIFS} } ## # Thee indicate what entry is selected. ## declare -i SELECTED select_theme() { local MORE_FLAGS=(-dmenu -format i -no-custom -p "Theme" -markup -config "${TMP_CONFIG_FILE}" -i) MORE_FLAGS+=(-kb-custom-1 "Alt-a") MORE_FLAGS+=(-u 2,3 -a 4,5 ) local CUR="default" while true do declare -i RTR declare -i RES local MESG="""You can preview themes by hitting Enter. Alt-a to accept the new theme. Escape to cancel Current theme: ${CUR} When setting a new theme this will override previous theme settings. Please update your config file if you have local modifications.""" THEME_FLAG= if [ -n "${SELECTED}" ] then THEME_FLAG="-theme ${themes[${SELECTED}]}" fi RES=$( create_theme_list | ${ROFI} ${THEME_FLAG} ${MORE_FLAGS[@]} -cycle -selected-row "${SELECTED}" -mesg "${MESG}") RTR=$? if [ "${RTR}" = 10 ] then return 0; elif [ "${RTR}" = 1 ] then return 1; elif [ "${RTR}" = 65 ] then return 1; fi CUR=${theme_names[${RES}]} SELECTED=${RES} done } ############################################################################################################ # Actual program execution ########################################################################################################### ## # Find all themes ## find_themes ## # Do check if there are themes. ## if [ ${#themes[@]} = 0 ] then ${ROFI} -e "No themes found." exit 0 fi ## # Create copy of config to play with in preview ## create_config_copy ## # Show the themes to user. ## if select_theme && [ -n "${SELECTED}" ] then # Apply the selected theme add_theme_to_config "${theme_names[${SELECTED}]}" # Send notification with the selected theme name selection="${theme_names[${SELECTED}]}" if [ -n "$NOTIFY_SEND" ]; then notify-send -u low -i "$iDIR/ja.png" "Rofi Theme applied:" "$selection" fi fi ## # Remove temp. config. ## rm -- "${TMP_CONFIG_FILE}"