Тайловый оконный менеджер i3
Я хотел бы продолжить начатую вчера JagaJaga тему тайловых оконных менеджеров рассказом об еще одном их представителе — i3wm. В отличие от awesome его настройки записываются в обычном текстовом файле.
Особенности i3wm для пользователя: корректная поддержка нескольких мониторов (смотрите скрин в конце), простой текстовый конфиг-файл, нет необходимости пересобирать wm после изменения настроек, три режима расположения окон, меню запуска приложений dmenu, создает рабочие столы по мере необходимости и удаляет пустые, из коробки имеет отличную информационную панель, показывающую уровень Wi-Fi сети, заряд батареи и много еще чего.
Демонстрация от автора i3
Установка
i3wm представлен в репозиториях Debian, Arch, Gentoo, Ubunto, FreeBSD, NetBSD, OpenBSD, OpenSUSE, Mageia, Fedora и Exerbo. Я буду рассказывать на примере Ubuntu 12.04.
Нужный пакет называется i3, поэтому:
Теперь на экране ввода пользователя и пароля можно выбрать «i3» в качестве оконного менеджера.
Настройка
При первом запуске вам предложат выбрать клавишу-модификатор. Я выбрал win для совместимости с большинством приложений.
Добавим переключение на русскую раскладку по Alt+Shift, автозагрузку dropbox, переключение между рабочими столами по mod+Control+Left/Right, блокировку экрана по mod+Control+l и спящий режим с блокировкой экрана при выходе из него по mod+Control+s.
Переключение раскладки клавиатуры настроено с помощью setxkbmap. Для этого служит
$ setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle"
Чтобы не вводить её каждый раз после перезагрузки, создадим в корневой папке пользователя файл .xsessionrc, сделаем исполняемым и приведем к виду:
#!/bin/sh exec setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle"
#!/bin/sh exec setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle" & dropbox start &
Теперь при следующем заходе в i3wm будут доступны русская и английская клавиатура.
Настройка i3 обычно производится с помощью пользовательского конфига. Создадим папку ~/.i3 и скопируем в нее шаблон конфигурации:
# lock screen bindsym $mod+Control+l exec i3lock # lock screen and suspend bindsym $mod+Control+s exec i3lock && dbus-send --system --print-reply --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Suspend # switch workspaces by mod+ctrl+left/right bindsym $mod+Control+Left workspace prev bindsym $mod+Control+Right workspace next
Использование
Некоторые стандартные горячие клавиши, которые работают по умолчанию:
mod+Enter открывает терминал
mod+d запускает dmenu (меню сверху экрана, которое по мере ввода с клавиатуры названия приложения предлагает варианты для запуска)
mod+Shift+Q закрывает активное окно
mod+v включает режим вертикального тайлинга (экран будет делиться горизонтально)
mod+h включает режим горизонтального тайлинга (экран будет делиться вертикально)
mod+w включает режим вкладок (каждое окно на рабочем столе занимает весь экран, сверху видны вкладки)
mod+s включает стековый режим (заголовки окон один под другим, каждое окно занимает весь экран)
mod+e возвращает стандартный режим
mod+Shift+Space переключает окно в режим плавающего и обратно
mod+Left/Right/Up/Down перемещает фокус в пределах рабочего стола
mod+Shift+Left/Right/Up/Down перемещает текущее окно в пределах рабочего стола
mod+1 и т.д. переключает на рабочий стол с указанным номером
mod+Shift+C читает настройки из файла конфигурации
mod+Shift+E выходит из i3wm на экран ввода имени пользователя и пароля
Полные возможности по настройке и использованию i3wm описаны в документации.
Cheatsheet с горячими клавишами, удобные картинки-подсказки с сайта автора:
Бонус
Если у вас два монитора, или встроенный экран нетбука и внешний монитор, как у меня, то i3wm отлично будет работать на них. Самое главное, что для этого не требуется никаких дополнительных настроек.
Cписок доступных мониторов:
$ xrandr --output LVDS1 --mode 1366x768 --pos 0x0 --output VGA1 --mode 1280x1024 --pos 1366x0
где LVD1 — встроенный в нетбук монитор, его разрешение 1366×768 и он прижат к левому верхнему углу, VGA1 — внешний монитор, его разрешение 1280×1024 и он смещен на 1366 пикселей вправо относительно левого верхнего угла.
Есть результат! Слева встроенный экран нетбука, справа внешний монитор:
Хабражитель burjui поделился ссылкой на видео про i3 с GoogleTechTalks.
Comparison of tiling window managers
This article provides an unbiased comparison of the most popular tiling window managers (as opposed to floating window managers).
Comparison table
The following table lists the most popular tiling window managers alongside notable features, providing readers with a quick overview.
Window Manager | Written in | Configured with | Management style | System tray support | On-the-fly reload | Information bars | Compositing | Default layouts | Pixel usage | External control | Library | Multiple (n) monitor behavior | ICCCM/EWMH compliant | Maintenance |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Awesome | C | Lua | Dynamic | Built-in | Yes | Built-in, images and text | External | max, nh-stack (and invert), nv-stack (and invert), free | Variable borders, optional h-tab titles | dbus (if enabled) | XCB | n-tags (workspaces). Per default 9 are enabled. Example | Yes | Active |
bspwm | C | Anything | Hybrid | None | Yes | Can write internal state to a FIFO | External | v-split, h-split | Variable borders | via bspc | XCB | Monitors hold Desktops | Yes | Active |
dwm | C | C (recompile) | Dynamic | Optional Patch | Optional | Built-in, reads from root window name | External | v-stack, max | via dwmfifo | Xlib | n regions, 9 workspaces fixed to each region | No | Active | |
FrankenWM | C | C (recompile) | Dynamic | None | No | No, outputs information to stdout, which can easily be parsed and displayed by an external monitor or panel (dzen2, conky, etc) | External | v-stack (and invert), h-stack (and invert), dual-v/h-stack, grid, fibonacci (vh-stack), rows, columns, max, free | Variable borders | XCB | No | Active | ||
herbstluftwm | C++ | Anything | Manual | None | Yes | External | vertical, horizontal, grid, max, tabbed | 1-pix borders | commands via herbstclient | Xlib | n regions, 9 workspaces visible in any region | Yes | Active | |
i3 | C | Text | Manual | i3bar | Yes (Layout is preserved) | text piped to i3bar ( i3status / conky and others can be used) | External | tree, v-split, h-split, stacked, tabbed, max, can be nested infinitely | None, 1-pix or 2-pix, optional titlebars, can hide edge borders | commands via ipc (or i3-msg, which uses ipc) | XCB | n regions | Yes | Active |
LeftWM | Rust | RON (user settings) / Anything (themes) | Dynamic | None | Yes | Yes, many options through theme system | External | v-stack, columns, rows | Variable based on theme | supports _NET_ACTIVE_WINDOW and sending commands to a named pipe | Xlib | Workspaces and monitors are not tied. Many workspaces for monitor or many monitors for workspace | Yes | Active |
Notion | C, Lua | Lua, compatible with Ion3 configs | Manual | trayion, stalonetray | Yes | configurable | ? | h-tab, max | Configurable borders and titlebars/tabs | EWMH, arbitrary Lua scripts which have access to the rich internal API | Xlib | n workspaces on each monitor. Supports on-the-fly changes in topology | Active | |
qtile | Python | Python | Dynamic | Yes | Yes | Yes | External | tree, v-split, h-split, stacked, tabbed, max | No borders, although customizable | Hooks, Server mode | XCB | Active | ||
Ratpoison | C | Text | Manual | None | Yes | Yes | External | max | No | Active | ||||
Snapwm | C | Reloadable Text | Dynamic | None | Yes | Built-in, reads from root window name | External | nVertical, Fullscreen, nHorizontal, Grid, Center Stacking | Variable borders, no titles | Xlib | Number of desktops distributed evenly between monitors | Active | ||
Spectrwm | C | Text | Dynamic | None | Yes | Built-in, reads from user script | No | nv-stack, nh-stack, max | 1-pix borders, no titles | XCB | n regions, 10 workspaces visible in any region | No | Active | |
Stumpwm | Common Lisp | Common Lisp | Manual | StumpTray | Yes | Yes | External | max | SLIME server («Swank») | Xlib | No | Active | ||
xmonad | Haskell | Haskell | Dynamic | None | Yes | No | Yes, with xmonad-contrib and an external manager | nv-stack, nh-stack, max | Variable borders, no titles | via XMonad-Hooks-ServerMode | Xlib | n regions, 9 workspaces visible in any region | Yes / via XMonad-Hooks-EwmhDesktops | Active |
Window Manager | Written in | Configured with | Management style | System tray support | On-the-fly reload | Information bars | Compositing | Default layouts | Pixel usage | External control | Library | Multiple (n) monitor behavior | ICCCM/EWMH compliant | Maintenance |
Tip: External control can also be achieved by programs like xdotool which simulate keystrokes.
Management style
Dynamic management emphasizes automatic management of window layouts for speed and simplicity. Manual management emphasizes manual adjustment of layout and sizing with potentially more precise control, at the cost of more time spent moving and sizing windows.
Layouts
A number of common layout types appear in several tiling WMs, although the terminology varies somewhat.
- max: one window shown fullscreen (with or without a status bar, title and borders). Aka: monocle (dwm, monsterwm).
- h-stack: master area in top half, other windows stack up horizontally in the bottom half. The master area may be resizable. May be inverted top-bottom (wmfs). Aka: bottom stack (dwm), bstack(monsterwm).
- v-stack: master area in left half, other windows stack up vertically in the right half. The master area may be resizable. May be inverted left-right (wmfs). Aka: tile (dwm, monsterwm).
- nh-stack: h-stack allowing >=1 windows in master area. Aka: nbstack (dwm)
- nv-stack: v-stack allowing >=1 windows in master area. Aka: ntile (dwm)
- mirror-h: nh-stack with stacks above and below the master area
- mirror-v: nv-stack with stacks to the left and right of the master area
- h-tab: one window shown fullscreen with all window titles shown horizontally (like browser tabs)
- v-tab: one window shown fullscreen with all window titles shown vertically. Aka: stack (wmii).
- h-split: a keybinding splits the current window horizontally creating space for another
- v-split: a keybinding splits the current window vertically creating space for another
- columns: manual layout style which treats windows as belonging to vertical columns
- rows: manual layout style which treats windows as belonging to horizontal rows
- grid: window positions and sizes based on a regular NxM grid. May be automatic (like wmfs, monsterwm) or manual (like Subtle).
Key bindings
Tiling window managers are usually designed to be used entirely with the keyboard or with keyboard & mouse. This is for speed (reaching for and moving a mouse is slow) and ease of use. Sensible key bindings are crucial to making workflow fast and efficient. Some default sets are better than others, but generally the keys can be rebound as desired by the user.