Bspwm - это минималистичный, быстрый и достаточно конфигурируемый тайловый оконный менеджер, представляющий окна как слои двоичного дерева. Поддерживается несколько мониторов. Имеет простую настройку.

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

Что будет использоваться:

  • bspwm - Тайловый оконный менеджер.

  • sxhkd - Демон горячих клавиш для X.

  • dmenu - Динамическое меню для X.

  • polybar - Инструмент для создания статус-баров.

  • picom - Композитор окон для X.

Данные компоненты легкие и быстрые, содержат небольшое кол-во зависимостей.

Вы с легкостью можете заменить часть компонентов на более красивые:

  • Вместо dmenu можно использовать Rofi, но стоит учитывать мощность вашей машины т.к. на слабой машине данное меню может открываться несколько секунд.

  • Вместо picom можно использовать его форк picom-jonaburg-git из AUR. Он добавляет эффект размытия, закруглённые края.

Примечание. В этом гайде не будет рассматриваться "красивый" дизайн системы. Обои, иконки, шрифты вы сможете поставить самостоятельно.

Установка

Все компоненты настраиваются в конфиг файлах, которые находятся в домашней директории пользователя. Поэтому не используйте root пользователя, а создайте нового. Иначе вы можете столкнуться с такими проблемами как запуск приложений в sandbox режиме (браузеры, приложения на electron).

Создание пользователя

Создаём пользователя. Замените "user_name" на нужное имя пользователя.

useradd -m -G wheel user_name

Ключ -G wheel означает, что пользователь войдет в группу wheel. Это нужно чтобы выполнят команды от суперпользователя (sudo).

Задаём пароль для пользователя:

passwd user_name

Чтобы группа имела право выполнять команды от суперпользователя, нужно изменить файл /etc/sudoers:

nano /etc/sudoers

Находим и раскомментируем строчку:

# %wheel ALL=(ALL:ALL) ALL

Пакеты и программы

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

pacman -S bspwm sxhkd dmenu polybar picom

Также нужно скачать эмулятор терминала. Мой выбор пал на легковесный xfce4-terminal:

pacman -S xfce4-terminal

Для удобства скачаем браузер. В качестве браузера я использую qutebrowser. Он заточен на использование без мыши. Если нужен обычный браузер, то качаем firefox.

pacman -S qutebrowser

Xorg

pacman -S xorg xorg-xinit

Группа xorg содержит внутри большое кол-во пакетов и шрифтов.

Если вы хотите более легкую установку, то стоит скачать определённые пакеты:

  • xorg-server - Xorg x сервер

  • xorg-xinit - Для использование xinit и startx.

  • xorg-xset - Утилита пользовательских настроек.

  • xorg-xsetroot - Установка фона root окна на заданный паттерн или цвет.

  • xorg-xrandr - Утилита для настройки RandR (настройка мониторов).

  • xorg-xrdb - Утилита базы данных для xorg сервера

pacman -S xorg-server xorg-xinit xorg-xset xorg-xsetroot xorg-xrandr xorg-xrdb

xorg-server и xorg-xinit скачиваются обязательно

Так как шрифты не установлены, поставим gnu free fonts:

pacman -S gnu-free-fonts

Видео драйвер

  • xf86-video-amdgpu - новый, свободный драйвер для видеокарт AMD.

  • xf86-video-ati - старый свободный драйвер для AMD.

  • xf86-video-intel - драйвер для встроенной графики Intel.

  • xf86-video-nouveau - свободный драйвер для карт NVIDIA.

  • xf86-video-vesa - свободный драйвер, поддерживающий все карты, ограниченная функциональность. Для виртуальной машины.

  • xf86-video-qxl - свободный драйвер виртуальной видеокарты, ограниченная функциональность. Для виртуальной машины. (Отсутствует в пакетах Artix)

  • nvidia - проприетарный драйвер для NVIDIA.

В данном случае надо смотреть на свою машину и производителя видеокарты.

Так как я использую виртуальную машину, то устанавливаю xf86-video-vesa:

pacman -S xf86-video-vesa

Конфигурация

Все операции с конфигами я буду производить не от root пользователя. Символ "~" в пути файла\директории означает /home/{user} (домашняя директория). Если вам нужно установить конфиг файлы для определённого пользователя, замените "~" на нужную домашнюю директорию пользователя.

Некоторые конфиг файлы будут храниться в ~/.config. Если данная директория отсутствует, то создайте её:

mkdir ~/.config

Bspwm

Создадим папку для локального конфига:

mkdir ~/.config/bspwm

Скопируем конфиг файл в домашнюю директорию:

cp /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm

Теперь откроем и изменим его:

nano ~/.config/bspwm/bspwmrc

Немного про правила приложений. Само правило выглядит примерно так:

bspc rule -a qutebrowser desktop='^2'

С помощью такого правила можно явно указать на каком рабочем столе запускать приложение или его начальное состояние

Рабочие столы

Данная строка задаёт 10 рабочих столов на главный монитор:

bspc monitor -d I II III IV V VI VII VIII IX X

Если вы обладатель нескольких мониторов, то можно распределить рабочие столы по ним.

Сначала узнаём имена мониторов в системе:

xrandr

Теперь мы можем добавить настройку рабочих столов для определённого монитора:

bspc monitor {Монитор} -d {Рабочие столы}

Может получиться примерно так:

bspc monitor DVI-I-1 -d I II III IVbspc monitor DVI-I-2 -d V VI VIIbspc monitor DP-1 -d VIII IX X

Цвета, рамки, отступы

Рамки и отступы:

bspc config border_width         2
bspc config window_gap          12

Цвет рамки в разных состояниях:

bspc config normal_border_color "#0A1F32"
bspc config active_border_color "#2D384A"
bspc config focused_border_color "#344756"

Цвет пространства при выборе положения нового окна:

bspc config presel_feedback_color "#595B82"

Фокус окна наведение курсора:

bspc config focus_follows_pointer true
bspc config pointer_modifier    super

Коэффициент разделение. Сколько процентов останется от родительского окна при открытии нового.

bspc config split_ratio          0.52

Отступы и рамки, когда открыто одно окно:

bspc config borderless_monocle   true
bspc config gapless_monocle      true

Sxhkd

Создадим папку для локального конфига:

mkdir ~/.config/sxhkd

Скопируем конфиг файл в домашнюю директорию:

cp /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd

Теперь откроем и изменим его:

nano ~/.config/sxhkd/sxhkdrc

Все что минимально нужно сделать - это изменить запуск терминала на нужный:

super + Return    
  xfce4-terminal

Можно самостоятельно добавить горячие клавиши по такому сантаксису:

Клавиша_Модификатор + Клавиша
  Команда

Если нужно выполнять команду с различными аргументами, то используем такой синтаксис:

Клавиша_Модификатор + {Клавиша1, Клавиша2} 
  Команда {Аргумент1, Аргумент2}

В данном случае "Клавиша1" соответствует "Аргументу1" и т.д.

Polybar

Создадим папку для локального конфига:

mkdir ~/.config/polybar

Скопируем конфиг файл в домашнюю директорию:

cp /usr/share/doc/polybar/examples/config.ini ~/.config/polybar/config

Теперь создадим загрузочный скрипт:

nano ~/.config/polybar/launch.sh

В этом файле прописываем:

killall -q polybar # Отключение бара, если он включен
echo "---" | tee -a /tmp/example_bar.log # Просмотр логов
polybar example >> /tmp/example_bar.log # Запуск бара example и запись его лога

Название бара прописывается в конфиг файле

Чтобы бар автоматически запускался добавим данную строку в конец файла ~/.config/bspwm:

$HOME/.config/polybar/launch.sh

Примечание. Автозапуск можно поставить разные места, например в xinitrc, но у меня, каким-то образом, polybar при таком подходе ломает bspwm.

Цвета

В начале конфигурационного обычно ставиться описание цвета бара:

[colors]
background = #222
background-alt = #444
foreground = #dfdfdf
foreground-alt = #f0f0f0
primary = #646464
secondary = #646464
alert = #646464
underline = #c0c0c0

в данном случае это нейтральные темные цвета

Bar

Первой строкой ставиться заголовок bar/название

[bar/base]

Опциональная привязка в определённому монитору(так можно поставить на каждый монитор разные бары):

monitor = ${env:MONITOR:HDMI-1}

Настройка размера:

width = 100%
height = 27
;offset-x = 1%
;offset-y = 1%
radius = 8.0
fixed-center = true

Цвета:

background = ${colors.background}
foreground = ${colors.foreground}

Настройка линии:

line-size = 2
line-color = #f00

Настройка рамки:

border-size = 4
border-color = #00000000

Шрифты:

font-0 = fixed:pixelsize=10;1
font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
font-2 = siji:pixelsize=10;1

Отступы:

padding-left = 0
padding-right = 5
module-margin-left = 1
module-margin-right = 2

Расположение модулей:

modules-left = bspwm 
modules-center = xwindow
modules-right =  pulseaudio eth wlan xkeyboard date

Модули

Polybar поддерживает дополнительные модули, которые можно сделать самостоятельно на любом интерпретируемом языке.

Синтаксис модуля строится на заголовке, типе, место запуска и настройки. Например модуль версии ядра:

[module/info-kernel]
type = custom/script
exec = uname -r
interval = 1024

Сообщество написало много модулей. Репозиторий с модулями.

Выбирайте любой понравившийся и скачайте. Например:

~/.config/polybar

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

chmod +x ~/.config/polybar/script.sh

Добавьте ваш модуль в конфиг polybar:

[module/{ИМЯ}]
type = custom/script
exec = ~/.config/polybar/script.sh

Переключение между барами:

Если вы не хотите перегружать один бар множеством модулей, то файле конфигурации polybar создайте 2 настройки бара (можно просто скопировать и изменить имя с набором модулей):

[bar/base]
modules-left = bspwm
modules-center = xwindow
modules-right =  pulseaudio eth wlan xkeyboard date
; ОСТАЛЬНЫЕ НАСТРОЙКИ

[bar/additional]
modules-left = info-kernel
modules-center = 
modules-right = filesystem memory cpu
; ОСТАЛЬНЫЕ НАСТРОЙКИ

Теперь создайте 2 скрипта для запуска баров:

# ~/.config/launch.sh
killall -q polybar
echo "---" | tee -a /tmp/polybar-base.log
polybar base >>/tmp/polybar-base.log

# ~/.config/launch-additional.sh
killall -q polybar
echo "---" | tee -a /tmp/polybar-additional.log
polybar additional >>/tmp/polybar-additional.log

Сделаем их исполняемыми:

chmod +x ~/.config/launch.sh
chmod +x ~/.config/launch-additional.sh

Теперь в конфигурацию sxhkd добавим горячие клавиши для переключение баров:

# base bar
super + F1    
  $HOME/.config/polybar/launch.sh 

# additional bar
super + F2    
  $HOME/.config/polybar/launch-additional.sh

Больше о конфигурации можно почитать в вики.

Xinitrc

Скопируем конфиг файл в домашнюю директорию:

cp /etc/X11/xinit/xinitrc ~/.xinitrc

Теперь откроем и изменим его:

nano ~/.xinitrc

Удаляем все после строчки "fi" в конце файла. В моём случае это:

# twm &
# xclock -geometry 50x50-1+1 &
# xterm -geometry 80x50+494_51 &
# xterm -geometry 80x20+494-0 &
# exec xterm -geometry 80x66+0+0 -name login

Заменяем эти команды на:

setxkbmap -option grp:alt_shift_toggle us,ru    # Смена языка. Такой подход не совсем "правильный"
picom -f &                                      # Запуск picom
xsetroot -cursor_name left_ptr                  # Установка стандартного курсора
exec bspwm                                      # Запуск bspwm

После изменения конфигурации xinitrc, можно попробовать запустить окружение с помощью:

startx

Чтобы выйти из окружения нажмите super+alt+q.

Настройка мониторов

Чтобы мониторы правильно отображались, нужно указать их конфигурацию для xrandr. Есть две вариации как это сделать.

Arandr

Простой вариант это скачать Arandr, он предназначен для обеспечения простого визуального интерфейса для XRandR.

pacman -S arandr

Так как программа графическая запускаем её.

Выводиться примерно такой интерфейс. Вы можете мышкой настроить положение мониторов. Если нажать ПКМ по монитору, то покажется меню, где есть дополнительные настройки. Мы можем задать ориентацию, разрешение для каждого монитора, а так же сделать один из мониторов главным.

После настройки нужно сохранить скрипт. Нажимаем на Layout > Save as. Даём название файла, например, display.sh.

Делаем файл исполняемым:

chmod +x .screenlayout/display.sh

Ручная настройка

Если вы не хотите устанавливать лишние приложения, то можно сделать все "вручную".

Выводим список мониторов:

xrandr

Помимо списка мониторов выводится информация о том, какие разрешения могут иметь мониторы, их ориентация, герцовка и т.д.

# Screen 0: minimum 320 x 200, current 1280 x960, maximum 8192 x 8192
# Virtual-1 connected primary 1280x960+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
#   800x600     60.00 + 60.32
#   2560x1600   59.99
#   2560x1440   59.95
#   1920x1440   60.00
#   1856x1392   60.00
#   1792x1344   60.00
#   1920x1200   59.88
#   1920x1080   59.96
#   1600x1200   60.00
#   1680x1050   59.95
#   1400x1050   59.98
#   1280x960    60.00*
#   1360x768    60.02
#   1280x800    59.81
#   1152x864    75.00
#   1280x768    59.87
#   1280x720    59.86
#   1024x768    60.00
#   640x480     59.94
# Virtual-2 disconnected (normal left inverted right x axis y axis)
# Virtual-3 disconnected (normal left inverted right x axis y axis)
# Virtual-4 disconnected (normal left inverted right x axis y axis)
# Virtual-5 disconnected (normal left inverted right x axis y axis)
# Virtual-6 disconnected (normal left inverted right x axis y axis)
# Virtual-7 disconnected (normal left inverted right x axis y axis)
# Virtual-8 disconnected 

Теперь можно настроить мониторы командой:

xrandr --output {Монитор} --mode {Разрешение}  

В моём случае это выглядит вот так:

xrandr --output Virtual-1 --mode 1280x960

Аргумент auto позволяет автоматически выставить разрешение:

xrandr --output Virtual-1 --auto

Если в списке присутствует несколько частот обновления, их можно изменить с помощью аргумента rate:

xrandr --output Virtual-1 --auto --rate 60

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

xrandr --output Virtual-1 --auto --primary

Если вам нужно изменить ориентацию монитора, то используйте аргумент rotate:

xrandr --output Virtual-1 --auto --rotate normal

Необязательно настраивать несколько мониторов разными командами, xrandr поддерживает настройку нескольких мониторов одной командой:

xrandr --output Virtual-1 --auto --output Virtual-2 --auto

С помощью аргумента off можно отключить монитор:

xrandr --output HDMI-1 --off --output HDMI-2 --auto

Если вы определились с настройкой, то сохраните команду в файл.

Создадим директорию .screenlayout, если она не присутствует:

mkdir ~/.screenlayout

Теперь запишем команду конфигурации в файл display.sh. В моё случае это выглядит так:

echo "xrandr --output Virtual-1 --primary --mode 1280x960 --rotate normal" >> .screenlayout/display.sh

Делаем файл исполняемым:

chmod +x .screenlayout/display.sh

Автозапуск

Автозапуск будем производить с помощью xinit. Добавляем в файл .xinitrc строчку:

$HOME/.screenlayout/display.sh  # Куда-нибудь сюда
picom -f &                      
xsetroot -cursor_name left_ptr
exec bspwm                      

Betterlockscreen

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

Установка

Betterlockscreen устанавливается из AUR, если у вас не установлен yay, то его необходимо установить.

Скачиваем yay с репозитория:

git clone https://aur.archlinux.org/yay.git 

Переходим в установленную директорию:

cd yay 

Собираем пакет:

makepkg -si 

Теперь установим сам betterlockscreen с помощью yay:

yay -S betterlockscreen

Настройка

Если запустить betterlockscreen без аргументов, он выведет описание всех аргументов. Рассмотрим некторые:

Добавление изображения:

Аргумента -u --update <PATH> добавляет обои на экран блокировки. Обои я скачал в директорию ~/.config/betterlockscreen/

betterlockscreen -u ~/.config/betterlockscreen/wallpaper.jpg

Так же можно дополнительно настроить отображение эффектов:

  • --dim <N> Затемнение изображения в процентах (0-100)

  • --blur <N> Величина размытия изображения (0.0-1.0)

  • --color <HEX> Заполнить цветом задний фон палитрой HEX

Например:

betterlockscreen -u ~/.config/betterlockscreen/wallpaper.jpg --dim 20 --blur 0.5

Теперь можно запустить экран блокировки с различными эффектами с помощью аргумента -l --lock <EFFECT>:

betterlockscreen -l blur 

Так же можно поставить изображение в качестве обоев рабочего стола:

betterlockscreen -u ~/downloads/wallpaper.jpg
betterlockscreen -w

Добавим горячую клавишу для запуска экрана блокировки в конфигурацию sxhkd:

alt + shift + x    
  betterlockscreen -l blur

Запуск и управление

Так как я не рассматриваю решения с использованием дисплейного менеджера, запуск будет производиться с консоли:

startx

Данная команда запускает наше графическое окружение на иксах. В работе это выглядит примерно так:

Стандартные горячие клавиши sxhkd:

Shortcut

Действие

super + Return

Запуск терминала

super + Spase

Запуск dmenu

super + Escape

Перезапуск конфига sxhkd

super + alt + {q,r}

Выйти/перезапустить bspwm

super + {_,shift + }w

Закрыть и убить приложение

super + m

Переход в режим монокля и обратно в плиточный

super + y

Отправить новейший отмеченный узел в новейший предварительно выбранный узел

super + g

Поменяйте местами текущий узел и самое большое окно

Состояние и флаги:

Shortcut

Действие

super + f

Установить режим окна (focused, floating)

super + ctrl + {m,x,y,z}

Установить флаг узла (marked,locked,sticky,private)

Фокус и перемещение:

Shortcut

Действие

super + {_,shift + }{h,j,k,l}

Фокус на ноду в выбранном направлении

super + {p,b,comma,period}

Фокус узлов в другой путь(workspace)

super + {_,shift + }c

Фокус на следующее/предыдущий окно в текущем рабочем столе

super + bracket{left,right}

Фокус на следующий/предыдущий рабочий стол в текущем мониторе

super + {grave,Tab}

Фокус на последний узел/рабочий стол

super + {o,i}

Фокус на более старый или новый узел в истории фокуса

super + {_,shift + }{1-9,0}

Переключиться на рабочий стол или перетащить на него активное окно

Предварительный выбор:

Shortcut

Действие

super + ctrl + {h,j,k,l}

Выбор направления открытого окна

super + ctrl + {1-9}

Выбрать рабочий стол на котором откроется новое окно

super + ctrl + space

Отменить предварительный выбор для сфокусированного узла

super + ctrl + shift + space

Отменить предварительный выбор для сфокусированного рабочего стола

Перемещение и изменение размера:

Shortcut

Действие

super + alt + {h,j,k,l}

Увеличить окно сдвинув одну из его сторон

super + alt + shift + {h,j,k,l}

Уменьшить окно сдвинув одну из его сторон

super + {Left,Down,Up,Right}

Перемещение плавающих окон

Литература

Arch wiki bspwm

Arch wiki sxhkd

Arch wiki dmenu

Arch wiki polybar

Arch wiki xorg

Arch wiki xrandr

BSPWM Установка и настройка

[14а] | Arch Linux: BSPWM - Part 1

[14b] | Arch Linux: BSPWM - Part 2