fix(tui): fix whiptail dialog progression, output descriptor handling and terminal scaling
Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
+3
-4
@@ -59,7 +59,7 @@ trap cleanup EXIT INT TERM
|
|||||||
|
|
||||||
main() {
|
main() {
|
||||||
local repo_url="${REPO_URL:-https://gitea.creative-dragonslayer.de/Scripts/Setup.git}"
|
local repo_url="${REPO_URL:-https://gitea.creative-dragonslayer.de/Scripts/Setup.git}"
|
||||||
local repo_branch="${REPO_BRANCH:-}"
|
local repo_branch="${REPO_BRANCH:-dev}"
|
||||||
|
|
||||||
log_step "Debian Unstable & Hyprland Setup Framework Installer"
|
log_step "Debian Unstable & Hyprland Setup Framework Installer"
|
||||||
log_info "Repository: $repo_url ${repo_branch:+(Branch: $repo_branch)}"
|
log_info "Repository: $repo_url ${repo_branch:+(Branch: $repo_branch)}"
|
||||||
@@ -132,10 +132,9 @@ main() {
|
|||||||
|
|
||||||
# Reconnect stdin to /dev/tty if stdin is currently piped and /dev/tty is accessible (for interactive prompts/TUI)
|
# Reconnect stdin to /dev/tty if stdin is currently piped and /dev/tty is accessible (for interactive prompts/TUI)
|
||||||
if [[ ! -t 0 ]] && [[ -e /dev/tty ]] && ( : < /dev/tty ) 2>/dev/null; then
|
if [[ ! -t 0 ]] && [[ -e /dev/tty ]] && ( : < /dev/tty ) 2>/dev/null; then
|
||||||
"${setup_cmd[@]}" < /dev/tty
|
exec < /dev/tty
|
||||||
else
|
|
||||||
"${setup_cmd[@]}"
|
|
||||||
fi
|
fi
|
||||||
|
"${setup_cmd[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
+93
-23
@@ -15,18 +15,51 @@ tui_check_whiptail() {
|
|||||||
|
|
||||||
# Display welcome message
|
# Display welcome message
|
||||||
tui_welcome() {
|
tui_welcome() {
|
||||||
|
local term_lines
|
||||||
|
term_lines=$(tput lines 2>/dev/null || echo 24)
|
||||||
|
local term_cols
|
||||||
|
term_cols=$(tput cols 2>/dev/null || echo 80)
|
||||||
|
|
||||||
|
local height=14
|
||||||
|
local width=70
|
||||||
|
if (( term_lines < 16 )); then
|
||||||
|
height=$(( term_lines - 2 > 8 ? term_lines - 2 : 8 ))
|
||||||
|
fi
|
||||||
|
if (( term_cols < 72 )); then
|
||||||
|
width=$(( term_cols - 4 > 40 ? term_cols - 4 : 40 ))
|
||||||
|
fi
|
||||||
|
|
||||||
whiptail --title "Debian Unstable Setup & Hyprland Installer" \
|
whiptail --title "Debian Unstable Setup & Hyprland Installer" \
|
||||||
--msgbox "Willkommen beim Debian Unstable & Desktop Setup!\n\nDieses Skript führt dich durch die modulare Einrichtung deines Debian Sid Systems mit XanMod-Kernel, Hyprland und Optimierungen.\n\nDrücke ENTER um zur Modulauswahl zu gelangen." \
|
--msgbox "Willkommen beim Debian Unstable & Desktop Setup!\n\nDieses Skript führt dich durch die modulare Einrichtung deines Debian Sid Systems mit XanMod-Kernel, Hyprland und Optimierungen.\n\nDrücke ENTER um zur Modulauswahl zu gelangen." \
|
||||||
14 70
|
"$height" "$width" || true
|
||||||
}
|
}
|
||||||
|
|
||||||
# Present stage checklist to user
|
# Present stage checklist to user
|
||||||
# Returns space-separated list of selected stage numbers (e.g., "01 02 03 04 05 06 07 08 09")
|
# Sets TUI_SELECTION and returns 0 on success, 1 on cancel
|
||||||
tui_select_stages() {
|
tui_select_stages() {
|
||||||
local choices
|
local tmp_file
|
||||||
choices=$(whiptail --title "Modulauswahl / Stages" \
|
tmp_file="$(mktemp)"
|
||||||
|
|
||||||
|
local term_lines
|
||||||
|
term_lines=$(tput lines 2>/dev/null || echo 24)
|
||||||
|
local term_cols
|
||||||
|
term_cols=$(tput cols 2>/dev/null || echo 80)
|
||||||
|
|
||||||
|
local height=20
|
||||||
|
local width=74
|
||||||
|
local list_height=10
|
||||||
|
|
||||||
|
if (( term_lines < 22 )); then
|
||||||
|
height=$(( term_lines - 2 > 12 ? term_lines - 2 : 12 ))
|
||||||
|
list_height=$(( height - 8 > 4 ? height - 8 : 4 ))
|
||||||
|
fi
|
||||||
|
if (( term_cols < 76 )); then
|
||||||
|
width=$(( term_cols - 4 > 40 ? term_cols - 4 : 40 ))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if whiptail --output-fd 3 --title "Modulauswahl / Stages" \
|
||||||
--checklist "Wähle die gewünschten Installations-Phasen mit der LEERTASTE aus:" \
|
--checklist "Wähle die gewünschten Installations-Phasen mit der LEERTASTE aus:" \
|
||||||
23 78 10 \
|
"$height" "$width" "$list_height" \
|
||||||
"01" "Debian Unstable (Deb822, Pinning, Upgrade)" ON \
|
"01" "Debian Unstable (Deb822, Pinning, Upgrade)" ON \
|
||||||
"02" "Kernel & Hardware (XanMod, P-State, Microcode)" ON \
|
"02" "Kernel & Hardware (XanMod, P-State, Microcode)" ON \
|
||||||
"03" "Bootloader & Theme (GRUB, Vimix, Plymouth)" ON \
|
"03" "Bootloader & Theme (GRUB, Vimix, Plymouth)" ON \
|
||||||
@@ -37,15 +70,18 @@ tui_select_stages() {
|
|||||||
"08" "Flatpaks (Flathub Repository & Flatpaks)" ON \
|
"08" "Flatpaks (Flathub Repository & Flatpaks)" ON \
|
||||||
"09" "Zusatz-Apps & MIME (Spotify, Waydroid, OpenDeck, MIME)" ON \
|
"09" "Zusatz-Apps & MIME (Spotify, Waydroid, OpenDeck, MIME)" ON \
|
||||||
"10" "Hyprland Desktop (LinuxBeginnings Debian-Hyprland Installer)" ON \
|
"10" "Hyprland Desktop (LinuxBeginnings Debian-Hyprland Installer)" ON \
|
||||||
3>&1 1>&2 2>&3) || {
|
3> "$tmp_file"; then
|
||||||
log_info "Setup durch Benutzer abgebrochen."
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clean quotes from whiptail output (e.g. '"01" "02"' -> '01 02')
|
TUI_SELECTION="$(tr -d '"' < "$tmp_file")"
|
||||||
local cleaned_choices
|
export TUI_SELECTION
|
||||||
cleaned_choices=$(echo "$choices" | tr -d '"')
|
rm -f "$tmp_file"
|
||||||
echo "$cleaned_choices"
|
return 0
|
||||||
|
else
|
||||||
|
rm -f "$tmp_file"
|
||||||
|
TUI_SELECTION=""
|
||||||
|
export TUI_SELECTION
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Prompt user for target user via Whiptail dialog
|
# Prompt user for target user via Whiptail dialog
|
||||||
@@ -53,6 +89,19 @@ tui_prompt_target_user() {
|
|||||||
local default_user="${1:-}"
|
local default_user="${1:-}"
|
||||||
local chosen=""
|
local chosen=""
|
||||||
|
|
||||||
|
# Detect candidate user if not provided or root
|
||||||
|
if [[ -z "$default_user" || "$default_user" == "root" ]]; then
|
||||||
|
if [[ -n "${SUDO_USER:-}" && "${SUDO_USER}" != "root" ]]; then
|
||||||
|
default_user="$SUDO_USER"
|
||||||
|
elif [[ -n "${PKEXEC_UID:-}" ]]; then
|
||||||
|
default_user="$(id -nu "$PKEXEC_UID" 2>/dev/null || true)"
|
||||||
|
elif [[ "$(id -u)" -ne 0 ]]; then
|
||||||
|
default_user="$(id -un)"
|
||||||
|
else
|
||||||
|
default_user="$(awk -F: '$3 >= 1000 && $3 < 60000 && $1 != "nobody" {print $1; exit}' /etc/passwd 2>/dev/null || true)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -n "$default_user" && "$default_user" != "root" ]]; then
|
if [[ -n "$default_user" && "$default_user" != "root" ]]; then
|
||||||
if whiptail --title "Ziel-Benutzer bestätigen" \
|
if whiptail --title "Ziel-Benutzer bestätigen" \
|
||||||
--yes-button "Verwenden" \
|
--yes-button "Verwenden" \
|
||||||
@@ -63,27 +112,34 @@ tui_prompt_target_user() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local tmp_file
|
||||||
|
tmp_file="$(mktemp)"
|
||||||
|
|
||||||
while [[ -z "$chosen" ]]; do
|
while [[ -z "$chosen" ]]; do
|
||||||
local input_user
|
if whiptail --output-fd 3 --title "Ziel-Benutzer eingeben" \
|
||||||
input_user=$(whiptail --title "Ziel-Benutzer eingeben" \
|
|
||||||
--inputbox "Bitte gib den Benutzernamen des Desktop-Benutzers ein:" \
|
--inputbox "Bitte gib den Benutzernamen des Desktop-Benutzers ein:" \
|
||||||
10 60 "$default_user" \
|
10 60 "$default_user" \
|
||||||
3>&1 1>&2 2>&3) || {
|
3> "$tmp_file"; then
|
||||||
log_info "Setup durch Benutzer abgebrochen."
|
|
||||||
exit 0
|
local input_user
|
||||||
}
|
input_user="$(tr -d '[:space:]' < "$tmp_file")"
|
||||||
input_user="$(echo "$input_user" | tr -d '[:space:]')"
|
|
||||||
if [[ -z "$input_user" || "$input_user" == "root" ]]; then
|
if [[ -z "$input_user" || "$input_user" == "root" ]]; then
|
||||||
whiptail --title "Ungültiger Benutzer" --msgbox "Ungültiger Benutzername (darf nicht leer oder root sein)." 8 50
|
whiptail --title "Ungültiger Benutzer" --msgbox "Ungültiger Benutzername (darf nicht leer oder root sein)." 8 55
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
if ! id "$input_user" >/dev/null 2>&1; then
|
if ! id "$input_user" >/dev/null 2>&1; then
|
||||||
whiptail --title "Benutzer nicht gefunden" --msgbox "Benutzer '$input_user' existiert nicht im System." 8 50
|
whiptail --title "Benutzer nicht gefunden" --msgbox "Benutzer '$input_user' existiert nicht im System." 8 55
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
chosen="$input_user"
|
chosen="$input_user"
|
||||||
|
else
|
||||||
|
rm -f "$tmp_file"
|
||||||
|
log_info "Setup durch Benutzer abgebrochen."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
rm -f "$tmp_file"
|
||||||
export TARGET_USER="$chosen"
|
export TARGET_USER="$chosen"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +148,21 @@ tui_confirm_execution() {
|
|||||||
local selected_stages="$1"
|
local selected_stages="$1"
|
||||||
local target_user="$2"
|
local target_user="$2"
|
||||||
|
|
||||||
|
local term_lines
|
||||||
|
term_lines=$(tput lines 2>/dev/null || echo 24)
|
||||||
|
local term_cols
|
||||||
|
term_cols=$(tput cols 2>/dev/null || echo 80)
|
||||||
|
|
||||||
|
local height=14
|
||||||
|
local width=70
|
||||||
|
if (( term_lines < 16 )); then
|
||||||
|
height=$(( term_lines - 2 > 10 ? term_lines - 2 : 10 ))
|
||||||
|
fi
|
||||||
|
if (( term_cols < 72 )); then
|
||||||
|
width=$(( term_cols - 4 > 40 ? term_cols - 4 : 40 ))
|
||||||
|
fi
|
||||||
|
|
||||||
whiptail --title "Installation starten" \
|
whiptail --title "Installation starten" \
|
||||||
--yesno "Folgende Konfiguration wird ausgeführt:\n\n- Ziel-Benutzer: $target_user\n- Ausgewählte Stages: $selected_stages\n\nMöchtest du die Installation jetzt starten?" \
|
--yesno "Folgende Konfiguration wird ausgeführt:\n\n- Ziel-Benutzer: $target_user\n- Ausgewählte Stages: $selected_stages\n\nMöchtest du die Installation jetzt starten?" \
|
||||||
14 70
|
"$height" "$width"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,9 +133,12 @@ else
|
|||||||
if [[ -t 0 && -t 1 ]]; then
|
if [[ -t 0 && -t 1 ]]; then
|
||||||
tui_check_whiptail
|
tui_check_whiptail
|
||||||
tui_welcome
|
tui_welcome
|
||||||
TUI_SELECTION=$(tui_select_stages)
|
if ! tui_select_stages; then
|
||||||
|
log_info "Setup aborted by user."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -z "$TUI_SELECTION" ]]; then
|
if [[ -z "${TUI_SELECTION:-}" ]]; then
|
||||||
log_warn "No stages selected. Exiting."
|
log_warn "No stages selected. Exiting."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user