Введение

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. Запускаем приложение и запускаем терминал в 1 рабочем пространстве
  2. В терминале вводим xprop
  3. Курсор станет крестиком, мы должны кликнуть на наше окно, у которого мы хотим узнать класс
  4. После клика, в терминале отобразится вся необходимая инфомрация

Пример, вывода

Мы ищем класс 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
    }
}

Hex значения прозрачности

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-канале