Введение
i3wm - это оконный менеджер который работает на базе Xorg. Он относительно сложен в настройке, но сложность очень сильно зависет от вашего железа.
В отличие от KDE, Gnome и других DE. i3 позволяет добиться большей кастомизации и можно создать подобный вид для своего рабочего окружения.
Так же i3 и все тайлинговые оконные менеджеры не являются полноценными DE (Desktop Environments), это лишь оконный менеджер, но его можно превратить в полноценный DE только лишь своими усилями, ну или просто забрать готовые конфиги и скрипты 😊
Задумка тайлинговых оконных менеджеров состоит в том, что они использую максимальное пространство для вызываемого окна на рабочем столе. Что очень удобно и позволяет держать окна в некотором порядке, в отличии от DE, где никаких правил расположений окон по-умолчанию нет.
Я рекомендую сразу начать настраивать i3wm на железной машине, а не на виртуальной, чтобы получить максимум опыта. Особенно, чтобы сразу выявить где есть проблемы со звуком, мультимедицными клавишами и т.д.
В этот раз Я выкладываю лишь собсвтенные заметки, что помогли мне в настройке моего окружения. В основном я обращался к паре видосов и документации. Все инструкции будут описаны именно для дистрибутива Arch Linux. Основную суть это не поменяет, может только название пакетов может не совпадать с другими дистрибутивами
Основы i3
При первом запуске i3 предложит выбрать Super-кнопку. Это либо , либо . Рекомендую использовать Win-клавишу, потому как в некоторых программах часто используется .
Все настройки i3 описываются в файле конфигурации домашнего пользователя ~/.config/i3/config
Рассмотрим основные настройки:
exec_always
- выполнение команды при каждом запуске/перезапуске i3. Напримерexec_always xrandr --output eDP-1 --mode 1920x1200
set $ws1 "1"
- объявление переменной $ws1 и присваивание ей значенияbindsym $mod+x exec echo "test" > ~/test.txt
- создание хоткея, который будет выполнять командуecho "test" > ~/test.txt
exec --no-startup-id
- выполнение команды при запуске i3 (что-то вроде автозапуске)
Остальные команды можно найти в документации
Мои заметки
Изменить разрешение экрана
pacman -S xorg-xrandr
Выводит информацию о мониторе и поддерживаемых разрешениях
xrandr
xrandr --output Virtual1 --mode 1920x1080
--output Virtual1
- монитор--mode 1920x1080
- разрешение
В конфиг файле это будет выглядеть так
# Display Resolution
exec_always xrandr --output Virtual1 --mode 1920x1080
ZSH
pacman -S zsh
chsh -s /usr/bin/zsh
Локаль
/etc/locale.gen
- раскомментим строку ru_RU.UTF-8 UTF-8
sudo locale-gen
locale -a
- проверяем доступность командой
Устанавливаем системную локаль
localectl set-locale ru_RU.UTF-8
Дефолтный терминал i3 не поддерживает РУ язык. Требуется подменить консоль например на kitty в конфиге ~/.config/i3/config
Установим kityy
pacman -S alacritty
Настроим терминал по-умолчанию
bindsym $mod+Return exec alacritty
/etc/X11/xorg.conf.d/00-keyboard.conf
- редактируем переключение раскладки на Alt+Shift
Section "InputClass"
Identifier "touchpad"
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
EndSection
Section "InputClass"
Identifier "keyboard"
Driver "libinput"
MatchIsKeyboard "on"
Option "XkbLayout" "us,ru"
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
CapsLock
Option "XkbOptions" "grp:caps_toggle"
Обои на рабочий стол
pacman -S feh
Конфиг i3
# Display Wallpaper
exec_always feh --bg-fill /home/vik/.config/i3/img/img.png
Блокировка экрана
i3lock
- блокирует экран
Конфиг i3 на горячие клавиши Win+L
# Lockscreen
bindsym $mod+l exec i3lock
Автозагрузка приложений на закрепленных экранах
Нужно узнать класс окна приложения.
- Запускаем приложение и запускаем терминал в 1 рабочем пространстве
- В терминале вводим
xprop
- Курсор станет крестиком, мы должны кликнуть на наше окно, у которого мы хотим узнать класс
- После клика, в терминале отобразится вся необходимая инфомрация
Пример, вывода
Мы ищем класс WM_CLASS(STRING) = "Navigator", "firefox"
Нам нужно второе значение класса, которое мы передадим в конфиг
# Assing Programs to Wotkspaces
for_windows [class="firefox"] mov to workspace $ws2
По такой логике будет работать любой запуск приложений привязаный к рабочему пространству
pacman -S ttf-font-awesome
Далее в гугл идем “font awesome cheet sheet” или переходим по ссылке
Копируем в буфер и вставляем например в
set $ws1 "1: [вставим иконку]Terminal"
Шрифты
pacman -S ttf-ubuntu-font-family
Установим шрифт
font pango:Ubuntu Regular 12
i3 Status bar
mkdir -p ~/.config/i3status
cp /etc/i3status.conf ~/.config/i3status/i3status.conf
chown vik:vik ~/.config/i3status/i3status.conf
Редактируем i3 конфиг, потому что i3 по-умолчанию смотрит на файл /etc/i3status.conf
Перейдем файл ~/.config/i3/config
Директива bar будет иметь такой вид
bar {
status_command i3status
}
И отредактируем ее
bar {
status_command i3status -c /home/vik/.config/i3status/i3status.conf
}
Настройка тем
pacman -S lxappearance
lxappearance
Темы применятся и к файловому менеджеру, например как к Thunar
pacman -S thunar gvfs smbclient
Настройка цветов
Настройки для i3
# Windows Colors
set $bgcolor #00897b
set $ibgcolor #363636
set $textcolor #ffffff
set $itextcolor #969696
set $ubgcolor #ff0000
#️ border background text indicator
client.focused $bgcolor $bgcolor $textcolor $bgcolor
client.unfocused $ibgcolor $ibgcolor $itextcolor $ibgcolor
client.focused_inactive $ibgcolor $ibgcolor $itextcolor $ibgcolor
client.urgent $ubgcolor $ubgcolor $textcolor $ubgcolor
Настройка для бара
bar {
status_command i3status --config ~/.i3status-small.conf
colors {
background $bgcolor
statusline $textcolor
separator #282828
# border background text
focused_workspace $bgcolor $bgcolor $textcolor
active_workspace $bgcolor $bgcolor $textcolor
inactive_workspace $ibgcolor $ibgcolor $itextcolor
urgent_workspace $ubgcolor $ubgcolor $itextcolor
binding_mode $bgcolor $bgcolor $textcolor
}
}
Прозрачный бар
bar {
status_command i3status --config ~/.i3status-small.conf
i3bar_command i3bar --transparency # принимаем входные данные прозачности (что?)
#tray_output none # скрыть трей
font pango:nomospace 11 # задаем отдельный шрифт для бара
colors {
background $bgcolor
statusline $textcolor
separator #282828
# border background text
focused_workspace $bgcolor $bgcolor $textcolor
active_workspace $bgcolor $bgcolor $textcolor
inactive_workspace $ibgcolor $ibgcolor $itextcolor
urgent_workspace $ubgcolor $ubgcolor $itextcolor
binding_mode $bgcolor $bgcolor $textcolor
}
}
All hex value from 100% to 0% alpha:
- 100% — FF
- 99% — FC
- 98% — FA
- 97% — F7
- 96% — F5
- 95% — F2
- 94% — F0
- 93% — ED
- 92% — EB
- 91% — E8
- 90% — E6
- 89% — E3
- 88% — E0
- 87% — DE
- 86% — DB
- 85% — D9
- 84% — D6
- 83% — D4
- 82% — D1
- 81% — CF
- 80% — CC
- 79% — C9
- 78% — C7
- 77% — C4
- 76% — C2
- 75% — BF
- 74% — BD
- 73% — BA
- 72% — B8
- 71% — B5
- 70% — B3
- 69% — B0
- 68% — AD
- 67% — AB
- 66% — A8
- 65% — A6
- 64% — A3
- 63% — A1
- 62% — 9E
- 61% — 9C
- 60% — 99
- 59% — 96
- 58% — 94
- 57% — 91
- 56% — 8F
- 55% — 8C
- 54% — 8A
- 53% — 87
- 52% — 85
- 51% — 82
- 50% — 80
- 49% — 7D
- 48% — 7A
- 47% — 78
- 46% — 75
- 45% — 73
- 44% — 70
- 43% — 6E
- 42% — 6B
- 41% — 69
- 40% — 66
- 39% — 63
- 38% — 61
- 37% — 5E
- 36% — 5C
- 35% — 59
- 34% — 57
- 33% — 54
- 32% — 52
- 31% — 4F
- 30% — 4D
- 29% — 4A
- 28% — 47
- 27% — 45
- 26% — 42
- 25% — 40
- 24% — 3D
- 23% — 3B
- 22% — 38
- 21% — 36
- 20% — 33
- 19% — 30
- 18% — 2E
- 17% — 2B
- 16% — 29
- 15% — 26
- 14% — 24
- 13% — 21
- 12% — 1F
- 11% — 1C
- 10% — 1A
- 9% — 17
- 8% — 14
- 7% — 12
- 6% — 0F
- 5% — 0D
- 4% — 0A
- 3% — 08
- 2% — 05
- 1% — 03
- 0% — 00
Для наших цветов мы добавляем в конец, hex-значения, например
#28282833
То есть мы добавили именно 33 - что означент 20% в hex таблице. Мы дали заданному цвету 20% прозрачности
Тонкая настройка монитора или нескольких мониторов
pacman -S arandr
Запускаем софт, позволяет настроить через GUI мониторы и их разрешение. Сохраняем в виде скрипта ~/.sceenlayout/script.sh
Затем смотрим, что сгенерил софт и можем подставлять эти команды в i3 конфиг
Rofi (запуск приложений)
Rofi - поставляется как альтернатива dmenu, который идет в пакете i3.
pacman -S rofi
Заменяем
bindsym $mod+d exec dmeu_run
на
bindsym $mod+d exec rofi -show run
Позволяет настроить тему
rofi-theme-selector
Alt+A применяет выбранную тему
Так же темы можно скачивать. В гугле пишем rofi themes
Темы можно сохранять и написать самому. Они лежат в /usr/share/rofi/themes
- в эту папку мы кладем файл *.rasi
, который будет применен для Rofi
i3blocks
Блоки позволяют вставлять пользовательские системные скрипты, которые будут более гибкими
То есть в блок можно поставить скрипт, который через API будет собирать инфу и передавать тебе в бар. Например курс валют или что-то еще
Для начала скопируем готовый файл с блоками из /etc/i3blocks.conf
в ~/.config/i3blocks/i3blocks.conf
Возьмем для примера наш конфиг с баром
bar {
status_command i3status --config ~/.i3status-small.conf
tray_output none # скрыть трей
colors {
background $bgcolor
statusline $textcolor
separator #282828
# border background text
focused_workspace $bgcolor $bgcolor $textcolor
active_workspace $bgcolor $bgcolor $textcolor
inactive_workspace $ibgcolor $ibgcolor $itextcolor
urgent_workspace $ubgcolor $ubgcolor $itextcolor
binding_mode $bgcolor $bgcolor $textcolor
}
}
В нем нам можно или нужно убрать i3status, и вместо него будем использовать блоки
bar {
status_command i3blocks --config ~/.config/i3blocks/i3blocks.conf
tray_output none # скрыть трей
colors {
background $bgcolor
statusline $textcolor
separator #282828
# border background text
focused_workspace $bgcolor $bgcolor $textcolor
active_workspace $bgcolor $bgcolor $textcolor
inactive_workspace $ibgcolor $ibgcolor $itextcolor
urgent_workspace $ubgcolor $ubgcolor $itextcolor
binding_mode $bgcolor $bgcolor $textcolor
}
}
Ну и понятное дело, в файле ~/.config/i3blocks/i3blocks.conf
мы описываем каждый из блоков
Последовательность такая.
- пишем скрипт, делаем его исполняемым
- записываем в блок
- по интервалу наш блок будет собирать свежие данные
Для примера возьмем этот блок
mkdir -p ~/.config/scripts
~/.config/scripts/disk
- положим внутрь содержимое файла disk
chmod +x ~/.config/scripts/disk
- сделаем его исполняемым
[disk]
command=~/.config/scripts/disk
LABEL=HOME
#DIR=$HOME
#ALERT_LOW=10
interval=30
Возьмем код блока и положим его в ~/.config/i3blocks/i3blocks.conf
Набор софта для работы с аудио и для блока звука через Pulse Audio
sudo pacman -S pulseaudio-alsa pulsaudio-bluetooth pulseaudio-equalizer pulsaudio-jack alsa-utils
Экран блокировки
sudo pacman -S i3lock-color
Этот пакет имеет больше возможностей кастомизации
Можно сделать вот такой экран блокировки
Возьмем файл lock.sh и положим его содержимое в ~/.config/scripts/lock.sh
Понятное дело, файл должен быть исполняемым
Затем в конфиге i3 поменяем программу для локскрина
bindsym $mod+p exec i3lock
На
bindsym $mod+p exec /home/vik/.config/scripts/lock.sh
Push-уведомления
В i3 нет серврера Push-уведомлений, который бы принимал API запросы и отправлял содержимое на рабочий стол. Без dunst или его аналогов системные пуши работать не будут. Но будут работать только те пуши, которые используют самописные вызовы, например как Telegram.
sudo pacman -S dunst
mkdir -p ~/.config/dunst/dunstrc
cp /etc/dunst/dunstrc ~/.config/dunst/dunstrc
Короткий пример конфига
[global]
monitor = 0
follow = keyboard
padding = 8
horizontal_padding = 8
font = Monospace 12
format = "<b>%a</b>\n<i>%s</i>\n%b"
[shortcuts]
close = ctrl+grave
close_all = ctrl+shift+grave
[urgency_low]
background = "#000000"
foreground = "#008080"
timeout = 0
[urgency_normal]
background = "#000000"
foreground = "#f5f5dc"
timeout = 0
[urgency_critical]
background = "#000000"
foreground = "#ff6347"
timeout = 0
Тачпад
Пример настройки тачпада.
Настроим тачпад при каждом запуске i3
sudo pacman -S xorg-xinput
Смотрим какие есть девайсы в системе
xinput --list
Смотрим какие есть параметры у девайса
xinput list-props "the device name"
Настраиваем параметры, которые включают “Тап-нажатие”
xinput set-prop "SynPS/2 Synaptics TouchPad" "libinput Tapping Enabled" 1
Проверяем, что настройки работают и настроим в i3
# Enable tapping touchpad
exec_always xinput set-prop "SynPS/2 Synaptics TouchPad" "libinput Tapping Enabled" 1
Picom
Это автономный композитор для Xorg. Композиторы нужны для добавления разного рода эффектов, которые применяются для окон, например “сгорание” окна, при его выключении. Но мы его будем использовать для отключения тирринга. Это когда твое изображение разрывается в динамике, когда ты играешь, смотришь видео или скролишь страницу.
Добавим конфиг picom, который позволит избавиться от тиринга и немного преобразит внешний вид i3
Положим файл в ~/.config/i3/picom.conf
# Thank you code_nomad: http://9m.no/ꪯ鵞
# and Arch Wiki contributors: https://wiki.archlinux.org/index.php/Compton
#################################
#
# Backend
#
#################################
# Backend to use: "xrender" or "glx".
# GLX backend is typically much faster but depends on a sane driver.
backend = "glx";
#backend = "xrender"
#################################
#
# GLX backend
#
#################################
glx-no-stencil = true;
# GLX backend: Copy unmodified regions from front buffer instead of redrawing them all.
# My tests with nvidia-drivers show a 10% decrease in performance when the whole screen is modified,
# but a 20% increase when only 1/4 is.
# My tests on nouveau show terrible slowdown.
glx-copy-from-front = false;
# GLX backend: Use MESA_copy_sub_buffer to do partial screen update.
# My tests on nouveau shows a 200% performance boost when only 1/4 of the screen is updated.
# May break VSync and is not available on some drivers.
# Overrides --glx-copy-from-front.
# glx-use-copysubbuffermesa = true;
# GLX backend: Avoid rebinding pixmap on window damage.
# Probably could improve performance on rapid window content changes, but is known to break things on some drivers (LLVMpipe).
# Recommended if it works.
glx-no-rebind-pixmap = true;
# GLX backend: GLX buffer swap method we assume.
# Could be undefined (0), copy (1), exchange (2), 3-6, or buffer-age (-1).
# undefined is the slowest and the safest, and the default value.
# copy is fastest, but may fail on some drivers,
# 2-6 are gradually slower but safer (6 is still faster than 0).
# Usually, double buffer means 2, triple buffer means 3.
# buffer-age means auto-detect using GLX_EXT_buffer_age, supported by some drivers.
# Useless with --glx-use-copysubbuffermesa.
# Partially breaks --resize-damage.
# Defaults to undefined.
#glx-swap-method = "undefined";
#################################
#
# Shadows
#
#################################
# Enabled client-side shadows on windows.
shadow = true;
# The blur radius for shadows. (default 12)
shadow-radius = 9;
# The left offset for shadows. (default -15)
shadow-offset-x = -9.5;
# The top offset for shadows. (default -15)
shadow-offset-y = -9;
# The translucency for shadows. (default .75)
shadow-opacity = 1;
log-level = "warn";
#change your username here
#log-file = "/home/erik/.config/compton.log";
# Set if you want different colour shadows
# shadow-red = 0.0;
# shadow-green = 0.0;
# shadow-blue = 0.0;
# The shadow exclude options are helpful if you have shadows enabled. Due to the way compton draws its shadows, certain applications will have visual glitches
# (most applications are fine, only apps that do weird things with xshapes or argb are affected).
# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher.
shadow-exclude = [
"! name~=''",
"name = 'Notification'",
"name = 'Plank'",
"name = 'Docky'",
"name = 'Kupfer'",
"name = 'xfce4-notifyd'",
"name *= 'VLC'",
"name *= 'compton'",
"class_g = 'Firefox' && argb",
"class_g = 'Conky'",
"class_g = 'Kupfer'",
"class_g = 'Synapse'",
"class_g ?= 'Notify-osd'",
"class_g ?= 'Cairo-dock'",
"class_g = 'Cairo-clock'",
"class_g ?= 'Xfce4-notifyd'",
"class_g ?= 'Xfce4-power-manager'",
"_GTK_FRAME_EXTENTS@:c",
"_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
];
# Avoid drawing shadow on all shaped windows (see also: --detect-rounded-corners)
shadow-ignore-shaped = false;
#################################
#
# Opacity
#
#################################
inactive-opacity = 1;
active-opacity = 1;
frame-opacity = 1;
inactive-opacity-override = false;
# Dim inactive windows. (0.0 - 1.0)
# inactive-dim = 0.2;
# Do not let dimness adjust based on window opacity.
# inactive-dim-fixed = true;
# Blur background of transparent windows. Bad performance with X Render backend. GLX backend is preferred.
# blur-background = true;
# Blur background of opaque windows with transparent frames as well.
# blur-background-frame = true;
# Do not let blur radius adjust based on window opacity.
blur-background-fixed = false;
blur-background-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'",
"_GTK_FRAME_EXTENTS@:c"
];
#################################
#
# Fading
#
#################################
# Fade windows during opacity changes.
fading = true;
# The time between steps in a fade in milliseconds. (default 10).
fade-delta = 5;
# Opacity change between steps while fading in. (default 0.028).
fade-in-step = 0.03;
# Opacity change between steps while fading out. (default 0.03).
fade-out-step = 0.03;
# Fade windows in/out when opening/closing
# no-fading-openclose = true;
# Specify a list of conditions of windows that should not be faded.
fade-exclude = [ ];
#################################
#
# Other
#
#################################
# Try to detect WM windows and mark them as active.
mark-wmwin-focused = true;
# Mark all non-WM but override-redirect windows active (e.g. menus).
mark-ovredir-focused = true;
# Use EWMH _NET_WM_ACTIVE_WINDOW to determine which window is focused instead of using FocusIn/Out events.
# Usually more reliable but depends on a EWMH-compliant WM.
use-ewmh-active-win = true;
# Detect rounded corners and treat them as rectangular when --shadow-ignore-shaped is on.
detect-rounded-corners = false;
# Detect _NET_WM_OPACITY on client windows, useful for window managers not passing _NET_WM_OPACITY of client windows to frame windows.
# This prevents opacity being ignored for some apps.
# For example without this enabled my xfce4-notifyd is 100% opacity no matter what.
detect-client-opacity = true;
# Specify refresh rate of the screen.
# If not specified or 0, compton will try detecting this with X RandR extension.
#refresh-rate = 48;
# Vertical synchronization: match the refresh rate of the monitor
# this breaks transparency in virtualbox - put a "#" before next line to fix that
vsync = true;
# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing.
# Reported to have no effect, though.
dbe = true;
# Limit compton to repaint at most once every 1 / refresh_rate second to boost performance.
# This should not be used with --vsync drm/opengl/opengl-oml as they essentially does --sw-opti's job already,
# unless you wish to specify a lower refresh rate than the actual value.
#sw-opti = true;
# Unredirect all windows if a full-screen opaque window is detected, to maximize performance for full-screen windows, like games.
# Known to cause flickering when redirecting/unredirecting windows.
unredir-if-possible = false;
# Specify a list of conditions of windows that should always be considered focused.
focus-exclude = [ ];
# Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused at the same time.
detect-transient = true;
# Use WM_CLIENT_LEADER to group windows, and consider windows in the same group focused at the same time.
# WM_TRANSIENT_FOR has higher priority if --detect-transient is enabled, too.
detect-client-leader = true;
#################################
#
# Window type settings
#
#################################
wintypes:
{
tooltip = { fade = true; shadow = true; opacity = 0.9; focus = true;};
dock = { shadow = true; }
dnd = { shadow = false; }
popup_menu = { opacity = 1; }
dropdown_menu = { opacity = 1; }
};
######################
#
# XSync
# See: https://github.com/yshui/compton/commit/b18d46bcbdc35a3b5620d817dd46fbc76485c20d
#
######################
# Use X Sync fence to sync clients' draw calls. Needed on nvidia-drivers with GLX backend for some users.
xrender-sync-fence = true;
А так же, нужно будет добавить в конфиг i3
exec_always --no-startup-id picom --config ~/.config/i3/picom.conf
Заключение
Считаю, что этого достаточно для того, чтобы разобраться с i3 и сделать свою сборку, а затем поделиться ей с сообществом.
Анонсы и еще больше информации в Telegram-канале