!Миграция с X11 i3wm на Wayland Sway

2023-06-21T15:50:00+05:00

linux

Обновление: 19.11.23

Очень полезная статья с актуальными и полезными советами с инструкциями по wayland sway

sudo pacman -S sway waybar wofi mako swaybg wl-clipboard slurp grim
  • sway - эквивалентно i3
  • waybar - эквивалентно polybar
  • wofi - эквивалентно rofi
  • wl-clipboard - чтобы копировать (yank) текст с nvim и вставлять его, эквивалентно xclip
  • slurp - эквивалентно maim
  • grim - скриншот утилита для wayland
  • otf-font-awesome - шрифты для waybar и swappy
mkdir ~/.config/sway
cp ~/.config/i3/config ~/.config/sway/

Примечание: действия связанные с данным конфигом применяться только сочетанием клавиш win+shift+c и смене раб. стола

Редактируем конфиг файл

nvim ~/.config/sway/config

#  Заставлять юзать для приложений и игр xwayland

xwayland force

# Убрать title bar
default_border pixel 2
default_floating_border pixel 2

#  Настройка клавиатуры

swaymsg -t get_inputs
input "type:keyboard" {
    # Смена раскладки
    xkb_layout us,ru
    xkb_options grp:caps_toggle,grp_led:caps,grp:switch

    # Ускорение печатания
    repeat_delay 210
    repeat_rate 40
}

#  Отключение акселерации на мышке

swaymsg -t get_inputs
input "1133:49284:Logitech_G102_Prodigy_Gaming_Mouse" {
	accel_profile "flat"
}

#  Дисплей и Обои

Качаем пакет

sudo pacman -S swaybg

Указываем наш дисплей из команды swaymsg -t get_outputs, режим, герцовку и VRR на усмотрение
Также рядом ставим обои

output DP-2 {
	mode 1920x1080@144Hz
	bg "/media/Media/Галарея/Обои на раб.стол/Ramen.jpg" fill
}

adaptive_sync on - включает VRR (Variable Refresh Rate) Переменную частоту кадров При включении лично у меня возникали мерцания при движении мышки, поэтому я убрал VRR

Сурс проблемы

#  Wofi - запуск программ подобно rofi

sudo pacman -S wofi
bindsym $mod+d exec wofi --show drun --allow-images

#  waybar - как polybar но для sway

sudo pacman -S waybar
bar swaybar_command waybar

#  Запуск программ и скриптов, подобно i3wm

Прописываем в конфиг файл

exec {
	autotiling
	/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
	mako
	mpd
	mpDris2
	udiskie -t
	corectrl
	steam -silent
	gammastep-indicator
	otd
# Запускает xwayland игры на основной монитор (если несколько мониторов), также исправляет работу мыши на играх wine
	xrandr --output XWAYLAND0 --primary
# Фикс GTK3 Темы
~/.config/sway/import-gsettings
# Load Xrdb
xrdb -merge $HOME/.config/X11/Xresources
}

Добавил

include /etc/sway/config.d/*

Убрал т.к в sway перезапускать конфиг только win+shift+c

bindsym $mod+Shift+r restart

#  FIX GTK3 Темы

Создаём файл ~/.config/sway/import-gsettings, и вставляем

#!/bin/sh

# Взято: https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland

# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi

gnome_schema="org.gnome.desktop.interface"
gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')"
icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')"
font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_size="$(grep 'gtk-cursor-theme-size' "$config" | sed 's/.*\s*=\s*//')"
gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"
gsettings set "$gnome_schema" cursor-size "$cursor_size"
gsettings set "$gnome_schema" color-scheme prefer-dark
chmod +x import-gsettings

И добавляем в ~/.config/sway/config

exec_always {
	...
	# Фикс GTK3 Темы
    ~/.config/sway/import-gsettings
	...
}

Ребутимся и после всё иконки, темы и курсор применились

Тема курсора не применилась до конца, решается это данной настройкой

sudo pacman -S seatd

И добавляем в ~/.config/sway/config

seat * xcursor_theme capitaine-cursors 16

Перезагружаем конфиг используя win+shift+c

Убирать простаивающий курсор через 3 сек

seat * hide_cursor 3000

Можно отключить тайлинг drag mouse

# Disable dragging of tiles with a mouse.
tiling_drag disable

#  Включаем Sharing Screen OBS на Sway

sudo pacman -S pipewire xdg-desktop-portal-wlr qt5-wayland slurp wofi

После того как добавили захват записи перед вами откроется wofi с выбором дисплея, если у вас установлен slurp тогда у вас появится курсор ввиде перекрестье в котором достаточно кликнуть на дисплей для захвата

#  Форк redshift для wayland - gammastep

sudo pacman -S gammastep
mkdir ~/.config/gammastep

Вставляем данные ~/.config/gammastep/config.ini

[general]
location-provider=manual
adjustment-method=wayland
[manual]
lat=[ваше значение долготы]
lon=[ваше значение широты]

Запуск gammastep-indicator &

Сайты с нахождением координат широты и долготы

#  Clipboard Manager для sway - cliphist (Ввиде Rofi)

image

Имеет возможность хранить картинки в буфере, но нету (или ещё не добавили) возможность игнорировать буфер Менеджеров паролей keepassxc

Также может работать как и с dmenu так и с wofi, правда работа в dmenu отображается горизонтально

Качаем Aur пакет

yay -S cliphist

Пакет не смог собраться

==> Проверка файлов source с использованием sha256sums...
    cliphist-0.3.1.tar.gz ... СБОЙ
==> ОШИБКА: Исходные файлы не прошли проверку целостности!
 -> ошибка сборки: cliphist

Пришлось качать бинарный файл cliphist который установился успешно

yay -S cliphist-bin

Вставляем в конфиг ~/.config/gammastep/config.ini для бинд клавиш и автозапуска

exec {
    ...
    # Запуск менеджер буфера обмена
    exec wl-paste --watch cliphist store
    ...
}

# Показать clipboard (для копирования)
bindsym $mod+v exec cliphist list \
  | wofi -d \
  | cliphist decode \
  | wl-copy

# Показать clipboard (для удаления)
bindsym $mod+Alt+Bar exec cliphist list \
   | wofi -d \
   | cliphist delete

#  Скриншон экрана на Sway

mkdir ~/Pictures/Screenshots/
nvim ~/.config/sway/config/
# --- Screenshots --- #
# Requres: slurp grim swappy wl-copy
set $scr-dir ~/Pictures/Screenshots

# Full Screenshot, без буфера обмена
bindsym Print exec --no-startup-id \
  IMG=$scr-dir/$(date +%s).png \
  && grim $scr-dir/$(date +%s).png \
  && notify-send -i $IMG \
  "Скриншот сохранён" "Место: $IMG" || notify-send "Failed to take screenshot"


# Скрин с выделением области или клик на окно в фокусе + буфер обмена
# Если вам не нужен буфер обмена уберите строку с wl-copy
bindsym $mod+Shift+s exec --no-startup-id \
  IMG=$scr-dir/$(date +%s).png \
  && swaymsg -t get_tree \
	| jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' \
	| slurp \
	| grim -t png -g - "$IMG" \
  && wl-copy -t image/png < $IMG \
  && notify-send -i $IMG "Обрезанный скриншот сохранён в буфер обмена" "Место: $IMG" || notify-send "Failed to take screenshot"


# Сканер палитры (color picker)
# https://github.com/swaywm/sway/wiki/Tricks#html-color-picker
# bindsym $mod+Shift+d exec grim -g "$(slurp -p)" -t ppm - | convert - -format '%[pixel:p{0,0}]' txt:- | tail -n 1 | cut -d ' ' -f 4 | wl-copy
bindsym $mod+Shift+p exec --no-startup-id \
	notify-send "Color Picker" "Выберите цвет" && \
    grim -g "$(slurp -p)" -t ppm /tmp/color-picker.png && \
    convert -size 100x100 xc:"$(convert /tmp/color-picker.png -format '#%[hex:s]\n' info:)" /tmp/color-picker.png && \
    notify-send -i /tmp/color-picker.png "Палитра скопирована в буфер обмена" $(convert /tmp/color-picker.png -format "#%[hex:s]\n" info:) && \
    convert /tmp/color-picker.png -format "#%[hex:s]\n" info: | wl-copy -n



# OCR сканер
# Требуется: tesseract tesseract-data-rus tesseract-data-eng tesseract-data-jpn wl-copy slurp
bindsym $mod+Shift+f exec --no-startup-id slurp \
  | xargs -I {} grim -s 2 -t png -g {} - \
  | tesseract -l rus+eng+jpn - - \
  | wl-copy -n



# QR код сканер
# Требуется: slurp grim zbar wl-copy
# bindsym Shift+Print exec grim -g "$(slurp -d)" - | zbarimg -q --raw PNG:- | wl-copy
bindsym Shift+Print exec \
	wl-copy $(slurp | grim -g - - | zbarimg -q --raw -) \
	&& qr=$(wl-paste) \
	&& notify-send "QR-code" "QR-code successfully read and copied to clipboard: <i>$qr</i>" -t 6000


# Быстрый перевод на Русский
# Требуется: tesseract tesseract-data-rus tesseract-data-eng tesseract-data-jpn translate-shell slurp grim wl-copy
bindsym alt+t exec --no-startup-id \
	ocr-translate-sway

Загрузить скриншот в pastebin 0x0.st и скопировать ссылку в буфер обмена

Вставляем содержимое в скрипт файл ~/.local/bin/ocr-translate-sway

#!/bin/bash
IMAGE_NAME=/tmp/_.png
FILE_NAME=/tmp/_.txt
FILE_TMP=/tmp/__.txt
x=$IMAGE_NAME && touch "$x" && slurp | grim -g- "$x"
tesseract -l eng+jpn --dpi 200 $IMAGE_NAME $(echo $FILE_NAME | awk '{split($0, a, "."); print a[1]}')
sed '/^[[:space:]]*$/d' $FILE_NAME > $FILE_TMP
cat $FILE_TMP # | wl-copy -n # Для доступа к оригинальному скопированному тексту
translation=$(trans -b "$(cat $FILE_TMP)")
echo -n $translation | wl-copy -n # Для доступа к переведённому тексту
notify-send "$translation"
rm $IMAGE_NAME $FILE_NAME $FILE_TMP

Для бинда вставляем в конфиг ~/.config/gammastep/config.ini

# Upload screenshot and copy url to clipboard
bindsym $mod+Shift+Print exec slurp | grim -g - - | curl --form 'file=@-' http://0x0.st | wl-copy && swaynag -m "screenshot uploaded & url copied to clipboard

#  Скриншот с возможностью на лету быстро редактировать используя swappy

Устанавливаем необходимые пакеты

sudo pacman -S slurp grim swappy wl-copy

Использование

grim -g "$(slurp)" - | swappy -f -

По дефолту swappy сохраняет в $HOME/Desktop, чтобы изменить хранение создаём папку swappy и config внутри неё с добавлением содержимого

mkdir ~/.config/swappy/config
nvim ~/.config/swappy/config
[Default]
save_dir=$HOME/Pictures/Screenshots
save_filename_format=swappy-%Y%m%d-%H%M%S.png
show_panel=false
line_size=5
text_size=20
text_font=sans-serif

#  Mako - wayland альтернатива dunst

sudo pacman -S mako libnotify
mkdir ~/.config/mako/config

Пример конфига

Все опции: man 5 mako

Вставляем в конфиг файл nvim ~/.config/mako/config

sort=-time
layer=overlay
background-color=#11121D
width=500
height=110
border-size=2
border-color=#88c0d0
icons=1
max-icon-size=70
default-timeout=5000
ignore-timeout=1
font=JetBrains Mono Nerd Font Medium 10

[urgency=low]
border-color=#d08770
text-color=#A0A8CD

[urgency=normal]
border-color=#d08770
text-color=#A0A8CD

[urgency=high]
border-color=#EE6D85
text-color=#EE6D85
default-timeout=0

[category=mpd]
default-timeout=2000
group-by=category

Вставляем для автозапуска в конфиг sway ~/.config/sway/config

exec {
	....
	mako
	....
}

# История уведомлений Mako win+`
bindsym $mod+grave exec makoctl restore

Перезапуск mako после применения изменений конфига

makoctl reload

Тестирование (также работает и с dunstify)

notify-send -u low "lol" "kek"
notify-send -u normal "lol" "kek"
notify-send -u critical "lol" "kek"

#  !Трей pasystray для sway (wayland) Не пробовал

yay -S pasystray-wayland

#  !Запускать всё программы через прослойку xwayland

Это исправляет проблемы steam с DISPLAY

sudo pacman -S xorg-xwayland

#  !Правка Chromium флагов для wayland

Редактируем конфиг файл ~/.config/chromium-flags.conf

# Исправляет дерганный скролл
--ozone-platform-hint=auto

# Позволяет делится экраном (для zoom и discord)
--enable-features=...WebRTCPipeWireCapturer...

Непонятно для чего этот пакет, вроде необходим для sharing screen

sudo pacman -S libpipewire02

#  Показ клавиш альтернатива Screenkey на wayland - wshowkeys

Качаем AUR пакет

yay -S wshowkeys-git

И вставляем в sway конфиг ~/.config/sway/config

# Вкл/Выкл режим показа клавиш снизу посередине
bindsym $mod+p exec "killall wshowkeys || wshowkeys -a bottom -t 1"

#  !!Альтернатива xprop для sway и как это использовать

Самый неочевидный способ

swaymsg -t get_tree | less

И через / искать app_id и вставлять в for_window

Метод чуть по проще

swaymsg -t get_tree | jq '.' | grep app_id

#  Запуск sway

Изменил параметры автозапуска sway в .zprofile чтобы при каждом открытии терминала не вылезал ещё один sway поверх sway'я. Для начало экспортируя необходиммые переменные для работы wayland

nvim ~/.zprofile
# Необходимые переменные wayland
set_wayland_env(){
	export MOZ_ENABLE_WAYLAND=1
    export XDG_SESSION_TYPE=wayland
    export XDG_CURRENT_DESKTOP=sway
	export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 # hide window decoratins in older versions of QT
	export NO_AT_BRIDGE=1 # Подавляет предупреждение о accessibility bus в GTK
	export SDL_VIDEODRIVER=wayland # Позволяет запускать SDL2 игры на wayland
	export QT_QPA_PLATFORM="wayland;xcb" # Позволяет запускать QT приложения на wayland
	export _JAVA_AWT_WM_NONREPARENTING=1 # Исправляет ошибки отрисовки приложений Java jre8
	export MOZ_WEBRENDER=1 # Enable WebRender for Firefox
}


# Запуск sway
[ -z $DISPLAY ] && [ $(tty) = /dev/tty1 ] && set_wayland_env && exec sway # --verbose >> ~/.sway.log

#  Решение проблем sway

  • Проблема: Уведомление Dunst при игре застрял курсор мышки

Решил это отредактировав конфиг dunst принудительно работать dunst на xwayland

nvim ~/.config/dunst/dunstrc

Меняем c false на true

force_xwayland = true
  • Проблема: При запуске любого видео из браузера или через mpv звук не появляется и браузер застревает но если открыть pavucontrol тогда звук появится

У меня установлен pipewire wireplumber

Проблема решается если в терминале ввести wireplumber

  • Проблема: Sway не экспортирует переменные из ~/.config/environment.d/*.conf

Если я правильно понимаю это из-за того что ни sway ни shell оболочка не запущен от systemd в пользовательском экземпляре
Об этом расписано здесь вместе с решением который является просто добавлением экспорта этой команды в zshrc

export $(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)

Или выполнить действия в Sway Wiki однако это официально не поддерживается

UPD: ещё есть вариант запуска sway через systemd