almost done(i thing so)

This commit is contained in:
2026-09-09 01:50:52 +06:00
parent 456ec37991
commit efd2f34055
52 changed files with 2915 additions and 802 deletions
+214 -2
View File
@@ -1,3 +1,215 @@
# labwc-alpine
# Labwc-Alpine
адаптированный репозиторий s13bby/labwc для дистрибутива alpine linux
Адаптированная конфигурация оконного менеджера **Labwc** для дистрибутива **Alpine Linux** от [s13bby](https://zenithcode.duckdns.org/s13bby/labwc-alpine).
---
## 🚀 Установка Alpine Linux
### 1. Запуск установки
```bash
setup-alpine
```
Следуйте инструкциям установщика. После завершения перезагрузите систему:
```bash
reboot
```
### 2. Первоначальная настройка
Войдите в систему как **root** и выполните:
```bash
apk update
apk upgrade
```
### 3. Установка базовых пакетов
```bash
apk add nano sudo git
```
> **Примечание:** Вы можете использовать любой другой текстовый редактор вместо `nano`.
### 4. Создание пользователя
Если вы ещё не создали пользователя во время установки:
```bash
adduser <имя_пользователя>
```
Добавьте пользователя в группу `wheel` (для доступа к `sudo`):
```bash
addgroup <имя_пользователя> wheel
```
### 5. Настройка sudo
Отредактируйте файл `/etc/sudoers`:
```bash
nano /etc/sudoers
```
Раскомментируйте строку:
```
%wheel ALL=(ALL) ALL
```
Сохраните и выйдите из редактора.
---
## 🖥️ Установка и настройка Labwc
### 1. Вход в систему от имени пользователя
```bash
su - <имя_пользователя>
```
### 2. Установка рабочего окружения
Запустите скрипт настройки рабочего стола:
```bash
sudo setup-desktop
```
Выберите **`xfce`** в качестве временного окружения.
Дождитесь завершения установки и перезагрузитесь:
```bash
reboot
```
### 3. Установка Labwc и терминала
Войдите в среду Xfce и установите Labwc:
```bash
apk add labwc alacritty
```
Выйдите из сессии Xfce и войдите в Labwc.
> **Готово!** Теперь у вас есть базовый Labwc.
---
## ⚙️ Установка конфигурации
Клонируйте репозиторий с готовой конфигурацией:
```bash
git clone https://zenithcode.duckdns.org/s13bby/labwc-alpine.git
```
Перейдите в директорию проекта:
```bash
cd labwc-alpine/
```
Сделайте установочный скрипт исполняемым:
```bash
chmod +x install.sh
```
Запустите установку:
```bash
sh ./install.sh
```
---
## 📁 Структура проекта
```
labwc-alpine/
├── backgrounds/ # Фоновые изображения
│ ├── alpine_bg_dark_sign.jpg
│ ├── alpine_bg_light_sign.jpg
│ ├── fuji_dark.jpg
│ └── fuji_light.jpg
│
├── configs/ # Конфигурационные файлы
│ ├── hypr/ # Hyprland (если используется)
│ │ ├── hypridle.conf
│ │ ├── hyprland.lua
│ │ └── hyprlock.conf
│ │
│ ├── labwc/ # Основная конфигурация Labwc
│ │ ├── autostart
│ │ ├── environment
│ │ ├── menu.xml
│ │ ├── rc.xml
│ │ ├── shutdown
│ │ ├── themerc-override
│ │ └── update_theme.sh
│ │
│ ├── waybar/ # Панель Waybar
│ │ ├── config.jsonc
│ │ ├── style.css
│ │ └── v2raya-toggle.sh
│ │
│ ├── wofi/ # Лаунчер Wofi
│ │ ├── cliphist-img.sh
│ │ └── style.css
│ │
│ ├── qt6ct/ # Настройки Qt6
│ │ └── qt6ct.conf
│ │
│ └── alacritty/ # Терминал Alacritty
│ └── alacritty.toml
│
├── palettes/ # Цветовые палитры
│ ├── alpine/
│ │ ├── alpine_palette_dark
│ │ ├── alpine_palette_light
│ │ ├── alpine_palette_pastel_dark
│ │ └── alpine_palette_pastel_light
│ │
│ └── fuji/
│ ├── fuji_palette_dark
│ ├── fuji_palette_light
│ ├── fuji_palette_pastel_dark
│ └── fuji_palette_pastel_light
│
├── fonts/ # Шрифты
│ └── Widock TRIAL Bold.otf
│
├── install.sh # Главный установочный скрипт
├── LICENSE # Лицензия
└── README.md # Этот файл
```
---
## 🗑️ Удаление Xfce
После успешной настройки Labwc вы можете удалить Xfce:
```bash
apk del xfce4 xfce4-scenarios xfce4-terminal orage thunar
apk del .xfce4-rundeps 2>/dev/null || true
```
---
## 📄 Лицензия
Этот проект распространяется под лицензией **MIT**. Подробнее см. в файле [LICENSE](LICENSE).
---
-548
View File
@@ -1,548 +0,0 @@
#!/bin/sh
# =============================================================================
# Labwc Installer for Alpine Linux (KVM/QEMU)
# =============================================================================
# Запускать от root: sh install_labwc.sh [username]
# Если username не указан — используется текущий не-root пользователь
# =============================================================================
set -e
# --- Цвета ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
info() { printf "${BLUE}[INFO]${NC} %s\n" "$1"; }
ok() { printf "${GREEN}[OK]${NC} %s\n" "$1"; }
warn() { printf "${YELLOW}[WARN]${NC} %s\n" "$1"; }
error() { printf "${RED}[ERROR]${NC} %s\n" "$1"; }
# --- Проверка root ---
if [ "$(id -u)" -ne 0 ]; then
error "Этот скрипт нужно запускать от root (su или sudo)"
exit 1
fi
# --- Определение пользователя ---
if [ -n "$1" ]; then
TARGET_USER="$1"
else
# Ищем первого не-root пользователя с домашней директорией
TARGET_USER=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1; exit}' /etc/passwd)
if [ -z "$TARGET_USER" ]; then
error "Не найден обычный пользователь. Создайте пользователя: adduser username"
error "Или запустите: sh $0 username"
exit 1
fi
fi
if ! id "$TARGET_USER" >/dev/null 2>&1; then
error "Пользователь '$TARGET_USER' не существует"
exit 1
fi
USER_UID=$(id -u "$TARGET_USER")
USER_GID=$(id -g "$TARGET_USER")
USER_HOME=$(getent passwd "$TARGET_USER" | cut -d: -f6)
info "Целевой пользователь: $TARGET_USER (uid=$USER_UID, home=$USER_HOME)"
# --- Добавление community репозитория ---
info "Настройка репозиториев..."
ALPINE_VERSION=$(cat /etc/alpine-release | cut -d'.' -f1,2)
COMMUNITY_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community"
if ! grep -q "$COMMUNITY_URL" /etc/apk/repositories 2>/dev/null; then
echo "$COMMUNITY_URL" >> /etc/apk/repositories
ok "Добавлен community репозиторий"
else
ok "Community репозиторий уже настроен"
fi
apk update
# --- Установка пакетов ---
info "Установка labwc и зависимостей..."
PACKAGES="
labwc
wlroots
seatd
seatd-launch
elogind
polkit-elogind
wayland-utils
wayland-protocols
mesa-dri-gallium
mesa-va-gallium
libseat
xf86-video-qxl
xf86-video-virtio
xwayland
foot
waybar
wofi
swaybg
swayidle
swaylock
mako
grim
slurp
wl-clipboard
xdg-utils
font-dejavu
font-noto
adwaita-icon-theme
papirus-icon-theme
pipewire
wireplumber
pipewire-pulse
pavucontrol
"
apk add $PACKAGES
ok "Пакеты установлены"
# --- Настройка служб ---
info "Настройка служб..."
rc-update add seatd default 2>/dev/null || true
rc-update add elogind default 2>/dev/null || true
rc-update add pipewire default 2>/dev/null || true
rc-service seatd start 2>/dev/null || true
rc-service elogind start 2>/dev/null || true
ok "Службы настроены"
# --- Права пользователя ---
info "Настройка прав пользователя..."
# Добавляем пользователя в необходимые группы
for group in seat video audio input; do
if getent group "$group" >/dev/null 2>&1; then
adduser "$TARGET_USER" "$group" 2>/dev/null || true
fi
done
ok "Пользователь $TARGET_USER добавлен в группы"
# --- Создание XDG_RUNTIME_DIR ---
info "Настройка XDG_RUNTIME_DIR..."
RUNDIR="/run/user/$USER_UID"
mkdir -p "$RUNDIR"
chown "$TARGET_USER:$TARGET_USER" "$RUNDIR"
chmod 700 "$RUNDIR"
# Добавляем в /etc/profile.d для persistency
mkdir -p /etc/profile.d
cat > /etc/profile.d/xdg-runtime.sh << 'EOF'
if [ -z "$XDG_RUNTIME_DIR" ]; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
fi
if [ ! -d "$XDG_RUNTIME_DIR" ]; then
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"
fi
EOF
chmod 644 /etc/profile.d/xdg-runtime.sh
ok "XDG_RUNTIME_DIR настроен"
# --- Конфигурация labwc ---
info "Создание конфигурации labwc..."
LABWC_DIR="$USER_HOME/.config/labwc"
mkdir -p "$LABWC_DIR"
# rc.xml — только если не существует
if [ ! -f "$LABWC_DIR/rc.xml" ]; then
cat > "$LABWC_DIR/rc.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<labwc_config>
<core>
<gap>8</gap>
<adaptiveSync>no</adaptiveSync>
</core>
<theme>
<name>Clearlooks</name>
<cornerRadius>8</cornerRadius>
<font place="ActiveWindow">
<name>sans</name>
<size>10</size>
</font>
<font place="MenuItem">
<name>sans</name>
<size>10</size>
</font>
<font place="OnScreenDisplay">
<name>sans</name>
<size>10</size>
</font>
</theme>
<keyboard>
<default />
<keybind key="W-Return">
<action name="Execute" command="foot" />
</keybind>
<keybind key="W-d">
<action name="Execute" command="wofi --show drun" />
</keybind>
<keybind key="W-Shift-d">
<action name="Execute" command="wofi --show run" />
</keybind>
<keybind key="W-l">
<action name="Execute" command="swaylock -f -c 000000" />
</keybind>
<keybind key="W-q">
<action name="Close" />
</keybind>
<keybind key="W-Shift-e">
<action name="Exit" />
</keybind>
<keybind key="W-f">
<action name="ToggleMaximize" />
</keybind>
<keybind key="W-Left">
<action name="SnapToEdge" direction="left" />
</keybind>
<keybind key="W-Right">
<action name="SnapToEdge" direction="right" />
</keybind>
<keybind key="W-1">
<action name="GoToDesktop" to="1" />
</keybind>
<keybind key="W-2">
<action name="GoToDesktop" to="2" />
</keybind>
<keybind key="W-3">
<action name="GoToDesktop" to="3" />
</keybind>
<keybind key="W-4">
<action name="GoToDesktop" to="4" />
</keybind>
<keybind key="Print">
<action name="Execute" command="grim -g $(slurp) $HOME/Pictures/screenshot-$(date +%Y%m%d-%H%M%S).png" />
</keybind>
</keyboard>
<mouse>
<default />
<context name="Frame">
<mousebind button="W-Left" action="Press">
<action name="Focus" />
<action name="Raise" />
</mousebind>
<mousebind button="W-Left" action="Drag">
<action name="Move" />
</mousebind>
<mousebind button="W-Right" action="Drag">
<action name="Resize" />
</mousebind>
</context>
</mouse>
</labwc_config>
EOF
ok "Создан $LABWC_DIR/rc.xml"
else
warn "$LABWC_DIR/rc.xml уже существует, пропускаю"
fi
# autostart — только если не существует
if [ ! -f "$LABWC_DIR/autostart" ]; then
cat > "$LABWC_DIR/autostart" << 'EOF'
#!/bin/sh
# Автозапуск labwc
# Фон
swaybg -c '#2e3440' &
# Панель
waybar &
# Уведомления
mako &
# Буфер обмена
wl-paste --watch cliphist store &
# Экранный блокировщик при простое
swayidle -w \
timeout 300 'swaylock -f -c 000000' \
timeout 600 'wlopm --off \*' \
resume 'wlopm --on \*' \
before-sleep 'swaylock -f -c 000000' &
EOF
chmod +x "$LABWC_DIR/autostart"
ok "Создан $LABWC_DIR/autostart"
else
warn "$LABWC_DIR/autostart уже существует, пропускаю"
fi
# menu.xml — контекстное меню
if [ ! -f "$LABWC_DIR/menu.xml" ]; then
cat > "$LABWC_DIR/menu.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<openbox_menu>
<menu id="root-menu" label="Labwc">
<item label="Terminal">
<action name="Execute" command="foot" />
</item>
<item label="Browser">
<action name="Execute" command="firefox" />
</item>
<separator />
<item label="Reconfigure">
<action name="Reconfigure" />
</item>
<item label="Exit">
<action name="Exit" />
</item>
</menu>
</openbox_menu>
EOF
ok "Создан $LABWC_DIR/menu.xml"
else
warn "$LABWC_DIR/menu.xml уже существует, пропускаю"
fi
# --- Настройка waybar ---
info "Настройка waybar..."
WAYBAR_DIR="$USER_HOME/.config/waybar"
mkdir -p "$WAYBAR_DIR"
if [ ! -f "$WAYBAR_DIR/config" ]; then
cat > "$WAYBAR_DIR/config" << 'EOF'
{
"layer": "top",
"position": "top",
"height": 30,
"spacing": 4,
"modules-left": ["sway/workspaces", "sway/window"],
"modules-center": ["clock"],
"modules-right": ["pulseaudio", "network", "cpu", "memory", "tray"],
"clock": {
"format": "{:%Y-%m-%d %H:%M}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt>{calendar}</tt>",
"format-alt": "{:%H:%M:%S}"
},
"cpu": {
"format": "CPU {usage}%",
"tooltip": false
},
"memory": {
"format": "RAM {}%"
},
"network": {
"format-wifi": "WiFi {signalStrength}%",
"format-ethernet": "Eth {ipaddr}/{cidr}",
"tooltip-format": "{ifname} via {gwaddr}",
"format-linked": "{ifname} (No IP)",
"format-disconnected": "Disconnected",
"format-alt": "{ifname}: {ipaddr}/{cidr}"
},
"pulseaudio": {
"format": "Vol {volume}%",
"format-muted": "Muted",
"on-click": "pavucontrol"
},
"tray": {
"spacing": 10
}
}
EOF
ok "Создан $WAYBAR_DIR/config"
else
warn "$WAYBAR_DIR/config уже существует, пропускаю"
fi
if [ ! -f "$WAYBAR_DIR/style.css" ]; then
cat > "$WAYBAR_DIR/style.css" << 'EOF'
* {
border: none;
border-radius: 0;
font-family: "DejaVu Sans", sans-serif;
font-size: 13px;
min-height: 0;
}
window#waybar {
background-color: #2e3440;
color: #d8dee9;
transition-property: background-color;
transition-duration: .5s;
}
#workspaces button {
padding: 0 10px;
color: #d8dee9;
}
#workspaces button.focused {
background-color: #4c566a;
color: #eceff4;
}
#workspaces button.urgent {
background-color: #bf616a;
}
#clock,
#cpu,
#memory,
#network,
#pulseaudio,
#tray {
padding: 0 10px;
margin: 0 4px;
color: #d8dee9;
}
#clock {
background-color: #434c5e;
}
#tray {
background-color: #3b4252;
}
EOF
ok "Создан $WAYBAR_DIR/style.css"
else
warn "$WAYBAR_DIR/style.css уже существует, пропускаю"
fi
# --- Настройка foot (терминал) ---
info "Настройка foot..."
FOOT_DIR="$USER_HOME/.config/foot"
mkdir -p "$FOOT_DIR"
if [ ! -f "$FOOT_DIR/foot.ini" ]; then
cat > "$FOOT_DIR/foot.ini" << 'EOF'
[main]
font=monospace:size=10
pad=8x8
[scrollback]
lines=10000
[cursor]
style=block
blink=no
[colors]
alpha=0.95
background=2e3440
foreground=d8dee9
regular0=3b4252
regular1=bf616a
regular2=a3be8c
regular3=ebcb8b
regular4=81a1c1
regular5=b48ead
regular6=88c0d0
regular7=e5e9f0
EOF
ok "Создан $FOOT_DIR/foot.ini"
else
warn "$FOOT_DIR/foot.ini уже существует, пропускаю"
fi
# --- Настройка mako (уведомления) ---
info "Настройка mako..."
MAKO_DIR="$USER_HOME/.config/mako"
mkdir -p "$MAKO_DIR"
if [ ! -f "$MAKO_DIR/config" ]; then
cat > "$MAKO_DIR/config" << 'EOF'
font=DejaVu Sans 10
background-color=#2e3440
text-color=#d8dee9
width=300
height=100
margin=10
padding=10
border-size=2
border-color=#4c566a
border-radius=8
progress-color=over #88c0d0
icons=1
max-icon-size=48
layer=overlay
anchor=top-right
default-timeout=5000
EOF
ok "Создан $MAKO_DIR/config"
else
warn "$MAKO_DIR/config уже существует, пропускаю"
fi
# --- Настройка автозапуска labwc при входе ---
info "Настройка автозапуска labwc..."
BASH_PROFILE="$USER_HOME/.bash_profile"
AUTOSTART_MARKER="# === labwc autostart ==="
if [ -f "$BASH_PROFILE" ] && grep -q "$AUTOSTART_MARKER" "$BASH_PROFILE" 2>/dev/null; then
warn "Автозапуск labwc уже настроен в .bash_profile"
else
cat >> "$BASH_PROFILE" << EOF
$AUTOSTART_MARKER
if [ -z "\$WAYLAND_DISPLAY" ] && [ "\$(tty)" = "/dev/tty1" ]; then
exec labwc
fi
# === end labwc autostart ===
EOF
ok "Автозапуск labwc добавлен в .bash_profile"
fi
# --- Права на конфиги ---
chown -R "$TARGET_USER:$TARGET_USER" "$USER_HOME/.config"
# --- Создание директорий ---
mkdir -p "$USER_HOME/Pictures" "$USER_HOME/Downloads"
chown "$TARGET_USER:$TARGET_USER" "$USER_HOME/Pictures" "$USER_HOME/Downloads"
# --- Финал ---
echo ""
echo "============================================================"
echo " Labwc установлен и настроен!"
echo "============================================================"
echo ""
echo "Пользователь: $TARGET_USER"
echo ""
echo "Горячие клавиши:"
echo " Win+Enter — Терминал (foot)"
echo " Win+D — Меню приложений (wofi)"
echo " Win+Shift+D — Запуск команды (wofi --show run)"
echo " Win+L — Блокировка экрана"
echo " Win+Q — Закрыть окно"
echo " Win+F — Развернуть окно"
echo " Win+1..4 — Переключение рабочих столов"
echo " Print — Скриншот области"
echo " Win+Shift+E — Выход из labwc"
echo ""
echo "Действия после установки:"
echo " 1. Перезагрузитесь: reboot"
echo " 2. Войдите как $TARGET_USER на tty1"
echo " 3. Labwc запустится автоматически"
echo ""
echo "Если labwc не запустился автоматически:"
echo " login: $TARGET_USER"
echo " $ labwc"
echo ""
ok "Установка завершена!"
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

+17
View File
@@ -0,0 +1,17 @@
general {
# Команда, которая выполняется при вызове блокировки через систему/dbus
lock_cmd = hyprlock
}
# ПРАВИЛО 1: Блокировка экрана через 5 минут бездействия
listener {
timeout = 300 # 5 минут (300 секунд)
on-timeout = hyprlock # Только блокируем экран
}
# ПРАВИЛО 2: Выключение мониторов через 5.5 минут (через 30 секунд после блокировки)
listener {
timeout = 330 # 5 минут 30 секунд
on-timeout = wlopm --off \* # Гасим все мониторы
on-resume = wlopm --on \* # Включаем при активности
}
+364
View File
@@ -0,0 +1,364 @@
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- AUTOGENERATED HYPRLAND CONFIG. --
-- EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS. --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
hl.config({ autogenerated = true }) -- remove this line to remove the warning
-- This is an example Hyprland Lua config file.
-- Refer to the wiki for more information.
-- https://wiki.hypr.land/Configuring/Start/
-- Please note not all available settings / options are set here.
-- For a full list, see the wiki
-- You can (and should!!) split this configuration into multiple files
-- Create your files separately and then require them like this:
-- require("myColors")
------------------
---- MONITORS ----
------------------
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = "auto",
})
---------------------
---- MY PROGRAMS ----
---------------------
-- Set programs that you use
local terminal = "kitty"
local fileManager = "dolphin"
local menu = "hyprlauncher"
-------------------
---- AUTOSTART ----
-------------------
-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
-- Autostart necessary processes (like notifications daemons, status bars, etc.)
-- Or execute your favorite apps at launch like this:
--
-- hl.on("hyprland.start", function ()
-- hl.exec_cmd(terminal)
-- hl.exec_cmd("nm-applet")
-- hl.exec_cmd("waybar & hyprpaper & firefox")
-- end)
-------------------------------
---- ENVIRONMENT VARIABLES ----
-------------------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
-----------------------
----- PERMISSIONS -----
-----------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly
-- for security reasons
-- hl.config({
-- ecosystem = {
-- enforce_permissions = true,
-- },
-- })
-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow")
-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow")
-----------------------
---- LOOK AND FEEL ----
-----------------------
-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
hl.config({
general = {
gaps_in = 5,
gaps_out = 20,
border_size = 2,
col = {
active_border = { colors = {"rgba(33ccffee)", "rgba(00ff99ee)"}, angle = 45 },
inactive_border = "rgba(595959aa)",
},
-- Set to true to enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false,
-- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
allow_tearing = false,
layout = "dwindle",
},
decoration = {
rounding = 10,
rounding_power = 2,
-- Change transparency of focused and unfocused windows
active_opacity = 1.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 4,
render_power = 3,
color = 0xee1a1a1a,
},
blur = {
enabled = true,
size = 3,
passes = 1,
vibrancy = 0.1696,
},
},
animations = {
enabled = true,
},
})
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} } })
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} } })
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 238.1191, dampening = 24.21279333 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- "Smart gaps" / "No gaps when only"
-- uncomment all if you wish to use that.
-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
-- hl.window_rule({
-- name = "no-gaps-wtv1",
-- match = { float = false, workspace = "w[tv1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- hl.window_rule({
-- name = "no-gaps-f1",
-- match = { float = false, workspace = "f[1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true, -- You probably want this
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
hl.config({
scrolling = {
fullscreen_on_one_column = true,
},
})
----------------
---- MISC ----
----------------
hl.config({
misc = {
force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
},
})
---------------
---- INPUT ----
---------------
hl.config({
input = {
kb_layout = "us",
kb_variant = "",
kb_model = "",
kb_options = "",
kb_rules = "",
follow_mouse = 1,
sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = false,
},
},
})
hl.gesture({
fingers = 3,
direction = "horizontal",
action = "workspace"
})
-- Example per-device config
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more
hl.device({
name = "epic-mouse-v1",
sensitivity = -0.5,
})
---------------------
---- KEYBINDINGS ----
---------------------
local mainMod = "SUPER" -- Sets "Windows" key as main modifier
-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal))
local closeWindowBind = hl.bind(mainMod .. " + C", hl.dsp.window.close())
-- closeWindowBind:set_enabled(false)
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch 'hl.dsp.exit()'"))
hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager))
hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu))
hl.bind(mainMod .. " + P", hl.dsp.window.pseudo())
hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit")) -- dwindle only
-- Move focus with mainMod + arrow keys
hl.bind(mainMod .. " + left", hl.dsp.focus({ direction = "left" }))
hl.bind(mainMod .. " + right", hl.dsp.focus({ direction = "right" }))
hl.bind(mainMod .. " + up", hl.dsp.focus({ direction = "up" }))
hl.bind(mainMod .. " + down", hl.dsp.focus({ direction = "down" }))
-- Switch workspaces with mainMod + [0-9]
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
for i = 1, 10 do
local key = i % 10 -- 10 maps to key 0
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i}))
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Example special workspace (scratchpad)
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic"))
hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" }))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
--------------------------------
---- WINDOWS AND WORKSPACES ----
--------------------------------
-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Example window rules that are useful
local suppressMaximizeRule = hl.window_rule({
-- Ignore maximize requests from all apps. You'll probably like this.
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
-- suppressMaximizeRule:set_enabled(false)
hl.window_rule({
-- Fix some dragging issues with XWayland
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Layer rules also return a handle.
-- local overlayLayerRule = hl.layer_rule({
-- name = "no-anim-overlay",
-- match = { namespace = "^my-overlay$" },
-- no_anim = true,
-- })
-- overlayLayerRule:set_enabled(false)
-- Hyprland-run windowrule
hl.window_rule({
name = "move-hyprland-run",
match = { class = "hyprland-run" },
move = "20 monitor_h-120",
float = true,
})
+91
View File
@@ -0,0 +1,91 @@
source = /home/ivan/.config/aether/theme/hyprlock.conf
$font_time = Widock TRIAL
$font = JetBrainsMono Nerd Font
general {
hide_cursor = false
}
background {
monitor =
path = screenshot # Сделает скриншот текущего экрана
blur_passes = 3 # Эффект размытия (оптимально 2-3)
blur_size = 7
# ЗАТЕМНЕНИЕ: Снижаем яркость картинки (0.0 — полностью черный, 1.0 — исходная яркость)
# Значение 0.5 уменьшит яркость скриншота ровно наполовину
brightness = 0.5
noise = 0.05
}
input-field {
monitor =
rounding = 0
size = 150, 50
outline_thickness = 2
font_family = $font
dots_size = 0.25
dots_spacing = 0.15
dots_center = true
fade_on_empty = false
placeholder_text = <i>you shall not pass</i>
hide_input = false
position = 0, -100
halign = center
valign = center
# Используем точные переменные из файла Aether
font_color = $font_color
inner_color = $inner_color
outer_color = $outer_color
check_color = $check_color
}
# ЧАСЫ
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%H")"
color = $font_color
font_size = 150
font_family = $font_time
position = 0, -250
halign = center
valign = top
shadow_passes = 0
}
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%M")"
color = $font_color
font_size = 150
font_family = $font_time
position = 0, -400
halign = center
valign = top
shadow_passes = 0
}
# ДАТА
label {
monitor =
text = cmd[update:1000] echo "$(date +'%A')"
color = $font_color
font_size = 18
font_family = $font_time
position = 0, -20
halign = center
valign = center
shadow_passes = 0
}
label {
monitor =
text = cmd[update:1000] echo "$(date +'%d %B')"
color = $font_color
font_size = 18
font_family = $font_time
position = 0, -40
halign = center
valign = center
shadow_passes = 0
}
+25
View File
@@ -0,0 +1,25 @@
{
"name": "spotify-popup",
"position": "top",
"height": 0,
"layer": "background",
"exclusive_zone": false,
"popup_gap": 0,
"popup_autohide": true,
"css_path": "style.css",
"margin": {
"right": 400
},
"end": [
{
"type": "music",
"name": "spotify-music",
"player_type": "mpris",
"format": "",
"show_status_icon": false,
"cover_image_size": 120
}
]
}
+37
View File
@@ -0,0 +1,37 @@
@define-color background #0e0e06;
@define-color foreground #c9c7e1;
* {
font-family: "JetBrainsMono Nerd Font", "Font Awesome 7 Free", "Font Awesome 7 Free Solid", "Font Awesome 7 Brands", sans-serif;
/*font-size: 12px;*/
/*border: none;*/
border-radius: 0;
}
window#ironbar {
background: #0e0e06;
}
#spotify-popup {
background: rgba(14, 14, 6, 0.75);
color: #c9c7e1;
min-height: 28px;
padding: 0;
margin: 0;
}
#spotify-music {
padding: 0 10px;
color: #c9c7e1;
}
#spotify-music .icon {
display: none;
}
#spotify-music .cover {
display: none;
}
#spotify-music {
background: red !important;
}
+23
View File
@@ -0,0 +1,23 @@
# синхронизация окружения
dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=labwc &
systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP &
# базовые сервисы
waybar &
mako &
hypridle &
hyprpolkitagent &
ironbar &
# буфер обмена
wl-paste --type text --watch cliphist store &
wl-paste --type image --watch cliphist store &
# тема и обои
~/.config/labwc/update_theme.sh &
# аудиоэффекты
(sleep 2 && easyeffects --gapplication-service) &
# polkit agent
systemctl --user start hyprpolkitagent.service &
+8
View File
@@ -0,0 +1,8 @@
# раскладка и ее порядок
XKB_DEFAULT_LAYOUT=us,ru
# смена раскладки на сочетание клавиш
XKB_DEFAULT_OPTIONS=grp:ctrl_space_toggle
# тема для Qt-приложений
QT_QPA_PLATFORMTHEME=qt6ct
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>
<openbox_menu>
<menu id="root-menu" label="">
<item label="reconfigure">
<action name="Reconfigure" />
<action name="Execute" command="sh -c '~/.config/labwc/update_theme.sh; killall waybar; waybar &amp;'" />
</item> <separator />
<item label="logout"><action name="Exit"/></item> <separator />
<item label="lock"><action name="Execute" command="hyprlock" /></item> <separator />
<item label="sleep"><action name="Execute" command="systemctl suspend" /></item> <separator />
<item label="reboot"><action name="Execute" command="systemctl reboot" /></item> <separator />
<item label="shutdown"><action name="Execute" command="systemctl poweroff" /></item>
</menu>
</openbox_menu>
+194
View File
@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?>
<labwc_config>
<!-- настройка кол-ва рабочих столов -->
<desktops>
<names>
<name>1</name>
<name>2</name>
<name>3</name>
<name>4</name>
</names>
</desktops>
<!-- настройка поведения окон от курсора -->
<focus>
<followMouse>yes</followMouse>
<raiseOnFocus>no</raiseOnFocus>
</focus>
<core>
<theme>
<name>DynamicAether</name>
</theme>
<windowSwitcher style="thumbnail" preview="yes" outlines="yes" />
</core>
<!-- настройка биндов -->
<keyboard>
<default />
<!-- ==================== РАБОТА С ОКНАМИ ==================== -->
<!-- закрытие окон -->
<keybind key="W-w"> <!-- Win+W -->
<action name="Close" />
</keybind>
<!-- растянуть окно в полноэкранный режим -->
<keybind key="S-W-f"> <!-- Shift+Win+F -->
<action name="ToggleFullscreen" />
</keybind>
<!-- максимизировать окно. работает в обратную сторону -->
<keybind key="W-f"> <!-- Win+F -->
<action name="ToggleMaximize" />
</keybind>
<!-- свернуть окно -->
<keybind key="S-C-f"> <!-- Shift+Ctrl+F -->
<action name="Iconify" />
</keybind>
<!-- снап окна влево (полэкрана) -->
<keybind key="W-;"> <!-- Win+; -->
<action name="SnapToEdge" direction="Left" />
</keybind>
<!-- снап окна вправо (полэкрана) -->
<keybind key="W-'"> <!-- Win+' -->
<action name="SnapToEdge" direction="Right" />
</keybind>
<!-- cнап окна в левый верхний угол (четверть экрана) -->
<keybind key="W-p"> <!-- Win+[ -->
<action name="SnapToEdge" direction="up-Left" />
</keybind>
<!-- cнап окна в левый нижний угол (четверть экрана) -->
<keybind key="W-,"> <!-- Win+. -->
<action name="SnapToEdge" direction="down-Left" />
</keybind>
<!-- cнап окна в правый верхний угол (четверть экрана) -->
<keybind key="W-]"> <!-- Win+] -->
<action name="SnapToEdge" direction="up-Right" />
</keybind>
<!-- cнап окна в правый нижний угол (четверть экрана) -->
<keybind key="W-/"> <!-- Win+/ -->
<action name="SnapToEdge" direction="down-Right" />
</keybind>
<!-- cнап окна вверх (полэкрана) -->
<keybind key="W-["> <!-- Win+] -->
<action name="SnapToEdge" direction="up" />
</keybind>
<!-- cнап окна вниз (полэкрана) -->
<keybind key="W-."> <!-- Win+] -->
<action name="SnapToEdge" direction="down" />
</keybind>
<!-- переместить окно на левый монитор -->
<keybind key="A-S-a"> <!-- Right Ctrl + <- (left) -->
<action name="MoveToOutput" direction="left" />
</keybind>
<!-- переместить окно на правый монитор -->
<keybind key="A-S-d"> <!-- Right Ctrl + -> (right) -->
<action name="MoveToOutput" direction="right" />
</keybind>
<!-- ==================== РАБОТА С РАБОЧИМИ СТОЛАМИ ==================== -->
<!-- перейти на раб стол 1 -->
<keybind key="W-1"> <!-- Win+1 -->
<action name="GoToDesktop">
<to>1</to>
</action>
</keybind>
<!-- перейти на раб стол 2 -->
<keybind key="W-2"> <!-- Win+2 -->
<action name="GoToDesktop">
<to>2</to>
</action>
</keybind>
<!-- перейти на раб стол 3 -->
<keybind key="W-3"> <!-- Win+3 -->
<action name="GoToDesktop">
<to>3</to>
</action>
</keybind>
<!-- перейти на раб стол 4 -->
<keybind key="W-4"> <!-- Win+4 -->
<action name="GoToDesktop">
<to>4</to>
</action>
</keybind>
<!-- ==================== ЗАПУСК ПРИЛОЖЕНИЙ ==================== -->
<!-- запустить меню приложений(wofi) -->
<keybind key="W-space"> <!-- Win+Space -->
<action name="Execute" command="wofi --show drun" />
</keybind>
<!-- запустить терминал(alacritty) -->
<keybind key="W-return"> <!-- Win+Return(enter) -->
<action name="Execute" command="alacritty --config-file ~/.config/aether/theme/alacritty.toml" />
</keybind>
<!-- запустить проводник(dolphin) -->
<keybind key="W-e"> <!-- Win+E -->
<action name="Execute" command="dolphin" />
</keybind>
<!-- заблокировать пк -->
<keybind key="W-l"> <!-- Win+L -->
<action name="Execute" command="hyprlock" />
</keybind>
<!-- сделать скриншот области(скриншот не сохраняется на диск) -->
<keybind key="W-S-s"> <!-- Shift+Win+S -->
<action name="Execute">
<command>sh -c 'grim -g "$(slurp)" - | wl-copy'</command>
</action>
</keybind>
<!-- запустить clipboard -->
<keybind key="C-W-v"> <!-- Ctrl+Win+v -->
<action name="Execute">
<command>~/.config/wofi/cliphist-img.sh</command>
</action>
</keybind>
<!-- ==================== УПРАВЛЕНИЕ МУЛЬТИМЕДИЕЙ ====================-->
<!-- остановить/запустить -->
<keybind key="A-R-s"> <!-- Right Alt+s -->
<action name="Execute" command="playerctl --player=spotify,%any play-pause" />
</keybind>
<!-- следующий трек -->
<keybind key="A-R-d"> <!-- Right Alt+d -->
<action name="Execute" command="playerctl --player=spotify,%any next" />
</keybind>
<!-- предыдущий трек -->
<keybind key="A-R-a"> <!-- Right Alt+a -->
<action name="Execute" command="playerctl --player=spotify,%any previous" />
</keybind>
</keyboard>
</labwc_config>
+2
View File
@@ -0,0 +1,2 @@
# очистка clipboard
cliphist wipe &
+17
View File
@@ -0,0 +1,17 @@
# цвет рамки active и inactive
window.active.border.color: #F9EDE4
window.inactive.border.color: #141414
# цвет фона заголовка active и inactive
window.active.title.bg.color: #141414
window.inactive.title.bg.color: #141414
# цвет текста заголовка окна
window.active.label.text.color: #F9EDE4
window.inactive.label.text.color: #F9EDE4
# цвет иконок кнопок для АКТИВНОГО окна
window.active.button.unpressed.image.color: #F9EDE4
# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC)
window.inactive.button.image.color: #F9EDE4
@@ -0,0 +1,8 @@
window.active.title.bg: #040608
window.active.title.text: #D4CFCB
window.active.border.color: #040608
window.inactive.title.bg: #040608
window.inactive.title.text: #D4CFCB
window.inactive.border.color: #040608
window.active.border.width: 2
window.inactive.border.width: 1
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
TARGET_FILE="$HOME/.config/aether/theme/waybar.css"
THEME_FILE="$HOME/.config/labwc/themerc-override"
BG_FOLDER="$HOME/.config/aether/theme/backgrounds"
WALLPAPER=$(find "$BG_FOLDER" -type f | head -n 1)
if [ -f "$TARGET_FILE" ]; then
BG_COLOR=$(grep "background" "$TARGET_FILE" | awk '{print $3}' | tr -d ';')
FG_COLOR=$(grep "foreground" "$TARGET_FILE" | awk '{print $3}' | tr -d ';')
if [ ! -z "$BG_COLOR" ] && [ ! -z "$FG_COLOR" ]; then
cat << EOF > "$THEME_FILE"
# цвет рамки active и inactive
window.active.border.color: $FG_COLOR
window.inactive.border.color: $BG_COLOR
# цвет фона заголовка active и inactive
window.active.title.bg.color: $BG_COLOR
window.inactive.title.bg.color: $BG_COLOR
# цвет текста заголовка окна
window.active.label.text.color: $FG_COLOR
window.inactive.label.text.color: $FG_COLOR
# цвет иконок кнопок для АКТИВНОГО окна
window.active.button.unpressed.image.color: $FG_COLOR
# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC)
window.inactive.button.image.color: $FG_COLOR
EOF
fi
fi
killall swaybg 2>/dev/null
if [ ! -z "$WALLPAPER" ] && [ -f "$WALLPAPER" ]; then
swaybg -m fill -i "$WALLPAPER" &
else
swaybg -c "$BG_COLOR" &
fi
+81
View File
@@ -0,0 +1,81 @@
стек:
labwc
waybar
swaylock(замена hyprlock)
swayidle(замена hypridle)
polkit-gnome(замена hyprpolkit)
dolphin
kate
google-chrome
pipewire
kitty(alacritty)
v2ray
v2rayA
telegram
htop
gparted
pavucontrol
qdirstat
easyeffects
lsp-plugins-lv2
obsidian
ristretto
mpv
wofi
cliphist
sddm
pango
xorg-server-xwayland
mesa-dri
nvidia-open-dkms
wl-clipboard
gtk-layer-shell
grim
slurp
swaybg
mako
seatd
dbus
polkit
fontconfig
noto-fonts-ttf
ttf-dejavu
alsa-pipewire
wireplumber
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
qt6-wayland
qt5-wayland
base-system
void-repo-nonfree
fuse
fuse-common
ca-certificates
curl
xdg-utils
dhcpcd
sudo
acpid
breeze-icons
ffmpeg
libnotify
ttf-jetbrains-mono
adwaita-icon-theme
xdg-desktop-portal-gtk
unzip
zip
p7zip
qt5ct
qt6ct
linux-firmware
ttf-font-awesome
aether(буду писать замену)
установка чистого void linux
обновление системы
sudo xbps-install -Syu
sudo xbps-install -u xbps
+32
View File
@@ -0,0 +1,32 @@
[Appearance]
color_scheme_path=/usr/share/qt6ct/colors/darker.conf
custom_palette=true
icon_theme=breeze-dark
standard_dialogs=default
style=Fusion
[Fonts]
fixed="JetBrainsMono Nerd Font,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular,0,0"
general="JetBrainsMonoNL Nerd Font,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular,0,0"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=2
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()
+65
View File
@@ -0,0 +1,65 @@
{
"layer": "top",
"position": "top",
"height": 25,
"spacing": 0,
"modules-left": ["wlr/taskbar"],
"modules-center": ["clock"],
"modules-right": ["network", "custom/spotify", "custom/v2raya", "custom/language", "pulseaudio", "cpu", "memory", "tray"],
"wlr/taskbar": {
"format": "{icon}",
"icon-size": 15,
"tooltip-format": "{title}",
"on-click": "activate"
},
"custom/language": {
"exec": "xkblayout-state print %s | tr 'a-z' 'A-Z'",
"interval": 1,
"format": " {} "
},
"custom/spotify": {
"format": "[{}] ",
"exec": "playerctl metadata --format '{{artist}} - {{title}}' spotify 2>/dev/null || echo ''",
"on-click": "ironbar bar spotify-popup toggle-popup spotify-music",
"interval": 3,
"max-length": 50
},
"custom/v2raya": {
"format": "PROXY{}",
"return-type": "json",
"interval": 2,
"exec": "/home/ivan/.config/waybar/v2raya-toggle.sh",
"on-click": "/home/ivan/.config/waybar/v2raya-toggle.sh toggle",
"signal": 10
},
"clock": {
"format": "{:%H:%M}",
"format-alt": "{:%d-%m-%Y}"
},
"cpu": {
"format": " {usage}%",
"tooltip": false,
"on-click": "alacritty -e htop"
},
"memory": {
"format": " {}%"
},
"network": {
"min-length": 10,
"format-wifi": " {bandwidthDownBytes}",
"format-ethernet": " {bandwidthDownBytes}",
"format-disconnected": "⚠ DONT",
"interval": 1
},
"pulseaudio": {
"format": " {volume}%",
"format-muted": " Muted",
"on-click": "pavucontrol"
},
"tray": {
"icon-size": 10,
"spacing": 15
}
}
+45
View File
@@ -0,0 +1,45 @@
* {
font-family: "JetBrainsMono Nerd Font", "Font Awesome 7 Free", "Font Awesome 7 Free Solid", "Font Awesome 7 Brands", sans-serif;
font-size: 12px;
border: none;
border-radius: 0;
}
@import "/home/ivan/.config/aether/theme/waybar.css";
window#waybar {
background: alpha(@background, 0.75);
color: @foreground;
min-height: 28px;
}
#clock,
#cpu,
#memory,
#network,
#pulseaudio,
#taskbar,
#custom-spotify,
#tray {
padding: 0 10px;
color: @foreground;
}
#taskbar button {
color: alpha(@foreground, 0.6);
padding: 0 8px;
}
#taskbar button.active {
background-color: alpha(@foreground, 0.2);
box-shadow: inset 0 -2px 0 0 @foreground;
color: @foreground;
}
#custom-v2raya.enabled {
color: @foreground;
}
#custom-v2raya.disabled {
color: @background;
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
# Проверяем, запущен ли процесс v2rayA
if pgrep -x "v2raya" > /dev/null; then
if [ "$1" = "toggle" ]; then
sudo systemctl stop v2raya.service 2>/dev/null || sudo killall v2raya
echo "{\"text\": \" \", \"class\": \"disabled\", \"tooltip\": \"v2rayA выключен\"}"
else
echo "{\"text\": \" \", \"class\": \"enabled\", \"tooltip\": \"v2rayA включен\"}"
fi
else
if [ "$1" = "toggle" ]; then
sudo systemctl start v2raya.service 2>/dev/null || sudo v2raya --daemon &
echo "{\"text\": \" \", \"class\": \"enabled\", \"tooltip\": \"v2rayA включен\"}"
else
echo "{\"text\": \" \", \"class\": \"disabled\", \"tooltip\": \"v2rayA выключен\"}"
fi
fi
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
export WAYLAND_DISPLAY=wayland-0
export XDG_RUNTIME_DIR=/run/user/$(id -u)
thumb_dir="${XDG_CACHE_HOME:-$HOME/.cache}/cliphist/thumbs"
mkdir -p "$thumb_dir"
make_thumb() { # $1 - исходник, $2 - результат
if command -v gdk-pixbuf-thumbnailer >/dev/null 2>&1; then
gdk-pixbuf-thumbnailer -s 256 "$1" "$2" 2>/dev/null
elif command -v magick >/dev/null 2>&1; then
magick "$1" -resize '256x256>' "$2" 2>/dev/null
elif command -v convert >/dev/null 2>&1; then
convert "$1" -resize '256x256>' "$2" 2>/dev/null
fi
# если тулза нет/ошибка — отдаём оригинал, wofi сам смасштабирует
[ -s "$2" ] || cp -f "$1" "$2"
}
wofi_input=""
while read -r line; do
[[ "$line" == *"<meta http-equiv="* ]] && continue
[[ -z "$line" ]] && continue
id="${line%%[[:space:]]*}"
if [[ "$line" == *binary* ]]; then
thumb_path="${thumb_dir}/${id}.png"
if [ ! -s "$thumb_path" ]; then
tmp="$(mktemp)"
# ВАЖНО: передаём строку через pipe,
# иначе decode прочитает stdin цикла и «съест» список
printf '%s\n' "$line" | cliphist decode > "$tmp" 2>/dev/null
[ -s "$tmp" ] && make_thumb "$tmp" "$thumb_path"
rm -f "$tmp"
fi
if [ -s "$thumb_path" ]; then
wofi_input+="img:${thumb_path}\n"
else
wofi_input+="${line}\n"
fi
else
wofi_input+="${line}\n"
fi
done <<< "$(cliphist list)"
choice="$(printf '%b' "$wofi_input" | wofi -I --dmenu --cache-file=/dev/null \
-Dimage_size=100 -Dynamic_lines=true --prompt "Буфер обмена")"
[ -z "$choice" ] && exit 0
if [[ "$choice" == img:* ]]; then
f="${choice#img:}"
id="$(basename "$f" .png)"
printf '%s\t' "$id" | cliphist decode | wl-copy
else
printf '%s\n' "$choice" | cliphist decode | wl-copy
fi
+53
View File
@@ -0,0 +1,53 @@
@import "/home/ivan/.config/aether/theme/wofi.css";
#img {
padding: 5px;
width: 120px;
height: 120px;
}
#entry {
padding: 10px;
}
window {
background-color: @bg;
border: 2px solid @gray3;
}
input {
background-color: @bg;
color: @fg;
border: 1px solid @gray2;
}
input:selected {
background-color: @gray1;
color: @fg_bright;
}
#entry {
color: @fg;
background-color: @bg;
padding: 5px;
margin: 2px;
}
#entry:selected {
background-color: @gray1;
color: @fg_bright;
}
scrollbar {
background-color: @bg;
}
scrollbar slider {
background-color: @gray2;
border-radius: 5px;
}
scrollbar slider:hover {
background-color: @gray3;
}
+17
View File
@@ -0,0 +1,17 @@
general {
# Команда, которая выполняется при вызове блокировки через систему/dbus
lock_cmd = hyprlock
}
# ПРАВИЛО 1: Блокировка экрана через 5 минут бездействия
listener {
timeout = 300 # 5 минут (300 секунд)
on-timeout = hyprlock # Только блокируем экран
}
# ПРАВИЛО 2: Выключение мониторов через 5.5 минут (через 30 секунд после блокировки)
listener {
timeout = 330 # 5 минут 30 секунд
on-timeout = wlopm --off \* # Гасим все мониторы
on-resume = wlopm --on \* # Включаем при активности
}
+364
View File
@@ -0,0 +1,364 @@
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- AUTOGENERATED HYPRLAND CONFIG. --
-- EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS. --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
hl.config({ autogenerated = true }) -- remove this line to remove the warning
-- This is an example Hyprland Lua config file.
-- Refer to the wiki for more information.
-- https://wiki.hypr.land/Configuring/Start/
-- Please note not all available settings / options are set here.
-- For a full list, see the wiki
-- You can (and should!!) split this configuration into multiple files
-- Create your files separately and then require them like this:
-- require("myColors")
------------------
---- MONITORS ----
------------------
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = "auto",
})
---------------------
---- MY PROGRAMS ----
---------------------
-- Set programs that you use
local terminal = "kitty"
local fileManager = "dolphin"
local menu = "hyprlauncher"
-------------------
---- AUTOSTART ----
-------------------
-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
-- Autostart necessary processes (like notifications daemons, status bars, etc.)
-- Or execute your favorite apps at launch like this:
--
-- hl.on("hyprland.start", function ()
-- hl.exec_cmd(terminal)
-- hl.exec_cmd("nm-applet")
-- hl.exec_cmd("waybar & hyprpaper & firefox")
-- end)
-------------------------------
---- ENVIRONMENT VARIABLES ----
-------------------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
-----------------------
----- PERMISSIONS -----
-----------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly
-- for security reasons
-- hl.config({
-- ecosystem = {
-- enforce_permissions = true,
-- },
-- })
-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow")
-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow")
-----------------------
---- LOOK AND FEEL ----
-----------------------
-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
hl.config({
general = {
gaps_in = 5,
gaps_out = 20,
border_size = 2,
col = {
active_border = { colors = {"rgba(33ccffee)", "rgba(00ff99ee)"}, angle = 45 },
inactive_border = "rgba(595959aa)",
},
-- Set to true to enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false,
-- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
allow_tearing = false,
layout = "dwindle",
},
decoration = {
rounding = 10,
rounding_power = 2,
-- Change transparency of focused and unfocused windows
active_opacity = 1.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 4,
render_power = 3,
color = 0xee1a1a1a,
},
blur = {
enabled = true,
size = 3,
passes = 1,
vibrancy = 0.1696,
},
},
animations = {
enabled = true,
},
})
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} } })
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} } })
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 238.1191, dampening = 24.21279333 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- "Smart gaps" / "No gaps when only"
-- uncomment all if you wish to use that.
-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
-- hl.window_rule({
-- name = "no-gaps-wtv1",
-- match = { float = false, workspace = "w[tv1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- hl.window_rule({
-- name = "no-gaps-f1",
-- match = { float = false, workspace = "f[1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true, -- You probably want this
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
hl.config({
scrolling = {
fullscreen_on_one_column = true,
},
})
----------------
---- MISC ----
----------------
hl.config({
misc = {
force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
},
})
---------------
---- INPUT ----
---------------
hl.config({
input = {
kb_layout = "us",
kb_variant = "",
kb_model = "",
kb_options = "",
kb_rules = "",
follow_mouse = 1,
sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = false,
},
},
})
hl.gesture({
fingers = 3,
direction = "horizontal",
action = "workspace"
})
-- Example per-device config
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more
hl.device({
name = "epic-mouse-v1",
sensitivity = -0.5,
})
---------------------
---- KEYBINDINGS ----
---------------------
local mainMod = "SUPER" -- Sets "Windows" key as main modifier
-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal))
local closeWindowBind = hl.bind(mainMod .. " + C", hl.dsp.window.close())
-- closeWindowBind:set_enabled(false)
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch 'hl.dsp.exit()'"))
hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager))
hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu))
hl.bind(mainMod .. " + P", hl.dsp.window.pseudo())
hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit")) -- dwindle only
-- Move focus with mainMod + arrow keys
hl.bind(mainMod .. " + left", hl.dsp.focus({ direction = "left" }))
hl.bind(mainMod .. " + right", hl.dsp.focus({ direction = "right" }))
hl.bind(mainMod .. " + up", hl.dsp.focus({ direction = "up" }))
hl.bind(mainMod .. " + down", hl.dsp.focus({ direction = "down" }))
-- Switch workspaces with mainMod + [0-9]
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
for i = 1, 10 do
local key = i % 10 -- 10 maps to key 0
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i}))
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Example special workspace (scratchpad)
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic"))
hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" }))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
--------------------------------
---- WINDOWS AND WORKSPACES ----
--------------------------------
-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Example window rules that are useful
local suppressMaximizeRule = hl.window_rule({
-- Ignore maximize requests from all apps. You'll probably like this.
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
-- suppressMaximizeRule:set_enabled(false)
hl.window_rule({
-- Fix some dragging issues with XWayland
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Layer rules also return a handle.
-- local overlayLayerRule = hl.layer_rule({
-- name = "no-anim-overlay",
-- match = { namespace = "^my-overlay$" },
-- no_anim = true,
-- })
-- overlayLayerRule:set_enabled(false)
-- Hyprland-run windowrule
hl.window_rule({
name = "move-hyprland-run",
match = { class = "hyprland-run" },
move = "20 monitor_h-120",
float = true,
})
+91
View File
@@ -0,0 +1,91 @@
source = /home/ivan/.config/aether/theme/hyprlock.conf
$font_time = Widock TRIAL
$font = JetBrainsMono Nerd Font
general {
hide_cursor = false
}
background {
monitor =
path = screenshot # Сделает скриншот текущего экрана
blur_passes = 3 # Эффект размытия (оптимально 2-3)
blur_size = 7
# ЗАТЕМНЕНИЕ: Снижаем яркость картинки (0.0 — полностью черный, 1.0 — исходная яркость)
# Значение 0.5 уменьшит яркость скриншота ровно наполовину
brightness = 0.5
noise = 0.05
}
input-field {
monitor =
rounding = 0
size = 150, 50
outline_thickness = 2
font_family = $font
dots_size = 0.25
dots_spacing = 0.15
dots_center = true
fade_on_empty = false
placeholder_text = <i>you shall not pass</i>
hide_input = false
position = 0, -100
halign = center
valign = center
# Используем точные переменные из файла Aether
font_color = $font_color
inner_color = $inner_color
outer_color = $outer_color
check_color = $check_color
}
# ЧАСЫ
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%H")"
color = $font_color
font_size = 150
font_family = $font_time
position = 0, -250
halign = center
valign = top
shadow_passes = 0
}
label {
monitor =
text = cmd[update:1000] echo -e "$(date +"%M")"
color = $font_color
font_size = 150
font_family = $font_time
position = 0, -400
halign = center
valign = top
shadow_passes = 0
}
# ДАТА
label {
monitor =
text = cmd[update:1000] echo "$(date +'%A')"
color = $font_color
font_size = 18
font_family = $font_time
position = 0, -20
halign = center
valign = center
shadow_passes = 0
}
label {
monitor =
text = cmd[update:1000] echo "$(date +'%d %B')"
color = $font_color
font_size = 18
font_family = $font_time
position = 0, -40
halign = center
valign = center
shadow_passes = 0
}
+15
View File
@@ -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 &
+23
View File
@@ -0,0 +1,23 @@
# синхронизация окружения
dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=labwc &
systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP &
# базовые сервисы
waybar &
mako &
hypridle &
hyprpolkitagent &
ironbar &
# буфер обмена
wl-paste --type text --watch cliphist store &
wl-paste --type image --watch cliphist store &
# тема и обои
~/.config/labwc/update_theme.sh &
# аудиоэффекты
(sleep 2 && easyeffects --gapplication-service) &
# polkit agent
systemctl --user start hyprpolkitagent.service &
+8
View File
@@ -0,0 +1,8 @@
# раскладка и ее порядок
XKB_DEFAULT_LAYOUT=us,ru
# смена раскладки на сочетание клавиш
XKB_DEFAULT_OPTIONS=grp:ctrl_space_toggle
# тема для Qt-приложений
QT_QPA_PLATFORMTHEME=qt6ct
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>
<openbox_menu>
<menu id="root-menu" label="">
<item label="reconfigure">
<action name="Reconfigure" />
<action name="Execute" command="sh -c '~/.config/labwc/update_theme.sh; killall waybar; waybar &amp;'" />
</item> <separator />
<item label="logout"><action name="Exit"/></item> <separator />
<item label="lock"><action name="Execute" command="hyprlock" /></item> <separator />
<item label="sleep"><action name="Execute" command="systemctl suspend" /></item> <separator />
<item label="reboot"><action name="Execute" command="systemctl reboot" /></item> <separator />
<item label="shutdown"><action name="Execute" command="systemctl poweroff" /></item>
</menu>
</openbox_menu>
+194
View File
@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?>
<labwc_config>
<!-- настройка кол-ва рабочих столов -->
<desktops>
<names>
<name>1</name>
<name>2</name>
<name>3</name>
<name>4</name>
</names>
</desktops>
<!-- настройка поведения окон от курсора -->
<focus>
<followMouse>yes</followMouse>
<raiseOnFocus>no</raiseOnFocus>
</focus>
<core>
<theme>
<name>DynamicAether</name>
</theme>
<windowSwitcher style="thumbnail" preview="yes" outlines="yes" />
</core>
<!-- настройка биндов -->
<keyboard>
<default />
<!-- ==================== РАБОТА С ОКНАМИ ==================== -->
<!-- закрытие окон -->
<keybind key="W-w"> <!-- Win+W -->
<action name="Close" />
</keybind>
<!-- растянуть окно в полноэкранный режим -->
<keybind key="S-W-f"> <!-- Shift+Win+F -->
<action name="ToggleFullscreen" />
</keybind>
<!-- максимизировать окно. работает в обратную сторону -->
<keybind key="W-f"> <!-- Win+F -->
<action name="ToggleMaximize" />
</keybind>
<!-- свернуть окно -->
<keybind key="S-C-f"> <!-- Shift+Ctrl+F -->
<action name="Iconify" />
</keybind>
<!-- снап окна влево (полэкрана) -->
<keybind key="W-;"> <!-- Win+; -->
<action name="SnapToEdge" direction="Left" />
</keybind>
<!-- снап окна вправо (полэкрана) -->
<keybind key="W-'"> <!-- Win+' -->
<action name="SnapToEdge" direction="Right" />
</keybind>
<!-- cнап окна в левый верхний угол (четверть экрана) -->
<keybind key="W-p"> <!-- Win+[ -->
<action name="SnapToEdge" direction="up-Left" />
</keybind>
<!-- cнап окна в левый нижний угол (четверть экрана) -->
<keybind key="W-,"> <!-- Win+. -->
<action name="SnapToEdge" direction="down-Left" />
</keybind>
<!-- cнап окна в правый верхний угол (четверть экрана) -->
<keybind key="W-]"> <!-- Win+] -->
<action name="SnapToEdge" direction="up-Right" />
</keybind>
<!-- cнап окна в правый нижний угол (четверть экрана) -->
<keybind key="W-/"> <!-- Win+/ -->
<action name="SnapToEdge" direction="down-Right" />
</keybind>
<!-- cнап окна вверх (полэкрана) -->
<keybind key="W-["> <!-- Win+] -->
<action name="SnapToEdge" direction="up" />
</keybind>
<!-- cнап окна вниз (полэкрана) -->
<keybind key="W-."> <!-- Win+] -->
<action name="SnapToEdge" direction="down" />
</keybind>
<!-- переместить окно на левый монитор -->
<keybind key="A-S-a"> <!-- Right Ctrl + <- (left) -->
<action name="MoveToOutput" direction="left" />
</keybind>
<!-- переместить окно на правый монитор -->
<keybind key="A-S-d"> <!-- Right Ctrl + -> (right) -->
<action name="MoveToOutput" direction="right" />
</keybind>
<!-- ==================== РАБОТА С РАБОЧИМИ СТОЛАМИ ==================== -->
<!-- перейти на раб стол 1 -->
<keybind key="W-1"> <!-- Win+1 -->
<action name="GoToDesktop">
<to>1</to>
</action>
</keybind>
<!-- перейти на раб стол 2 -->
<keybind key="W-2"> <!-- Win+2 -->
<action name="GoToDesktop">
<to>2</to>
</action>
</keybind>
<!-- перейти на раб стол 3 -->
<keybind key="W-3"> <!-- Win+3 -->
<action name="GoToDesktop">
<to>3</to>
</action>
</keybind>
<!-- перейти на раб стол 4 -->
<keybind key="W-4"> <!-- Win+4 -->
<action name="GoToDesktop">
<to>4</to>
</action>
</keybind>
<!-- ==================== ЗАПУСК ПРИЛОЖЕНИЙ ==================== -->
<!-- запустить меню приложений(wofi) -->
<keybind key="W-space"> <!-- Win+Space -->
<action name="Execute" command="wofi --show drun" />
</keybind>
<!-- запустить терминал(alacritty) -->
<keybind key="W-return"> <!-- Win+Return(enter) -->
<action name="Execute" command="alacritty --config-file ~/.config/aether/theme/alacritty.toml" />
</keybind>
<!-- запустить проводник(dolphin) -->
<keybind key="W-e"> <!-- Win+E -->
<action name="Execute" command="dolphin" />
</keybind>
<!-- заблокировать пк -->
<keybind key="W-l"> <!-- Win+L -->
<action name="Execute" command="hyprlock" />
</keybind>
<!-- сделать скриншот области(скриншот не сохраняется на диск) -->
<keybind key="W-S-s"> <!-- Shift+Win+S -->
<action name="Execute">
<command>sh -c 'grim -g "$(slurp)" - | wl-copy'</command>
</action>
</keybind>
<!-- запустить clipboard -->
<keybind key="C-W-v"> <!-- Ctrl+Win+v -->
<action name="Execute">
<command>~/.config/wofi/cliphist-img.sh</command>
</action>
</keybind>
<!-- ==================== УПРАВЛЕНИЕ МУЛЬТИМЕДИЕЙ ====================-->
<!-- остановить/запустить -->
<keybind key="A-R-s"> <!-- Right Alt+s -->
<action name="Execute" command="playerctl --player=spotify,%any play-pause" />
</keybind>
<!-- следующий трек -->
<keybind key="A-R-d"> <!-- Right Alt+d -->
<action name="Execute" command="playerctl --player=spotify,%any next" />
</keybind>
<!-- предыдущий трек -->
<keybind key="A-R-a"> <!-- Right Alt+a -->
<action name="Execute" command="playerctl --player=spotify,%any previous" />
</keybind>
</keyboard>
</labwc_config>
+2
View File
@@ -0,0 +1,2 @@
# очистка clipboard
cliphist wipe &
+17
View File
@@ -0,0 +1,17 @@
# цвет рамки active и inactive
window.active.border.color: #F9EDE4
window.inactive.border.color: #141414
# цвет фона заголовка active и inactive
window.active.title.bg.color: #141414
window.inactive.title.bg.color: #141414
# цвет текста заголовка окна
window.active.label.text.color: #F9EDE4
window.inactive.label.text.color: #F9EDE4
# цвет иконок кнопок для АКТИВНОГО окна
window.active.button.unpressed.image.color: #F9EDE4
# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC)
window.inactive.button.image.color: #F9EDE4
@@ -0,0 +1,8 @@
window.active.title.bg: #040608
window.active.title.text: #D4CFCB
window.active.border.color: #040608
window.inactive.title.bg: #040608
window.inactive.title.text: #D4CFCB
window.inactive.border.color: #040608
window.active.border.width: 2
window.inactive.border.width: 1
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
TARGET_FILE="$HOME/.config/aether/theme/waybar.css"
THEME_FILE="$HOME/.config/labwc/themerc-override"
BG_FOLDER="$HOME/.config/aether/theme/backgrounds"
WALLPAPER=$(find "$BG_FOLDER" -type f | head -n 1)
if [ -f "$TARGET_FILE" ]; then
BG_COLOR=$(grep "background" "$TARGET_FILE" | awk '{print $3}' | tr -d ';')
FG_COLOR=$(grep "foreground" "$TARGET_FILE" | awk '{print $3}' | tr -d ';')
if [ ! -z "$BG_COLOR" ] && [ ! -z "$FG_COLOR" ]; then
cat << EOF > "$THEME_FILE"
# цвет рамки active и inactive
window.active.border.color: $FG_COLOR
window.inactive.border.color: $BG_COLOR
# цвет фона заголовка active и inactive
window.active.title.bg.color: $BG_COLOR
window.inactive.title.bg.color: $BG_COLOR
# цвет текста заголовка окна
window.active.label.text.color: $FG_COLOR
window.inactive.label.text.color: $FG_COLOR
# цвет иконок кнопок для АКТИВНОГО окна
window.active.button.unpressed.image.color: $FG_COLOR
# цвет иконок кнопок для НЕАКТИВНОГО окна (ОБЯЗАТЕЛЬНЫЙ КЛЮЧ LABWC)
window.inactive.button.image.color: $FG_COLOR
EOF
fi
fi
killall swaybg 2>/dev/null
if [ ! -z "$WALLPAPER" ] && [ -f "$WALLPAPER" ]; then
swaybg -m fill -i "$WALLPAPER" &
else
swaybg -c "$BG_COLOR" &
fi
+81
View File
@@ -0,0 +1,81 @@
стек:
labwc
waybar
swaylock(замена hyprlock)
swayidle(замена hypridle)
polkit-gnome(замена hyprpolkit)
dolphin
kate
google-chrome
pipewire
kitty(alacritty)
v2ray
v2rayA
telegram
htop
gparted
pavucontrol
qdirstat
easyeffects
lsp-plugins-lv2
obsidian
ristretto
mpv
wofi
cliphist
sddm
pango
xorg-server-xwayland
mesa-dri
nvidia-open-dkms
wl-clipboard
gtk-layer-shell
grim
slurp
swaybg
mako
seatd
dbus
polkit
fontconfig
noto-fonts-ttf
ttf-dejavu
alsa-pipewire
wireplumber
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
qt6-wayland
qt5-wayland
base-system
void-repo-nonfree
fuse
fuse-common
ca-certificates
curl
xdg-utils
dhcpcd
sudo
acpid
breeze-icons
ffmpeg
libnotify
ttf-jetbrains-mono
adwaita-icon-theme
xdg-desktop-portal-gtk
unzip
zip
p7zip
qt5ct
qt6ct
linux-firmware
ttf-font-awesome
aether(буду писать замену)
установка чистого void linux
обновление системы
sudo xbps-install -Syu
sudo xbps-install -u xbps
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
PALETTE="$HOME/.config/labwc/palettes/palette-dark.json"
FG_COLOR=$(jq -r '.FG_COLOR' "$PALETTE")
SUB_FG_COLOR=$(jq -r '.SUB_FG_COLOR' "$PALETTE")
BG_COLOR=$(jq -r '.BG_COLOR' "$PALETTE")
SUB_BG_COLOR=$(jq -r '.SUB_BG_COLOR' "$PALETTE")
ACCENT_COLOR=$(jq -r '.ACCENT_COLOR' "$PALETTE")
SUB_ACCENT_COLOR=$(jq -r '.SUB_ACCENT_COLOR' "$PALETTE")
cat << EOF > "$HOME/.config/labwc/themerc-override"
# цвет рамки active и inactive
window.active.border.color: $FG_COLOR
window.inactive.border.color: $BG_COLOR
# цвет фона заголовка active и inactive
window.active.title.bg.color: $FG_COLOR
window.inactive.title.bg.color: $FG_COLOR
# цвет текста заголовка окна
window.active.label.text.color: $BG_COLOR
window.inactive.label.text.color: $BG_COLOR
# цвет иконок кнопок для АКТИВНОГО окна
window.active.button.unpressed.image.color: $BG_COLOR
# цвет иконок кнопок для НЕАКТИВНОГО окна
window.inactive.button.image.color: $BG_COLOR
EOF
killall swaybg 2>/dev/null
swaybg \
-m fill \
-i "$HOME/.config/labwc/backgrounds/voidlinux_bg_dark.png" &
+25
View File
@@ -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" &
+32
View File
@@ -0,0 +1,32 @@
[Appearance]
color_scheme_path=/usr/share/qt6ct/colors/darker.conf
custom_palette=true
icon_theme=breeze-dark
standard_dialogs=default
style=Fusion
[Fonts]
fixed="JetBrainsMono Nerd Font,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular,0,0"
general="JetBrainsMonoNL Nerd Font,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular,0,0"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=2
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2m)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()
+65
View File
@@ -0,0 +1,65 @@
{
"layer": "top",
"position": "top",
"height": 25,
"spacing": 0,
"modules-left": ["wlr/taskbar"],
"modules-center": ["clock"],
"modules-right": ["network", "custom/spotify", "custom/v2raya", "custom/language", "pulseaudio", "cpu", "memory", "tray"],
"wlr/taskbar": {
"format": "{icon}",
"icon-size": 15,
"tooltip-format": "{title}",
"on-click": "activate"
},
"custom/language": {
"exec": "xkblayout-state print %s | tr 'a-z' 'A-Z'",
"interval": 1,
"format": " {} "
},
"custom/spotify": {
"format": "[{}] ",
"exec": "playerctl metadata --format '{{artist}} - {{title}}' spotify 2>/dev/null || echo ''",
"on-click": "ironbar bar spotify-popup toggle-popup spotify-music",
"interval": 3,
"max-length": 50
},
"custom/v2raya": {
"format": "PROXY{}",
"return-type": "json",
"interval": 2,
"exec": "/home/ivan/.config/waybar/v2raya-toggle.sh",
"on-click": "/home/ivan/.config/waybar/v2raya-toggle.sh toggle",
"signal": 10
},
"clock": {
"format": "{:%H:%M}",
"format-alt": "{:%d-%m-%Y}"
},
"cpu": {
"format": " {usage}%",
"tooltip": false,
"on-click": "alacritty -e htop"
},
"memory": {
"format": " {}%"
},
"network": {
"min-length": 10,
"format-wifi": " {bandwidthDownBytes}",
"format-ethernet": " {bandwidthDownBytes}",
"format-disconnected": "⚠ DONT",
"interval": 1
},
"pulseaudio": {
"format": " {volume}%",
"format-muted": " Muted",
"on-click": "pavucontrol"
},
"tray": {
"icon-size": 10,
"spacing": 15
}
}
+45
View File
@@ -0,0 +1,45 @@
* {
font-family: "JetBrainsMono Nerd Font", "Font Awesome 7 Free", "Font Awesome 7 Free Solid", "Font Awesome 7 Brands", sans-serif;
font-size: 12px;
border: none;
border-radius: 0;
}
@import "/home/ivan/.config/aether/theme/waybar.css";
window#waybar {
background: alpha(@background, 0.75);
color: @foreground;
min-height: 28px;
}
#clock,
#cpu,
#memory,
#network,
#pulseaudio,
#taskbar,
#custom-spotify,
#tray {
padding: 0 10px;
color: @foreground;
}
#taskbar button {
color: alpha(@foreground, 0.6);
padding: 0 8px;
}
#taskbar button.active {
background-color: alpha(@foreground, 0.2);
box-shadow: inset 0 -2px 0 0 @foreground;
color: @foreground;
}
#custom-v2raya.enabled {
color: @foreground;
}
#custom-v2raya.disabled {
color: @background;
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
# Проверяем, запущен ли процесс v2rayA
if pgrep -x "v2raya" > /dev/null; then
if [ "$1" = "toggle" ]; then
sudo systemctl stop v2raya.service 2>/dev/null || sudo killall v2raya
echo "{\"text\": \" \", \"class\": \"disabled\", \"tooltip\": \"v2rayA выключен\"}"
else
echo "{\"text\": \" \", \"class\": \"enabled\", \"tooltip\": \"v2rayA включен\"}"
fi
else
if [ "$1" = "toggle" ]; then
sudo systemctl start v2raya.service 2>/dev/null || sudo v2raya --daemon &
echo "{\"text\": \" \", \"class\": \"enabled\", \"tooltip\": \"v2rayA включен\"}"
else
echo "{\"text\": \" \", \"class\": \"disabled\", \"tooltip\": \"v2rayA выключен\"}"
fi
fi
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
export WAYLAND_DISPLAY=wayland-0
export XDG_RUNTIME_DIR=/run/user/$(id -u)
thumb_dir="${XDG_CACHE_HOME:-$HOME/.cache}/cliphist/thumbs"
mkdir -p "$thumb_dir"
make_thumb() { # $1 - исходник, $2 - результат
if command -v gdk-pixbuf-thumbnailer >/dev/null 2>&1; then
gdk-pixbuf-thumbnailer -s 256 "$1" "$2" 2>/dev/null
elif command -v magick >/dev/null 2>&1; then
magick "$1" -resize '256x256>' "$2" 2>/dev/null
elif command -v convert >/dev/null 2>&1; then
convert "$1" -resize '256x256>' "$2" 2>/dev/null
fi
# если тулза нет/ошибка — отдаём оригинал, wofi сам смасштабирует
[ -s "$2" ] || cp -f "$1" "$2"
}
wofi_input=""
while read -r line; do
[[ "$line" == *"<meta http-equiv="* ]] && continue
[[ -z "$line" ]] && continue
id="${line%%[[:space:]]*}"
if [[ "$line" == *binary* ]]; then
thumb_path="${thumb_dir}/${id}.png"
if [ ! -s "$thumb_path" ]; then
tmp="$(mktemp)"
# ВАЖНО: передаём строку через pipe,
# иначе decode прочитает stdin цикла и «съест» список
printf '%s\n' "$line" | cliphist decode > "$tmp" 2>/dev/null
[ -s "$tmp" ] && make_thumb "$tmp" "$thumb_path"
rm -f "$tmp"
fi
if [ -s "$thumb_path" ]; then
wofi_input+="img:${thumb_path}\n"
else
wofi_input+="${line}\n"
fi
else
wofi_input+="${line}\n"
fi
done <<< "$(cliphist list)"
choice="$(printf '%b' "$wofi_input" | wofi -I --dmenu --cache-file=/dev/null \
-Dimage_size=100 -Dynamic_lines=true --prompt "Буфер обмена")"
[ -z "$choice" ] && exit 0
if [[ "$choice" == img:* ]]; then
f="${choice#img:}"
id="$(basename "$f" .png)"
printf '%s\t' "$id" | cliphist decode | wl-copy
else
printf '%s\n' "$choice" | cliphist decode | wl-copy
fi
+53
View File
@@ -0,0 +1,53 @@
@import "/home/ivan/.config/aether/theme/wofi.css";
#img {
padding: 5px;
width: 120px;
height: 120px;
}
#entry {
padding: 10px;
}
window {
background-color: @bg;
border: 2px solid @gray3;
}
input {
background-color: @bg;
color: @fg;
border: 1px solid @gray2;
}
input:selected {
background-color: @gray1;
color: @fg_bright;
}
#entry {
color: @fg;
background-color: @bg;
padding: 5px;
margin: 2px;
}
#entry:selected {
background-color: @gray1;
color: @fg_bright;
}
scrollbar {
background-color: @bg;
}
scrollbar slider {
background-color: @gray2;
border-radius: 5px;
}
scrollbar slider:hover {
background-color: @gray3;
}
-252
View File
@@ -1,252 +0,0 @@
#!/bin/sh
#
# setup-sddm-labwc.sh
# Alpine Linux / OpenRC: SDDM + elogind + LabWC.
#
# Запуск от root:
# chmod +x setup-sddm-labwc.sh
# ./setup-sddm-labwc.sh ivan
#
set -eu
USER_NAME="${1:-ivan}"
HOME_DIR="/home/$USER_NAME"
PROFILE="$HOME_DIR/.profile"
if [ "$(id -u)" -ne 0 ]; then
echo "[!] Запусти скрипт от root."
exit 1
fi
if [ ! -f /etc/alpine-release ]; then
echo "[!] Этот скрипт только для Alpine Linux."
exit 1
fi
if ! id "$USER_NAME" >/dev/null 2>&1; then
echo "[!] Пользователь не найден: $USER_NAME"
exit 1
fi
echo
echo "=================================================="
echo " Alpine: SDDM + elogind + LabWC"
echo "=================================================="
echo
echo "[*] Пользователь: $USER_NAME"
echo "[*] Alpine: $(cat /etc/alpine-release)"
echo
# ------------------------------------------------------------
# Пакеты
# ------------------------------------------------------------
echo "[*] Обновление индекса APK..."
apk update
echo "[*] Установка зависимостей display manager..."
apk add \
dbus \
seatd \
elogind \
elogind-openrc \
sddm \
sddm-openrc \
xorg-server \
mesa \
mesa-dri-gallium \
xf86-input-libinput
# ------------------------------------------------------------
# Удаление старых/неверных конфигов SDDM
# ------------------------------------------------------------
echo "[*] Очистка старой конфигурации SDDM..."
mkdir -p /etc/sddm.conf.d
rm -f /etc/sddm.conf.d/wayland.conf
rm -f /etc/sddm.conf.d/labwc.conf
rm -f /etc/sddm.conf.d/00-general.conf
cat > /etc/sddm.conf.d/00-general.conf << 'EOF'
[General]
DisplayServer=x11
[Autologin]
Relogin=false
EOF
chmod 644 /etc/sddm.conf.d/00-general.conf
# ------------------------------------------------------------
# Удаление старого getty-autologin wrapper
# ------------------------------------------------------------
echo "[*] Удаление старого getty-autologin wrapper..."
rm -f /usr/local/sbin/autologin-login
# /etc/inittab намеренно не меняем.
# kill -HUP 1 намеренно не вызываем.
# ------------------------------------------------------------
# Группы пользователя
# ------------------------------------------------------------
echo "[*] Настройка групп пользователя..."
for GROUP_NAME in wheel seat video input; do
if ! getent group "$GROUP_NAME" >/dev/null 2>&1; then
echo "[*] Создание группы: $GROUP_NAME"
addgroup "$GROUP_NAME"
fi
if id -nG "$USER_NAME" | tr ' ' '\n' | grep -qx "$GROUP_NAME"; then
echo "[+] $USER_NAME уже в группе $GROUP_NAME."
else
echo "[*] Добавление $USER_NAME в группу $GROUP_NAME..."
addgroup "$USER_NAME" "$GROUP_NAME"
fi
done
# ------------------------------------------------------------
# Сессия LabWC в меню SDDM
# ------------------------------------------------------------
echo "[*] Создание записи LabWC для SDDM..."
mkdir -p /usr/share/wayland-sessions
cat > /usr/share/wayland-sessions/labwc.desktop << 'EOF'
[Desktop Entry]
Name=LabWC
Comment=LabWC Wayland compositor
Exec=labwc
TryExec=labwc
Type=Application
DesktopNames=labwc
EOF
chmod 644 /usr/share/wayland-sessions/labwc.desktop
# ------------------------------------------------------------
# Конфигурация LabWC пользователя
# ------------------------------------------------------------
echo "[*] Настройка LabWC..."
mkdir -p "$HOME_DIR/.config/labwc"
cat > "$HOME_DIR/.config/labwc/environment" << 'EOF'
XDG_CURRENT_DESKTOP=labwc
XDG_SESSION_DESKTOP=labwc
XDG_SESSION_TYPE=wayland
MOZ_ENABLE_WAYLAND=1
QT_QPA_PLATFORM=wayland
SDL_VIDEODRIVER=wayland
LIBSEAT_BACKEND=seatd
EOF
cat > "$HOME_DIR/.config/labwc/autostart" << 'EOF'
#!/bin/sh
if command -v nm-applet >/dev/null 2>&1; then
nm-applet &
fi
if command -v waybar >/dev/null 2>&1; then
waybar &
fi
if command -v mako >/dev/null 2>&1; then
mako &
fi
if command -v pipewire >/dev/null 2>&1 &&
! pgrep -x pipewire >/dev/null 2>&1
then
pipewire &
fi
if command -v wireplumber >/dev/null 2>&1 &&
! pgrep -x wireplumber >/dev/null 2>&1
then
wireplumber &
fi
EOF
chmod 755 "$HOME_DIR/.config/labwc/autostart"
chown -R "$USER_NAME:$USER_NAME" "$HOME_DIR/.config"
# ------------------------------------------------------------
# Удаление старого запуска LabWC из login shell
# ------------------------------------------------------------
echo "[*] Отключение старого запуска LabWC из .profile..."
if [ -f "$PROFILE" ] && grep -qF '# LABWC-AUTOSTART' "$PROFILE"; then
cp "$PROFILE" "$PROFILE.before-sddm.bak"
sed -i '/^# LABWC-AUTOSTART$/,$d' "$PROFILE"
chown "$USER_NAME:$USER_NAME" "$PROFILE"
echo "[+] LABWC-AUTOSTART удалён из .profile."
else
echo "[+] Блока LABWC-AUTOSTART в .profile нет."
fi
# ------------------------------------------------------------
# OpenRC
# ------------------------------------------------------------
echo "[*] Включение служб OpenRC..."
rc-update add dbus default 2>/dev/null || true
rc-update add seatd default 2>/dev/null || true
rc-update add elogind default 2>/dev/null || true
rc-update add sddm default 2>/dev/null || true
echo
echo "=================================================="
echo " Проверка"
echo "=================================================="
echo
echo "[*] Установленные пакеты:"
apk info -e dbus seatd elogind elogind-openrc sddm sddm-openrc \
xorg-server mesa mesa-dri-gallium xf86-input-libinput || true
echo
echo "[*] Группы пользователя:"
id "$USER_NAME"
echo
echo "[*] Запись LabWC:"
cat /usr/share/wayland-sessions/labwc.desktop
echo
echo "[*] DRM:"
ls -la /dev/dri 2>&1 || true
echo
echo "=================================================="
echo " Готово"
echo "=================================================="
echo
echo "[!] В этом скрипте SDDM специально НЕ запускается."
echo "[!] Это нужно, чтобы не повторять проблему stale-процесса."
echo
echo "Теперь выполни:"
echo
echo " reboot"
echo
echo "После перезагрузки порядок будет такой:"
echo " 1. dbus"
echo " 2. seatd"
echo " 3. elogind"
echo " 4. sddm"
echo
echo "В SDDM войди пользователем $USER_NAME"
echo "и в меню сессий выбери LabWC."
echo
Binary file not shown.
Executable
+256
View File
@@ -0,0 +1,256 @@
#!/bin/sh
set -e
# colors for output
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
# helpers
info() {
printf '%b\n' "${BLUE}>>$1${NC}"
}
success() {
printf '%b\n' "${GREEN}>>$1${NC}"
}
error() {
printf '%b\n' "${RED}>>ERROR: $1${NC}" >&2
}
# 0. Check environment
if [ "$(id -u)" -eq 0 ]; then
error "do not run this installer as root"
exit 1
fi
if [ ! -f /etc/alpine-release ]; then
error "Alpine Linux is required"
exit 1
fi
if [ ! -d "$HOME/labwc-alpine" ]; then
error "labwc-alpine directory not found in $HOME"
printf '%b\n' "${RED}>>Please clone the repository first:${NC}"
printf '%b\n' "${RED}>>git clone https://zenithcode.duckdns.org/s13bby/labwc-alpine.git${NC}"
exit 1
fi
if [ ! -d "$HOME/labwc-alpine/.git" ]; then
error "$HOME/labwc-alpine is not a git repository"
exit 1
fi
if ! command -v sudo >/dev/null 2>&1; then
error "sudo is required"
exit 1
fi
# 1. Begin
echo "┌──────────────────────────────────────┐"
echo "│ zenithcode.duckdns.org │"
echo "│ welcome to installer labwc-alpine │"
echo "│ by s13bby │"
echo "└──────────────────────────────────────┘"
# 2. Update and upgrade system
info "updating distro repositories..."
sudo apk update
info "upgrading system packages..."
sudo apk upgrade
success "distro repositories and system are up-to-date"
# 3. Install needed packages
info "installing needed packages..."
sudo apk add \
gcc \
g++ \
git \
curl \
cmake \
libcurl \
libcurl-dev \
opencv \
opencv-dev \
waybar \
mako \
swaybg \
wofi \
font-noto \
font-dejavu \
wl-clipboard \
xdg-desktop-portal \
xdg-desktop-portal-gtk \
pipewire \
wireplumber \
alsa-utils \
networkmanager \
nm-applet \
pcmanfm-gtk3 \
firefox \
swaylock \
playerctl \
font-jetbrains-mono
success "all packages installed"
# 4. Configure NetworkManager
info "configuring NetworkManager..."
if rc-update show default 2>/dev/null | grep -q "networkmanager"; then
success "networkmanager already configured"
else
sudo rc-update add networkmanager default
success "networkmanager added to default runlevel"
fi
if rc-service networkmanager status >/dev/null 2>&1; then
success "networkmanager is already running"
else
sudo rc-service networkmanager start
fi
# 5. Build zenith-cli
if [ -d "$HOME/zenith-cli/.git" ]; then
info "zenith-cli already exists, updating..."
cd "$HOME/zenith-cli"
git pull
else
if [ -e "$HOME/zenith-cli" ]; then
error "$HOME/zenith-cli exists but is not a git repository"
exit 1
fi
info "cloning zenith-cli repository..."
git clone \
https://zenithcode.duckdns.org/s13bby/zenith-cli.git \
"$HOME/zenith-cli"
fi
if [ ! -f "$HOME/zenith-cli/build.sh" ]; then
error "zenith-cli/build.sh not found"
exit 1
fi
info "making build script executable..."
chmod +x "$HOME/zenith-cli/build.sh"
info "building zenith-cli..."
sh "$HOME/zenith-cli/build.sh"
if [ ! -f "$HOME/zenith-cli/zenith-cli" ]; then
error "zenith-cli binary was not created"
exit 1
fi
info "installing zenith-cli to ~/.local/bin..."
mkdir -p "$HOME/.local/bin"
cp "$HOME/zenith-cli/zenith-cli" "$HOME/.local/bin/zenith-cli"
chmod +x "$HOME/.local/bin/zenith-cli"
if ! grep -Fq 'export PATH="$HOME/.local/bin:$PATH"' "$HOME/.profile" 2>/dev/null; then
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.profile"
success "added ~/.local/bin to PATH in .profile"
fi
# Make zenith-cli available in the current shell
export PATH="$HOME/.local/bin:$PATH"
success "zenith-cli ready to work"
# 6. Copy configs
info "creating config directory..."
mkdir -p "$HOME/.config"
info "copying dotfiles..."
for config in hypr labwc waybar wofi qt6ct alacritty; do
if [ -d "$HOME/labwc-alpine/configs/$config" ]; then
cp -r "$HOME/labwc-alpine/configs/$config" "$HOME/.config/"
else
error "config directory not found: $config"
exit 1
fi
done
if [ -d "$HOME/labwc-alpine/palettes" ]; then
cp -r "$HOME/labwc-alpine/palettes" "$HOME/.config/"
else
error "palettes directory not found"
exit 1
fi
success "dotfiles copied"
# 7. Copy fonts
info "creating fonts directory..."
mkdir -p "$HOME/.local/share/fonts"
if [ -d "$HOME/labwc-alpine/fonts" ]; then
cp -r "$HOME/labwc-alpine/fonts/"* "$HOME/.local/share/fonts/"
else
error "fonts directory not found"
exit 1
fi
info "updating font cache..."
fc-cache -fv >/dev/null
success "fonts copied"
# 8. Copy backgrounds
info "creating backgrounds directory..."
mkdir -p "$HOME/backgrounds/"
if [ -d "$HOME/labwc-alpine/backgrounds" ]; then
cp -r "$HOME/labwc-alpine/backgrounds/"* "$HOME/backgrounds/"
else
error "backgrounds directory not found"
exit 1
fi
success "backgrounds copied"
# 9. Done
echo
echo "┌──────────────────────────────────────┐"
echo "│ zenithcode.duckdns.org │"
echo "│ thanks for use my dotfiles │"
echo "│ mail: qaws3623@gmail.com by s13bby │"
echo "└──────────────────────────────────────┘"
printf '%b\n' "${GREEN}"
printf '%b\n' ">>please reboot system<<"
printf '%b\n' "${NC}"
+5
View File
@@ -0,0 +1,5 @@
#0c0c0c
#121212
#7e49b2
#1c1c1c
#c8c8c8
+5
View File
@@ -0,0 +1,5 @@
#c8c8c8
#1c1c1c
#7e49b2
#121212
#0c0c0c
+5
View File
@@ -0,0 +1,5 @@
#cbb0e6
#e6c2c2
#e6c2c2
#e6c2c2
#e6c2c2
+5
View File
@@ -0,0 +1,5 @@
#e6c2c2
#e6c2c2
#e6c2c2
#e6c2c2
#cbb0e6