Это старая версия документа.


Эта статья помечена как незаконченная. См. заметку в конце статьи.

FVWM - оконный менеджер, предоставляющий пользователю возможность самостоятельно настроить все возможные аспекты управления окнами в соответствии со своими представлениями об удобстве. В fvwm можно реализовать такие вещи, как открытие окон с произвольными размерами и координатами на определённом рабочем столе, большое количество чувствительных к контексту сочетаний клавиш для любых операций, до десяти кнопок в заголовке окна, которым можно назначить произвольные действия, меню, в том числе динамически генерируемые меню, меню, генерируемые с помощью скриптов (как pipe-menu в openbox) и tear-off меню, разные обои на разных рабочих столах, группировка окон со вкладками в заголовке окна, помещение окон в произвольные слои, заголовок окна на любой из сторон окна, стили оформления окон, возможность добавления своих элемнтов интерфейса с помощью модуля FvwmButtons. Приложение очень «лёгкое», файл конфигурации достаточно легко читается, особенно по сравнению с xml или кодом на lua или haskel.

Перевод FVWM Beginners Guide

Пролог

Feeble Virtual Window Manager (Слабый вирутальный окнонный менеджер) это чрезвычайно гибкий менеджер окон для X Window System. Слово «слабый» в названии может ввести в заблуждение. Дело в том, что FVWM является форком TWM, и сделан как его слабая замена, но к сегодняшнему дню FVWM вырос из слабого и скромного в самый гибкий в настройке оконный менеджер. От FVWM вы можете добиться всего, что хотите от подобной программы и даже больше. Поскольку название «слабый» больше не подходит к FVWM, то строят разные легенды по поводу того, что же эта F в названии значит. Чаще всего в F не раскрывают и пишут F? Virtual Window Manager.

Не смотря на то, что FVWM очень гибок в настройке, многие стараются не использовать его потому, что нет визуальных инструментов для управления параметрами FVWM. Предпринимались попытки создать для настройки FVWM подобные вещи, такие как fvwm-themes, однако, такое огромное количество опций и настроек не так-то просто перевести в графический интерфейс, так что лучший способ настроить FVWM — написать свой конфигурационный файл. В этом вам поможет сие руководство, здесь вы ознакомитесь с синтаксисом конфигурационных файлов FVWM и основными командами. Первая часть руководства расскажет вам шаг за шагом, как создать простой конфигурационный файл FVWM. Не смотря на то, что это руководство, информация предоставляется в таком виде, что вы просто можете скопировать настройки и вставить их в конфигурационный файл. После того, как вы создадите базовую конфигурацию, мы с вами углубимся в некоторые темы и настройки и вы сможете позабавиться с ними на вашем рабочем столе. Я надеюсь, что к концу этого руководства вы достаточно ознакомитесь с настройкой FVWM и сможете создать такую конфигурацию, какая вам необходима.

Я попытаюсь достаточно хорошо объяснить все настройки, которые я вам представил, но в манах FVWM всё достаточно чётко написано. Маны довольно длинные, но они полны ключевых слов, ищите по ним, чтобы узнать, что делает та или иная опция. О некоторых опциях я говорю мало и не полно, и надеюсь, что вы воспользуйтесь манами, чтобы узнать те детали, которые я опустил. Так что если вы от меня что-то не узнали, то маны являются для вас ценным ресурсом.

Это руководство было написано к нестабильному релизу, fvwm-2.5.10 на тот момент. Я не тестировал конфигурацию на стабильном релизе и не уверен в его работе на нём. Рекомендую использовать версию 2.5.10. Не смотря на то, что этот релиз не стабильный, стандартные функции работают нормально и я не заметил никаких проблем с ним. Я также использую патч для прозрачности.

Всё в FVWM можно настроить в одном единственном файле. В стандартной сборке из репозиториев он лежит в ~/.fvwm/config. Ещё возможны варианты типа ~/.fvwm/.fvwm2rc и ~/.fvwm2rc. Однако, имеется команда Read, позволяющая обрабатывать содержимое других файлов. С её помощью можно разделить один большой конфиг на несколько малых. Но в целях просто обучиться настройке FVWM, мы будем записывать все настройки в один файл. Так что для начала создайте в домашнем каталоге папку .fvwm и в ней простой текстовый файл config. Если вы уже запустили FVWM, не настроив его, не ужасайтесь — стандартная конфигурация FVWM очень уродлива, ведь FVWM требует тонкой настройки.

Откройте наш ~/.fvwm/config в своём любимом текстовом редакторе. Этот файл перечитывается FVWM при каждом запуске и определяет вид и поведение нашего нового оконного менеджера. Комментарии должны начинаться символом “#”.

Общие настройки

Первое, что мы должны сделать - это задать переменные окружения и сделать базовую настройку рабочего стола. В FVWM переменные окружения нужны в основном для задания расположения разных файлов (например, иконок), которые используются в конфиге. Но не стоит засорять среду переменными и использовать переменные для чего ни попадя: не нужно обозначать переменными то, что меняется раз в год. Вот пример задания переменных:

# Задание переменных
SetEnv fvwm_img /usr/share/images
SetEnv fvwm_icon /usr/share/fvwm/icons
SetEnv fvwm_scrpt /usr/share/fvwm/scripts
SetEnv fvwm_wallpapers $[FVWM_USERDIR]/wallpaper
SetEnv fvwm_webbrowser /usr/bin/opera
SetEnv fvwm_video_player /usr/bin/mplayer

Теперь зададим ImagePath:

# ImagePath
ImagePath $[fvwm_icon]:$[fvwm_icon];.png:$[fvwm_wallpapers]:+

Это значит, что все иконки берутся из папки, указанной в переменной $[fvwm_icon]. .png означает, что иконки в формате ПНГ. Так же могут использоваться икс-пи-эм-иконки по умолчанию. Можно легко добавить больше директорий в ImagePath, если, например, есть глобальные иконки для всех пользователей в /usr/share/images и личные для отдельного пользователя в ~/fvwm/icons.

Теперь настроим виртуальные рабочие столы. FVWM позволяет иметь сколько угодно рабочих столов, да ещё каждый из них может состоять из множества страниц. Зададим три рабочих стола, каждый из которых состоит из четырёх страниц в конфигурации 2×2:

# Настройки виртуальных рабочих столов
DesktopSize 2x2
DesktopName 0 Главный
DesktopName 1 Работа
DesktopName 2 Игры
EdgeScroll 100 100
EdgeResistance 150  150
EdgeThickness 1

Переменная DesktopSize определяет количество страниц на рабочем столе. Затем, с помощью переменных DesktopName мы задаём рабочие столы и их названия. Параметр EdgeScroll определяет, на сколько процентов сдвигается рабочий стол при подведении курсора к краю экрана. EdgeScroll 100 100 говорит, что при заезде указателя на край экрана страница будет прокручиваться на 100%, то есть целиком. EdgeResistance определяет время, через которое должно произойти перемещение, после движения курсора. EdgeThicknes определяет толщину края экрана. То есть ту область вокруг экрана, в которую необходимо попасть, чтобы переместиться. Если вам не нужно такое перемещение, можете задать EdgeThickness 0 или EdgeScroll 0 0.

Теперь назначим поведение мыши и фокус.

# Настройки мыши и фокус
ClickTime 350
MoveThreshold 3
Style * SloppyFocus, MouseFocusClickRaises

Параметр ClickTime определяет время в милисекундах между нажатием мыши и тем моментом, который FVWM считает за клик. Если нажатие длиться дольше, чем указанное время, то FVWM определяет это, как удержание мыши. MoveThreshold это такое количество пикселей, на которе нужно сместить мышь, чтобы это было воспринято, как движение.

Функции

Функции могут быть использованы для настройки самых разнообразных вещей в FVWM. Мы рассмотрим только базовый синтаксис и несколько элементарных функций. Для начала поглядим на скелет функции. Он закомментирован для того, чтобы вы могли скопировать его себе в конфиг, как напоминание.

# Конспект функции FVWM
#
# DestroyFunc FuncName
# AddToFunc   FuncName
# + I (Действие происходит немедленно)
# + C (Действие происходит по клику)
# + D (Действие происходит по двойному клику)
# + H (Действие происходит при задержке мыши)
# + M (Действие происходит при движении мыши)

Таким образом, первое, что нужно сделать — это очистить функцию командой DestroyFunc, это освободит функцию от всего, что могло случайно попасть в неё раньше. Затем командой AddToFunc вы добавляете действия, которые должны происходить при вызове функции, и, как вы могли заметить выше, эти действия выполняются при определённом событии, совершаемом мышью. Когда вы вызываете функцию в FVWM, вы можете передать ей различные параметры. Например, вы можете вызвать вышеозначенную функцию так: FuncName $0 $1 $2 $3 $4, где $0-$4 — это параметры, передаваемые функции, и они могут определять вывод этой функции. Теперь давайте рассмотрим следующий список базовых функций.

#####
# Базовые функции
###########
DestroyFunc FvwmDeleteOrDestroy
AddToFunc   FvwmDeleteOrDestroy
+ H Nop
+ M Nop
+ C Delete
+ D Destroy

DestroyFunc FvwmIconifyOrShade
AddToFunc   FvwmIconifyOrShade
+ C Iconify
+ D WindowShade

DestroyFunc FvwmMaximize
AddToFunc   FvwmMaximize
+ H Nop
+ M Nop
+ C Maximize $0 $1

DestroyFunc FvwmMoveOrIconify
AddToFunc   FvwmMoveOrIconify
+ M Move
+ D Iconify

DestroyFunc FvwmWindowShade
AddToFunc   FvwmWindowShade
+ D WindowShade $0

Первая функция FvwmDeleteOrDestroy не делает ничего, если мышь задержена при наведении или двигает. На одиночный клик эта функция закроет окно обычным образом, а на двойной удалит, даже если оно будет сопротивляться. Вторая функция FvwmIconifyOrShade на одиночный клик свернёт окно на панель задач, а на двойной — свернёт в заголовок. Функция FvwmMaximized примет два параметра, определяющие, как развернуть окно. Например, вы можете вызвать функцию FvwmMaximized 100 100, и тогда окно развернётся на 100% по горизонтали и вертикали. Если же вы вызовете её как FvwmMaximize 100 0, то окно растянется во всю ширину окна, но сохранит свою высоту. Функция FvwmMoveOrIconify позволит перетаскивать окно, когда вы двигаете его мышью, и свернёт его на панель задач при двойном клике. А функция FvwmWindowShade свернёт окно в заголовок, если ей передан параметр true (FvwmWindowShade True), и развернёт его из заголовка, если ей передан параметр false. Если она вызвана без параметров, то она развернёт свёрнутое окно и свернёт развёрнутое.

Теперь напишем несколько функций запуска приложений, чтобы потом просто вызывать эти функции. Эти функции очень просты, но они вносят немного организованности:

#####
# Функции для запуска программ
###########
DestroyFunc FvwmXTerm
AddToFunc   FvwmXTerm
+ I Exec exec xterm

DestroyFunc FvwmATerm
AddToFunc   FvwmATerm
+ I Exec exec aterm

DestroyFunc FvwmGVim
AddToFunc   FvwmGVim
+ I Exec exec gvim

DestroyFunc FvwmGimp
AddToFunc   FvwmGimp
+ I Exec exec gimp-2.0

DestroyFunc FvwmFireFox
AddToFunc   FvwmFireFox
+ I Exec exec firefox

DestroyFunc FvwmIrssi
AddToFunc   FvwmIrssi
+ I Exec exec aterm -e irssi

DestroyFunc FvwmXmms
AddToFunc   FvwmXmms
+ I Exec exec xmms

DestroyFunc FvwmViewManPage
AddToFunc   FvwmViewManPage
+ I Exec exec xterm -fg White -bg DarkBlue -g 80x40 -fn 7x14 -fb 7x14bold \
 -n "Manual Page - $0" -T "Manual Page - $0" -e man "$0"

Первые функции должны быть понятны, а вот последнюю стоит объяснить. Она принимает в качестве аргумента man-страницу. Например, если вы выполните FvwmViewManPage fvwm, то отобразится страница man fvwm в терминале xterm. Также обратите внимание на синтаксис последних строк. Вторая строка снизу оканчивается на обратный слэш (\), это означает, что следующая строка должна восприниматься как продолжение текущей. То есть последние две строки интерпретируются как одна, благодаря бэкслэшу.

Теперь взглянем на три специальные функции: StartFunction, InitFunction и RestartFunction. Функция StartFunction выполняется при запуске FVWM, в то время как InitFunction выполняется после StartFunction, когда инициализируется FVWM. Функция RestartFunction выполняется после StartFunction при перезапуске FVWM.

#####
# Функции запуска
###########
DestroyFunc StartFunction
AddToFunc   StartFunction
+ I Module FvwmTaskBar
+ I Module FvwmPager 0 2
+ I Module FvwmButtons MyButtons

DestroyFunc InitFunction
AddToFunc   InitFunction
+ I Exec exec xscreensaver
+ I Exec exec fvwm-root -r $[fvwm_wallpapers]/background.png
+ I FvwmXmms
+ I FvwmATerm

DestroyFunc RestartFunction
AddToFunc   RestartFunction
+ I Nop

Во время запуска FVWM подгружает три модуля: FvwmTaskBar, FvwmPages и FvwmButtons. После запуска FVWM включает скринсейвер, задаёт фоновое изображение, запускает XMMS и ATerm. При перезапуске он ничего не делает (кроме StartFunction).

Функции могут быть достаточно подробными, добавить много функциональности вашему окружению. Функции могут иметь любое число параметров ($1, $2, $3 и т.д.) и сочетать в себе любое количество действий мыши. Функции могут иметь любое имя, кроме зарезервированных для FVWM, таких как Nop, Delete, Destroy, Restart и пр.

Вот ещё немного примеров разных функций:

#####
# Screenshot Functions (uses ImageMagick)
###########
DestroyFunc FvwmWindowScreenshot
AddToFunc   FvwmWindowScreenshot
+ I ThisWindow (!Shaded !Iconic Iconifiable) \
  Exec import -window $[w.id] -quality 100 -silent \
  "$[fvwm_home]/screenshot/screenshot-`date +%F[%R]`.$[w.id].jpg"

DestroyFunc FvwmDesktopScreenshot
AddToFunc   FvwmDesktopScreenshot
+ I Exec sleep $0; import -window root -quality 100 -silent \
  "$[fvwm_home]/screenshot/screenshot-`date +%F[%R]`.jpg"

#####
# XRoach Invasion
###########
DestroyFunc XRoachInvasion
AddToFunc   XRoachInvasion
+ I Exec exec xroach -roaches 5 -rc Cyan -speed 17
+ I Exec exec xroach -roaches 3 -rc Red -speed 15
+ I Exec exec xroach -roaches 7 -rc Green -speed 10
+ I Exec exec xroach -roaches 3 -rc Blue -speed 20
+ I Exec exec xroach -roaches 1 -rc Black -speed 30
+ I Exec exec xroach -roaches 1 -rc White -speed 40

DestroyFunc XRoachExterminate
AddToFunc   XRoachExterminate
+ I Exec killall xroach

Первая пара функций делает скриншот одного окна или всего рабочего стола с помощью ImageMagick'а. Чтобы сделать скриншот одного окна, вызовите первую функцию как Pick (Circulate Hit) FvwmWindowScreenshot. После чего сменится курсор. Выберите им то окно, снимок которого хотите получить. Вторая функция сделает скриншот рабочего стола после паузы, длительность которой передаётся параметром $0 в секундах. FvwmDesktopScreenshot 5 сделает снимок рабочего стола через пять секунд после вызова. Это хороший путь для того, например, чтобы снять меню. Вторая группа функций запускает древнюю игрушку X.org'а - тараканов, ползающих по вашему экрану. Для этого у вас должен быть установлен xroach.

Сочетания клавиш

Всего существует два типа биндингов: к мыши и к клавиатуре. Чтобы лучше понять, как это работает, давайте взглянем на типичный экран с одним развёрнутым окном и двумя свёрнутыми. Из следующей схемы ясно, что экран разделён на следующие области: R — рабочий стол, I — иконки, в которые свёрнуты окна, F — углы рамок окон, S — стороны рамок окон, T — заголовок окна, W — клиентская область приложения, 0—9 — кнопки заголовка окна. Запомните, что A означает везде, то есть не важно, где расположен курсор.

Задавать биндинги вы можете по нижеследующему образцу. Все клавиатурные биндинги записываются как Key X Контекст Модификатор Действие, а мышинные как Mouse X Контекст Модификатор Действие. Здесь X — это клавиша или кнопка мыши, контекст — область, в которой была нажата клавиша или кнопка, модификатор — это модификатор клавиатуры (типа Капс-Лока, Контрола, шифта и пр.), и действие — то, что нужно совершить по данному событию. Модфификаторы кодируются как A — любой (any), C — Control, S — Shif, M — Meta, N — никакой (nothing), или числами 1—5, что повторяет X-Модификаторы (man xmodmap).

#####
# Базовые биндинги
###########
Key F1 A M Menu MenuFvwmRoot
Key Tab A M WindowList Root c c NoDeskSort, SelectOnRelease Meta_L
Key Super_L A A FvwmATerm
Mouse 1 R A Menu FvwmRootMenu
Mouse 3 R A Menu FvwmWindowOpsMenu
Mouse 1 1 A FvwmDeleteOrDestroy
Mouse 1 3 A FvwmIconifyOrShade
Mouse 1 5 A FvwmMaximize 100 100
Mouse 2 5 A FvwmMaximize 0 100
Mouse 3 5 A FvwmMaximize 100 0
Mouse 1 W M FvwmMoveOrIconify
Mouse 1 I A FvwmMoveOrIconify
Mouse 4 T A FvwmWindowShade True
Mouse 5 T A FvwmWindowShade False

Это можно описать как:

  1. По нажатию Alt+F1 независимо от фокуса и положения курсора открывает главное меню FVWM.
  2. Позволяет переключать окна по Alt+Tab
  3. Запускает ATerm по нажатию левой командной клавиши.
  4. Открывает главное меню по клику левой кнопкой мыши на рабочем столе.
  5. Открывает WindowOpsMenu по клику правой кнопкой мыши на рабочем столе.
  6. Закрывает или удаляет окно по клику или двойному клику по кнопке №1.
  7. Сворачивает окно в иконку или в заголовок по клику или двойному клику на кнопке №3 .
  8. Разворачивает окно на полный экран, когда первая кнопка мыши (левая) нажимает на кнопку №5.
  9. Растягивает окно по вертикали, когда вы кликаете второй кнопкой мыши на кнопку №5.
  10. Растягивает окно по вертикали, когда вы кликаете третьей кнопкой мыши на кнопку №5.
  11. Перемещает окно, если мы тащим его мышью с зажатым Alt и сворачивает в иконку по двойному клику.
  12. FIXME Binds the FvwmMoveOrIconify function to work on 'Icons' so they can be moved and UnIconified.
  13. Сворачивает окно в заголовок, когда вы крутите колёсиком вверх хотя бы два раза.
  14. Разворачивает активное окно из заголовка, когда вы крутите колёсиком вниз хотя бы два раза.

Внешний вид окон

В FVWM вы можете задавать внешний вид окон через цветовые схемы и изображения. В качестве первого примера рассмотрим простой дизайн окон без картинок. Для начала зададим колорсеты, определяющие базовые цвета, которые мы будем использовать. Колорсеты могут быть использованы для задания цветов всего, чего угодно, в FVWM. Следующий кусок конфига задаёт три простых колорсета:

#####
# Window Colorsets
###########
Colorset 3 fg #101060, bg #e6e7d7
Colorset 4 fg Black, bg #a6a797
Colorset 5 fg White, bg Black

Это задаёт три колорсета с номерами 3, 4 и 5, которые имеют цвет текста (foreground, fg) и цвет фона (background, bg). Цвета могут быть заданы в hex-нотации или псевдонимами X, записанными в /etc/X11/rgb.txt.

Настройка

Клавиатура и мышь

Сочетание клавиш для fvwm - это заданное пользователем действие, выполняемое при нажатии клавиши (или кнопки мыши) в определённом контексте, с определённым модификатором, несколькими модификаторами или без модификаторов и в зависимости от имени окна.

Поддержка контекста для хоткеев и кнопок мыши - важная и удобная черта любого wm, именно благодаря ей правый клик по содержимому окна отличается от правого клика по его заголовку или по рабочему столу, а сочетания клавиш wm не конфликтуют с сочетаниями клавиш в приложениях.

fvwm понимает следующие контексты:

R - рабочий стол
I - иконка
F - углы декорации окна
S - стороны декорации окна
T - заголовок окна
W - окно приложения
0-9 - кнопки
M - меню
A - любое место на десктопе

Контексты можно комбинировать между собой: FSTW, WT, FS.

Модификаторами могут служить клавиши Ctrl, Shift, Super и т.д.

Модификаторы, понимаемые fvwm и их обозначения в конфигурационном файле:

Ctrl - С
Super - 4
Alt - 1
Shift - S
Caps Lock - L
Num Lock - 2

Модификаторов может быть несколько: C1, CS, C4.

Поскольку клавиши Caps Lock и Num Lock являются модификаторами, при включении цифровой клавиатуры или верхнего регистра они считаются fvwm нажатыми, что приводит к некорректной работе (сбросу настроек клавиатуры, мыши и политики фокуса на дефолтные). Для того, чтобы этого избежать, нужно добавить в конфигурационный файл строку

IgnoreModifiers 2L

Кроме всего перечисленного, fvwm может принимать во внимание название активного окна, оно указывается в скобках после Key или Mouse, можно использовать wildcards (*).

В качестве действия можно указывать любую команду fvwm - Exec, Function, PipeRead, Restart и т.д.

Таким образом, сочетания клавиш задаются так:

Key/Mouse (Окно) Клавиша/Кнопка Контекст Модификатор Действие

Несколько примеров:

Список окон по Alt+Tab

Key Tab A 1 WindowList Root NoGeometry

Закрытие окна по левому клику на крайней правой кнопке декорации

#Функция
DestroyFunc DeleteWin
AddToFunc DeleteWin
+ I Delete

#Вызов функции
Mouse 1 2 N DeleteWin

Меню по правому клику на рабочем столе

Mouse 3 R N Menu MainMenu

При активном окне браузера вызвать gmrun по Ctrl+Alt+Z

Key (*Namoro*) Z A C1  Exec exec gmrun

Практические советы

Несколько советов по настройке fvwm, которые могут помочь в настройке, улучшить читаемость и переносимость конфигурационного файла, задействовать полезные функции fvwm.

  • Удобно разнести настройки, отвечающие за разные аспекты поведения wm по разным конфигурационным файлам и объединить их с помощью функции Read - это облегчит чтение конфигурационных файлов, внесение в них изменений по ходу работы и обмен интересными вариантами настройки. В последствии можно будет создать меню настроек fvwm, где каждый пункт будет ссылаться на соответствующий конфигурационный файл.
  • В процессе настройки полезно добавить горячие клавиши для FvwmIdent и FvwmConsole - первая функция позволяет вызвать информацию об окне - слой, геометрия, тип и т.д., а вторая - вводить команды fvwm в специальной консоли.
  • Если вы хотите использовать в своей конфигурации fvwm скрипты в меню, подобные pipe-scripts в openbox, такие меню имеет смысл делать динамически генерируемыми. Синтаксис такого меню:
#Создаём меню и объявляем его динамически воссоздаваемым функцией MakeBasicMenu
AddToMenu Basic Basic title
+ DynamicPopupAction Function MakeBasicMenu

#Добавляем пункты меню
AddToFunc MakeBasicMenu
+ I DestroyMenu recreate Basic
+ I AddToMenu Basic "Gedit" Exec exec gedit
+ I AddToMenu Basic "Firefox" Exec exec firefox
  • В репозитариях Ubuntu нет неофициального пакета fvwm-patched - fvwm 2.5.28 с набором патчей, но исходники без проблем компилируются.
  • Для того, чтобы нажатие NumLock не приводило к сбросу ваших настроек, добавьте в свой конфигурационный файл строку, заставляющую fvwm не считать NumLock модификатором:
IgnoreModifiers 2

Полезные ссылки

FIXME Эта статья не окончена. Пожалуйста, если вы располагаете соответствующими знаниями и небольшим количеством свободного времени, попробуйте улучшить эту статью.
  • Стилистика этой статьи не соответствует рекомендуемому минимуму.
  • Содержание этой статьи не соответствует рекомендуемому минимуму.
  • Структура статьи меняется по мере написания.
  • Вероятно, стоит перевести FVWM Beginners Guide до конца, добавить ссылок на оригинал и более детально объяснить это вообще такое, FVWM.
  • Дополнительно было бы неплохо приложить к статье несколько скриншотов и соответствующих им примеров конфигураций.

MadKox