Back to the F(?)VWM

от автора

Я пользуюсь компьютером с 1994 года, — MS-DOS, Windows 95, 98, XP…
С выходом Vista поплевался и стал надеяться, что следующая версия Windows не станет очередной глянцевой порнографией; но да, к официальному релизу Windows 7 уже пересел на Linux, — к уютному, квадратному интерфейсу девяностых.

image
(Windows XP на последний момент перед переходом на Linux)

Важно, чтобы оформление было не просто красивым с точки зрения обывателя (какими шаблонно лепят Windows 7, Linux {Ubuntu,Mint}, Mac OS X), а впервую очередь оно нравилось мне, так как в своей среде комфортнее работать и повышается производительность.

image
(evilwm)

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

Почитав историю развития Linux, базовых утилит, и уже жалея, что потратил
десяток лет сидя за Windows, решил для себя начать изучение Linux’а с самого
его начала.
Первым появившимся на свет оконным менеджером стал TWM, который с позволения его автора начали включать по-умолчанию в поставку с X.Org, но на тот момент многих пользователей не устраивало, что TWM расходует слишком много системных ресурсов. Автор rvxt решил разобраться в коде и выпустил форк — F(?)VWM (со временем значение буквы F было утеряно), который не прекращал своего развития и вырос в огромный проект.

image
(Мой первый FVWM, — да, это FVWM, не Gnome 2)

То, что FVWM поддерживает все стандарты (EWMH, ICCCM-2, GNOME) управления окнами — уже по-умолчанию делает его полноценным оконным менеджером.

┌─[myhost ~] └─╼ pmap $(pgrep fvwm) | grep total  total     8932K

Он потребляет мало системных ресурсов, в отличии от, и можно сделать еще меньше, если отключить %ненужно% (см. выхлоп pmap) в опциях ./configure. Почему современные DE расходуют память сотнями Мбайт? К ним прикрутили прозрачность, добавили тени, закругленные декорации? FVWM же не привязан ко времени, — да, у него уродливые декорации окон из коробки, но все настраиваемо.

В FVWM есть все, — логика любых свистелок-перделок пишется на Bash и прикручиваются к интерфейсу FVWM, так что любой мало-мальски продвинутый пользователь в состоянии что-нибудь да реализовать. Грубо говоря, мягко выражаясь, FVWM — это как Emacs в мире WM, в котором вы самостоятельно, вкупе с Bash, встроенными модулями и скриптинговым движком можете реализовать любые элементы интерфейса.

Перед первым запуском FVWM следует создать конфиг, в котором потом вы будете описывать все настройки и правила управления окнами, создавать свои функции, меню, декорации и прочие элементы интерфейса.
mkdir ~/.fvwm && touch ~/.fvwm/config, но конфигурация предоставляемая из коробки отпугнет любого пользователя.

Для начала освоения подойдет упрощенная evilwm-конфигурация:

Скрытый текст

DesktopSize 3x1 EdgeThickness 0  HideGeometryWindow Always  OpaqueMoveSize 0 MoveThreshold 0  DestroyFunc Click1 AddToFunc Click1 + I Raise + M Move  DestroyFunc Click2 AddToFunc Click2 + I Lower  DestroyFunc Click3 AddToFunc Click3 + M Resize  Mouse 1 R A - Mouse 2 R A - Mouse 3 R A -  Mouse 1 W M Click1 Mouse 2 W M Click2 Mouse 3 W M Click3  Key Return A CM Exec urxvt Key Delete W CM Close Key Insert W CM RaiseLower Key Tab A M WindowList Root c c NoCurrentDeskTitle Key BackSpace A CM Restart  Key x W CM Maximize  Key 1 A CM GotoPage 0 0 Key 2 A CM GotoPage 1 0 Key 3 A CM GotoPage 2 0  Style * !Title, !Handles, !Borders Style * !UsePPosition, PositionPlacement UnderMouse, SloppyFocus

Где у окон напрочь отсутствуют декорации, фокусируются окна при наведении на них мышкой, и появляются все новые окна отцентрованными ровно под курсором мышки.

Горячая мышка:
Alt + Левая кнопка мыши — перемещает окно;
Alt + Средняя кнопка мыши — переключает окно;
Alt + Правая кнопка мыши — изменяет размер окна.

И горячие клавиши:
Ctrl + Alt + Enter — откроет терминал Rxvt-Unicode;
Ctrl + Alt + Delete — закрывает активное окно;
Ctrl + Alt + Tab, Insert — переключают между окнами;
Ctrl + Alt + x — развернет окно на весь экран и восстановит обратно;
Ctrl + Alt + 1, 2, 3 — переключают между тремя рабочими столами;
Ctrl + Alt + BackSpace — перезапускает FVWM (для обновления конфигурации, если вы внесли изменения)

Казалось бы, что еще нужно для управления окнами? Удобно и имеется весь необходимый минимум. Я с подобной конфигурацией за evilwm просидел целый год.
Получив мало-мальски удобный в управлении оконный менеджер теперь можно обвешивать его рюшечками, — поговорим о вкусном.

Чтобы не запоминать, какие окна на каком рабочем столе находятся, подключим FvwmPager (в правый нижний угол):

image

Скрытый текст

Style Fvwm* !Title, !Handles, !Borders, !Iconifiable, NeverFocus, WindowListSkip, CirculateSkip, CirculateSkipIcon Style Fvwm* Sticky, StaysOnBottom, FixedPosition, FixedSize  DestroyFunc StartFunction AddToFunc StartFunction + I Module FvwmPager *  DestroyModuleConfig FvwmPager: * *FvwmPager: Geometry -0-0 *FvwmPager: SmallFont 5x7 *FvwmPager: WindowLabelFormat %c

Чтобы на каждую программу не запускать терминал, — не выполнять заклинания навроде [Ctrl + Alt + Enter]firefox &[Ctrl + D], нарисуем панель быстрого
запуска, используя модуль FvwmButtons.

Скрытый текст

ImagePath /usr/share/icons/gnome/:+  CleanupColorsets Colorset 0 RootTransparent  Style Fvwm* !Title, !Handles, !Borders, !Iconifiable, NeverFocus, WindowListSkip, CirculateSkip, CirculateSkipIcon Style Fvwm* Sticky, StaysOnBottom, FixedPosition, FixedSize  DestroyFunc StartFunction AddToFunc StartFunction + I Module FvwmButtons FvwmDock  DestroyModuleConfig FvwmDock: * *FvwmDock: Geometry +0-0 *FvwmDock: Rows 1 *FvwmDock: Padding 0 0 *FvwmDock: Frame 0 *FvwmDock: Colorset 0 *FvwmDock: (Icon "32x32/apps/utilities-terminal.png", ActiveIcon "48x48/apps/utilities-terminal.png", Action (Mouse 1) "Exec urxvtc") *FvwmDock: (Icon "32x32/apps/internet-web-browser.png", ActiveIcon "48x48/apps/internet-web-browser.png", Action (Mouse 1) "Exec firefox") *FvwmDock: (Icon "32x32/apps/phone.png", ActiveIcon "48x48/apps/phone.png", Action (Mouse 1) "Exec skype") *FvwmDock: (Icon "32x32/apps/wine.png", ActiveIcon "48x48/apps/wine.png", Action (Mouse 1) "Exec wine")

image

И при наведении на иконку она будет увеличиваться в размерах, с 32×32 до 48×48 пикселей (почти прям как в Mac OS X).

image

Для полного счастья и создания полнофункционального рабочего окружения нам нехватает разве что TaskBar’а, — попробуем сотворить что-нибудь нескучное, подобное TaskBar’у в Windows 7, чтобы отображались миниатюры окон.
В стиле UNIX-way, использовать мы будем сторонние утилиты, поэтому понадобятся пакеты xorg-xwd и imagemagick.

Скрытый текст

DestroyFunc StartFunction AddToFunc StartFunction + I Test (Init) PipeRead "test -d \"/tmp/fvwm-$[UID]\" || mkdir \"/tmp/fvwm-$[UID]\"; echo Nop" + I Test (Init) PipeRead "fvwm-root --retain-pixmap \"$[HOME]/Desktop/Wallpapers/#400040.png\"; echo Nop"  DestroyFunc ExitFunction AddToFunc ExitFunction + I Test (Quit) PipeRead "rm --force --recursive \"/tmp/fvwm-$[UID]\"; echo Nop"  DestroyFunc FuncFvwmThumbnail AddToFunc FuncFvwmThumbnail + I SetEnv Icon-$[w.id] $[w.iconfile] + I Raise + I PipeRead "xwd -silent -id $[w.id] | convert -scale 192 -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\", IconOverride"  DestroyFunc FuncFvwmDeThumbnail AddToFunc FuncFvwmDeThumbnail + I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\], NoActiveIconOverride" + I UnsetEnv Icon-$[w.id] + I PipeRead "rm --force \"/tmp/fvwm-$[UID]/Icon-$[w.id].png\"; echo Nop"  DestroyFunc FuncFvwmIconify AddToFunc FuncFvwmIconify + I ThisWindow (!Shaded, Iconifiable, !Iconic) FuncFvwmThumbnail + I ThisWindow (Iconic) FuncFvwmDeThumbnail + I Iconify + I All (CurrentPage, Iconic) PlaceAgain Icon  Style * !IconTitle, IconBackgroundRelief 0, IconBackgroundPadding 0, IconBackgroundColorset 0 Style * IconBox 0 0 -0 -0, IconGrid 1 1, IconFill Left Bottom  Mouse 1 I A FuncFvwmIconify Mouse 2 I A - Mouse 3 I A -  Key z W CM FuncFvwmIconify

При нажатии Ctrl + Alt + Z (подобно как Ctrl + Z в командной оболочке) окно свернется в миниатюру, а при клике по ней развернется обратно.

image

Cлепив все вместе — мы получим вполне себе комфортное рабочее окружение.

image

Таков FVWM, в котором из ничего, из уже готовых деталей — можно слепить что угодно. В данный момент я занимаюсь полноценной реализацией TaskBar’а из Windows 7 на чистом FVWM. И без пошлого глянца by-design.

Меня полностью устраивают окна без декораций, — не понимаю зачем они вообще
нужны, когда функции по управлению окнами можно повешать на горячие клавиши, или максимум на жесты мышкой. «Что вы как неандертальцы, с машиной вместо нормального текста — жестами общаетесь?» ©

Если вы все-же станете использовать декорации окон, то вам, как и мне, может
быть удобно отключать декорации окон при их развертывании на весь экран
(особенно, если у вас маленькое разрешение).

Скрытый текст

DestroyFunc Fullscreen AddToFunc Fullscreen + I ThisWindow (Maximized) DestroyWindowStyle + I TestRc (NoMatch) ThisWindow (!Maximized) WindowStyle !Title, !Handles, !Borders, ResizeHintOverride, !Iconifiable, FixedPosition, FixedSize + I UpdateStyles + I ThisWindow (Maximized) Maximize + I TestRc (NoMatch) Maximize ewmhiwa 100 100

Просто замените везде функцию Maximize на Fullscreen, и теперь у окон будут отключаться декорации и они даже будут игнорировать стандарт EWMH, чтобы разввернуться на весь(!) экран целиком.

Если у вас остались какие-то идеи для реализации нескучных фич, — вы можете описать их в комментариях, и я бы их с радостью реализовал в FVWM.
Ну и просто, спрашивайте ответы.

ссылка на оригинал статьи http://habrahabr.ru/post/161937/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *