1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-10-27 05:23:18 -04:00
rofi/script/rofi-theme-selector
Amith Mohanan e65b90757f
[rofi-theme-selector] prepend newline before specifying new theme (#1791)
* [rofi-theme-selector] prepend newline before specifying new theme

If the EOF is not a newline, new theme setting will fail.

* make sed substitution more readable

* simplify sed substitution
2023-01-30 11:44:28 +01:00

241 lines
5.8 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# This code is released in public domain by Dave Davenport <qball@gmpclient.org>
#
##
# OS checking code as utilities could be different
##
OS="gnu"
case "$OSTYPE" in
*linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) OS="gnu";;
*bsd*|*darwin*) OS="bsd";;
*sunos*|*solaris*|*indiana*|*illumos*|*smartos*) OS="sun";;
esac
ROFI=$(command -v rofi)
if [ $OS = "bsd" ]; then
SED=$(command -v gsed)
else
SED=$(command -v sed)
fi
MKTEMP=$(command -v mktemp)
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
TMP_CONFIG_FILE=$(${MKTEMP}).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()
{
DIRS=${XDG_DATA_DIRS}
OLDIFS=${IFS}
IFS=:
if [ -z "${XDG_DATA_DIRS}" ]
then
echo "XDG_DATA_DIRS needs to be set for this script to function correctly."
echo -n "Using dirs from \$PATH: "
DIRS=
# Iterate over items in $PATH
for p in ${PATH}; do
# Remove trailing / if exists.
x=${p%/}
# remove both /bin and /sbin and /games from end
x=${x%/bin}
x=${x%/sbin}
x=${x%/games}
# Add /share
x=${x}/share
# Check if entry exists Prepend : so :${x}: matches nicely
case ":${DIRS}" in
*$x:*);;
*) DIRS+="$x:";;
esac
done
# Remove trailing :
DIRS=${DIRS%:}
echo "${DIRS}"
fi
# Add user dir.
DIRS+=":${XDG_DATA_HOME:-${HOME}/.local/share}"
DIRS+=":${XDG_CONFIG_HOME:-${HOME}/.config}"
for p in ${DIRS}; do
p=${p%/}
TD=${p}/rofi/themes
if [ -n "${p}" ] && [ -d "${TD}" ]
then
echo "Checking themes in: ${TD}"
for file in ${TD}/*.rasi
do
if [ -f "${file}" ]
then
themes+=("${file}")
FN=$(basename "${file}")
NAME=${FN%.*}
USER=$(${SED} -n 's/^.*User: \(.*\)/\1/p' "${file}" | head -n 1 )
if [ -z "${USER}" ]
then
theme_names+=(${NAME})
else
theme_names+=("${NAME} by ${USER}")
fi
fi
done
fi
done
IFS=${OLDIFS}
}
##
# Create a copy of rofi
##
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 <b>Enter</b>.
<b>Alt-a</b> to accept the new theme.
<b>Escape</b> to cancel
Current theme: <b>${CUR}</b>
<span weight=\"bold\" size=\"xx-small\">When setting a new theme this will override previous theme settings.
Please update your config file if you have local modifications.</span>"""
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
}
###
# Create if not exists, then removes #include of .theme file (if present) and add the selected theme to the end.
# Repeated calls should leave the config clean-ish
###
set_theme()
{
CDIR="${XDG_CONFIG_HOME:-${HOME}/.config}/rofi"
if [ ! -d "${CDIR}" ]
then
mkdir -p "${CDIR}"
fi
# on BSD & MacOS readlink acts differently
if [ $OS = "bsd" ]; then
get_link="$(realpath "${CDIR}")/config.rasi"
else
get_link=$(readlink -f "${CDIR}/config.rasi")
fi
if [[ ! -f "${get_link}" ]]
then
touch "${get_link}"
fi
# Comment old base theme, not replace as it may be modified after the line
${SED} -i '/^\s*@theme/ s,^,//,' "${get_link}"
echo -e "\n@theme \"${1}\"" >> "${get_link}"
}
############################################################################################################
# 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
# Set theme
set_theme "${themes[${SELECTED}]}"
fi
##
# Remove temp. config.
##
rm -- "${TMP_CONFIG_FILE}"