# 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 ```bash 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 ```bash 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 ```bash 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 ```bash # Глобальные переменные для конфигурации 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 ```bash # Структура конфигурации темы 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 ```bash 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 ```bash 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 ```bash 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 ```bash # Тестирование выбора темы 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 ```bash # Тестирование полного процесса установки в тестовой среде 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 ```bash # Тестирование обработки ошибок 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 в итоговый отчет - Сохранение информации о выбранной теме для будущих обновлений