9.5 KiB
9.5 KiB
Design Document
Overview
Интеграция установки SDDM тем в основной скрипт install-hyprland.sh путем замены функции install_sddm_config() на встроенную логику установки тем. Основная проблема - конфликт stdin при запуске скрипта внутри скрипта решается путем встраивания логики установки тем непосредственно в основной скрипт.
Architecture
Current Architecture
install-hyprland.sh
├── install_sddm_config()
│ └── Вызывает внешний install.sh (ПРОБЛЕМА: конфликт stdin)
└── Остальные функции установки
New Architecture
install-hyprland.sh
├── install_sddm_config()
│ ├── sddm_choose_installation_type()
│ ├── sddm_download_themes()
│ ├── sddm_install_dependencies()
│ ├── sddm_install_theme_files()
│ ├── sddm_configure_theme()
│ └── sddm_configure_sddm()
└── Остальные функции установки
Components and Interfaces
1. Main Integration Function
install_sddm_config() {
print_step_info "13" "НАСТРОЙКА МЕНЕДЖЕРА ДИСПЛЕЯ SDDM" \
"Установка красивых тем для экрана входа"
if ask_user "Установить SDDM темы?"; then
sddm_install_process
else
print_info "Установка SDDM тем пропущена"
fi
}
2. SDDM Installation Process
sddm_install_process() {
local install_type
local selected_theme
# Выбор типа установки
sddm_choose_installation_type install_type selected_theme
# Установка зависимостей
sddm_install_dependencies
# Загрузка и установка тем
sddm_download_and_install_themes "$install_type" "$selected_theme"
# Настройка SDDM
sddm_configure_system "$selected_theme"
}
3. Theme Selection Interface
sddm_choose_installation_type() {
local -n type_ref=$1
local -n theme_ref=$2
echo "Выберите тип установки SDDM тем:"
echo "1) Полная установка (все темы)"
echo "2) Установка одной темы"
read -p "Ваш выбор (1-2): " choice
case $choice in
1) type_ref="full" ;;
2)
type_ref="single"
sddm_select_single_theme theme_ref
;;
*)
print_error "Неверный выбор, используется полная установка"
type_ref="full"
;;
esac
}
Data Models
Installation Configuration
# Глобальные переменные для конфигурации SDDM
SDDM_REPO_URL="https://github.com/Sm1tee/sddm-theme.git"
SDDM_INSTALL_DIR="/usr/share/sddm/themes/sm1tee"
SDDM_CONFIG_FILE="/etc/sddm.conf"
SDDM_TEMP_DIR="sddm-theme-temp"
# Доступные темы
SDDM_AVAILABLE_THEMES=(
"apocalypse" "bones" "demon" "explosion" "gate" "gate2" "wizard"
"samurai" "samurai2" "samurai3" "samurai4" "solder" "warrior"
"house" "house2" "house3" "house4" "house5" "tree" "window" "window2"
"calmness" "space" "space2" "witcher" "harry"
)
Theme Configuration Structure
# Структура конфигурации темы
sddm_theme_config() {
local theme_name=$1
echo "[Theme]"
echo "Current=sm1tee"
echo "CursorTheme=Vimix-white-cursors"
echo "CursorSize=30"
echo ""
echo "[General]"
echo "DisplayServer=wayland"
echo "GreeterEnvironment=wayland,QML2_IMPORT_PATH=/usr/share/sddm/themes/silent/components/,QT_IM_MODULE=qtvirtualkeyboard,XKB_DEFAULT_LAYOUT=us,ru"
echo "Numlock=on"
echo "InputMethod=qtvirtualkeyboard"
}
Error Handling
1. Dependency Installation Errors
sddm_install_dependencies() {
local packages
local install_cmd
case $DISTRO in
"arch"|"manjaro"|"endeavouros")
packages="sddm qt6-svg qt6-virtualkeyboard qt6-multimedia-ffmpeg"
install_cmd="sudo pacman -S --needed $packages"
;;
# ... другие дистрибутивы
esac
if ! eval "$install_cmd"; then
print_error "Ошибка установки зависимостей SDDM"
return 1
fi
}
2. Download and Installation Errors
sddm_download_themes() {
local install_type=$1
local theme_name=$2
# Очистка предыдущих загрузок
[[ -d "$SDDM_TEMP_DIR" ]] && rm -rf "$SDDM_TEMP_DIR"
if ! git clone "$SDDM_REPO_URL" "$SDDM_TEMP_DIR"; then
print_error "Ошибка загрузки репозитория SDDM тем"
return 1
fi
# Проверка существования темы для single установки
if [[ "$install_type" == "single" ]] && [[ ! -f "$SDDM_TEMP_DIR/themes/sm1tee/configs/${theme_name}.conf" ]]; then
print_error "Тема '$theme_name' не найдена"
return 1
fi
}
3. Permission and System Errors
sddm_install_theme_files() {
local source_dir="$SDDM_TEMP_DIR/themes/sm1tee"
if [[ ! -d "$source_dir" ]]; then
print_error "Исходная папка темы не найдена"
return 1
fi
# Создание резервной копии существующей темы
if [[ -d "$SDDM_INSTALL_DIR" ]]; then
sudo mv "$SDDM_INSTALL_DIR" "${SDDM_INSTALL_DIR}.backup.$(date +%Y%m%d_%H%M%S)"
fi
if ! sudo cp -r "$source_dir" "$SDDM_INSTALL_DIR"; then
print_error "Ошибка копирования файлов темы"
# Восстановление резервной копии если есть
return 1
fi
}
Testing Strategy
1. Unit Testing Functions
# Тестирование выбора темы
test_sddm_theme_selection() {
local test_input="2\nwitcher\n"
local install_type theme_name
echo -e "$test_input" | sddm_choose_installation_type install_type theme_name
[[ "$install_type" == "single" ]] || return 1
[[ "$theme_name" == "witcher" ]] || return 1
}
# Тестирование конфигурации
test_sddm_config_generation() {
local config_output
config_output=$(sddm_theme_config "witcher")
echo "$config_output" | grep -q "Current=sm1tee" || return 1
echo "$config_output" | grep -q "DisplayServer=wayland" || return 1
}
2. Integration Testing
# Тестирование полного процесса установки в тестовой среде
test_sddm_full_installation() {
# Создание временной тестовой среды
local test_dir="/tmp/sddm_test_$$"
mkdir -p "$test_dir"
# Переопределение путей для тестирования
SDDM_INSTALL_DIR="$test_dir/themes"
SDDM_CONFIG_FILE="$test_dir/sddm.conf"
# Запуск установки
sddm_install_process
# Проверка результатов
[[ -d "$SDDM_INSTALL_DIR" ]] || return 1
[[ -f "$SDDM_CONFIG_FILE" ]] || return 1
# Очистка
rm -rf "$test_dir"
}
3. Error Handling Testing
# Тестирование обработки ошибок
test_sddm_error_handling() {
# Тест с недоступным репозиторием
SDDM_REPO_URL="https://invalid-url.com/repo.git"
if sddm_download_themes "full" ""; then
return 1 # Должна быть ошибка
fi
# Тест с недоступной темой
if sddm_download_themes "single" "nonexistent_theme"; then
return 1 # Должна быть ошибка
fi
}
Implementation Notes
1. Стилистическая Интеграция
- Использовать существующие функции print_step_info, print_error, print_success из основного скрипта
- Сохранить цветовую схему и форматирование основного скрипта
- Использовать существующие функции ask_user для пользовательского ввода
2. Совместимость с Дистрибутивами
- Определение дистрибутива должно использовать существующую логику из основного скрипта
- Команды установки пакетов должны соответствовать стилю основного скрипта
- Обработка ошибок должна быть консистентной
3. Cleanup и Безопасность
- Автоматическая очистка временных файлов
- Создание резервных копий перед перезаписью
- Проверка прав доступа перед выполнением sudo команд
4. Логирование и Отчетность
- Интеграция с системой логирования основного скрипта
- Добавление информации об установке SDDM в итоговый отчет
- Сохранение информации о выбранной теме для будущих обновлений