diff --git a/backgrounds/voidlinux_bg_dark.png b/backgrounds/voidlinux_bg_dark.png new file mode 100644 index 0000000..1e91a4e Binary files /dev/null and b/backgrounds/voidlinux_bg_dark.png differ diff --git a/backgrounds/voidlinux_bg_light.png b/backgrounds/voidlinux_bg_light.png new file mode 100644 index 0000000..4c0ffd4 Binary files /dev/null and b/backgrounds/voidlinux_bg_light.png differ diff --git a/configs/labwc/autostart b/configs/labwc/autostart new file mode 100644 index 0000000..3d49028 --- /dev/null +++ b/configs/labwc/autostart @@ -0,0 +1,15 @@ +# базовые сервисы +waybar & +mako & + +# буфер обмена +wl-paste --type text --watch cliphist store & +wl-paste --type image --watch cliphist store & + +# обои +# потом заменить на ~/.config/labwc/update_theme.sh & +~/.config/labwc/scripts/base_theme_dark.sh & + + +# polkit agent +systemctl --user start hyprpolkitagent.service & \ No newline at end of file diff --git a/configs/labwc/scripts/base_theme_dark.sh b/configs/labwc/scripts/base_theme_dark.sh new file mode 100644 index 0000000..9237daf --- /dev/null +++ b/configs/labwc/scripts/base_theme_dark.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +cat << EOF > "$HOME/.config/labwc/themerc-override" +# цвет рамки active и inactive +window.active.border.color: #ECE7DD +window.inactive.border.color: #141414 + +# цвет фона заголовка active и inactive +window.active.title.bg.color: #ECE7DD +window.inactive.title.bg.color: #ECE7DD + +# цвет текста заголовка окна +window.active.label.text.color: #141414 +window.inactive.label.text.color: #141414 + +# цвет иконок кнопок для АКТИВНОГО окна +window.active.button.unpressed.image.color: #141414 + +# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC) +window.inactive.button.image.color: #141414 +EOF + +killall swaybg 2>/dev/null + +swaybg -m fill -i "$HOME/.config/labwc/backgrounds/voidlinux_bg_dark.png" & diff --git a/configs/labwc/scripts/base_theme_light.sh b/configs/labwc/scripts/base_theme_light.sh new file mode 100644 index 0000000..4b27676 --- /dev/null +++ b/configs/labwc/scripts/base_theme_light.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +cat << EOF > "$HOME/.config/labwc/themerc-override" +# цвет рамки active и inactive +window.active.border.color: #ECE7DD +window.inactive.border.color: #141414 + +# цвет фона заголовка active и inactive +window.active.title.bg.color: #ECE7DD +window.inactive.title.bg.color: #ECE7DD + +# цвет текста заголовка окна +window.active.label.text.color: #141414 +window.inactive.label.text.color: #141414 + +# цвет иконок кнопок для АКТИВНОГО окна +window.active.button.unpressed.image.color: #141414 + +# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC) +window.inactive.button.image.color: #141414 +EOF + +killall swaybg 2>/dev/null + +swaybg -m fill -i "$HOME/.config/labwc/backgrounds/voidlinux_bg_light.png" & diff --git a/palettes/palette-dark.json b/palettes/palette-dark.json new file mode 100644 index 0000000..2b9df17 --- /dev/null +++ b/palettes/palette-dark.json @@ -0,0 +1,10 @@ +{ + "FG_COLOR":"#ece7dd", + "SUB_FG_COLOR":"#b4b4b4", + + "BG_COLOR":"#141414", + "SUB_BG_COLOR":"#2c2c2c", + + "ACCENT_COLOR":"#7f4ab4", + "SUB_ACCENT_COLOR":"#a384c2" +} \ No newline at end of file diff --git a/palettes/palette-light.json b/palettes/palette-light.json new file mode 100644 index 0000000..4d472e8 --- /dev/null +++ b/palettes/palette-light.json @@ -0,0 +1,10 @@ +{ + "FG_COLOR":"#141414", + "SUB_FG_COLOR":"#747474", + + "BG_COLOR":"#ece7dd", + "SUB_BG_COLOR":"#b4b4b4", + + "ACCENT_COLOR":"#7f4ab4", + "SUB_ACCENT_COLOR":"#a384c2" +} \ No newline at end of file diff --git a/scripts/xbps_install.sh b/scripts/xbps_install.sh new file mode 100644 index 0000000..ee99be9 --- /dev/null +++ b/scripts/xbps_install.sh @@ -0,0 +1,735 @@ +#!/bin/sh +# ============================================================================= +# Void Linux + SDDM + Labwc +# ============================================================================= +# +# Целевая схема: +# +# BIOS/UEFI +# | +# v +# runit +# | +# +---- dbus +# | +# +---- seatd +# | +# +---- elogind +# | +# +---- sddm +# | +# +---- Xorg +# | +# v +# SDDM +# | +# v +# Labwc (Wayland) +# +# Подходит для: +# - чистой установки Void Linux +# - KVM/QEMU + QXL +# - KVM/QEMU + VirtIO GPU +# - Intel +# - AMD +# +# NVIDIA намеренно НЕ настраивается автоматически. +# +# Запуск: +# +# sudo sh void-labwc-install.sh +# +# ============================================================================= + +set -eu + +# ============================================================================= +# Цвета / вывод +# ============================================================================= + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log() { + printf "${GREEN}[✓]${NC} %s\n" "$1" +} + +info() { + printf "${BLUE}[i]${NC} %s\n" "$1" +} + +warn() { + printf "${YELLOW}[!]${NC} %s\n" "$1" +} + +error() { + printf "${RED}[✗]${NC} %s\n" "$1" + exit 1 +} + +# ============================================================================= +# Проверка root +# ============================================================================= + +if [ "$(id -u)" -ne 0 ]; then + error "Скрипт необходимо запускать через sudo: + + sudo sh $0" +fi + +# ============================================================================= +# Определение обычного пользователя +# ============================================================================= + +REAL_USER="${SUDO_USER:-}" + +if [ -z "$REAL_USER" ] || [ "$REAL_USER" = "root" ]; then + error "Не удалось определить обычного пользователя. + +Запусти скрипт так: + + sudo sh $0 + +а не из root shell." +fi + +if ! id "$REAL_USER" >/dev/null 2>&1; then + error "Пользователь '$REAL_USER' не существует." +fi + +USER_UID="$(id -u "$REAL_USER")" +USER_GID="$(id -g "$REAL_USER")" +USER_GROUP="$(id -gn "$REAL_USER")" +USER_HOME="$(getent passwd "$REAL_USER" | cut -d: -f6)" + +if [ -z "$USER_HOME" ] || [ ! -d "$USER_HOME" ]; then + error "Не удалось определить HOME пользователя '$REAL_USER'." +fi + +echo "" +echo "============================================================" +echo " Void Linux + SDDM + Labwc installer" +echo "============================================================" +echo "" +echo "Пользователь : $REAL_USER" +echo "UID : $USER_UID" +echo "HOME : $USER_HOME" +echo "" + +# ============================================================================= +# Проверка архитектуры +# ============================================================================= + +info "Архитектура системы: $(uname -m)" + +# ============================================================================= +# ЭТАП 1 — Репозитории +# ============================================================================= + +echo "" +log "Этап 1/8: настройка репозиториев..." + +# Nonfree нужен для части firmware/драйверов и некоторых пакетов. +if xbps-query -Rs '^void-repo-nonfree$' 2>/dev/null | \ + grep -q 'void-repo-nonfree'; then + + log "void-repo-nonfree доступен." + +else + info "Устанавливаю void-repo-nonfree..." + xbps-install -Sy void-repo-nonfree +fi + +# ============================================================================= +# ЭТАП 2 — Обновление системы +# ============================================================================= + +echo "" +log "Этап 2/8: обновление системы..." + +xbps-install -Syu + +# ============================================================================= +# ЭТАП 3 — Базовые пакеты +# ============================================================================= + +echo "" +log "Этап 3/8: установка базовой системы..." + +BASE_PACKAGES=" +base-system +dbus +elogind +seatd +sudo +ca-certificates +curl +wget +tar +unzip +zip +p7zip +unar +fuse +fuse-common +xdg-utils +" + +for pkg in $BASE_PACKAGES; do + info "Установка: $pkg" + xbps-install -y "$pkg" || warn "Не удалось установить $pkg" +done + +# ============================================================================= +# ЭТАП 4 — Графический стек +# ============================================================================= + +echo "" +log "Этап 4/8: установка графического стека..." + +GRAPHICS_PACKAGES=" +xorg +xorg-server-xwayland +mesa-dri + +sddm +labwc + +waybar +wofi +mako +swaylock +swayidle +swaybg + +wl-clipboard +cliphist +grim +slurp + +xdg-desktop-portal +xdg-desktop-portal-wlr +xdg-desktop-portal-gtk + +polkit +polkit-gnome + +qt5-wayland +qt6-wayland +qt5ct +qt6ct + +pipewire +wireplumber +alsa-pipewire + +fontconfig +noto-fonts-ttf +ttf-dejavu +ttf-jetbrains-mono +ttf-font-awesome + +breeze-icons +adwaita-icon-theme + +linux-firmware +" + +for pkg in $GRAPHICS_PACKAGES; do + info "Установка: $pkg" + xbps-install -y "$pkg" || warn "Не удалось установить $pkg" +done + +# ============================================================================= +# QXL / KVM +# ============================================================================= + +echo "" +info "Проверка виртуальной/физической видеокарты..." + +if command -v lspci >/dev/null 2>&1; then + + GPU_INFO="$(lspci | grep -Ei 'VGA|3D|Display' || true)" + + if [ -n "$GPU_INFO" ]; then + echo "" + echo "$GPU_INFO" + echo "" + + case "$GPU_INFO" in + + *QXL*|*Red\ Hat*QXL*) + info "Обнаружена QXL GPU — устанавливаю Xorg QXL driver." + xbps-install -y xf86-video-qxl || \ + warn "xf86-video-qxl недоступен." + ;; + + *Virtio*) + info "Обнаружена VirtIO GPU." + ;; + + *AMD*|*ATI*|*Radeon*) + info "Обнаружена AMD/ATI GPU." + ;; + + *Intel*) + info "Обнаружена Intel GPU." + ;; + + *NVIDIA*) + warn "Обнаружена NVIDIA GPU." + warn "NVIDIA driver намеренно НЕ устанавливается автоматически." + ;; + + *) + info "Неизвестный GPU — используются Mesa/Xorg по умолчанию." + ;; + esac + else + warn "Не удалось определить GPU через lspci." + fi + +else + warn "lspci не найден." +fi + +# ============================================================================= +# Дополнительные пользовательские приложения +# ============================================================================= + +echo "" +log "Установка пользовательских приложений..." + +OPTIONAL_PACKAGES=" +dolphin +kate +firefox +kitty +mpv +ristretto +pavucontrol +easyeffects +gparted +htop +qdirstat +ffmpeg +libnotify +nodejs +npm +" + +for pkg in $OPTIONAL_PACKAGES; do + info "Установка: $pkg" + xbps-install -y "$pkg" || warn "Пропущен пакет: $pkg" +done + +# ============================================================================= +# ЭТАП 5 — Пользовательские группы +# ============================================================================= + +echo "" +log "Этап 5/8: настройка групп пользователя..." + +add_group() { + group="$1" + + if getent group "$group" >/dev/null 2>&1; then + usermod -aG "$group" "$REAL_USER" + log "$REAL_USER -> $group" + else + warn "Группа '$group' отсутствует." + fi +} + +add_group "_seatd" +add_group "audio" +add_group "video" +add_group "wheel" + +# ============================================================================= +# ЭТАП 6 — Runit services +# ============================================================================= + +echo "" +log "Этап 6/8: настройка системных сервисов runit..." + +enable_service() { + svc="$1" + + if [ ! -d "/etc/sv/$svc" ]; then + warn "Сервис отсутствует: /etc/sv/$svc" + return 0 + fi + + if [ -L "/var/service/$svc" ]; then + log "Уже включён: $svc" + return 0 + fi + + ln -s "/etc/sv/$svc" "/var/service/$svc" + log "Включён: $svc" +} + +enable_service dbus +enable_service seatd +enable_service elogind +enable_service sddm + +# ============================================================================= +# ВАЖНО: +# +# НЕ включаем: +# +# pipewire +# wireplumber +# +# как system-wide runit services. +# +# Они должны работать в пользовательской сессии. +# ============================================================================= + +if [ -L "/var/service/pipewire" ]; then + warn "Обнаружен system-wide pipewire service." + warn "Отключаю его — PipeWire будет работать в user session." + rm -f /var/service/pipewire +fi + +if [ -L "/var/service/wireplumber" ]; then + warn "Обнаружен system-wide wireplumber service." + warn "Отключаю его — WirePlumber будет работать в user session." + rm -f /var/service/wireplumber +fi + +# ============================================================================= +# elogind vs acpid +# ============================================================================= +# +# elogind сам занимается session/power management. +# Поэтому не включаем acpid. +# ============================================================================= + +if [ -L "/var/service/acpid" ]; then + warn "Отключаю acpid, поскольку используется elogind." + rm -f /var/service/acpid +fi + +# ============================================================================= +# ЭТАП 7 — SDDM +# ============================================================================= + +echo "" +log "Этап 7/8: настройка SDDM..." + +mkdir -p /etc/sddm.conf.d + +# ------------------------------------------------------------------------- +# ВАЖНО: +# +# НЕ заставляем SDDM работать как Wayland compositor. +# +# SDDM использует Xorg для своего login screen. +# +# После авторизации SDDM запускает Labwc как Wayland session. +# ------------------------------------------------------------------------- + +rm -f /etc/sddm.conf.d/10-wayland.conf + +cat > /etc/sddm.conf.d/10-display.conf << 'EOF' +[General] +DisplayServer=x11 +EOF + +log "SDDM настроен на X11/Xorg." + +# ============================================================================= +# Labwc Wayland session +# ============================================================================= + +mkdir -p /usr/share/wayland-sessions + +cat > /usr/share/wayland-sessions/labwc.desktop << 'EOF' +[Desktop Entry] +Name=Labwc +Comment=Wayland window-stacking compositor +Exec=labwc +Type=Application +DesktopNames=labwc +EOF + +chmod 644 /usr/share/wayland-sessions/labwc.desktop + +log "Создана Wayland-сессия Labwc." + +# ============================================================================= +# SDDM autologin НЕ включаем. +# ============================================================================= + +# Пользователь сам выбирает Labwc на экране SDDM. + +# ============================================================================= +# ЭТАП 8 — Labwc config +# ============================================================================= + +echo "" +log "Этап 8/8: создание базовой конфигурации Labwc..." + +LABWC_DIR="$USER_HOME/.config/labwc" + +mkdir -p "$LABWC_DIR" + +# ------------------------------------------------------------------------- +# autostart +# ------------------------------------------------------------------------- + +AUTOSTART="$LABWC_DIR/autostart" + +if [ ! -f "$AUTOSTART" ]; then + + cat > "$AUTOSTART" << 'EOF' +#!/bin/sh + +# --------------------------------------------------------- +# Labwc autostart +# --------------------------------------------------------- + +# Waybar +if command -v waybar >/dev/null 2>&1; then + waybar & +fi + +# Notification daemon +if command -v mako >/dev/null 2>&1; then + mako & +fi + +# PolicyKit authentication agent +if [ -x /usr/libexec/polkit-gnome-authentication-agent-1 ]; then + /usr/libexec/polkit-gnome-authentication-agent-1 & +elif command -v polkit-gnome-authentication-agent-1 >/dev/null 2>&1; then + polkit-gnome-authentication-agent-1 & +fi +EOF + + chmod +x "$AUTOSTART" + + log "Создан Labwc autostart." + +else + info "Существующий Labwc autostart не изменён." +fi + +# ============================================================================= +# ALSA / PipeWire +# ============================================================================= + +info "Настройка ALSA → PipeWire..." + +mkdir -p /etc/alsa/conf.d + +if [ -f /usr/share/alsa/alsa.conf.d/50-pipewire.conf ]; then + ln -sf \ + /usr/share/alsa/alsa.conf.d/50-pipewire.conf \ + /etc/alsa/conf.d/50-pipewire.conf +fi + +if [ -f /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf ]; then + ln -sf \ + /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf \ + /etc/alsa/conf.d/99-pipewire-default.conf +fi + +log "ALSA/PipeWire настроен." + +# ============================================================================= +# Права пользователя +# ============================================================================= + +chown -R "$REAL_USER":"$USER_GROUP" \ + "$USER_HOME/.config" + +# ============================================================================= +# Проверка установки +# ============================================================================= + +echo "" +log "Проверка установленного ПО..." + +check_command() { + cmd="$1" + + if command -v "$cmd" >/dev/null 2>&1; then + log "$cmd: $(command -v "$cmd")" + else + warn "$cmd: НЕ НАЙДЕН" + fi +} + +check_command labwc +check_command sddm +check_command Xorg +check_command dbus-run-session +check_command pipewire +check_command wireplumber + +# ============================================================================= +# Проверка session file +# ============================================================================= + +if [ -f /usr/share/wayland-sessions/labwc.desktop ]; then + log "Labwc session file: OK" +else + warn "Labwc session file отсутствует!" +fi + +# ============================================================================= +# Ожидание запуска runit services +# ============================================================================= + +echo "" +info "Ожидание запуска сервисов..." + +sleep 3 + +# ============================================================================= +# Проверка сервисов +# ============================================================================= + +check_service() { + svc="$1" + + if [ ! -L "/var/service/$svc" ]; then + warn "$svc: НЕ ВКЛЮЧЁН" + return 0 + fi + + if sv status "$svc" 2>/dev/null | grep -q '^run:'; then + log "$svc: RUNNING" + else + warn "$svc: НЕ ЗАПУЩЕН" + sv status "$svc" 2>&1 || true + fi +} + +echo "" +info "Статус системных сервисов:" + +check_service dbus +check_service seatd +check_service elogind +check_service sddm + +# ============================================================================= +# Проверка Xorg +# ============================================================================= + +echo "" +info "Проверка Xorg..." + +if [ -x /usr/bin/X ]; then + log "Xorg найден: /usr/bin/X" +else + warn "Xorg /usr/bin/X не найден!" +fi + +# ============================================================================= +# Финальная информация +# ============================================================================= + +echo "" +echo "============================================================" +printf "${GREEN}✓ УСТАНОВКА ЗАВЕРШЕНА${NC}\n" +echo "============================================================" +echo "" + +echo "Архитектура:" +echo " SDDM -> Xorg" +echo " SDDM -> Labwc" +echo " Labwc -> Wayland" +echo "" + +echo "Сервисы:" +echo " dbus" +echo " seatd" +echo " elogind" +echo " sddm" +echo "" + +echo "Labwc:" +echo " $LABWC_DIR" +echo "" + +echo "SDDM session:" +echo " /usr/share/wayland-sessions/labwc.desktop" +echo "" + +echo "============================================================" +echo " ЧТО ДЕЛАТЬ ДАЛЬШЕ" +echo "============================================================" +echo "" + +echo "1. Перезагрузиться:" +echo "" +echo " sudo reboot" +echo "" + +echo "2. Дождаться экрана SDDM." +echo "" + +echo "3. Выбрать сессию:" +echo "" +echo " Labwc" +echo "" + +echo "4. Войти под пользователем:" +echo "" +echo " $REAL_USER" +echo "" + +echo "============================================================" +echo " ЕСЛИ ЧТО-ТО НЕ ЗАПУСТИЛОСЬ" +echo "============================================================" +echo "" + +echo "Перейти в TTY:" +echo "" +echo " Ctrl + Alt + F2" +echo "" + +echo "Проверить сервисы:" +echo "" +echo " sudo sv status dbus" +echo " sudo sv status seatd" +echo " sudo sv status elogind" +echo " sudo sv status sddm" +echo "" + +echo "Проверить SDDM:" +echo "" +echo " ps aux | grep -E 'sddm|Xorg' | grep -v grep" +echo "" + +echo "Проверить Xorg:" +echo "" +echo " sudo tail -100 /var/log/Xorg.0.log" +echo "" + +echo "Проверить GPU:" +echo "" +echo " lspci -k -d ::03xx" +echo "" + +echo "Проверить XDG_RUNTIME_DIR после входа:" +echo "" +echo " echo \"\$XDG_RUNTIME_DIR\"" +echo "" + +echo "============================================================" +echo "" + +warn "После добавления пользователя в группы требуется новая" +warn "login-сессия. Поэтому после установки ОБЯЗАТЕЛЬНО reboot." + +echo "" \ No newline at end of file