Arch Linux + BSPWM в стиле Dracula. Установка и конфигурация
В этой статье мы сделаем минимальную конфигурацию Arch Linux с оконным менеджером BSPWM, применив цветовую палитру Dracula. В итоге получится красивая минималистичная ОС с приятным визуальным оформлением.
Как обычно, определяем задачи:
- Установить Arch Linux с шифрованием + LVM
- Установить и настроить bspwm
- Настроить терминал Kitty и командную оболочку Zsh
- Создать и активировать swap-файл
- Установить и настроить менеджер входа LightDM
- Установить и настроить менеджер блокировки экрана (xss-lock + xsecurelock)
- Установить и настроить USBGuard
- Установить и настроить лаунчер приложений rofi
- Установить и настроить агент аутентификации
- Установить и настроить демон уведомлений dunst
- Установить базовый набор программ для работы (веб-браузер, файловый менеджер, медиаплеер и т.п.)
- Установить темы для Qt и GTK (Dracula)
- Установить и настроить polybar
- Установить и настроить 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/nvme0n1p2cryptsetup open /dev/nvme0n1p2 luksls /dev/mapper (должна быть директория luks)pvcreate /dev/mapper/luksvgcreate main /dev/mapper/lukslvcreate -l 100%FREE main -n root
Форматируем:mkfs.ext4 /dev/mapper/main-rootmkfs.fat -F32 /dev/nvme0n1p1
Монтируем:mount /dev/mapper/main-root /mntmkdir /mnt/bootmount /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 /mntvim /etc/mkinicpio.conf
в HOOKS после filesystems добавляем encrypt и lvm2, чтобы было вот так:
Ставим загрузчик: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/localtimehwclock --systohc
Генерируем локали:vim /etc/locale.gen - здесь раскомментируем en_US и ru_RU с кодировкой UTF-8.locale-gen
Прописываем hostname:vim /etc/hostname
127.0.0.1 localhost ::1 localhost
(Вместо hostname указываем то, что прописали в файле /etc/hostname)
Настраиваем пользовательские данные:passwduseradd -m userpasswd userusermod -aG wheel,audio,video,storage,optical,scanner,floppy userEDITOR=vim visudo - убираем комментарий с %wheel ALL=(ALL:ALL) ALL
Включаем NetworkManager:systemctl enable NetworkManager
Выходим и перезагружаем:exitumount /mnt -lreboot
Установка bspwm и базового набора ПО
sudo pacman -Syusudo 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/bspwmmkdir ~/.config/sxhkdcp /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 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 соответственно.
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
Настраиваем терминал и командную оболочку
Устанавливаем шрифт:sudo pacman -S otf-fantasque-sans-mono
Редактируем конфиг Kitty:
ctrl + shift + F2
enable_audio_bell nofont_family Fantasque Mono Sanscursor #f8f8f2cursor_text_color backgroundcursor_trail 1
url_color #8be9fdurl_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-autosuggestionsgit 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/pixmapssudo 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-editorcd ~/Downloadsunzip gtk-master.zipsudo cp -r gtk-master /usr/share/themes/Dracula
В lightdm-gtk-greeter-settings выбираем тему Dracula.
Раз уж мы принялись за тему для GTK, то сразу сделаем и остальное:
Скачиваем набор иконок.unzip Dracula.zipsudo cp -r Dracula /usr/share/iconslxappearance - меняем на нужные значения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-lockxset s 160 20xss-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 suusbguard 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
# program launcher
super + d
rofi -show drunТема Dracula:mkdir -p ~/.config/rofigit clone https://github.com/dracula/roficp 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
# 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/dunstcp /etc/dunst/dunstrc ~/.config/dunst
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
# nemo super + e nemo # firefox super + f firefox # obsidian super + o obsidian # vs-code super + v codevv # flameshot gui super + Print flameshot gui
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
org.cinnamon.desktop.applications.terminal exec "kitty" org.cinnamon.desktop.applications.calculator exec "qalculate-gtk"
Темы для QT
Раз уж мы поставили тему для GTK, то сделаем это и для QT. Возьмем ту же Dracula:sudo pacman -S qt5ct qt6ctgit clone https://github.com/dracula/qt5.gitcp qt5/Dracula.conf ~/.config/qt5ct/colors
Запускаем qt5ct и меняем тему на Dracula. Также меняем иконки и шрифт. Тоже самое делаем с qt6ct.
Для того, чтобы изменения применялись, нужно прописать в /etc/environment следующую строку:QT_QPA_PLATFORMTHEME=qt5ct:qt6ct
polybar
sudo pacman -S polybarmkdir -p ~/.conifg/polybarcp /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-symbolssystemctl 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#!/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
[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" pacmixerbspc rule -a "Kitty pacmixer" state-floating rectangle=750x455+1005+54
Media control:
Очень полезная штука для тех, кто любит слушать музыку. А я просто обожаю музыку и слушаю ее постоянно.sudo pacman -S playerctl python3-venv - устанавливаем необходимые пакетыpython -m venv venv - запускаем виртуальное окружение venvsource venv/bin/activate - активируем виртуальное окружение venvpip install dbus-python - устанавливаем python-модуль dbus-pythongit clone https://github.com/d093w1z/polybar-now-playing - клонируем репозиторий с githubcd 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"[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"
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
После запуска мы сразу видим ублюдскую тень от 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