#!/bin/bash set -euo pipefail # Source common library for shared functions SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" # shellcheck source=../../lib/common.sh source "$SCRIPT_DIR/../../lib/common.sh" # Configuration ----------------------------------------------------------------- TARGET_SESSION_NAME="Xfce Session" TARGET_PACKAGES=( xfwm4 # Compositing window manager with XFCE integration xfce4-session # Provides the Xfce session entry for display managers xfce4-panel # Panel with system tray support xfce4-settings # Settings daemon (enables compositing toggle, theming, etc.) xfce4-terminal # Handy default terminal for the new environment ) # Utility functions -------------------------------------------------------------- info() { echo "[INFO] $*"; } warn() { echo "[WARN] $*" >&2; } error() { echo "[ERROR] $*" >&2 exit 1 } ensure_pacman() { require_command pacman "pacman" || error "Required command 'pacman' not found." if ! grep -qi "arch" /etc/os-release 2> /dev/null; then warn "This script was designed for Arch Linux; continuing anyway." fi } install_packages() { install_missing_pacman_packages "${TARGET_PACKAGES[@]}" } print_post_install_tips() { cat << EOF ------------------------------------------------------------------------ XFCE session installed. • i3 remains your default window manager. We did not modify ~/.xinitrc, display manager defaults, or systemd targets. • At your next graphical login, pick "${TARGET_SESSION_NAME}" (or "Xfce"), then log in to enjoy compositing via xfwm4. • Once you are done testing Unity, simply log out and choose i3 again. We'll log you out now so you can switch sessions safely. ------------------------------------------------------------------------ EOF } logout_user() { local session_id="${XDG_SESSION_ID:-}" if [[ -n $session_id ]] && loginctl show-session "$session_id" > /dev/null 2>&1; then info "Terminating current session (ID: $session_id) via loginctl." loginctl terminate-session "$session_id" return fi if loginctl list-sessions 2> /dev/null | awk '{print $1" "$3}' | grep -q " $USER$"; then info "Terminating all sessions for user '$USER' via loginctl." loginctl terminate-user "$USER" return fi warn "loginctl could not terminate the session; attempting fallback logout." pkill -KILL -u "$USER" || error "Failed to terminate user sessions. Please log out manually." } main() { ensure_pacman install_packages print_post_install_tips # Give the user a moment to read the instructions before logging out. logout_user } main "$@"