F(?)VWM (значение буквы F утеряно) — второй в истории оконный менеджер для иксов (первым был twm), до сих пор актуальный и поддерживаемый, насчитывающий свыше 250 000 строчек исходного кода. Обладает большим набором функций, и, если так будет понятнее, FVWM — это как конструктор или фреймворк, в котором уже реализованы все необходимые возможности современных оконных менеджеров, а вам лишь остается написать конфигурационный файл для своих задач.
Если вы готовы потратить день на изучение, чтобы потом за 5 минут «долететь», даже если вам просто нужен полноценный оконный менеджер, следующий стандартам — FVWM для вас.
Если предпочитаете, чтобы за вас уже подумали другие и предоставили рабочее решение «под ключ», вам надоел «линукс ради линукса», и надоело всё вечно настраивать и допиливать — FVWM не для вас.
Установка и запуск
FVWM (пакет с названием fvwm) доступен в официальных репозиториях множества дистрибутивов, в некоторых может быть установлен уже даже из коробки. Если нет, его можно скачать с официального сайта и, распаковав архив с исходниками, собрать их самостоятельно.
user@linux:~$ wget ftp://ftp.fvwm.org/pub/fvwm/version-2/fvwm-2.6.5.tar.bz2 user@linux:~$ tar xf fvwm-2.6.5.tar.bz2 user@linux:~$ cd fvwm-2.6.5 user@linux:~/fvwm-2.6.5$ ./configure && make user@linux:~/fvwm-2.6.5$ su -c "make install"
Последняя команда, кхм, смотрите сами, но если в вашем дистрибутиве нет пакетного менеджера…
После чего можно запустить еще одни иксы по соседству, но уже с FVWM.
xinit fvwm -- :1
Конфигурационный файл ~/.fvwm/config
по умолчанию сам не создается, поэтому:
user@linux:~$ mkdir ~/.fvwm user@linux:~$ touch ~/.fvwm/config
Первое впечатление
Вы получаете чистый экран с малофункциональной менюшкой по клику в любом месте рабочего стола. С нуля, если вы не используете Debian и стандартный эмулятор терминала xterm — вы вообще вряд ли чего сможете запустить в fvwm. Чтобы такого не произошло, запишем первую строку в конфигурационный файл, чтобы по нажатию определенных клавиш запускался терминал, откуда затем мы уже сможем запустить что угодно.
Для этого добавим в ~/.fvwm/config строку: Key Return A CM Exec urxvt
В данном случае: (Key) по нажатию клавиши (Return) Enter (A) в любом контексте, будь то рабочий стол или активное окно (CM) с зажатыми клавишами Ctrl и Meta (Alt) следует запустить программу (urxvt).
То есть, перезапускаем FVWM с одной такой строкой в конфиге, и теперь по нажатию Ctrl + Alt + Enter мы запустим нужный нам эмулятор терминала.
Глядя на декорации окон, кто-то пустит скупую слезу по былым временам и предастся ностальгии, а кто-то в ужасе закроет FVWM и больше никогда его не запустит. На время нашего первого знакомства с FVWM предлагаю отключить декорации окон совсем, чтобы они вас не отвлекали.
Добавим еще строку Style * !Title, !Handles, !Borders
В данном случае: (Style) командой по управлению внешним видом и поведением (*) всем окнам (!) отключим (Title) заголовок, (Handles) элементы управления по бокам окна (Borders) и однопиксельную рамку.
Получилось минималистично, но уже не так ужасно. И просто для того, чтобы данным оконным менеджером можно было пользоваться, соберем минимально необходимую, но удобную для того конфигурацию.
DesktopSize 3x1 DestroyFunc FuncFvwmRaiseLowerX AddToFunc FuncFvwmRaiseLowerX + I Raise + M $0 + D Lower Key Return A CM Exec urxvt Key Delete W CM Close Key Insert W CM RaiseLower Key BackSpace A CM Restart Key 1 A CM GotoPage 0 0 Key 2 A CM GotoPage 1 0 Key 3 A CM GotoPage 2 0 Key x W CM Maximize Mouse 1 R A Menu MenuFvwmWindowOps Mouse 2 R A WindowList NoDeskSort Mouse 3 R A Menu MenuFvwmRoot Mouse 1 T A FuncFvwmRaiseLowerX "Move" Mouse 1 FS A FuncFvwmRaiseLowerX "Resize" Mouse 1 W M FuncFvwmRaiseLowerX "Move" Mouse 2 W M Lower Mouse 2 FST A Lower Mouse 3 WFS M FuncFvwmRaiseLowerX "Resize" Style * !Title, !Handles, !Borders Style URxvt PositionPlacement UnderMouse
Будет создан один рабочий стол с тремя «страницами» по горизонтали, между ними можно переключаться подведя мышку к краю экрана.
Горячие клавиши:
Ctrl + Alt + Enter — запустит терминал urxvt (измените название терминала, если необходимо);
Ctrl + Alt + Delete — закроет активное окно;
Ctrl + Alt + Insert — переключает фокус между окнами и выводит следующее окно на передний план;
Ctrl + Alt + BackSpace — перезапустит FVWM (необходимо при редактировании конфигурационного файла);
Ctrl + Alt + X — развернет окно на весь экран, при повторном нажатии восстановит его обратно;
Ctrl + Alt + 1, 2, 3 — переключает страницы (1, 2, или 3 соответственно);
(Shift +) Alt + Tab — встроенные клавиши для переключения между окнами.
В случае, если вы решили не отключать декорации окон — мышкой вы можете управлять окнами, таская их за декорации, иначе, зажав клавишу Meta (Alt), левой кнопкой мышки вы перемещаете окно, средней (колесиком, либо двойным кликом левой) переключаете фокус между окнами, а правой изменяете размер окна.
Окно терминала будет создаваться отцентрованным прямо под курсором мышки — это удобно, чтобы окно открывалось сразу в фокусе и в терминале вы могли начать печатать… Не понимаю я тех, кто создает иконки для терминала в различных тулбарах: приходится мышевозить, чтобы затем снова переключиться на клавиатуру. 🙂
И таким образом, на первых порах, мы получили классический оконный менеджер, который предоставляет весь необходимый минимум в управлении окнами.
Особенности поведения
У каждого оконного менеджера имеются свои особенности поведения (как задумали их авторы), и в большинстве они вшиты в исходный код. Меняя оконные менеджеры, вам приходится привыкать к новому поведению окон и прочим мелочам, которые могут казаться непривычными или даже раздражать, но в FVWM все настраиваемо.
Тем не менее, FVWM не стал исключением и по умолчанию имеет свой ряд особенностей «из коробки».
Инициализация
Имеется ряд встроенных функций для последующего автовыполнения команд, таких, как InitFunction, SessionInitFunction, StartFunction, SessionStartFunction, RestartFunction, SessionRestartFunction и ExitFunction.
Однако двух функций с последующей проверкой условий вполне достаточно.
DestroyFunc StartFunction AddToFunc StartFunction + I Test (Init) PipeRead 'test -d "/tmp/fvwm-$[UID]" || mkdir "/tmp/fvwm-$[UID]"; echo Nop' + I Test (Init) PipeRead 'xsetroot -solid "#400040"; echo Nop' DestroyFunc ExitFunction AddToFunc ExitFunction + I Test (Quit) PipeRead 'rm --force --recursive "/tmp/fvwm-$[UID]"; echo Nop'
Здесь командой Test мы проверяем, что сейчас конкретно происходит, и при запуске, в зависимости от выполненного условия, создадим временную директорию для FVWM (необязательно, просто она нам еще пригодится), установим обои (фон) на рабочий стол. При закрытии FVWM удалим временную директорию со всем содержимым.
Автофокус окна
Представим, что вы используете все виртуальные рабочие столы в количестве 4 294 967 294 штук (да, такое их количество возможно создать в FVWM), на каждом из которых крутятся какие-то приложения, и вот одно из них «позвало вас к себе» — когда, например, вас хайлайтнули (обратились к вашему нику) в чате. Среди такого зоопарка окон трудно найти нужное, а если это был просто «бип» спикером? Сиди, гадай, что за окно может бибикать и по какой причине.
В FVWM было решено мгновенно переключаться на такое окно, и это удобно, но может раздражать, если вы в это время писали код, а какое-то надоедливое окно вас отвлекает автофокусом на него.
Так вот, когда такое окно «звенит», вызывается встроенная функция UrgencyFunc, и когда оно перестает «звенеть», вызывается UrgencyDoneFunc. По умолчанию функции выглядят следующим образом:
AddToFunc UrgencyFunc + I Iconify off + I FlipFocus NoWarp + I Raise AddToFunc UrgencyDoneFunc + I Nop
И понятное дело, вы можете их переопределить. К примеру, наделать всплывающих уведомлений где-либо с наименованием окна, которое вас «позвало»… Все же удобнее и проще будет просто их удалить, и более «хайлайт в чатах» вас не будет отвлекать (в прямом смысле).
DestroyFunc UrgencyFunc DestroyFunc UrgencyDoneFunc
Еще один момент, когда, помимо звенящих окон, стандарт EWMH требует активации окна, и схож он с предыдущей функцией, но называется EWMHActivateWindowFunc:
AddToFunc EWMHActivateWindowFunc + I Iconify off + I Focus NoWarp + I Raise
Ее мы также удаляем, если вам совсем-совсем не хочется отвлекаться на требующие к себе внимания окна.
DestroyFunc EWMHActivateWindowFunc
Shift + Alt + Tab, Alt + Tab
Как и во многих других оконных менеджерах, данные горячие клавиши переключают окна, по умолчанию вызывая меню со списком окон. Не всех может устраивать такое поведение, поэтому для «тихого» переключения между окнами предлагаю переопределить их на свои функции.
DestroyFunc FuncFvwmNextWindow AddToFunc FuncFvwmNextWindow + I Next (CurrentPage, !Iconic, AcceptsFocus) FlipFocus NoWarp + I Current Raise DestroyFunc FuncFvwmPrevWindow AddToFunc FuncFvwmPrevWindow + I Prev (CurrentPage, !Iconic, AcceptsFocus) Focus NoWarp + I Current Raise Key Tab A M FuncFvwmNextWindow Key Tab A SM FuncFvwmPrevWindow
Таким образом, курсор мышки не будет скакать от окна к окну, а фокус между окнами переключается без всяких меню.
Меню
Есть два вида меню — обычное (скажем, для запуска программ или выполнения каких-то действий) по умолчанию называется MenuFvwmRoot, и меню со списком всех окон, которое вызывается функцией WindowList.
Если по заголовку меню кликнуть средней кнопкой мыши (колесиком), то меню превратится в обычное окно fvwm_menu, и для него также можно установить отдельные стили:
Style fvwm_menu Title, Handles, Borders Style fvwm_menu UsePPosition
WindowList вызывается по клику мышкой на рабочем столе, либо встроенными горячими клавишами Alt + Tab (чтобы переключить следующее окно) и/или Shift + Alt + Tab (для переключения на предыдущее окно).
Когда вы выбираете пункт в этом меню, вызывается функция WindowListFunc, по умолчанию выполняющая следующее:
AddToFunc WindowListFunc + I Iconify off + I FlipFocus NoWarp + I Raise
Можете переопределить ее по своему усмотрению.
Иконки приложений
Обычно графические приложения уже имеют свои иконки, установленные в /usr/share/icons/hicolor
, но в большинстве случаев вам придется задавать иконки приложениям вручную, если вы хотите использовать какие-то «темы» иконок.
Для удобства задаем ImagePath /usr/share/icons/Tango:+
, где FVWM будет искать картинки.
И теперь к каждому приложению задаем иконки.
Style * Icon "48x48/mimetypes/application-x-executable.png", MiniIcon "22x22/mimetypes/application-x-executable.png" Style URxvt Icon "48x48/apps/utilities-terminal.png", MiniIcon "22x22/apps/utilities-terminal.png" Style Firefox Icon "48x48/apps/internet-web-browser.png", MiniIcon "22x22/apps/internet-web-browser.png", IconOverride, EWMHMiniIconOverride Style MPlayer Icon "48x48/apps/mplayer.png", MiniIcon "22x22/apps/mplayer.png" Style Thunar Icon "48x48/apps/system-file-manager.png", MiniIcon "22x22/apps/system-file-manager.png" Style Leafpad Icon "48x48/apps/accessories-text-editor.png", MiniIcon "22x22/apps/accessories-text-editor.png", IconOverride, EWMHMiniIconOverride Style Deadbeef Icon "48x48/apps/audioplayer.png", MiniIcon "22x22/apps/audioplayer.png", IconOverride, EWMHMiniIconOverride
Обратите внимание, что многие графические приложения требуют дополнительные параметры IconOverride и EWMHMiniIconOverride, чтобы переписать их иконки.
Свернутые окна
Сворачиваемые окна становятся иконками на рабочем столе, по клику на которые разворачиваются обратно в окно. Если вы хотите отключить такие иконки, то тогда установите следующий параметр:
Style * NoIcon
При этом прежде у окон не должны быть заданы какие-либо иконки (Icon, MiniIcon), и теперь свернутые окна не будут видны на рабочем столе, а доступны лишь через какой-либо список окон (всевозможные TaskBar’ы, либо меню WindowList).
Выполнить…
Если у вас установлен эмулятор терминала rxvt-unicode (urxvt), то мы можем использовать его отдельно для запуска приложений.
DestroyFunc FuncFvwmRun AddToFunc FuncFvwmRun + I PipeRead 'test -a "/tmp/fvwm-$[UID]/!PS1" || echo "PS1=" > /tmp/fvwm-$[UID]/!PS1; urxvtc -geometry 50x1+30-30 \ -name fvwm_run --keysym.0xFF0D " &\\nexit\\n" -fn "9x15bold" +sb -e bash --init-file "/tmp/fvwm-$[UID]/!PS1"' Key r A CM FuncFvwmRun Style fvwm_run !Title, !Handles, Borders Style fvwm_run !Iconifiable, !Maximizable, FixedPosition, FixedSize Style fvwm_run GrabFocus
По нажатию Ctrl + Alt + R в левом нижнем углу у вас появится urxvt, если что-нибудь ввести и нажать Enter — оно запустится, а urxvt закроется.
Полноэкранный режим
Может быть удобным при развертывании окна на весь экран отключать его декорации и фиксировать (ни свернуть, ни развернуть, ни поменять размер или положение окна), и тем же методом восстанавливать окно в обычное состояние.
DestroyFunc FuncFvwmMaximize AddToFunc FuncFvwmMaximize + I ThisWindow (Maximized) DestroyWindowStyle + I TestRc (NoMatch) ThisWindow (!Maximized) WindowStyle !Title, !Handles, !Borders + I UpdateStyles + I ThisWindow (Maximized) Maximize + I TestRc (NoMatch) Maximize ewmhiwa 100 100 + I TestRc (NoMatch) WindowStyle !Iconifiable, !Maximizable, FixedPosition, FixedSize + I TestRc (NoMatch) UpdateStyles Key x A CM FuncFvwmMaximize
Делаем это клавишами Ctrl + Alt + X.
Миниатюры окон
По умолчанию окна сворачиваются в небольшие иконки приложений на рабочем столе. С помощью пакетов imagemagick и xorg-xwd возможно сделать так, чтобы предварительно делался скриншот сворачиваемого окна, а затем задавался как иконка.
DestroyFunc FuncFvwmThumbnail AddToFunc FuncFvwmThumbnail + I Raise + I InfostoreAdd Icon-$[w.id] $[w.iconfile] + I PipeRead 'xwd -silent -id $[w.id] | convert -scale 128 -quality 0 xwd:- png:- | composite -gravity SouthEast $[w.iconfile] - /tmp/fvwm-$[UID]/Icon-$[w.id].png && echo WindowStyle Icon "/tmp/fvwm-$[UID]/Icon-$[w.id].png" || echo Nop' DestroyFunc FuncFvwmDeThumbnail AddToFunc FuncFvwmDeThumbnail + I PipeRead 'echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]' + I InfostoreRemove Icon-$[w.id] + I PipeRead 'rm --force "/tmp/fvwm-$[UID]/Icon-$[w.id].png"' DestroyFunc FuncFvwmIconify AddToFunc FuncFvwmIconify + I ThisWindow (!Shaded, Iconifiable, !Iconic) FuncFvwmThumbnail + I ThisWindow (Iconic) FuncFvwmDeThumbnail + I Iconify + I All (CurrentPage, Iconic) PlaceAgain Icon Key z W CM FuncFvwmIconify Mouse 1 I M FuncFvwmRaiseLowerX "Move" Mouse 1 I A FuncFvwmIconify Mouse 2 I M Lower Mouse 3 I A Menu MenuFvwmWindowOps Style * IconFont "Shadow=0 0 BottomRight:StringEncoding=UTF-8:xft:Sans:Medium:Roman:size=8:minspace=False;fixed" Style * IconBox screen w 0 0 -0 -0, IconFill left bottom
По нажатию Ctrl + Alt + Z окно свернется в небольшую миниатюру в левом нижнем углу, а по клику по ней развернется обратно.
FVWM в действии
ссылка на оригинал статьи http://habrahabr.ru/post/169631/
Добавить комментарий