Привет, Хабр! Сегодня я хотел бы рассказать вам о моём переезде на Linux под управлением оконного менеджера I3-wm. Попробую немного раскрыть тему настройки оконного менеджера и поделюсь своим опытом. Надеюсь кому-то будет полезно получить такого рода информацию.
P.s если вы не новичок, то вряд ли узнаете много нового, но благодарю за внимание!
Итак! Данная программа была разработана в целях бэкапа конфигурации системы, которую я использую каждый день - Manjaro I3. Я приготовил 3 конфигурации оконного менеджера I3-wm для систем: Manjaro, Solus и Fedora, так как они наиболее популярны на мой взгляд. Я использовал каждый из представленных дистрибутивов и временами меняю свой основной дистрибутив на один из них.
Я пользуюсь Linux с 18 февраля 2019 года, но летом 2020 я начал использовать Linux как основную систему (на тот момент ещё Ubuntu 20.04 LTS).
Что меня привело к Linux
Как я уже писал выше, до 2019 года я использовал операционную систему Windows, но в один момент мне захотелось преобразить её и моя затея сильно затянулась, т.к оформление, которое я надумал, требовало большой работы над Windows 10 и некоторые нужные мне задачи реализовались не так удобно и практично, как могли бы. По этому, я решил попробовать что-то новое и открыл для себя Linux, а именно дистрибутив KDE Neon. Я быстро настроил внешний вид системы и решил попробовать использовать её для своих нужд (программирование, серфинг в интернете, игры).
Немного разобравшись в теме Linux я открыл для себя терминал, и то как нужно его применять и был приятно удивлен его возможностями по сравнению с командной строкой Windows. Стало удобнее обращаться с системой, я мог быстрее реализовать нужные мне задачи. Да и в целом, система была чуть менее требовательна к ресурсам ПК, нежели Windows 10.
Мне очень понравилось так взаимодействовать с системой, и с тех пор я использую Linux, как основную ОС на своем домашнем ПК. В процессе изучения, как и все, сменил много дистрибутивов и через время остановился на Manjaro.
Как зарождался мой проект
В августе 2021 года мне стали интересны тайловые оконные менеджеры, и почему некоторые люди предпочитают их стековым оконным менеджерам. Поразмыслив на эту тему, я решил посмотреть, что в них такого интересного и установил I3-wm на мой дистрибутив. С тех пор я заинтересовался возможными конфигурациями таких систем под управлением I3, так же мне очень понравилось то, что теперь системе нужно намного меньше ресурсов в отличие от Windows 10, которая требует 4гб ОЗУ для нормальной работы с ней.
Вкратце про оконные менеджеры
Оконные менеджеры бывают двух видов:
Стековые - это оконные менеджеры, с плавающими окнами как на OS X или Windows. Самый простой случай, когда это просто обычные окна, которые можно расположить по оси Z (Окна перекрывают друг друга).
Тайловые – разбивают оконное пространство. “Тайловые” в переводе “Мозаичные”, то есть приложения занимают экранное пространство так, как будто оно разбито на “мозаику” из неперекрывающихся областей, окон или фреймов. Главный плюс тайловых оконных менеджеров в скорости работы с ними, невероятной легковесности и гибкой настройке под нужды пользователя.
Так я начал изучать тайловый оконный менеджер I3-wm. Я экспериментировал с его конфигурациями, собрав свою собственную. Через некоторое время я понял, что мне нужен бэкап моей системы, я сохранил мою конфигурацию и все нужные файлы на мой github, чтобы в случае сбоя системы, при очередных экспериментах, я мог быстро восстановить старую сборку.
Ещё через некоторое время я понял, что не стоит ограничиваться одной системой, и написал конфигурации под все дистрибутивы, которые использовал или когда-нибудь буду использовать, чтобы если я решу перейти на тот или иной дистрибутив, я мог бы как всегда применить свой конфиг I3-wm. Таким образом, я написал все нужные мне конфигурации и решил обернуть их в небольшую утилиту, которая мне поможет их автоматически установить, опять же ради экономии времени (иначе пришлось бы вручную переносить все файлы в конфиг системы). Спустя некоторое время, методом проб и ошибок, я написал эту утилиту.
Так же я надеюсь, что моя работа поможет новичкам, изучающим I3, быстрее и лучше разобраться в настройке своей системы.
Как работает программа
Клонировать репозиторий:
git clone https://github.com/Avdushin/GOAPPLE
Перейти в репозиторий:
cd GOAPPLE
Запустить утилиту:
./goapple
или./goapple -ru для запуска русифицированной версии
При запуске программы вы видите главное меню:
DISTROS - открывает меню выбора дистрибутивов
В этом пункте нужно выбрать ваш дистрибутив, нажав нужную кнопку, и программа начнет устанавливать все необходимые компоненты и файлы на ваш ПК. После будет проведена перезагрузка системы.
MYOS - выводит информацию о системе
SETTINGS - открывает настройки утилиты (можно выбрать язык)
Что я использовал для написания программы
Изначально, я решил писать проект на bash, так как подумал что было бы интересно реализовать на нем эту затею (первые версии программы были написаны на bash). Но потом, я решил поработать над интерфейсом, и тут мне на помощь пришёл Python, т.к я понимал как можно реализовать на нём поставленные мной задачи, но через время я решил что python не так эффективен для моей программы и переписал её на GO.
Проект на python (неактуально) - https://github.com/Avdushin/PIN3APPLE
Проект на GO (актуальная версия) - https://github.com/Avdushin/GOAPPLE
Для реализации программы я использовал библиотеки GO:
"os/exec"
- для запуска команд
"github.com/mbndr/figlet4go"
- для вывода логотипа
"flag"
- для запуска с помощью флагов (-ru, -h)
Код проекта:
GOAPPLE-CLI - консольная версия
GOAPPLE-GUI - графическая версия
Можно заметить, что код простой, но при этом он выполняет поставленную задачу.
Как настраивается конфигурационный файл I3
Конфигурация I3 настраивается с помощью всего одного конфигурационного файла, он находится в ~/.config/i3/config
"~" - домашняя директория пользователя
В начале конфига назначается клавиша $MOD - главная клавиша в системе, с помощью которой можно управлять окнами, запуском приложений и другими действиями в системе.
Далее я настроил раскладку клавиатуры:
exec --no-startup-id setxkbmap -model pc105 -layout us,ru -variant -option grp:alt_shift_toggle
русский, английский языки и переключение раскладки на alt+shift
Настройка мониторов (экрана)
Настройка рабочих столов для нескольких мониторов:
exec --no-startup-id xrandr --output HDMI-0 --left-of DP-1-1 --auto
set $firstMonitor HDMI-0
set $secondMonitor DP-1-1
# Выбор монитора рабочих для мест
workspace 1 output $firstMonitor
...
workspace 6 output $secondMonitor
...
P.s если у вас один монитор, всё автоматически будет подстроено под него.
Настройка перемещения окон и смены переключения на рабочее место
# перемещение на рабочие места
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
...
# перемещение выделенных окон на рабочее место
bindsym $mod+Shift+1 move container to workspace 1; workspace 1
bindsym $mod+Shift+2 move container to workspace 2; workspace 2
bindsym $mod+Shift+3 move container to workspace 3; workspace 3
...
Старт меню запуска программ
Для меню запуска программ я использую приложение rofi
# старт rofi
bindsym $mod+space exec --no-startup-id rofi -show run -font "Noto Sans 13"
Автостарт программ
Таким образом можно настраивать автоматический старт программ
# Polybar панель
exec_always --no-startup-id ~/.config/polybar/launch.sh &
Запуск программ по горячим клавишам
# запуск терминала kitty
bindsym $mod+Return exec kitty;focus
# сделать скриншот экрана
bindsym Print exec --no-startup-id flameshot gui
Управление плавающими/статичными окнами
# плавающее окно
for_window [class="gcolor3"] floating enable
# статичное окно
for_window [class="Nitrogen"] floating disable
Отступы между окнами
# отступы с помощью I3-gaps
for_window [class="^.*"] border pixel 2
# внутренние отступы
gaps inner 8
# внешние отступы
gaps outer 2
Настройка цвета окна
# Настройка цвета окна
# class обводка фон текст индикатор
client.focused #6790EB #6790EB #e5e5e5 #6790EB
client.unfocused #222222 #222222 #aaaaaa #222222
client.focused_inactive #222222 #222222 #a9a9a9 #222222
client.placeholder #222222 #222222 #aaaaaa #222222
client.urgent #d42121 #d42121 #f7f7f7 #d42121
client.background #242424
Настройка панели POLYBAR
Polybar - это панель, которая расположена у меня в верхней части экрана, она позволяет использовать её встроенные модули или дописывать свои собственные, с помощью простого синтаксиса и программирования.
Конфигурационный файл POLYBAR находится в ~/.config/polybar/config
В конфиге панели я дописал пару тем оформления и несколько модулей (подробнее см. в моём GitHub)
Настройка цветов панели
; Solarized Dark =======
background = #223C43
foreground = #f3f4f5
; ======================
Радиус и отступы
radius = 12
padding-left = 5
padding-right = 5
РАСПОЛОЖЕНИЕ МОДУЛЕЙ
#(Слева, по центру, справа)
modules-left = i3 xwindow
modules-center =
modules-right = cpu2 memory3 volume date xkeyboard2 uptime variety trash wireless-network powermenu
Трей
По умолчанию системный трей в polybar включен, но я не использую его. Чтобы его включить, вам нужно раскомментировать строки:
; комментарий выглядит так ";"
tray-detached = false
tray-offset-x = 0
tray-offset-y = 0
tray-padding = 2
tray-maxsize = 20
tray-scale = 1.0
tray-position = right
tray-background = ${colors.background}
Значки рабочих мест
# ЗНАЧКИ РАБОЧИХ СТОЛОВ
(Иконки используют шрифт Awesome)
ws-icon-0 = 1;
ws-icon-1 = 2;
ws-icon-2 = 3;
ws-icon-3 = 4;
ws-icon-4 = 5;
ws-icon-5 = 6;
ws-icon-6 = 7;
ws-icon-7 = 8;
ws-icon-8 = 9;
ws-icon-9 = 10;
ws-icon-default = ""
Модуль корзины
[module/trash]
type = custom/script
interval = 1
exec = ~/.config/polybar/trash
format-prefix = " "
format-prefix-padding-left = 0
format-prefix-padding-right = 0
format-prefix-foreground = ${colors.foreground}
label-padding = 0
label-foreground = ${colors.foreground}
click-left = rm -rf ~/.local/share/Trash/files/* ;exec notify-send 'Корзина пуста'
format-background =
format-underline = #FF7676
Модуль даты и времени
(По умолчанию я добавил 12-часовой формат, он меняется при клике на модуль на самой панели)
[module/date]
type = internal/date
interval = 1
date = " %d-%m-%Y "
date-alt = " %d-%m-%Y"
time = %l:%M:%S %p
#time = %H:%M:%S
time-alt = %H:%M:%S
format-prefix = " "
format-prefix-foreground = #c1941a
format-underline = #6C6565
format-foreground = ${colors.foreground}
format-background = ${colors.background}
label = %time% | %date%
Выше я продемонстрировал как выглядят модули панели изнутри, вы можете попробовать написать нужные вам модули сами, или поискать их в интернете.
Приглашаю вас на GitHub репозиторий проекта - там вы можете ознакомиться с его кодом/скриптами и посмотреть интересующие вас настройки.
Благодарю за внимание! Надеюсь, я поделился чем-то новым и интересным для вас.