waybox/data/xdg-autostart
2022-02-22 21:24:09 -05:00

98 lines
3.3 KiB
Bash

#!/bin/sh
# Autostart script
#
# I've tried to make it compatible with the specification, but YMMV
#
# Start autostart programs for the following environments:
# WB_AUTOSTART_ENVIRONMENT= # No environment
# WB_AUTOSTART_ENVIRONMENT=all # All environments
# WB_AUTOSTART_ENVIRONMENT=GNOME:KDE # GNOME and KDE only
# Using the old set hack rather than ksh arrays, which some shells don't
# implement correctly or at all
set --
oldifs=$IFS
IFS=:
for d in ${XDG_CONFIG_HOME:-~/.config}:${XDG_CONFIG_DIRS:-${sysconfdir:-/etc}/xdg};
do
for f in $d/autostart/*.desktop;
do
# Skip this entry if this file doesn't exist (e.g. if there are no
# desktop files in that directory)
if test ! -f "$f";
then
continue
# Hidden key; must not be shown
elif cat "$f" | grep -q "^Hidden\s*=\s*true$";
then
show_in=0
# Value of WAYBOX: run all programs
elif test "$WB_AUTOSTART_ENVIRONMENT" = "all";
then
show_in=1
# No OnlyShowIn or NotShowIn key, so show regardless of the value of
# WB_AUTOSTART_ENVIRONMENT
elif ! (cat "$f" | grep -q '^\(Only\|Not\)ShowIn\s*=\s*');
then
show_in=1
# No WB_AUTOSTART_ENVIRONMENT specified, so don't run any programs that
# specify a special environment
elif test -z "$WB_AUTOSTART_ENVIRONMENT";
then
cat "$f" | grep -q '^OnlyShowIn\s*=\s*' && show_in=0
else
# Run programs only in the specified autostart environments
IFS=:
show_in=0
for autostart_environment in $WB_AUTOSTART_ENVIRONMENT;
do
IFS=\;
ONLY_SHOW_IN=$(cat "$f" | grep '^OnlyShowIn\s*=\s*' | sed -e 's/^OnlyShowIn\s*=\s*//g')
for only_show_in in $ONLY_SHOW_IN;
do
if test "$only_show_in" = "$autostart_environment";
then
show_in=1
break 2
fi
done
# But don't show in these environments
NOT_SHOW_IN=$(cat "$f" | grep '^NotShowIn\s*=\s*' | sed -e 's/^NotShowIn\s*=\s*//g')
for not_show_in in $NOT_SHOW_IN;
do
if test "$not_show_in" = "$autostart_environment";
then
show_in=0
break 2
fi
done
done
fi
fn=$(basename "$f")
# Don't use if a desktop entry with the same name has already been used
for df in "$@";
do
if test "$df" = "$fn";
then
show_in=0
fi
done
# Must be set back before executing the program
IFS=$oldifs
set -- $@ "$fn"
if test $show_in -ne 0;
then
# Don't run the Exec key if a non-empty TryExec command can't be found
TRY_EXEC=$(cat "$f" | grep '^TryExec\s*=\s*\S' | sed -e 's/^TryExec\s*=\s*//g');
if test -n "$TRY_EXEC" && ! which $TRY_EXEC;
then
continue
fi
$(cat "$f" | grep '^Exec\s*=\s*' | sed -e 's/^Exec\s*=\s*//g') &
fi
done
done