Linux
October 24

Arch Linux + BSPWM в стиле Dracula. Установка и конфигурация

В этой статье мы сделаем минимальную конфигурацию Arch Linux с оконным менеджером BSPWM, применив цветовую палитру Dracula. В итоге получится красивая минималистичная ОС с приятным визуальным оформлением.

Dotfiles тут.

Как обычно, определяем задачи:

  1. Установить Arch Linux с шифрованием + LVM
  2. Установить и настроить bspwm
  3. Настроить терминал Kitty и командную оболочку Zsh
  4. Создать и активировать swap-файл
  5. Установить и настроить менеджер входа LightDM
  6. Установить и настроить менеджер блокировки экрана (xss-lock + xsecurelock)
  7. Установить и настроить USBGuard
  8. Установить и настроить лаунчер приложений rofi
  9. Установить и настроить агент аутентификации
  10. Установить и настроить демон уведомлений dunst
  11. Установить базовый набор программ для работы (веб-браузер, файловый менеджер, медиаплеер и т.п.)
  12. Установить темы для Qt и GTK (Dracula)
  13. Установить и настроить polybar
  14. Установить и настроить picom

Установка Arch Linux

Выставляем время и проверяем:
timedatectl set-ntp true && timedate set-timezone Europe/Moscow && timedatectl

Смотрим список дисков:
fdisk -l

После того, как нашли нужный диск, стираем с него все данные с помощью blkdiscard:
blkdiscard -s /dev/nvme0n1
Если диск не поддерживает режим --secure, то можно использовать --zeroout, чтобы заполнить его нулями:
blkdiscard -z /dev/nvme0n1
Если на диске уже есть базовая разметка, то может понадобиться использовать -f (программа сама сообщит об этом):
blkdiscard -z -f /dev/nvme0n1

Думаю, стоит отметить, что этот процесс не быстрый и придется долго ждать завершения операции. Использовать blkdiscard необходимо для того, чтобы избежать утечки данных. Далее делаем разметку и шифруем основной раздел:
cfdisk /dev/nvme0n1 (здесь создаем загрузочный раздел с типом EFI System и основной с типом Linux Filesystem)

cryptsetup luksFormat /dev/nvme0n1p2
cryptsetup open /dev/nvme0n1p2 luks
ls /dev/mapper (должна быть директория luks)
pvcreate /dev/mapper/luks
vgcreate main /dev/mapper/luks
lvcreate -l 100%FREE main -n root

Проверяем:
lvs

Форматируем:
mkfs.ext4 /dev/mapper/main-root
mkfs.fat -F32 /dev/nvme0n1p1

Монтируем:
mount /dev/mapper/main-root /mnt
mkdir /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot

Устанавливаем систему:
pacstrap -i /mnt base linux linux-firmware base-devel lvm2 vim sudo networkmanager

Генерируем fstab:
genfstab -U /mnt >> /mnt/etc/fstab

Меняем корневой каталог и пересобираем ядро:
arch-chroot /mnt
vim /etc/mkinicpio.conf
в HOOKS после filesystems добавляем encrypt и lvm2, чтобы было вот так:

mkinitcpio -p linux

Ставим загрузчик:
bootctl install --path=/boot

Настриваем:
vim /boot/loader/loader.conf
В файле указываем timeout 0, чтобы не ждать 3 секунды и сразу загружалась система, а также указываем файл arch (который мы далее создадим):

timeout 0
default arch

vim /boot/loader/entries/arch.conf

title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options rw cryptdevice=UUID=UUID-раздела:main root=/dev/mapper/main-root

(вместо "UUID-раздела" ставим свое значение. UUID раздела можно узнать с помощью cryptsetup luksUUID /dev/nvme0n1p2)

Настраиваем время:
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
hwclock --systohc

Генерируем локали:
vim /etc/locale.gen - здесь раскомментируем en_US и ru_RU с кодировкой UTF-8.
locale-gen

Прописываем hostname:
vim /etc/hostname

Редачим hosts:
vim /etc/hosts

127.0.0.1    localhost
::1          localhost

(Вместо hostname указываем то, что прописали в файле /etc/hostname)

Настраиваем пользовательские данные:
passwd
useradd -m user
passwd user
usermod -aG wheel,audio,video,storage,optical,scanner,floppy user
EDITOR=vim visudo - убираем комментарий с %wheel ALL=(ALL:ALL) ALL

Включаем NetworkManager:
systemctl enable NetworkManager

Выходим и перезагружаем:
exit
umount /mnt -l
reboot

Установка bspwm и базового набора ПО

sudo pacman -Syu
sudo pacman -S locate net-tools neofetch htop openssh xdg-user-dirs ntfs-3g exfatprogs bash-completion vim pacman-contrib git wget bleueman aspell aspell-en aspell-ru noto-fonts-cjk noto-fonts-emoji nvidia-utils nvidia-settings nvidia-open gvfs-mtp xorg-server xorg-xinit xorg-xkill xorg-xrandr bspwm sxhkd zsh kitty less numlockx
На этом этапе лучше перезагрузить компьютер.

Далее создаем файл ~/.profile и добавляем в него строки для запуска sxhkd и bspwm, а также hotkeys для изменения раскладки клавиатуры (это временно):
vim ~/.xprofile

setxkbmap -layout 'us,ru' -option 'grp:alt_shift_toggle' &
sxhkd &
numlockx
exec bspwm

Теперь копируем конфиги:
mkdir ~/.config/bspwm
mkdir ~/.config/sxhkd
cp /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/
cp /usr/share/doc/bspwm/examples/sxhkd/sxhkdrc ~/.config/sxhkd/

Конфиг bspwm обязательно должен быть исполняемым:
chmod +x ~/.config/bspwm/bspwmrc

Сразу пропишем открытие Kitty по Win+ENTER в конфиге sxhkd:
vim ~/.config/sxhkd/sxhkdrc

# terminal emulator
super + Return
		kitty

Создадим скрипт для проверки подключения второго монитора:

#!/bin/bash

my_second_monitor=$(xrandr --query | grep 'HDMI-1-0')
if [[ $my_second_monitor = *connected* ]]; then
    xrandr --output eDP-1 --primary --mode 1920x1080 --rotate normal --output HDMI-1-0 --mode 1920x1080 --rotate normal --right-of eDP-1
fi

В конфиге bspwm прописываем его запуск при старте:
~/.scripts/dual_monitor.sh

А также настроим через bspc:

bspc monitor eDP-1 -d I II III IV
bspc monitor HDMI-1-0 -d V VI VII VIII IX X
bspc desktop -f ^1

Теперь редактируем sxhkdrc. Поменяем hotkeys для перезапуска sxhkdrc:

super + ctrl + r
		pkill -USR1 -x sxhkd

Управление окнами:

super + {Left, Down,Up,Right}
		bspc node -v {-20 0,0 20 -20,20 0}
super + ctrl + {Left,Down,Up,Right}
		bspc node -p {west,south,north,east}
super + alt + {Left,Down,Up,Right}
		bspc node -Z {left -20 0,bottom 0 20,top 0 -20,right 20 0}
super + alt + ctrl + {Left,Down,Up,Right}
		bspc node -z {right -20 0,top 0 20,bottom 0 -20,left 20 0}

А также назначим hotkeys для перезапуска настроек клавиатуры через xsetkeyboard:

super + shift + k
		setxkbmap -layout 'us,ru' -option 'grp:alt_shift_toggle'

Изменим hotkeys для управления окнами:

Наконец, hotkeys для переключения режимов управления окном:

Теперь для тайлинга - Win + Shift + T, для псевдотайлинга - Win + Shift + P, для плавающего режима - Win + Shift + S и для полноэкранного режима Win + Shift + F соответственно.

Меняем цвета рамок для bspwm:

bspc config normal_border_color "#44475a"
bspc config active_border_color "#bd93f9"
bspc config focused_border_color "#ff79c6"
bspc config presel_feedback_color "#6272a4"

И настраиваем отображение одного окна на рабочем столе:

bpsc config single_monocle true
bpsc config borderless_monocle true
bpsc config gapless_monocle false

Запускаем bspwm:
startx

Настраиваем терминал и командную оболочку

Устанавливаем шрифт:
sudo pacman -S otf-fantasque-sans-mono
Редактируем конфиг Kitty:
ctrl + shift + F2

enable_audio_bell no
font_family Fantasque Mono Sans
cursor #f8f8f2
cursor_text_color background
cursor_trail 1

url_color #8be9fd
url_style straight

foreground            #f8f8f2
background            #282a36
selection_foreground  #ffffff
selection_background  #44475a
# black
color0  #21222c
color8  #6272a4

# red
color1  #ff5555
color9  #ff6e6e

# green
color2  #50fa7b
color10 #69ff94

# yellow
color3  #f1fa8c
color11 #ffffa5

# blue
color4  #bd93f9
color12 #d6acff

# magenta
color5  #ff79c6
color13 #ff92df

# cyan
color6  #8be9fd
color14 #a4ffff

# white
color7  #f8f8f2
color15 #ffffff
active_tab_foreground   #282a36
active_tab_background   #f8f8f2
inactive_tab_foreground #282a36
inactive_tab_background #6272a4
mark1_foreground #282a36
mark1_background #ff5555
active_border_color #f8f8f2
inactive_border_color #6272a4

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

Еще убираем комментарий со строчки, которая отвечает за удаление пробелов в конце скопированного текста:

Обновляем конфиг с помощью ctrl + shift + F5.

Настраиваем zsh:
zsh
Здесь мы можем сменить оболочку по умолчанию с помощью chsh -s /usr/bin/zsh, но это также можно сделать и автоматизированным методом после установки oh my zsh с помощью следующей команды.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Плагины для oh-my-zsh:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

В zshrc:
plugins=(git archlinux web-search dirhistory history zsh-autosuggestions zsh-syntax-highlighting)

Чтобы некоторые плагины заработали нужно перезапустить компьютер.

powerlevel10k:
Устанавливаем:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
И в ~/.zshrc меняем значение ZSH_THEME на powerlevel10k/powerlevel10k, чтобы получилось вот так:

ZSH_THEME="powerlevel10k/powerlevel10k"

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

SWAP-файл

Многие не создают swap-файл, предпочитая обходиться исключительно возможностями оперативки, но я на всякий случай создам его. Не то чтобы он часто пригождается, но все-таки иногда может быть полезен. Размер ему выделю на 8 Гб:
sudo fallocate -l 8G /swapfile
Обязательно устанавливаем права:
sudo chmod 600 /swapfile
Форматируем:
sudo mkswap /swapfile
И активируем:
sudo swapon /swapfile

Все хорошо, но для того, чтобы файл подкачки использовался после каждой перезагрузки, нужно сделать дополнительные действия:
sudo vim /etc/fstab - добавляем следующую строку:

/swapfile none swap defaults 0 0

Менеджер входа LightDM

Установка:
sudo pacman -S lightdm lightdm-gtk-greeter

Конфиг:
sudo vim /etc/lightdm/lightdm.conf

greeter-allow-guest=false
greeter-hide-users=true
greeter-show-manual-login=true
user-session=bspwm
greeter-session=lightdm-webkit2-greeter

Автозапуск:
sudo systemctl enable lightdm.service

Окей, теперь настроим внешний вид. Для начала поставим фоновое изображение. Создадим директорию .backgrounds:
mkdir ~/.backgrounds
И перекинем в нее обои. Далее скопируем какое-нибудь изображение из этой директории в /usr/share/pixmaps:
cp ~/.backgrounds/*.png /usr/share/pixmaps
sudo chmod 555 -R /usr/share/pixmaps - чтобы у lightdm был доступ к директории

Мы можем редактировать конфиг вручную или воспользоваться lightdm-gtk-greeter-settings:
sudo pacman -S lightdm-gtk-greeter-settings

После применения обоев, они также применяются и для рабочего стола. Это нам не подходит, поэтому будем менять ситуацию с помощью feh:
sudo pacman -S feh

И добавляем в .xprofile (хотя, лучше добавить в bspwmrc, т.к. у polybar'а может возникнуть конфликт, когда мы его установим):
feh --bg-scale ~/.backgrounds/bg.png

Кстати, об автозагрузке. Помните, мы редактировали файл ~/.xprofile? Так вот, по умолчанию lightdm как раз использует этот файл, если он существует, но т.к. в конфиге lightdm мы прописали bspwm в качестве сессии, нам теперь нужно удалить из ~/.xprofile строчки, которые отвечают за запуск bspwm и sxhkd, потому что они больше не требуются и могут вызывать конфликты. Оставим только строчки с numlockx и setxkbmap.

Также сменим тему для GTK. Скачать ее можно отсюда.
sudo pacman -S unzip lxappearance dconf-editor
cd ~/Downloads
unzip gtk-master.zip
sudo cp -r gtk-master /usr/share/themes/Dracula
В lightdm-gtk-greeter-settings выбираем тему Dracula.

Раз уж мы принялись за тему для GTK, то сразу сделаем и остальное:
Скачиваем набор иконок.
unzip Dracula.zip
sudo cp -r Dracula /usr/share/icons
lxappearance - меняем на нужные значения
dconf-editor

org.gnome.desktop.interface gtk-theme "Dracula"
org.gnome.desktop.wm.preferences theme "Dracula"
org.gnome.desktop.interface icon-theme "Dracula"
org.gnome.desktop.interface color-scheme prefer-dark
org.gnome.desktop.interface font-name "Fantasque Sans Mono 11"

Редактируем файл /usr/share/gtk-2.0/gtkrc и меняем значения на Dracula + добавляем принудительное использование темной темы + использование сочетаний клавиш:

gtk-icon-theme-name = "Dracula"
gtk-theme-name = "Dracula"
gtk-application-prefer-dark-theme = true
gtk-can-change-accels = 1

~/.config/gtk-3.0/settings.ini:

[Settings]
gtk-icon-theme-name = Dracula
gtk-theme-name = Dracula
gtk-font-name = Fantasque Sans Mono 11

~/.config/gtk-4.0/settings.ini:

[Settings]
gtk-icon-theme-name = Dracula
gtk-theme-name = Dracula
gtk-font-name = Fantasque Sans Mono 11

/etc/gtk-3.0/settings.ini и /etc/gtk-4.0/settings.ini по аналогии с двумя предыдущими файлами (это нужно для того, чтобы при запуске программ от имени root, темы тоже использовались).

Шрифт для GTK устанавливаем точно также, путем редактирования конфигов и использования такого ПО, как lxappearance, gtk-chteme и т.д.

В lightdm-gtk-greeter-settings переходим на вкладку "Panel" и убираем лишние значки с панели.

Изменение аватара:
Кидаем изображение размером 96x96 в /usr/share/pixmaps.

Блокировка экрана

Теперь настроим блокировку экрана. Это можно сделать с помощью того же LightmDM через dm-tool lock, но он не работает должным образом с xss-lock, поэтому воспользуемся xsecurelock.

Для начала настроим hotkeys для ручной блокировки:

# lock
super + l
		~/.scripts/xsecurelock_conf.sh

Теперь сделаем блокировку автоматической, с помощью xss-lock:
sudo pacman -S xss-lock
xset s 160 20
xss-lock ~/.scripts/xsecurelock_conf.sh

И настроим сам xsecurelock:
vim ~/.scripts/xsecurelock_conf.sh

#!/bin/zsh

export XSECURELOCK_PASSWORD_PROMPT=hidden
export XSECURELOCK_SHOW_DATETIME=1
export XSECURELOCK_SHOW_USERNAME=0
export XSECURELOCK_SHOW_HOSTNAME=0
export XSECURELOCK_BACKGROUND_COLOR="#282a36"
export XSECURELOCK_AUTH_BACKGROUND_COLOR="#282a36"
export XSECURELOCK_AUTH_FOREGROUND_COLOR="#f8f8f2"
export XSECURELOCK_AUTH_WARNING_COLOR="#ff5555"
xsecurelock

chmod -w ~/.scripts/xsecurelock_conf.sh

USBGuard

Установка:
sudo pacman -S usbguard
Создаём исходный набор правил (от имени root):
sudo su
usbguard generate-policy > /etc/usbguard/rules.conf
Для того чтобы отредактировать исходный набор правил:
vim /etc/usbguard/rules.conf
Запуск службы:
systemctl start usbguard.service
Добавляем в автозагрузку:
systemctl enable usbguard.service

Чтобы вывести список всех USB-устройств, распознаваемых USBGuard:
usbguard list-devices
Чтобы авторизовать устройство для взаимодействия с системой:
usbguard allow-device <ID устройства (можно узнать с помощью предыдущей команды)>
Для деавторизации и удаления устройства из системы:
reject-device <ID устройства>
Для деавторизации без удаления устройства из системы:
usbguard block-device <ID устройства>

Rofi

sudo pacman -S rofi

sxhkdrc:

# program launcher
super + d
        rofi -show drun

Тема Dracula:
mkdir -p ~/.config/rofi
git clone https://github.com/dracula/rofi
cp rofi/theme/config1.rasi ~/.config/rofi/config.rasi

Немного подкорректируем шрифт:
vim ~/.config/rofi/config.rasi

font: "Fantasque Sans mono 11"

Установим скрипты:
Monitor Layout - изменение настроек мониторов
Power - управление питанием (тут нужно отредачить скрипт, чтобы вместо i3lock использовался xsecurelock)

Также установим и настроим greenclip (менеджер буфера обмены):
yay -S rofi-greenclip - для установки
greenclip daemon - для запуска демона
rofi -modi "clipboard:greenclip print" -show clipboard - для запуска rofi-greenclip

Hotkeys:

# rofi scripts
super + XF86Tools
		~/.scripts/rofi/power.sh
super + XF86Launch6
		~/scripts/rofi/power.sh
super + space
		rofi -modi "clipboard:greenclip print" -show clipboard

Агент аутентификации

sudo pacman -S mate-polkit
В автозагрузку:

/usr/lib/mate-polkit/polkit-mate-authentication-agent-1

Dunst

Установка:
sudo pacman -S dunst

Копируем конфиг:
mkdir ~/.config/dunst
cp /etc/dunst/dunstrc ~/.config/dunst

vim ~/.config/dunst/dunstrc

follow = keyboard
width = 400
origin = top-center
padding = 10
font = Fantasque Sans Mono 11
format = "<b>%s</b> %p\n%b"
alignment = center

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

#!/usr/bin/env bash

OPTIONS="Show history\nClear history"

LAUNCHER="rofi -width 30 -dmenu -i -p notifications"

option=`echo -e $OPTIONS | $LAUNCHER`
if [ ${#option} -gt 0 ]
then
    case $option in
      "Show history")
        dunstctl history-pop
        ;;
      "Clear history")
        dunstctl history-clear
        ;;
	  "Send test notification")
		notify-send "Test" "test"
		;;
      *)
        ;;
    esac
fi

И добавил для его запуска hotkeys:

super + XF86Launch5
		~/.scripts/rofi/dunst.sh

Набор ПО

sudo pacman -S firefox nemo nemo-preview nemo-seahorse nemo-share nemo-terminal code gparted obsidian libreoffice-still nmap ark flameshot pdfarranger vlc mousepad calcurse qalculate-gtk veracrypt nm-connection-editor

sxhkdrc:

# nemo
super + e
		nemo

# firefox
super + f
		firefox

# obsidian
super + o
		obsidian

# vs-code
super + v
		codevv

# flameshot gui
super + Print
		flameshot gui

bspwmrc:

bspc rule -a Nemo state=floating rectangle=750x455+585+310
bspc rule -a feh state=floating
bspc rule -a Dconf-editor state=floating
bspc rule -a Gtk-chteme state=floating rectangle=750x455+585+310
bspc rule -a qt5ct state=floating
bspc rule -a qt6ct state=floating
bspc rule -a Nm-connection-editor = state=floating

Настроим Nemo:

org.cinnamon.desktop.applications.terminal exec "kitty"
org.cinnamon.desktop.applications.calculator exec "qalculate-gtk"

Темы для QT

Раз уж мы поставили тему для GTK, то сделаем это и для QT. Возьмем ту же Dracula:
sudo pacman -S qt5ct qt6ct
git clone https://github.com/dracula/qt5.git
cp qt5/Dracula.conf ~/.config/qt5ct/colors

Запускаем qt5ct и меняем тему на Dracula. Также меняем иконки и шрифт. Тоже самое делаем с qt6ct.

Для того, чтобы изменения применялись, нужно прописать в /etc/environment следующую строку:
QT_QPA_PLATFORMTHEME=qt5ct:qt6ct

polybar

sudo pacman -S polybar
mkdir -p ~/.conifg/polybar
cp /usr/share/doc/polybar/examples/config.ini ~/.config/polybar/config.ini

Т.к. наибольшую часть времени я провожу за вторым монитором, мне необходимо, чтобы polybar отображался и на втором мониторе. Сделать это довольно просто - достаточно создать bash-скрипт и немного отредактировать конфиг polybar:

killall -q polybar
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done

if type "xrandr"; then
  for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do
    MONITOR=$m polybar --reload mybar &
  done
else
  polybar --reload mybar &
fi
[colors]
background = #282a36
background-alt = #44475a
foreground = #f8f8f2
primary = #bd93f9
secondary = #ffb86c
alert = #ff5555
disabled = #6272a4

[bar/mybar]
monitor=${env:MONITOR:}
font-0 Fantasque Sans Mono;2
font-1 Symbols Nerd Font;2

Далее убираем лишние модули. Я оставил xworkspaces, pulseaudio, xkeyboard, wlan, eth и date. Остальные отключил.

Bluetooth:
sudo pacman -S bluez bluez-utils blueberry (blueberry можно будет заменить скриптом rofi. Покажу чуть ниже)
pacman -S ttf-nerd-fonts-symbols
systemctl start bluetooth.service
В конфиг polybar добавляем модуль (взят отсюда):

[module/bluetooth]
type = custom/script
exec = ~/.scripts/polybar/bluetooth.sh
interval = 2
click-left = exec blueberry
click-right = exec ~/.scripts/polybar/toggle_bluetooth.sh
format-padding = 1

Скрипты для модуля:
bluetooth.sh (обратите внимание, тут я изменил цвета, чтобы они лучше подходили под тему Dracula!)

#!/bin/sh
if [ $(bluetoothctl show | grep "Powered: yes" | wc -c) -eq 0 ]
then
  echo "%{F#707880}"
else
  if [ $(echo info | bluetoothctl | grep 'Device' | wc -c) -eq 0 ]
  then 
    echo "󰂯"
  fi
  echo "%{F#bd93f9}"
fi

toggle_bluetooth.sh

#!/bin/sh
if [ $(bluetoothctl show | grep "Powered: yes" | wc -c) -eq 0 ]
then
  bluetoothctl power on
else
  bluetoothctl power off
fi

Вместо blueberry:
Берем вот этот скрипт либо с помощью yay -S rofi-bluetooth, либо копируем с гита (второй вариант лучше, т.к. скрипт можно будет поместить в любую директорию, например у меня он в ~/.scripts/rofi/) и немного переписываем модуль для polybar'а (меняем blueberry в click-left на exec ~/.scripts/rofi/bluetooth-menu.sh):

[module/bluetooth]
type = custom/script
exec = ~/.scripts/polybar/bluetooth.sh
interval = 0.3
click-left = exec ~/.scripts/rofi/bluetooth-menu.sh
click-right = exec ~/.scripts/polybar/toggle_bluetooth.sh
format-padding = 1

Wi-Fi:
А вот с wi-fi дела обстоят чуть сложнее, т.к. скрипт rofi-wifi-menu мне не нравится тем, что в нем невозможно скрыть пароль при вводе. Дело в том, что при вводе пароля, все вводимые символы будут отображаться и заменить их на какие-нибудь звездочки не получится. Еще сканирование происходит только один раз за запуск скрипта, соответсвенно список сетей автоматически не обновляется. Я сейчас покажу как поставить все это дело, но в будущем планирую заменить на что-нибудь (хотя в данный момент я даже не имею представления на что менять, т.к. хочется именно виджет, а не всеми привычное окно с перегруженным GUI). Короче, устанавливаем:
yay -S rofi-wifi-menu-git - для установки через AUR, но я все таки рекомендую вариант ниже:

git clone https://github.com/zbaylin/rofi-wifi-menu.git
cd rofi-wifi-menu
bash "./rofi-wifi-menu.sh"

Далее копируем config.example в .config/rofi под именем wifi. Ну или меняем rofi-wifi-menu.sh и указываем иной путь к конфигу. В самом файле wifi можно поменять некоторые значения, в том числе расположение rofi на экране и отображаемую информацию. В целом все, теперь можно просто запускать скрипт (естественно, переместив в нужную директорию, например у меня это ~/.scripts/rofi/).

Осталось разобраться с модулями для polybar'а:

[module/wireless-network]
type = internal/network
interface = wlp0s20f3
interface-type = wireless
interval = 0.3

label-connected = %{F#bd93f9}󰖩 %{A1:~/.scripts/rofi/wifi-menu.sh:}%ifname%%{F-} %essid% %{F#bd93f9}%netspeed% %signal%%{A}
label-disconnected = %{F#bd93f9}󰖪 %{A1:~/.scripts/rofi/wifi-menu.sh:}%ifname% %{F#707880}disconnected%{A}

format-connected = <label-connected>
format-disconnected = <label-disconnected>

[module/wired-network]
type = internal/network
interface = enp3s0
interface-type = wired
interval = 0.3

label-connected = %{F#bd93f9}󰲝 %ifname%%{F-} %local_ip% %{F#bd93f9}%netspeed%
label-disconnected = %{F#bd93f9}󰲝 %ifname%%{F#707880} disconnected

format-connected = <label-connected>
format-disconnected = <label-disconnected>

Проверка обновлений:
Теперь сделаем модуль, который будет проверять, есть ли какие-то обновления и если да, то выводить их количество на бар.
Конфиг бара:

[module/package-updates]
type = custom/ipc
hook-0 = ~/.scripts/polybar/package-updates.sh

[module/package-updates-trigger]
type = custom/script
exec = polybar-msg hook package-updates 1 &>/dev/null
interval = 600

~/.scripts/polybar/package-updates.sh:

#!/bin/sh
format() {
    if [ "$1" -eq 0 ]; then
        echo '-'
    else
        echo "$1"
    fi
}

if ! updates_arch="$(checkupdates | wc -l)"; then
    updates_arch=0
fi

if ! updates_aur="$(yay -Qum 2>/dev/null | wc -l)"; then
    updates_aur=0
fi

updates="$((updates_arch + updates_aur))"

if [ "$updates" -gt 0 ]; then
    echo " ($(format $updates_arch)/$(format $updates_aur))"
else
    echo
fi

/etc/pacman.d/hooks/polybar.hook:

[Trigger]
Operation = Upgrade
Operation = Remove
Type = Package
Target = *

[Action]
Description = Updating Polybar package count...
Depends = polybar
When = PostTransaction
Exec = /usr/bin/bash -c '/usr/bin/polybar-msg hook package-updates 1 &>/dev/null || true'

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

[module/battery]

type = internal/battery
full-at = 100

battery = BAT1
adapter = ACAD
poll-interval = 0.3

label-discharging = %percentage%%
label-charging = %percentage%%
label-full = %{F#50FA7B}%{F-} %percentage%%

format-discharging = <ramp-capacity> <label-discharging>
format-charging = %{F#BD93F9}<animation-charging>%{F-} <label-charging>

ramp-capacity-0 = %{F#FF5555}%{F-}
ramp-capacity-1 = %{F#FF5555}%{F-}
ramp-capacity-2 = %{F#FFB86C}%{F-}
ramp-capacity-3 = %{F#50FA7B}%{F-}
ramp-capacity-4 = %{F#50FA7B}%{F-}

animation-charging-0 = 
animation-charging-1 = 
animation-charging-2 = 
animation-charging-3 = 
animation-charging-4 = 
animation-charging-framerate = 750

Чтобы узнать имя батареи и адаптера (для battery и adapter):
ls -l /sys/class/power_supply

pavucontrol:
yay -S pacmixer - консольный иенеджер, вдохновленный pavucontrol

~/.config/polybar/config.ini:

[module/pulseaudio]
type = internal/pulseaudio

format-volume = %{F#bd93f9}<ramp-volume>%{F-} <label-volume>

label-volume = %percentage%%
label-muted =%{F#FF5555}%{F-} %{F#6272a4}muted

ramp-volume-0 = 
ramp-volume-1 = 
ramp-volume-2 = 

click-right = kitty --class="kitty pacmixer" pacmixer

~/.config/bspwm/bspwmrc:

bspc rule -a "Kitty pacmixer" state-floating rectangle=750x455+1005+54

Media control:
Очень полезная штука для тех, кто любит слушать музыку. А я просто обожаю музыку и слушаю ее постоянно.
sudo pacman -S playerctl python3-venv - устанавливаем необходимые пакеты
python -m venv venv - запускаем виртуальное окружение venv
source venv/bin/activate - активируем виртуальное окружение venv
pip install dbus-python - устанавливаем python-модуль dbus-python
git clone https://github.com/d093w1z/polybar-now-playing - клонируем репозиторий с github
cd polybar-now-playing - переходим в директорию клонированного репозитория
python polybar-now-playing - проверяем работу программы
mv polybar-now-playing ~/.scripts/polybar/now-playing.py - перемещаем скрипт в нужную директорию
cd - переходим обратно в домашний каталог
rm -rf polybar-now-playing - удаляем директорию

Далее добавляем модуль в polybar:

[module/now-playing]
type = custom/script
tail = true
exec = source ~/venv/bin/activate && ~/.scripts/polybar/now-playing.py

format = <label>

Готово.

Яркость экрана:
Я так и не смог настроить стандартный модуль (backlight) для регулировки яркости, поэтому воспользовался кастомным:
~/.scripts/polybar/brightnessctl.sh

#!/bin/bash

BRIGHTNESS_VALUE=`brightnessctl | grep -o "(.*" | tr -d "()"`
BRIGHTNESS_NR=${BRIGHTNESS_VALUE//%}

if [ $BRIGHTNESS_NR -lt 20 ]; then
	BRIGHTNESS_ICON='󰛩'
elif [ $BRIGHTNESS_NR -lt 50 ]; then
	BRIGHTNESS_ICON='󱩒'
elif [ $BRIGHTNESS_NR -lt 80 ]; then
	BRIGHTNESS_ICON='󱩕'
else
	BRIGHTNESS_ICON='󰛨'
fi

echo "$BRIGHTNESS_ICON"

конфиг polybar'а:

[module/brightnessctl]
type = custom/script
exec = ~/.scripts/polybar/brightnessctl.sh

scroll-up = exec brightnessctl set +5%
scroll-down = exec brightnessctl set 5%-

interval = 0.5

label = %{F#bd93f9}%output%
label-foreground = ${colors.foreground}

Данный модуль позволяет менять яркость только на первом мониторе (ибо данные берутся из /sys/class/backlight/intel_backlight), поэтому некоторым он не подойдет. Найти какое-то альтернативное решение для двух мониторов я не смог и было принято решение написать модуль самостоятельно, который будет использовать xrandr вместо brightnessctl, но и тут меня настиг провал, потому что для получения информации о текущей настройке яркости через xrandr требуется значительно больше ресурсов. Сравните сами, вот команда для получения данных через brightnessctl:

BRIGHTNESS_VALUE=`brightnessctl | grep -o "(.*" | tr -d "()"`

echo "$BRIGHTNESS_VALUE"

А вот через xrandr:

BRIGHTNESS_VALUE=`xrandr --verbose | grep -m 1 -w HDMI-1-0 -A8 | grep "Brightness" | tr -d "Brightness: "`

echo "$BRIGHTNESS_VALUE"

И это должно запускаться каждые 0.3 секунды, для того чтобы на баре отображалась актуальная инфомация о текущей настройке. В итоге наблюдаются небольшие задержки из за нагрузки на ЦП.

При беглом поиске найти какую-то другую программу, через которую можно было бы получить текущее значение яркости второго экрана я не смог, а заморачиваться над этой мелочью в данный момент не хочу и решил оставить эту задачу на потом. Могу лишь посоветовать один скрипт c гита:
GitHub - philippnormann/xrandr-brightness-script: 🔆 Script for adjusting the brightness and color temperature of displays on a software level using xrandr.

Он позволяет через bash-скрипт менять яркость через xrandr на разных мониторах. Вот примеры:

./brightness.sh + eDP1
./brightness.sh + eDP1 0.2 
./brightness.sh - HDMI-1-0

Можно использовать в качестве опоры для разработки своей тулзы под это дело.

Кстати, если вам не нравится, что с помощью модуля есть возможность установить значение яркости экрана на 0% (то есть полностью выключить экран), то можно сделать простой скрипт, который будет при запуске bspwm проверять уровень яркости и если он ниже 1%, то яркость автоматически будет повышаться на 1%:

#!/bin/bash

BRIGHTNESS_VALUE=`brightnessctl | grep -o "(.*" | tr -d "()"`
BRIGHTNESS_NR=${BRIGHTNESS_VALUE//%}

if [ $BRIGHTNESS_NR -lt 1 ]; then
	brightnessctl set +1%
fi

Таким образом, при перезапуске bspwm (у меня это по нажатию Super + Alt + R), яркость будет автоматически устанавливаться не ниже 1%. Ну или точно такую же проверку можно написать в скрипт для самого модуля:

#!/bin/bash
BRIGHTNESS_VALUE=`brightnessctl | grep -o "(.*" | tr -d "()"`
BRIGHTNESS_NR=${BRIGHTNESS_VALUE//%}

if [ $BRIGHTNESS_NR -lt 1 ]; then
	brightnessctl set +1%
elif [ $BRIGHTNESS_NR -lt 20 ]; then
	BRIGHTNESS_ICON='󰛩'
elif [ $BRIGHTNESS_NR -lt 50 ]; then
	BRIGHTNESS_ICON='󱩒'
elif [ $BRIGHTNESS_NR -lt 80 ]; then
	BRIGHTNESS_ICON='󱩕'
else
	BRIGHTNESS_ICON='󰛨'
fi

echo "$BRIGHTNESS_ICON"

Да, я прекрасно знаю, что можно установить минимальное значение яркости. Но опять же, в brightnessctl такой возможности нет. По крайней мере, я так и не понял как работает опция "-n". Поэтому это самый простой и эффективный способ.

Найти какую-то независимую от среды рабочего стола программу для настройки яркости может быть и можно, но я не стал этого делать. Мне проще прописать что-то типа xrandr --output HDMI-1-0 --brighness 0.6 или ~/.scripts/xrandr_change_brightness - HDMI-1-0 в терминале. Как минимум потому что в реальных обстоятельствах мне ни разу не приходилось настраивать яркость и она у меня всегда выставлена на максимум. Ну а модуль и возможность настройки я добавляю просто на всякий случай, чтобы если когда-то это вдруг понадобится не мучаться.

picom:

Bspwm в связке с оригинальным picom'ом работает плохо, т.к. при округлении углов окон обрезаются рамки и в итоге это выглядит очень неэстетично и вырвиглазно. Исправить ситуацию можно форком:
sudo yay -S picom-ftlabs-git

Запуск:
picom

После запуска мы сразу видим ублюдскую тень от polybar'а и очень медленные анимации, но это легко исправить.
Переходим к редактированию конфига:
vim ~/.config/picom/picom.config
Тени:

shadow-radius = 11;
shadow-opacity = 0.40
shadow-offset-x = -7;
shadow-offset-y = -7;

# polybar
wintypes:
  {
    dock = {
    shadow = false;
    opacity = false;
    };
  };

# firefox
shadow-exclude = [
  "class_g = 'firefox' && argb",
];

Анимации отключаем, т.к. на ноутбуке они будут лишними:

fading = false

Настраиваем прозрачность и блюр (хотя, я думаю что и это на нотбуке будет лишним):

opacity-rule = [
  "95:class_g = 'kitty'",
  "95:class_g = 'kitty',
  "95:class_g = 'code-oss'",
  "95:class_g = 'code-oss'",
  "95:class_g = 'Nemo'",
  "95:class_g = 'Nemo'",
  "95:class_g = 'obsidian'",
  "95:class_g = 'obsidian'",
  "95:class_g = 'firefox' && !focused",
  "100:class_g = 'firefox' focused",
];

blur-method = "dual_kawase"
blur-size = 10
blur-strength = 5
backend = "glx"

Ну и собственно, округление окон:

corner-radius = 10

Итог:


Мой Telegram

Мой GitHub

Поддержать автора донатом