initial commit

Signed-off-by: Martin Matous <m@matous.dev>
This commit is contained in:
Martin Matous 2022-03-30 17:48:16 +02:00
commit 5f4052b74b
Signed by: mmatous
GPG key ID: 8BED4CD352953224

201
autostart.eselect Normal file
View file

@ -0,0 +1,201 @@
# Copyright (C) 2022 Martin Matouš
# 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, version 3.
# 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/>.
DESCRIPTION="Manage XDG autostart applications"
MAINTAINER="Martin Matouš <m@matous.dev>"
VERSION="1.0.0"
AUTOSTART_DIR="${XDG_CONFIG_HOME%/}/autostart"
get_entry_dirs() {
echo "${XDG_DATA_HOME%/}/applications"
local xdg_data
IFS=':' read -ra xdg_data <<< "${XDG_DATA_DIRS}"
for dir in "${xdg_data[@]}"; do
echo "${dir%/}/applications"
done
}
find_targets() {
mapfile -t entry_dirs < <(get_entry_dirs)
local dir
for dir in "${entry_dirs[@]}"; do
for desktop_file in "${dir%/}"/*.desktop; do
[[ -f ${desktop_file} ]] && echo "${desktop_file}"
done
done
}
remove_symlink() {
if [[ ! -L "${symlink}" ]]; then
die -q "${symlink} does not exist or is not a symlink!"
fi
rm -f "${symlink}"
}
### list action ###
is_enabled() {
local -r entry="${1}"
mapfile -t autostarted_list < <(find "${AUTOSTART_DIR}" -type l)
local autostarted
IFS=""
for autostarted in ${autostarted_list[@]}; do
autostarted="$(canonicalise "${autostarted}")"
[[ "${entry}" = "${autostarted}" ]] && return 0
done
return 1
}
describe_list() {
echo "List available XDG .desktop files"
}
do_list() {
local i
mapfile -t targets < <(find_targets)
if [[ ! -d ${AUTOSTART_DIR} ]]; then
write_warning_msg "Autostart dir not found. Maybe you are running eselect autostart as root?"
fi
write_list_start "Available autostart symlink targets:"
for (( i = 0; i < ${#targets[@]}; i++ )); do
is_enabled "${targets[i]}" && targets[i]=$(highlight_marker "${targets[i]}")
done
write_numbered_list -m "(none found)" "${targets[@]}"
}
### enable action ###
describe_enable() {
echo "Enable specified XDG .desktop file(s)"
}
describe_enable_parameters() {
echo "<target>"
}
describe_enable_options() {
echo "<target> : Target name or number (from 'list' action)"
}
deduce_path() {
mapfile -t entry_dirs < <(get_entry_dirs)
local dir
local -r entry_relative_path="${1}"
for dir in "${entry_dirs[@]}"; do
if [[ -f ${dir%/}/${entry_relative_path} ]]; then
echo "${dir%/}/${entry_relative_path}"
fi
done
}
activate_entry() {
local entry=${1}
shift
local -r targets=("${@}")
if is_number "${entry}"; then
[[ ${entry} -ge 1 && ${entry} -le ${#targets[@]} ]] \
|| die -q "Number out of range: ${entry}"
entry=${targets[entry-1]}
fi
if [[ ! "${entry}" == *".desktop" ]]; then
entry="${entry}.desktop"
fi
# if only file specified (no / in arg)
if [[ ! "${entry}" == *"/"* ]]; then
entry=$(deduce_path "${entry}")
fi
if [[ ! -f ${entry} ]]; then
write_error_msg "Entry ${entry} doesn't exist!"
return
fi
local -r symlink="${AUTOSTART_DIR}/$(basename "${entry}")"
# entry with that name is already activated
if [[ -L ${symlink} ]]; then
local -r active=$(find "${symlink}" -printf %l)
if [[ "${active}" = "${entry}" ]]; then
write_warning_msg "${active} is already activated"
return
else
remove_symlink "${symlink}" \
|| die -q "Couldn't deactivate previous entry"
fi
return
fi
ln -s "${entry}" "${symlink}" || \
write_error_msg "Failed to create symlink '${symlink}' -> '${entry}'"
}
do_enable() {
[[ -z ${1} ]] && die -q "You didn't specify any .desktop file to enable"
# create directory if necessary
if [[ ! -d ${AUTOSTART_DIR} ]]; then
mkdir -p "${AUTOSTART_DIR}" || die -q "Failed to create ${AUTOSTART_DIR}"
fi
# make sure we have proper permissions
if [[ ! -w ${AUTOSTART_DIR} ]]; then
die -q "You don't have permission to write to ${AUTOSTART_DIR}"
fi
mapfile -t targets < <(find_targets)
for entry in "$@"; do
activate_entry "${entry}" "${targets[@]}"
done
}
### disable action ###
describe_disable() {
echo "Disable specified XDG .desktop file(s)"
}
describe_disable_parameters() {
echo "<target>"
}
describe_disable_options() {
echo "<target> : Target name or number (from 'list' action)"
}
do_disable() {
[[ -z ${1} ]] && die -q "You didn't specify any XDG .desktop files to disable"
local symlink_name symlink entry
mapfile -t targets < <(find_targets)
for entry in "$@"; do
if is_number "${entry}"; then
[[ ${entry} -ge 1 && ${entry} -le ${#targets[@]} ]] \
|| die -q "Number out of range: ${entry}"
entry="${targets[entry-1]}"
fi
if [[ ! "${entry}" == *".desktop" ]]; then
entry="${entry}.desktop"
fi
symlink_name=$(basename "${entry}")
symlink="${AUTOSTART_DIR}/${symlink_name}"
remove_symlink "${symlink}"
done
}