Вернуться назад

sway

!!! Никогда не надо запускать SWAY (и любые другие WAYLAND-сессии) через sudo

Установка Sway

wlroots (отдельно ставить не надо) – это библиотека для Wayland-композиторов (Sway, Wayfire etc.). Она управляет мониторами, окнами, вводом с клавиатуры и мыши, рендерингом через OpenGL. Sway не напрямую работает с GPU — он использует wlroots, а wlroots уже использует OpenGL (через Mesa) для отрисовки окон и эффектов.

# минимальный минимум для запуска sway:
sudo pacman -S mesa sway foot

# Для запуска X11-программ:
sudo pacman -S xorg-xwayland

Инструменты sway

Вместе со sway ставятся также и утилиты-помощники:

Запуск

 dbus-run-session -- sway
 dbus-run-session sway
 dbus-run-session sway > ~/.sway.log 2>&1
 exec sway

Sway запустился. Единственное, что отображается на экране по умолчанию – это swaybar наверху. Swaybar – это встроенная панель, входящая в состав самого пакета sway. Настроить её можно в конфигурационном файле sway, в разделе bar.

Основные команды управления sway:

# Win+Enter – Открыть окно терминала
swaymsg kill     # Win+Shift+Q – закрыть окно
swaymsg exit     # Win+Shift+E – выйти из sway (нужно будет подтвердить, кликнув мышкой)
swaymsg reload   # Win+Shift+C – перезагрузка конфигурации без выхода из сессии

Первое, что бросается мне в глаза – это мелкий шрифт в терминале. Чтобы его поменять пишем в конфигурационный файл foot:

# ~/.config/foot/foot.ini

[main]
font=monospace:size=14      # увеличиваем шрифт с 8 до 14
dpi-aware=yes
# Можно скопировать шаблон конфига:

cp /etc/xdg/foot/foot.ini ~/.config/foot/foot.ini

Конфигурационный файл SWAY

Конфигурационный файл находится здесь: /etc/sway/config. Скопируем его в домашнюю директорию:

mkdir -p ~/.config/sway
cp /etc/sway/config ~/.config/sway/

Первое, что следует сделать для удобства – это добавить русскую раскладку и Compose-key:

# Раскладка клавиатуры: английская и русская,
# смена языка – на Alt+Shift:
input * {
   xkb_layout us,ru
   xkb_options grp:alt_shift_toggle
}

# То же, но добавим ещё Compose-key на правый Alt:
input * {
   xkb_layout us,ru
   xkb_options grp:alt_shift_toggle,compose:ralt
}

# grp:alt_shift_toggle — это переключение раскладки Alt+Shift
# compose:ralt — это назначение правого Alt как Compose-клавиши

# На моей новой клавиатуре нет правого Win. Но есть клавиша Menu.
# Мне нужно сделать так, чтобы при нажатии на клавишу Menu система воспринимала её как Win 
# altwin:menu_win – это мы назначаем клавише Menu клавишу Win
# Добавим эту опцию в xkb_options:
input * {
    xkb_layout us,ru
    xkb_options grp:alt_shift_toggle,compose:ralt,altwin:menu_win
}

Вместе со sway у нас ещё загрузились в систему несколько обоев для рабочего стола – в папку /usr/share/backgrounds/sway/. А в config'е можно найти вот такую строку:

output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill

Это означает, что файл Sway_Wallpaper_Blue_1920x1080.png должен отображаться в качестве фона рабочего стола. Но у нас рабочий стол чёрный. А всё потому, что эта команда в конфиге "под капотом" использует программу swaybg для того, чтобы установить обои. То есть swaybg у нас не установлен, но в дефолтном конфиге уже есть включённая настройка, которая использует swaybg для того, чтобы вывести на рабочий стол обои Sway_Wallpaper_Blue_1920x1080.png. Более того, если мы выйдем в TTY, то увидим что-то типа:

00:00:00.356 [sway/config.c:1083] failed to execute 'swaybg' (background configuration probably not applied): No such file or directory

А это значит, что дефолтные обои у нас уже настроены, но пока не установлен swaybg. Из-за этого обои и не отображаются. Поэтому просто устанавливаем swaybg и перезагружаем конфиг: Win+Shift+C. Всё. Обои подгрузились.

РАЗРЕШЕНИЕ И ЧАСТОТА

# Посмотретьтекущие настройки:
   swaymsg -t get_outputs
      # выведет допустимые разрешения и частоты
# или:
   wayland-info	## пакет wayland-utils
# или:
   wlr-randr		## wlr-randr

# Чтобы поменять разрешение и частоту навсегда, надо внести эту строку в ~/.config/sway/config:
   swaymsg output HDMI-A-2 mode 1920x1080@144Hz

Чтобы поменять разрешение и частоту навсегда, надо внести эту строку в ~/.config/sway/config:

output HDMI-A-2 mode 1920x1080@144Hz

Переменные среды

Лаунчер

Чтобы можно было удобно запускать приложения:

sudo pacman -S wofi

# И создаём конфиг:
mkdir -p ~/.config/wofi

Запуск wofi:

wofi --show drun

# или:
wofi --show run

В конфиге запуск лаунчера уже назначен на сочетание клавиш Win+D. По умолчанию там указан лаунчер wmenu-run. Просто закомментируем его и назначим наш wofi.

# Your preferred application launcher
# set $menu wmenu-run
set $menu wofi --show drun

# Start your launcher
bindsym --to-code  $mod+d exec $menu

wlogout

AUR. Для работы необходим xwayland.

Чтобы можно было нормально выходить из системы.

При этом у меня по умолчанию не создался .desktop-файл в /usr/share/applications, поэтому wofi не запускает wlogout. Создадим сами wlogout.desktop в ~/.local/share/applications.

[Desktop Entry]
Type=Application
Name=wlogout
Exec=wlogout
Terminal=false

И обновим кэш:

update-desktop-database ~/.local/share/applications

Текстовый редактор

Например, Featherpad.

Браузер

Теперь неплохо бы установить браузер, чтобы можно было выходить в интернет. Firefox вроде бы как нативно поддерживает wayland.

sudo pacman -S firefox

Файловый менеджер

ntfs-3g

Понадобится, если планируем подключать диски с файловой системой NTFS.

Видео-проигрыватель

mpv – и вот тут уже пригодится VAAPI (intel-media-driver, libva-utils)

Чтобы проверить, установлен VAAPI, или нет, сначала поставим libva-utils:

sudo pacman -S libva-utils

# И запустим:
vainfo

Если VA-API работает — увидим что-то вроде «VA-API version: …», список поддерживаемых кодеков и драйвер. Если команда выдаёт ошибку ("cannot open driver", "va_openDriver failed" и т.п.), значит либо драйвер не установлен/не подходит, либо конфигурация не позволяет VA-API работать.

Если intel-media-driver не установлен, тогда ставим его:

sudo pacman -S intel-media-driver

# И опять проверяем:
vainfo

Установим mpv:

sudo pacman -S mpv

Чтобы проверить, использует ли mpv аппаратное декодирование, запустим видео файл:

mpv --hwdec=vaapi --vo=gpu --gpu-context=wayland some_video.mkv

  # ...
  # Using hardware decoding (vaapi).
  # AO: [pipewire] 48000Hz stereo 2ch floatp
  # VO: [gpu] 1024x576 vaapi[nv12]
  # AV: 00:00:38 / 01:20:45 (1%) A-V:  0.000 Cache: 598s/150MB

Здесь мы видим строку: Using hardware decoding (vaapi). Значит, аппаратное декодирование работает.

Если мы хотим получить больше информации, например, узнать используется wayland или xwayland, то можно запустить команду вот так:

mpv --hwdec=vaapi --vo=gpu --gpu-context=wayland --msg-level=vo=v some_video.mkv

Чтобы все эти опции запускались, когда мы кликаем по файлу, нужно прописать их в конфиг:

# ~/.config/mpv/mpv.conf

hwdec=vaapi
vo=gpu
gpu-context=wayland

Теперь можно просто запускать файл командой:

mpv filename.mkv

ГПТ посоветовал такой конфиг для макс. качества изображения:

hwdec=vaapi
vo=gpu
gpu-context=wayland
profile=gpu-hq
scale=ewa_lanczossharp
cscale=ewa_lanczossharp
dscale=mitchell
video-sync=display-resample
interpolation
tscale=oversample

Аудио-проигрыватель

И тут придётся разобраться с ALSA, PipeWire... pavucontrol

Громкость

Чтобы можно было регулировать громкость звука в системе, поставим pavucontrol:

sudo pacman -S pavucontrol

Изображения

Ставим прогрмму imv или feh.

sudo pacman -S imv

# для того, чтобы смотреть характеристики изображения:
sudo pacman -S imagemagick

# Теперь можно открыть изображение:
imv images/screenshot.png

# Или посмотреть его характеристики:
identify images/screenshot.png

swaybar – раскладка

По умолчанию в waybar'е отображается только год, месяц, дата и текущее время. За этот вывод в конфиге отвечает вот этот блок:

#
# Status Bar:
#
# Read `man 5 sway-bar` for more information about this section.
bar {
    position bottom

    # When the status_command prints a new line to stdout, swaybar updates.
    # The default just shows the current date and time.
    status_command while date +'%Y-%m-%d %X'; do sleep 1; done

    colors {
        statusline #ffffff
        background #323232
        inactive_workspace #32323200 #32323200 #5c5c5c
    }
}

Всю работу здесь выполняет эта строка:

status_command while date +'%Y-%m-%d %X'; do sleep 1; done

Создадим файл ~/.config/sway/status.sh:

#!/bin/bash

while true; do
    # Получаем раскладку
    layout=$(swaymsg -t get_inputs | jq -r '.[] | select(.type=="keyboard") | .xkb_active_layout_name' | head -n 1)

    # Преобразуем в RU/EN
    case "$layout" in
        "Russian") layout="RU" ;;
        "English (US)") layout="EN" ;;
    esac

    # Вывод строки в бар
    echo "$layout | $(date +'%Y-%m-%d %H:%M:%S')"

    sleep 1
done

Сделаем этот файл исполняемым:

chmod +x ~/.config/sway/status.sh

И теперь заменим status_command в конфиге на:

status_command ~/.config/sway/status.sh

А ещё мне не нравится чисто белый цвет текста в статус-баре. Мне больше нравится цвет: #BAC3BC.


bar {
   ...
   colors {
      statusline #bac3bc
      ...
   }
}

Осталось перезагрузить конфиг sway (Mod+Shift+C) и в панели появится обозначение текущей раскладки.

waybar


## Запуск waybar:
   exec_always "pgrep -x waybar || waybar"
   # И надо обязательно закомментировать блок "bar", который отвечает за запуск swaybar, иначе при старте запустится дефолтный swaybar

swaylock и swayidle

# Устанавливаем их:

sudo pacman -S swaylock swayidle

# Запустить блокировщик с тёмным фоном:
swaylock -c 222222

#
swayidle -w \
   timeout 300 'swaylock -c 222222' \
   timeout 600 'swaymsg "output * dpms off"' \
      resume 'swaymsg "output * dpms on"'

Можно просто добавить команду запуска swayidle в конфиг sway:

# ~/.config/sway/config

exec swayidle -w \
   timeout 300 'swaylock -c 222222' \
   timeout 600 'swaymsg "output * dpms off"' \
      resume 'swaymsg "output * dpms on"'
# Получаю такое вот странное предупреждение, хотя всё работет:

swayidle -w timeout 10 'swaylock -c 222222'
  # 2025-12-03 00:35:36 - [Line 277] Failed to parse get BlockInhibited property: Invalid argument

Строка означает: «не получилось корректно прочитать свойство BlockInhibited у logind, но идём дальше». Предупреждение полность безопасное. У swayidle есть логика общения с org.freedesktop.login1 через D-Bus. Причём включает она это автоматически, если login1 присутствует (как раз как у меня).

Проверка свойства BlockInhibited:

busctl introspect org.freedesktop.login1 /org/freedesktop/login1 | grep BlockInhibited
  # .BlockInhibited    property  s    ""   emits-change

Посмотреть список ингибиторов:

systemd-inhibit --list
# Запускаем:
systemd-inhibit --what=idle sleep 10

# И проверяем ингибиторы:
systemd-inhibit --list

Что дальше

Уведомления

Для вывода уведомлений на экран установим mako:

sudo pacman -S mako

Проверить работу mako можно вот так:

notify-send "Заголовок" "А содержание самого сообщения."

В правом верхнем углу должно появиться сообщение. Чтобы его убрать нужно кликнуть по нему мышкой.

Закрыть сообщение:

# Закрыть текущее сообощение:
makoctl dismiss

# Закрыть все сообощения:
mako dismiss --all

Подробнее о mako

Скриншоты

Скриншоты экрана делаются с помощью grim:

sudo pacman -S grim

Сделаем скриншот экрана:

grim filename.png

Создадим уникальное имя для скриншота с датой и временем:

grim ~/Pictures/screenshot_$(date +%Y-%m-%d_%H-%M-%S-%3N).png

Частая практика в скриптах:

# Сначала присваиваем переменной путь к файлу:
FILE=~/Pictures/screenshot_$(date +%Y-%m-%d_%H-%M-%S-%3N).png
grim "$FILE"

А теперь всё это можно запихнуть в конфиг sway и назначить горячую клавишу:

# ~/.config/sway/config
	
bindsym --to-code $mod+Print exec sh -c 'file=~/Pictures/screenshot-$(date +%Y-%m-%d_%H-%M-%S-%3N).png; grim "$file" && notify-send "Скриншот" "Сохранён в $file"'

Теперь сочетание клавиш Win+PrintScreen будет создавать скриншот всего экрана и сохранять его в png-файл в папку ~/Pictures/.

slurp

slurp работает через протокол wlroots. Для работы ему нужно фокусное приложение или композитор, который позволяет ему рисовать рамку выделения.

sudo pacman -S slurp

Если запустить slurp без параметров, то по умолчанию применяется параметр -d (те есть выделить область):

slurp

# То же самое:
slurp -d

# Выделить один пиксель:
slurp -p

После того, как мы выбрали область, или кликнули по пикселю, то в терминал выводится либо координаты выбранной области, либо координата одного пикселя.

А теперь объединим grim и slurp – чтобы вывести скриншот определённой области на экране:

grim -g "$(slurp -d)" ~/Pictures/screenshot_$(date +%Y-%m-%d_%H-%M-%S-%3N).png

# Или с переменной:
FILE=~/Pictures/screenshot_$(date +%Y-%m-%d_%H-%M-%S-%3N).png
grim -g "$(slurp)" "$FILE"

А теперь всё это запихнём в конфиг Sway и назначим сочетание клавиш: Win+Shift+PrintScreen:

# ~/.config/sway/config
	
bindsym --to-code $mod+Shift+Print exec sh -c 'FILE=~/Pictures/screenshot_$(date +%Y-%m-%d_%H-%M-%S-%3N).png; grim -g "$(slurp)" "$FILE" && notify-send "Скриншот" "Сохранён в $file"'

Пипетка

Здесь нам поможет imagemagick:

sudo pacman -S imagemagick

Чтобы скопировать цвет в буфер обмена нам также понадобится wl-clipboard.

Подробней про wl-clipboard.

Создадим скрипт ~/scripts/pipette.sh, который будет определять цвет пикселя, по которому мы кликнули, копировать в буфер обмена его HEX и выводить в mako:

#!/usr/bin/env bash

# Делаем скрин выделенной области
COLOR=$(grim -g "$(slurp -p)" -t ppm - | magick - txt:- | grep -m1 -oP '#\w{6}')

# Если пользователь нажал Esc и цвет не выбран
[ -z "$COLOR" ] && exit 0

# Копируем цвет в буфер обмена
echo -n "$COLOR" | wl-copy

# Создаем маленькую цветную иконку 64x64 для уведомления
magick -size 64x64 xc:"$COLOR" /tmp/color.png

# Показываем уведомление
notify-send -i /tmp/color.png "Цвет скопирован" "$COLOR"

А теперь проверим рабочесть этого скрипта:

chmod +x ~/scripts/pipette.sh
~/scripts/pipette.sh

Если всё нормально, то добавим его в конфиг Sway. Привяжем к сочетанию клавиш Win+Shift+P:

bindsym --to-code $mod+Shift+p exec ~/scripts/pipette.sh

grim -g "$(slurp -p)" -t ppm - → PPM в stdout

magick - txt:- → превращает PPM в текст с цветами пикселей

grep -m1 -oP '#\w{6} → берёт первый HEX-цвет #RRGGBB.

Tesseract

Tesseract – это OCR-движок (Optical Character Recognition).

Устанавливаем его:

sudo pacman -S tesseract

И сразу же проверяем список доступных языков:

tesseract --list-langs
  # List of available languages in "/usr/share/tessdata/" (2):
  # afr
  # osd

У меня доступны только африкаанс и osd — orientation & script detection (служебный, не для текста).

Установим английский и русский языки:

sudo pacman -S tesseract-data-eng tesseract-data-rus

# Также могут быть полезны:
  # tesseract-data-deu – немецкий
  # tesseract-data-fra – французский

Теперь можно протестировать распознавание языка:

tesseract ~/Pictures/kakashka.png ~/Pictures/output

# с явным указанием языка:
tesseract ~/Pictures/kakashka.png ~/Pictures/output3 -l eng

# можно смешивать языки:
tesseract ~/Pictures/kakashka.png ~/Pictures/output3 -l eng+rus

# вевести результат в терминал:
tesseract ~/Pictures/kakashka.png stdout -l eng

Создался файл ~/Pictures/output.txt. Обратите внимание, что tesseract автоматическ добавляет .txt к имени файлу.

А теперь выведем в терминал то, что захватили с экрана:

grim -g "$(slurp)" -t png - | tesseract stdin stdout -l eng

Создадим скрипт, который будет копировать всё, что мы захватили с экрана, в буфер обмена и выводить в mako сообщение:

#!/usr/bin/env bash

# Языки OCR (eng или eng+rus)
LANGS="eng+rus"

# Делаем скрин выделенной области и распознаём текст
TEXT=$(grim -g "$(slurp)" -t png - \
  | tesseract stdin stdout -l "$LANGS" 2>/dev/null)

# Если пользователь нажал Esc или текст пуст
[ -z "$TEXT" ] && exit 0

# Копируем в буфер
echo -n "$TEXT" | wl-copy

# Укорачиваем текст для уведомления
PREVIEW=$(echo "$TEXT" | head -n 5)

# Уведомление
notify-send "OCR: текст скопирован" "$PREVIEW"

Делаем скрипт исполняемым и запускаем:

chmod +x ~/scripts/ocr.sh
~/scripts/ocr.sh

Если всё в порядке, добавим его в конфиг Sway:

# ~/.config/sway/config

bindsym --to-code $mod+t ~/scripts/ocr.sh