#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx
#

# Execute system modules, just in case
if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

# Load Xresources
[ -f ~/.config/Xresources/main ] && xrdb -I"$HOME" ~/.config/Xresources/main

# Disable the bell
xset b off

# Folders to search for desktop environments (DE) in
sessions_dirs="/usr/share/xsessions"

# If we have locally installed DE try them before system ones
sessions_dir_local="$HOME/.local/share/xsessions"
if [ -d "$sessions_dir_local" ]
then
    sessions_dirs="$sessions_dir_local $sessions_dirs"
fi

# If we have junest installed DE try them before all others
sessions_dir_junest="$HOME/.junest/usr/share/xsessions"
if [ -d "$sessions_dir_junest" ]
then
    sessions_dirs="$sessions_dir_junest $sessions_dirs"
fi

startSession() {
    session_dir="$1"
    session_name="$2"

    session_file="${session_dir}/${session_name}.desktop"
    executable="$(grep ^Exec= "$session_file" | cut -d'=' -f2)"
    # TODO Does this work with parameters?
    # gnome-classic might need some

    # If this is a Junest DE, we need to wrap it
    if [ "$sessions_dir" = "$sessions_dir_junest" ]
    then
        # Some DMs enforce that to you,
        # which shows warning on Junest
        unset LD_PRELOAD

        # The intended way:
        # exec ~/.local/bin/junest "$executable" $parameters
        # Too restricted to the outside (e.g. Yubikey isn't accessible)

        # The custom way
        exec ~/.local/bin/junest --backend-args "--dev-bind /run /run" "$executable" $parameters

        # The fallback wrappers way
        # export PATH="$PATH:~/.junest/usr/bin_wrappers"
        # exec "$executable" $parameters
        # Should work but doesn't, I forgot why

        # The "I do what I want" way
        #exec bwrap --bind $HOME/.junest / --bind $HOME $HOME --bind /tmp /tmp --proc /proc --dev-bind /dev /dev --dev-bind /run /run "$executable" $parameters
        # Even Alacritty doesn't work here

    fi

    exec "$executable" $parameters
}

trySession() { # session_name
    session_name="$1"
    for sessions_dir in $sessions_dirs
    do
        session_file="$sessions_dir/${session_name}.desktop"
        if [ -f "$session_file" ]
        then
            startSession "$sessions_dir" "$session_name"
        fi
    done
}

if [ -n "$1" ]
then
    trySession "$1"
else
    trySession i3
    trySession xfce4
    trySession mate
    trySession plasma
    trySession gnome
    trySession kde
fi

# If we found nothing by then, RIP
echo "Couldn't find a suitable DM."
exit 1