FVWM Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:fvwm [2011/04/02 23:20]
[Общие настройки]
wiki:fvwm [2011/04/02 23:52] (текущий)
[FVWM]
Строка 1: Строка 1:
 +<note warning>​Статья в переработке до середины апреля. ​
 +tartan</​note>​
 +
 ====== FVWM ====== ====== FVWM ======
- 
-<​note>​ 
-Эта статья помечена как незаконченная. См. заметку в конце статьи. 
-</​note>​ 
- 
 FVWM - оконный менеджер,​ предоставляющий пользователю возможность самостоятельно настроить все возможные аспекты управления окнами в соответствии со своими представлениями об удобстве. В fvwm можно реализовать такие вещи, как открытие окон с произвольными размерами и координатами на определённом рабочем столе, большое количество чувствительных к контексту сочетаний клавиш для любых операций,​ до десяти кнопок в заголовке окна, которым можно назначить произвольные действия,​ меню, в том числе динамически генерируемые меню, меню, генерируемые с помощью скриптов (как pipe-menu в openbox) и tear-off меню, разные обои на разных рабочих столах,​ группировка окон со вкладками в заголовке окна, помещение окон в произвольные слои, заголовок окна на любой из сторон окна, стили оформления окон, возможность добавления своих элемнтов интерфейса с помощью модуля FvwmButtons. Приложение очень "​лёгкое",​ файл конфигурации достаточно легко читается,​ особенно по сравнению с xml или кодом на lua или haskel. FVWM - оконный менеджер,​ предоставляющий пользователю возможность самостоятельно настроить все возможные аспекты управления окнами в соответствии со своими представлениями об удобстве. В fvwm можно реализовать такие вещи, как открытие окон с произвольными размерами и координатами на определённом рабочем столе, большое количество чувствительных к контексту сочетаний клавиш для любых операций,​ до десяти кнопок в заголовке окна, которым можно назначить произвольные действия,​ меню, в том числе динамически генерируемые меню, меню, генерируемые с помощью скриптов (как pipe-menu в openbox) и tear-off меню, разные обои на разных рабочих столах,​ группировка окон со вкладками в заголовке окна, помещение окон в произвольные слои, заголовок окна на любой из сторон окна, стили оформления окон, возможность добавления своих элемнтов интерфейса с помощью модуля FvwmButtons. Приложение очень "​лёгкое",​ файл конфигурации достаточно легко читается,​ особенно по сравнению с xml или кодом на lua или haskel.
  
-{{:wiki:fvwm.png?500|}}+Одно из основных отличий ​fvwm от других оконных менеджеров - по умолчанию он не предоставляет пользователю практически ничего. С другой стороны,​ возможности настройки настолько широки,​ что если вас не устраивает fvwm, то пора задуматься о написании собственного менеджера окон.
  
 +===== Общие принципы настройки =====
  
 +Возможно,​ лучший способ понять принципы настройки fvwm - думать о нём как о специализированном языке программирования высокого уровня.
  
 +Как любой язык программирования,​ fvwm предоставляет пользователю **команды** для управления окнами и элементами интерфейса,​ **управляющие структуры** и возможность написания собственных **функций**. Существует несколько **библиотек** - модулей. Команды и функции привязываются к различным событиям от устройств ввода - клавиатуры и мыши. Полное описание всех команд и функций занимает около двухсот страниц,​ в этой статье мы попытаемся рассмотреть практические аспекты программирования fvwm и создать окружение,​ напоминающее openbox с заимствованием нескольких удачных рещений из других оконных менеджеров.
  
-==== Функции ​====+===== Команды =====
  
-Функции могут быть использованы для настройки самых разнообразных ​вещей в FVWM. Мы рассмотрим только базовый синтаксис и несколько элементарных функций. Для ​начала поглядим на скелет функции. Он закомментирован для того, чтобы вы могли скопировать его себе в конфиг,​ как напоминание.+Команды позволяют двигать окнаизменять их размеры
  
-<​file>​ 
-# Конспект функции FVWM 
-# 
-# DestroyFunc FuncName 
-# AddToFunc ​  ​FuncName 
-# + I (Действие происходит немедленно) 
-# + C (Действие происходит по клику) 
-# + D (Действие происходит по двойному клику) 
-# + H (Действие происходит при задержке мыши) 
-# + M (Действие происходит при движении мыши) 
-</​file>​ 
  
-Таким образом,​ первое,​ что нужно сделать,​ — это очистить функцию командой ''​DestroyFunc'',​ это освободит функцию от всего, что могло случайно попасть в неё раньше. Затем командой ''​AddToFunc''​ вы добавляете действия,​ которые должны происходить при вызове функции,​ и, как вы могли заметить выше, эти действия выполняются при определённом событии,​ совершаемом мышью. Когда вы вызываете функцию в FVWM, вы можете передать ей различные параметры. Например,​ вы можете вызвать вышеозначенную функцию так: ''​FuncName $0 $1 $2 $3 $4'',​ где $0—$4 — это параметры,​ передаваемые функции,​ и они могут определять вывод этой функции. Теперь давайте рассмотрим следующий список базовых функций. 
  
-<​file>#####​ 
-# Базовые функции 
-########### 
-DestroyFunc FvwmDeleteOrDestroy 
-AddToFunc ​  ​FvwmDeleteOrDestroy 
-+ H Nop 
-+ M Nop 
-+ C Delete 
-+ D Destroy 
  
-DestroyFunc FvwmIconifyOrShade 
-AddToFunc ​  ​FvwmIconifyOrShade 
-+ C Iconify 
-+ D WindowShade 
  
-DestroyFunc FvwmMaximize +{{:wiki:​fvwm.png?500|}}
-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</​file>​ +
- +
-Первая функция ''​FvwmDeleteOrDestroy''​ не делает ничего,​ если мышь задержана при наведении или двигает. На одиночный клик эта функция закроет окно обычным образом,​ а на двойной удалит,​ даже если оно будет сопротивляться. Вторая функция ''​FvwmIconifyOrShade''​ на одиночный клик свернёт окно на панель задач, а на двойной — свернёт в заголовок. Функция ''​FvwmMaximized''​ примет два параметра,​ определяющие,​ как развернуть окно. Например,​ вы можете вызвать функцию ''​FvwmMaximized 100 100'',​ и тогда окно развернётся на 100% по горизонтали и вертикали. Если же вы вызовете её как ''​FvwmMaximize 100 0'',​ то окно растянется во всю ширину окна, но сохранит свою высоту. Функция ''​FvwmMoveOrIconify''​ позволит перетаскивать окно, когда вы двигаете его мышью, и свернёт его на панель задач при двойном клике. А функция ''​FvwmWindowShade''​ свернёт окно в заголовок,​ если ей передан параметр true (''​FvwmWindowShade True''​),​ и развернёт его из заголовка,​ если ей передан параметр false. Если она вызвана без параметров,​ то она развернёт свёрнутое окно и свернёт развёрнутое. +
- +
-Теперь напишем несколько функций запуска приложений,​ чтобы потом просто вызывать эти функции. Эти функции очень просты,​ но они вносят немного организованности:​ +
- +
-<​file>#####​ +
-# Функции для запуска программ +
-###########​ +
-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"</​file>​ +
- +
-Первые функции должны быть понятны,​ а вот последнюю стоит объяснить. Она принимает в качестве аргумента man-страницу. Например,​ если вы выполните ''​FvwmViewManPage fvwm'',​ то отобразится страница man fvwm в терминале xterm. Также обратите внимание на синтаксис последних строк. Вторая строка снизу оканчивается на обратный слэш (''​\''​),​ это означает,​ что следующая строка должна восприниматься как продолжение текущей. То есть последние две строки интерпретируются как одна, благодаря бэкслэшу. +
- +
-Теперь взглянем на три специальные функции:​ ''​StartFunction'',​ ''​InitFunction''​ и ''​RestartFunction''​. Функция ''​StartFunction''​ выполняется при запуске FVWM, в то время как ''​InitFunction''​ выполняется после ''​StartFunction'',​ когда инициализируется FVWM. Функция ''​RestartFunction''​ выполняется после ''​StartFunction''​ при перезапуске FVWM. +
- +
-<​file>#####​ +
-# Функции запуска +
-###########​ +
-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</​file>​ +
- +
-Во время запуска FVWM подгружает три модуля:​ FvwmTaskBar,​ FvwmPages и FvwmButtons. После запуска FVWM включает скринсейвер,​ задаёт фоновое изображение,​ запускает XMMS и ATerm. При перезапуске он ничего не делает (кроме ''​StartFunction''​). +
- +
-Функции могут быть достаточно подробными,​ добавить много функциональности вашему окружению. Функции могут иметь любое число параметров ($1, $2, $3 и т.д.) и сочетать в себе любое количество действий мыши. Функции могут иметь любое имя, кроме зарезервированных для FVWM, таких как Nop, Delete, Destroy, Restart и пр. +
- +
-Вот ещё немного примеров разных функций:​ +
- +
-<​file>#####​ +
-# 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</​file>​ +
- +
-Первая пара функций делает скриншот одного окна или всего рабочего стола с помощью ImageMagick'​а. Чтобы сделать скриншот одного окна, вызовите первую функцию как ''​Pick (Circulate Hit) FvwmWindowScreenshot''​. После чего сменится курсор. Выберите им то окно, снимок которого хотите получить. Вторая функция сделает скриншот рабочего стола после паузы, длительность которой передаётся параметром $0 в секундах. ''​FvwmDesktopScreenshot 5''​ сделает снимок рабочего стола через пять секунд после вызова. Это хороший путь для того, например,​ чтобы снять меню. Вторая группа функций запускает древнюю игрушку X.org'​а — тараканов,​ ползающих по вашему экрану. Для этого у вас должен быть установлен xroach. +
- +
-==== Сочетания клавиш ==== +
- +
-{{wiki:window_layout.png }}Всего существует два типа биндингов:​ к мыши и к клавиатуре. Чтобы лучше понять,​ как это работает,​ давайте взглянем на типичный экран с одним развёрнутым окном и двумя свёрнутыми. Из следующей схемы ясно, что экран разделён на следующие области:​ R — рабочий стол, I — иконки,​ в которые свёрнуты окна, F — углы рамок окон, S — стороны рамок окон, T — заголовок окна, W — клиентская область приложения,​ 0—9 — кнопки заголовка окна. Запомните,​ что A означает везде, то есть не важно, где расположен курсор. +
- +
-Задавать биндинги вы можете по нижеследующему образцу. Все клавиатурные биндинги записываются как ''​Key X Контекст Модификатор Действие'',​ а мышинные как ''​Mouse X Контекст Модификатор Действие''​. Здесь X — это клавиша или кнопка мыши, контекст — область,​ в которой была нажата клавиша или кнопка,​ модификатор — это модификатор клавиатуры (типа Капс-Лока,​ Контрола,​ шифта и пр.), и действие — то, что нужно совершить по данному событию. Модфификаторы кодируются как A — любой (any), C — <​key>​Control</​key>,​ S — <​key>​Shif</​key>,​ M — <​key>​Meta</​key>,​ N — никакой (nothing), или числами 1—5, что повторяет X-Модификаторы (man xmodmap).  +
- +
-<​file>#####​ +
-# Базовые биндинги +
-###########​ +
-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</​file>​ +
- +
-Это можно описать как: +
-  - По нажатию <​key>​A-F1</​key>​ независимо от фокуса и положения курсора открывает главное меню FVWM. +
-  - Позволяет переключать окна по <​key>​A-tab</​key>​ +
-  - Запускает ATerm по нажатию левой командной клавиши. +
-  - Открывает главное меню по клику левой кнопкой мыши на рабочем столе. +
-  - Открывает WindowOpsMenu по клику правой кнопкой мыши на рабочем столе. +
-  - Закрывает или удаляет окно по клику или двойному клику по кнопке №1. +
-  - Сворачивает окно в иконку или в заголовок по клику или двойному клику на кнопке №3 . +
-  - Разворачивает окно на полный экран, когда первая кнопка мыши (левая) нажимает на кнопку №5. +
-  - Растягивает окно по вертикали,​ когда вы кликаете второй кнопкой мыши на кнопку №5. +
-  - Растягивает окно по вертикали,​ когда вы кликаете третьей кнопкой мыши на кнопку №5. +
-  - Перемещает окно, если мы тащим его мышью с зажатым <​key>​A</​key>​ и сворачивает в иконку по двойному клику. +
-  - FIXME Binds the FvwmMoveOrIconify function to work on '​Icons'​ so they can be moved and UnIconified. +
-  - Сворачивает окно в заголовок,​ когда вы крутите колёсиком вверх хотя бы два раза. +
-  - Разворачивает активное окно из заголовка,​ когда вы крутите колёсиком вниз хотя бы два раза.  +
- +
-==== Внешний вид окон ==== +
- +
-В FVWM вы можете задавать внешний вид окон через цветовые схемы и изображения. В качестве первого примера рассмотрим простой дизайн окон без картинок. Для начала зададим колорсеты,​ определяющие базовые цвета, которые мы будем использовать. Колорсеты могут быть использованы для задания цветов всего, чего угодно,​ в FVWM. Следующий кусок конфига задаёт три простых колорсета:​ +
- +
-<​file>#####​ +
-# Window Colorsets +
-###########​ +
-Colorset 3 fg #101060, bg #e6e7d7 +
-Colorset 4 fg Black, bg #a6a797 +
-Colorset 5 fg White, bg Black</​file>​ +
- +
-Это задаёт три колорсета с номерами 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''​ - любое место на десктопе\\ +
- +
-{{:​wiki:​window_layout.png|}} +
- +
-Контексты можно комбинировать между собой: ''​FSTW'',​ ''​WT'',​ ''​FS''​. +
- +
-Модификаторами могут служить клавиши <​key>​Ctrl</​key>,​ <​key>​Shift</​key>,​ <​key>​Super</​key>​ и т.д. +
- +
-Модификаторы,​ понимаемые fvwm и их обозначения в конфигурационном файле:​ +
- +
-<​key>​Ctrl</​key>​ - ''​С''​\\ +
-<​key>​Super</​key>​ - ''​4''​\\ +
-<​key>​Alt</​key>​ - ''​1''​\\ +
-<​key>​Shift</​key>​ - ''​S''​\\ +
-<​key>​Caps Lock</​key>​ - ''​L''​\\ +
-<​key>​Num Lock</​key>​ - ''​2''​\\ +
- +
-Модификаторов может быть несколько:​ ''​C1'',​ ''​CS'',​ ''​C4''​. +
- +
-Поскольку клавиши <​key>​Caps Lock</​key>​ и <​key>​Num Lock</​key>​ являются модификаторами,​ при включении цифровой клавиатуры или верхнего регистра они считаются fvwm нажатыми,​ что приводит к некорректной работе (сбросу настроек клавиатуры,​ мыши и политики фокуса на дефолтные). Для того, чтобы этого избежать,​ нужно добавить в конфигурационный файл строку +
- +
-<​code>​IgnoreModifiers 2L</​code>​ +
- +
- +
-Кроме всего перечисленного,​ fvwm может принимать во внимание название активного окна, оно указывается в скобках после ''​Key''​ или ''​Mouse'',​ можно использовать wildcards (*). +
- +
-В качестве действия можно указывать любую команду fvwm - ''​Exec'',​ ''​Function'',​ ''​PipeRead'',​ ''​Restart''​ и т.д. +
- +
-Таким образом,​ сочетания клавиш задаются так: +
- +
-Key/Mouse (Окно) Клавиша/​Кнопка Контекст Модификатор Действие +
- +
-Несколько примеров:​ +
- +
-Список окон по <​key>​Alt-Tab</​key>​ +
-<​code>​Key Tab A 1 WindowList Root NoGeometry</​code>​+
  
-Закрытие окна по левому клику на крайней правой кнопке декорации 
-<​code>#​Функция 
-DestroyFunc DeleteWin 
-AddToFunc DeleteWin 
-+ I Delete 
  
-#Вызов функции 
-Mouse 1 2 N DeleteWin</​code>​ 
  
  
-Меню по правому клику на рабочем столе 
-<​code>​Mouse 3 R N Menu MainMenu</​code>​ 
  
-При активном окне браузера вызвать ​ gmrun по <​key>​Ctrl-Alt-Z</​key>​ 
-<​code>​Key (*Namoro*) Z A C1  Exec exec gmrun</​code>​ 
  
-===== Практические советы ===== 
  
-Несколько советов по настройке fvwm, которые могут помочь в настройке,​ улучшить читаемость и переносимость конфигурационного файла, задействовать полезные функции fvwm. 
  
-  * Удобно разнести настройки,​ отвечающие за разные аспекты поведения wm по разным конфигурационным файлам и объединить их с помощью функции ''​Read''​ - это облегчит чтение конфигурационных файлов,​ внесение в них изменений по ходу работы и обмен интересными вариантами настройки. В последствии можно будет создать меню настроек fvwm, где каждый пункт будет ссылаться на соответствующий конфигурационный файл. 
-  * В процессе настройки полезно добавить горячие клавиши для ''​FvwmIdent''​ и ''​FvwmConsole''​ - первая функция позволяет вызвать информацию об окне - слой, геометрия,​ тип и т.д., а вторая - вводить команды fvwm в специальной консоли. 
-  * Если вы хотите использовать в своей конфигурации fvwm скрипты в меню, подобные pipe-scripts в [[openbox]],​ такие меню имеет смысл делать динамически генерируемыми. Синтаксис такого меню: 
-<​code>​ 
-#​Создаём меню и объявляем его динамически воссоздаваемым функцией 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 
-</​code>​ 
   * В репозитариях Ubuntu нет неофициального пакета [[fvwm-patched]] - fvwm 2.5.28 с набором патчей,​ но исходники без проблем компилируются.   * В репозитариях Ubuntu нет неофициального пакета [[fvwm-patched]] - fvwm 2.5.28 с набором патчей,​ но исходники без проблем компилируются.
   * Для того, чтобы нажатие <​key>​NumLock</​key>​ не приводило к сбросу ваших настроек,​ добавьте в свой конфигурационный файл строку,​ заставляющую fvwm не считать <​key>​NumLock</​key>​ модификатором:​   * Для того, чтобы нажатие <​key>​NumLock</​key>​ не приводило к сбросу ваших настроек,​ добавьте в свой конфигурационный файл строку,​ заставляющую fvwm не считать <​key>​NumLock</​key>​ модификатором:​