On NixOS, autologin bypasses cosmic-greeter and instead launches start-cosmic
directly. The XDG_SESSION_DESKTOP variable previously wasn't set hence, which
would break functionality like session commands ("Power Off") in the launcher.
114 lines
4.5 KiB
Bash
Executable file
114 lines
4.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# From: https://people.debian.org/~mpitt/systemd.conf-2016-graphical-session.pdf
|
|
|
|
if command -v systemctl >/dev/null; then
|
|
# robustness: if the previous graphical session left some failed units,
|
|
# reset them so that they don't break this startup
|
|
for unit in $(systemctl --user --no-legend --state=failed --plain list-units | cut -f1 -d' '); do
|
|
partof="$(systemctl --user show -p PartOf --value "$unit")"
|
|
for target in cosmic-session.target graphical-session.target; do
|
|
if [ "$partof" = "$target" ]; then
|
|
systemctl --user reset-failed "$unit"
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
fi
|
|
|
|
# use the user's preferred shell to acquire environment variables
|
|
# see: https://github.com/pop-os/cosmic-session/issues/23
|
|
if [ -n "${SHELL}" ]; then
|
|
# --in-login-shell: our flag to indicate that we don't need to recurse any further
|
|
if [ "${1}" != "--in-login-shell" ]; then
|
|
# `exec -l`: like `login`, prefixes $SHELL with a hyphen to start a login shell
|
|
exec bash -c "exec -l '${SHELL}' -c '${0} --in-login-shell'"
|
|
fi
|
|
fi
|
|
|
|
export XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:=COSMIC}"
|
|
export XDG_SESSION_DESKTOP="${XDG_SESSION_DESKTOP:=COSMIC}"
|
|
export XDG_SESSION_TYPE="${XDG_SESSION_TYPE:=wayland}"
|
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
export GDK_BACKEND=wayland,x11
|
|
export MOZ_ENABLE_WAYLAND=1
|
|
export QT_QPA_PLATFORM="wayland;xcb"
|
|
export QT_AUTO_SCREEN_SCALE_FACTOR=1
|
|
export QT_ENABLE_HIGHDPI_SCALING=1
|
|
export DCONF_PROFILE=cosmic
|
|
|
|
# Set the QT platform theme to CuteCosmic. Fallback to qt6ct if CuteCosmic is not installed.
|
|
if [ -z "$QT_QPA_PLATFORMTHEME" ]; then
|
|
export QT_QPA_PLATFORMTHEME=cosmic
|
|
for QT_PLUGIN_PATH in /usr/lib{*,/*}/qt6/plugins; do
|
|
if [ -f "${QT_PLUGIN_PATH}/platformthemes/libcutecosmictheme.so" ]; then
|
|
# CuteCosmic found, no need for a fallback.
|
|
export QT_QPA_PLATFORMTHEME=cosmic
|
|
break
|
|
elif [ -f "${QT_PLUGIN_PATH}/platformthemes/libqt6ct.so" ] || [ -f "${QT_PLUGIN_PATH}/platformthemes/libqt5ct.so" ]; then
|
|
# Fallback to qt6ct, but keep looking for CuteCosmic.
|
|
# Note that "qt5ct" is compatible with both qt5ct and qt6ct.
|
|
export QT_QPA_PLATFORMTHEME=qt5ct
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Start gnome keyring components if the daemon is active
|
|
# -> check if /run/user/$UID/keyring exists
|
|
if [ -d "/run/user/$(id -u)/keyring" ]; then
|
|
|
|
# Use PATH lookup instead of hardcoding /usr/bin
|
|
if command -v gnome-keyring-daemon >/dev/null 2>&1; then
|
|
eval "$(gnome-keyring-daemon --start --components=pkcs11,secrets,ssh > /dev/null 2>&1)"
|
|
else
|
|
echo "gnome-keyring-daemon not found in PATH" >&2
|
|
fi
|
|
|
|
# Only set SSH_AUTH_SOCK if the socket actually exists. Either
|
|
# set the correct one, or don't set one at all. Don't set the
|
|
# wrong value.
|
|
if [ -S "/run/user/$(id -u)/gcr/ssh" ]; then
|
|
export SSH_AUTH_SOCK="/run/user/$(id -u)/gcr/ssh"
|
|
elif [ -S "/run/user/$(id -u)/keyring/ssh" ]; then
|
|
export SSH_AUTH_SOCK="/run/user/$(id -u)/keyring/ssh"
|
|
fi
|
|
fi
|
|
|
|
if command -v systemctl >/dev/null; then
|
|
# Import some variables that we explicitly want to have available
|
|
# in the user session.
|
|
systemctl --user import-environment XDG_SESSION_TYPE XDG_CURRENT_DESKTOP DCONF_PROFILE SSH_AUTH_SOCK
|
|
|
|
# For environment variables already imported into the user's
|
|
# session, if the value imported differs from the value in this
|
|
# environment, update it.
|
|
mapfile -t existing_env_vars < <(systemctl --user show-environment)
|
|
for env_var in "${existing_env_vars[@]}"; do
|
|
env_var_name="${env_var%%=*}"
|
|
env_var_value=${!env_var_name:-}
|
|
|
|
# Skip current iteration if the environment variable's value
|
|
# in the current envionment is unset.
|
|
if [[ -z "${env_var_value}" ]]; then
|
|
continue
|
|
fi
|
|
|
|
env_var_val_str_to_compare="${env_var_name}=${env_var_value}"
|
|
env_var_val_str_to_compare_ansi_c_quoted="${env_var_name}=\$'$(printf '%q' "${env_var_value}")'"
|
|
if [[ "${env_var}" == "${env_var_val_str_to_compare}" ]]; then
|
|
continue
|
|
elif [[ "${env_var}" == "${env_var_val_str_to_compare_ansi_c_quoted}" ]]; then
|
|
continue
|
|
fi
|
|
systemctl --user import-environment "${env_var_name}" ||:
|
|
done
|
|
fi
|
|
|
|
# Run cosmic-session
|
|
if [[ -z "${DBUS_SESSION_BUS_ADDRESS}" ]]; then
|
|
exec /usr/bin/dbus-run-session -- /usr/bin/cosmic-session
|
|
else
|
|
exec /usr/bin/cosmic-session
|
|
fi
|