Window manager i3
Менеджер окон i3.
Содержание
1 Общая информация
- Тайловый менеджер окон.
 - https://i3wm.org/
 
2 Репозиторий конфигурации
- Я сделал репозиторий со своей конфигурацией: https://github.com/yamadharma/config-i3
 
3 Файл конфигурации
- Файлы конфигурации просматриваются в следующем порядке:
$XDG_CONFIG_HOME/i3/config(~/.config/i3/config);~/.i3/config;$XDG_CONFIG_DIRS/i3/config(/etc/xdg/i3/config);/etc/i3/config.
 - Начиная с версии 4.20, можно подключать другие файлы конфигурации из основного файла конфигурации i3.
- Примеры использования директивы 
include:# Тильда преобразуется в домашний каталог пользователя include ~/.config/i3/assignments.conf # Переменные среды разыменовываются include $HOME/.config/i3/assignments.conf # Символы подстановки раскрываются include ~/.config/i3/config.d/*.conf # Можно выполнять команду include ~/.config/i3/`hostname`.conf # Каждый путь загружается только один раз include ~/.config/i3/config # Относительные пути интерпретируются относительно каталога конфигурационного файла include assignments.conf 
 - Примеры использования директивы 
 
4 Навигация
4.1 Клавиша-модификатор
- В качестве модификатора обычно используется:
Alt:set $mod Mod1Super(Клавиша со значком Windows):set $mod Mod4- Предпочитаю 
Super, чтобы не конфликтовать с Emacs. 
 
4.2 Основные комбинации клавиш
Mod+Enter: открыть терминал.
4.3 Перемещение фокуса
- Фокус можно перемещать как с помощью стрелок, так и с помощью буквенных клавиш, как в редакторе vi.
Mod+hилиMod+Left: сдвиг фокуса влево.Mod+jилиMod+Down: сдвиг фокуса вниз.Mod+kилиMod+Up: сдвиг фокуса вверх.Mod+lилиMod+Right: сдвиг фокуса вправо.
 - Конфигурация выглядит следующим образом:
## Home row direction keys, like vim set $left h set $down j set $up k set $right l ## Move your focus around bindsym $mod+$left focus left bindsym $mod+$down focus down bindsym $mod+$up focus up bindsym $mod+$right focus right ## Or use $mod+[up|down|left|right] bindsym $mod+Left focus left bindsym $mod+Down focus down bindsym $mod+Up focus up bindsym $mod+Right focus right - Впрочем, следует заметить, что также могут использоваться и другие соглашения:
j: влево;k: вниз;l: вверх;;: вправо.
 - Поскольку в данном менеджере окон поддерживаются контейнеры, то можно переключить фокус на родительский контейнер:
Mod+a: переключить фокус на родительский контейнер.- Конфигурация:
## Move focus to the parent container bindsym $mod+a focus parent 
 Mod+Space: переключить режим фокуса.
4.4 Перемещение окон
- Делается аналогично перемещению фокуса, но с добавлением модификатора 
Shift:Mod+Shift+hилиMod+Shift+Left: перемещение влево;Mod+Shift+jилиMod+Shift+Down: перемещение вниз;Mod+Shift+kилиMod+Shift+Up: перемещение вверх;Mod+Shift+lилиMod+Shift+Right: перемещение вправо.
 - Конфигурация выглядит следующим образом:
## Move the focused window with the same, but add Shift bindsym $mod+Shift+$left move left bindsym $mod+Shift+$down move down bindsym $mod+Shift+$up move up bindsym $mod+Shift+$right move right ## Ditto, with arrow keys bindsym $mod+Shift+Left move left bindsym $mod+Shift+Down move down bindsym $mod+Shift+Up move up bindsym $mod+Shift+Right move right 
4.5 Modifying windows
Mod+ f toggle fullscreenMod+ v split a window verticallyMod+ h split a window horizontallyMod+ r resize mode
4.6 Структура расположения контейнеров
- Поддерживаются следующие расположения контейнеров:
Mod+e: переключение разделённого расположения (split layout);Mod+s: стековое размещение (stacking layout);Mod+w: размещение с табами (tabbed layout).
 - Конфигурация:
## Switch the current container between different layout styles bindsym $mod+s layout stacking bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split - Для раскладки по умолчанию я использую табы:
### Layout mode for new containers ## default|stacking|tabbed workspace_layout tabbed 
4.7 Floating
Mod+ Shift + Space toggle floatingMod+ Left click drag floating
4.8 Рабочие области (workspaces)
- Сконфигурим рабочие области:
## Define names for workspaces set $ws1 1 set $ws2 2 set $ws3 3 set $ws4 4 set $ws5 5 set $ws6 6 set $ws7 7 set $ws8 8 set $ws9 9 set $ws10 10 Mod+0–9: переключиться на соответствующую рабочую область:## Switch to workspace bindsym $mod+1 workspace $ws1 bindsym $mod+2 workspace $ws2 bindsym $mod+3 workspace $ws3 bindsym $mod+4 workspace $ws4 bindsym $mod+5 workspace $ws5 bindsym $mod+6 workspace $ws6 bindsym $mod+7 workspace $ws7 bindsym $mod+8 workspace $ws8 bindsym $mod+9 workspace $ws9 bindsym $mod+0 workspace $ws10Mod+Shift+0–9: перенести окно на соответствующую рабочую область:## Move focused container to workspace bindsym $mod+Shift+1 move container to workspace $ws1 bindsym $mod+Shift+2 move container to workspace $ws2 bindsym $mod+Shift+3 move container to workspace $ws3 bindsym $mod+Shift+4 move container to workspace $ws4 bindsym $mod+Shift+5 move container to workspace $ws5 bindsym $mod+Shift+6 move container to workspace $ws6 bindsym $mod+Shift+7 move container to workspace $ws7 bindsym $mod+Shift+8 move container to workspace $ws8 bindsym $mod+Shift+9 move container to workspace $ws9 bindsym $mod+Shift+0 move container to workspace $ws10
4.9 Opening applications / Closing windows
Mod+ d open application launcher (dmenu)Mod+ Shift + q kill a window
4.10 Выход/Перезапуск
Mod+Shift+c: перечитать конфигурационный файл.## ~/.config/i3/config ## reload the configuration file bindsym $mod+Shift+c reloadMod+Shift+r: перестартовать i3, сохранив сессию.## ~/.config/i3/config ## restart i3 inplace (preserves your layout/session, can be used to upgrade i3) bindsym $mod+Shift+r restartMod+Shift+e: выход из i3.## ~/.config/i3/config ## exit i3 (logs you out of your X session) bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
5 Настройка
5.1 Терминал
В качестве терминала я использую kitty.
Конфигурация запуска терминала:
set $term kitty bindsym $mod+Return exec $term- В этом случае запускается одно окно терминала.
 
Для работы я использую специальную настройку сессии терминала. Я её запускаю при входе в сессию. Для этого я приспособил комбинацию
Mod+Shift+Enter:bindsym $mod+Shift+Return exec kitty --session ~/.config/kitty/startup
5.2 Управление окном с помощью мышки
Можно управлять окнами с помощью мышки.
Привязка осуществляется следующей командой:
bindsym [--release] [--border] [--whole-window] [--exclude-titlebar] [<Modifiers>+]button<n> command- По умолчанию привязка запускается только при нажатии на строку заголовка окна.
 - Если указан флаг 
--release, он запустится, когда кнопка мыши будет отпущена. - Если указан флаг 
--whole-window, то привязка также будет выполняться при щелчке по любой части окна, за исключением границы. - Чтобы привязка выполнялась при щелчке границы, нужно указать флаг 
--border. - Если задан флаг 
--exclude-titlebar, заголовок не будет учитываться для привязки клавиш. 
Примеры.
- Средняя кнопка на заголовке закрывает окно:
bindsym --release button2 kill - Средняя кнопка и модификатор над любой частью окна закрывает окно:
bindsym --whole-window $mod+button2 kill - Правая кнопка мыши переключает плавающий режим:
bindsym button3 floating toggle bindsym $mod+button3 floating toggle - Боковые кнопки мыши перемещают окно:
bindsym button9 move left bindsym button8 move right 
- Средняя кнопка на заголовке закрывает окно:
 
5.3 Строка статуса
5.3.1 i3bar
- Отрисовку панели осуществляет утилита 
i3bar. - Отображается вверху или внизу экрана.
 - Содержит:
- область с кнопками переключения рабочих областей i3;
 - системную строку, генерируемую при помощи 
i3statusили аналогов; - системный трей с иконками программ.
 
 - В конфигурационном файле задаётся следующим образом (https://i3wm.org/docs/userguide.html#_configuring_i3bar):
# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start i3bar to display a workspace bar bar { status_command i3status position top } 
Поддержка иконок в i3bar
- В 
i3barможно использовать шрифты иконок (см. Моноширинные шрифты). - Наиболее распространённым является шрифт Font Awesome.
 - Установка:
- Gentoo
emerge media-fonts/fontawesome 
 - Gentoo
 - Для вставки шрифта в файл можно использовать список кодов для иконок https://fontawesome.com/cheatsheet.
 - Шрифт лучше явно обозначить в конфигурации:
## ~/.config/i3/config bar { … font pango:Source Sans Pro, FontAwesome 5 Free 10 … } - Для набора символа по его коду следует использовать конфигурации клавиш. Например, для набора символа с кодом 
0xf004, требуется набрать:- приложения на основе GTK: 
Ctrl+Shift+u,f004,Enter; - emacs: 
Ctrl+x,8,Enter,f004,Enter; - vim: 
Ctrl+v,uf004; - urxvt: удерживая 
Ctrl+Shift, наберитеf004. 
 - приложения на основе GTK: 
 
- В 
 
i3status
- Использовано https://igancev.ru/2020-05-11-configuring-i3status-in-i3wm.
 i3statusгенерирует строку состояния дляi3bar.- Содержит встроенные модули:
- IPv6 — получает и выводит IPv6 адрес.
 - Disk — отображает информацию о занятом и свободном месте в файловой системе.
 - Run-watch — мониторинг определённого процесса в системе.
 - Path-exists — проверяет на существование путь в файловой системе.
 - Wireless — позволяет выводить подключения к WIFI сети, уровень сигнала, имя точки доступа.
 - Ethernet — предоставляет IP адрес и скорость соединения сетевого интерфейса.
 - Battery — показ уровня заряда батареи.
 - CPU-Temperature — показ температуры процессора.
 - CPU Usage — использование процессора в процентах.
 - Memory — использование оперативной памяти.
 - Load — среднее значение загрузки системы за 1, 5 и 15 минут (Load Overage).
 - Time — время в текущей временной зоне.
 - TzTime — время в заданной временной зоне.
 - DDate — дата.
 - Volume — управление громкостью звука.
 - File Contents — вывод содержимого указанного файла.
 
 - Модули в строке можно переиспользовать по нескольку раз, управляя порядком вывода.
 - Конфигурацию условно можно разделить на 3 части:
- блок 
general— содержит общие параметры; - переменная 
order— в неё записывается порядок вывода интересующих модулей; - блоки конфигурации модулей — непосредственно настройки самих блоков с метриками.
 
 - блок 
 - В конфигурации i3bar задаётся конфигурационный файл для i3status:
# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start i3bar to display a workspace bar bar { font pango:Source Sans Pro, FontAwesome 5 Free 10 status_command i3status --config ~/.config/i3/i3status/config position top } - Структура информационной панели задаётся в конфигурационном файле:
### -*- mode: conf-unix; -*- ## ~/.config/i3/i3status/config general { colors = true # включение/выключение поддержки цветов true/false interval = 1 # интервал обновления строки статуса, в секундах output_format = "i3bar" # формат вывода, устанавливаем i3bar (JSON) } # порядок вывода модулей order += "run_watch openvpn" order += "run_watch openconnect" order += "volume master" order += "wireless _first_" order += "battery all" order += "disk /" order += "memory" order += "cpu_usage" order += "cpu_temperature 0" order += "tztime local" # отслеживание процесса openvpn # служит как индикатор работы openvpn клиента # при запуске openvpn необходимо # указывать параметр --writepid /var/run/openvpn.pid run_watch openvpn { pidfile = "/var/run/openvpn.pid" format = " openvpn" # если пареметр format_down оставить пустым, # то при неактивном процессе блок будет отсутствовать format_down="" } # аналогичный блок индикатор openconnect vpn клиента # требуется запуск клиента с параметром --pid-file=/var/run/openconnect.pid run_watch openconnect { pidfile = "/var/run/openconnect.pid" format = " openconnect vpn" format_down="" } # управление громкостью звука volume master { format = " %volume" # шаблон громкости в активном состоянии format_muted = " %volume" # шаблон громкости в состоянии muted (без звука) device = "default" mixer = "Master" mixer_idx = 0 } # индикатор WIFI wireless _first_ { # шаблон вывода, можно дополнить # наименованием подключения %essid # и ip адресом %ip format_up = "%quality %frequency" format_down = "" } # состояние заряда батареи battery all { # шаблон вывода, можно дополнить # оставшимся временем работы %emptytime # энергопотреблением %consumption в ваттах format = "%status %percentage" # true - показ процента заряда от 0 до 100 # false - показ процента заряда от 0 до n, с учетом # изношенности аккумулятора last_full_capacity = true format_down = "" status_chr = "" # статус подзарядки status_bat = "" # статус в режиме работы от батареи status_unk = "? UNK" # неизвестный статус status_full = "" # статус полного заряда path = "/sys/class/power_supply/BAT%d/uevent" # нижний порог заряда, после которого блок # будет окрашен в "color_bad" (по умолчанию красный) # подробнее в man i3status low_threshold = 10 } # отслеживаемый накопитель disk "/" { # доступные переменные: # %used, %percentage_used - занятое пространство # %free, %percentage_free - свободное пространство # %avail, %percentage_avail - доступное пространство # %total - всего format = " %avail" # будет окрашен в "color_bad" (по умолчанию красный) # при достижении нижнего порога менее 10GB доступного пространства low_threshold = "10" threshold_type = "gbytes_avail" format_below_threshold = " Warning: %avail" } # миниторинг оперативной памяти memory { # доступные переменные: # %total, percentage_total # %used, percentage_used # %free, percentage_free # %available, percentage_available # %shared, percentage_shared format = " %used" # порог, при котором вывод окрасится в # желтый (degraded) или красный (critical) # а формат вывода изменится на format_degraded threshold_degraded = "1G" threshold_critical = "200M" format_degraded = "MEMORY < %available" } # температура процессора cpu_temperature 0 { format = " %degrees" # верхний порог температуры, при достижении которого # вывод окрасится красным, # и формат изменится на format_above_threshold max_threshold = "80" format_above_threshold = " %degrees" path = "/sys/class/thermal/thermal_zone0/temp" } # использование центрального процессора cpu_usage { # %usage - процентное использование ЦП # %cpu<N> - начиная с %cpu0 и далее показывает использование ядер format = " %usage" # доступны параметры: # degraded_threshold, окрас в желтый, по умолчанию 90 # max_threshold, окрас в красный, по умолчанию 95 # и кастомные форматы для них # format_above_degraded_threshold и format_above_threshold } # вывод даты и времени по заданному формату tztime local { format = " %d %b %Y  %H:%M:%S" } 
5.3.2 py3status
py3status— это расширяемая оболочка дляi3status, написанная на python.- Сайт: https://py3status.readthedocs.io/.
 - Репозиторий: https://github.com/ultrabug/py3status.
 - Можно управлять 
i3bar:- используя один из доступных модулей, поставляемых с 
py3status; - группировать несколько модулей и автоматически или вручную циклически отображать их отображение;
 - писать свои собственные модули и отображать их вывод на панели;
 - обрабатывать события кликов на 
i3bar. 
 - используя один из доступных модулей, поставляемых с 
 - Отображается вверху или внизу экрана.
 - Содержит:
- область с кнопками переключения рабочих областей i3;
 - системную строку;
 - системный трей с иконками программ.
 
 
Запуск py3status
- Запускается вместо 
i3bar:# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start py3status to display a workspace bar bar { font pango:Iosevka Nerd Font 12 status_command py3status position top } - Использует конфигурационный файл от 
i3statusили собственную конфигурацию. - Порядок поиска конфигурационного файла:
$XDG_CONFIG_HOME/py3status/config;$XDG_CONFIG_HOME/i3status/config;$XDG_CONFIG_HOME/i3/i3status.conf;~/.i3status.conf;~/.i3/i3status.conf;$XDG_CONFIG_DIRS/i3status/config;/etc/i3status.conf.
 
- Запускается вместо 
 
5.3.3 polybar
Отдельное приложение для строки статуса.
Применяется для замены i3bar.
Темы для polybar: https://github.com/adi1090x/polybar-themes
Одним из побудительных мотивов установки polybar может быть то, что здесь можно без проблем настроить индикатор раскладки клавиатуры.
Установка
- Gentoo:
USE="i3wm" emerge x11-misc/polybar 
- Gentoo:
 Конфигурационный файл:
- стандартное расположение: 
~/.config/polybar/config($XDG_CONFIG_HOME/polybar/config); - использую для локальных настроек только для i3: 
~/.config/i3/polybar/config. 
- стандартное расположение: 
 
Скрипт запуска
- Создадим скрипт запуска 
polybar.#!/bin/bash # ~/.config/i3/polybar/launch.sh # Terminate already running bar instances killall -q polybar # If all your bars have ipc enabled, you can also use # polybar-msg cmd quit # Wait until the processes have been shut down while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done # Launch Polybar, using config location ~/.config/i3/polybar/config polybar --config=~/.config/i3/polybar/config i3 & echo "Polybar launched..." - Установим права на исполнение:
chmod +x ~/.config/i3/polybar/launch.sh - Добавим вызов 
polybarв файл конфигурации i3. Конфигурацию для i3bar следует закомментировать.## ~/.config/i3/config ## Start i3bar to display a workspace bar # bar { # font pango:Source Sans Pro, FontAwesome 5 Free 10 # status_command i3status --config ~/.config/i3/i3status/config # position top # } ## Start polybar exec_always --no-startup-id ~/.config/i3/polybar/launch.sh 
- Создадим скрипт запуска 
 
5.4 Запуск приложений
- По умолчанию используется 
dmenu. - Можно заменить на 
rofi(см. Запуск приложений. Rofi). 
5.4.1 rofi
- Используется для запуска приложений, переключения окон.
 - https://github.com/davatorium/rofi
 - Конфигурация по умолчанию находится в 
~/.config/rofi/config. - Для выбора темы можно использовать команду:
rofi-theme-selector - Для запуска программ используется несколько мод:
run: запускать приложения из пути ($PATH) с возможностью запуска в терминале.drun: запускать приложения на основе desctop-файлов (по стандарту XDG).window: переключение между окнами в оконном менеджере, совместимом со спецификацией EWMH.ssh: подключение к удаленному хосту черезssh.file-browser: базовый файловый броузер для открытия файлов.keys: список внутренних привязок клавиш.script: использование простых скриптов.combi: объединяет несколько мод в одну.
 - Использование запятых в файле настроек i3 может привести к проблемам. Лучше использовать файл настроек rofi или замените запятые символом 
#, например, заменить строкунаrofi -combi-modi window,drun,sshrofi -combi-modi window#drun#ssh - Возможная конфигурация в командной строке команды 
rofi:## ~/.config/i3/config set $menu rofi -combi-modi window#drun -show combi -modi combi -show-icons - Конфигурация с помощью конфигурационного файла (поместим его в 
~/.config/i3/rofi/config). 
5.5 Блокировка экрана
Для отключения экрана можно использовать DPMS:
exec --no-startup-id xset dpms 1800- Отключается через 30 минут.
 
5.5.1 Блокировщик экрана i3lock
В качестве блокировщика экрана используем
i3lock.- Установка
- Gentoo
emerge x11-misc/i3lock 
 - Gentoo
 
- Установка
 Использование в конфигурационном файле:
set $Locker i3lock --color=000000 && sleep 1sleep 1добавляет небольшую задержку, чтобы предотвратить возможное состояние гонки.
Для блокировки экрана после заданного периода времени можно использовать
xautolockилиxss-lock.Использование
xautolock.Установка
- Gentoo
emerge x11-misc/xautolock 
- Gentoo
 Использование в конфигурационном файле:
exec --no-startup-id xautolock -time 10 -locker "$Locker"- Блокирует через 10 минут.
 
Использование
xss-lock.Установка
- Gentoo
emerge x11-misc/xss-lock 
- Gentoo
 Использование в конфигурационном файле:
exec --no-startup-id xss-lock -- "$Locker"
5.5.2 Блокировщик экрана i3lock-color
- Репозиторий: https://github.com/Raymo111/i3lock-color
 
Дополнительные возможности в i3lock-color
- Дополнительное управление цветом элементов.
 - Размытие текущего экрана и использование его в качестве фона блокировки.
 - Отображение часов в индикаторе.
 - Обновление по таймеру, а не при каждом нажатии клавиши.
 - Отображение раскладки клавиатуры.
 
Установка
- Gentoo
- Порт находится в оверлее 
guru:emerge x11-misc/i3lock-color 
 - Порт находится в оверлее 
 
- Gentoo
 
6 Приложения
6.1 Снимки экрана
Для скриншотов можно использовать scrot.
- Gentoo
emerge media-gfx/scrot 
- Gentoo
 Добавим в конфигурационный файл:
## Screenshot ## Screenshot active display bindsym --release Print exec --no-startup-id scrot '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null' ## Screenshot current window bindsym --release $mod+Print exec --no-startup-id scrot -u '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null' ## Screenshot selected region bindsym --release $mod+Shift+Print exec --no-startup-id scrot -s '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null'- По клавише 
PrtScrделается скриншот. - По клавише 
mod+PrtScrделается скриншот активного окна. - По клавише 
mod+Shift+PrtScrпредлагается выделить область экрана, скриншот которой следует сделать. - Скриншоты переносятся в каталог $XDG_PICTURES_DIR (обычно 
~/Picturesили~/Изображения) (см. XDG. Пользовательские каталоги). 
- По клавише 
 
7 Совместимость приложений
7.1 Java
7.1.1 Серое окно, приложения не меняют размер с помощью WM, меню сразу закрываются
- В стандартных тулкитах для Java жестко зашит список оконных менеджеров.
 - Следует установить переменную окружения:
export _JAVA_AWT_WM_NONREPARENTING=1 
7.1.2 Меню в приложениях плавает отдельно, им невозможно пользоваться
- В выпусках Java до версии 9 GTK интерфейс ориентирован на GTK2, в последующих версиях на GTK3.
 - GTK LookAndFeel может работать с GTK версий 2, 2.2 и 3.
 - По умолчанию используется GTK3.
 - Следует явно задать более старую версию:
export JAVA_TOOL_OPTIONS='-Djdk.gtk.version=2.2'