Back to the F(?)VWM

в 6:13, , рубрики: fvwm, linux, Дизайн в IT, интерфейсы, пользовательские интерфейсы, метки: ,

Я пользуюсь компьютером с 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

И при наведении на иконку она будет увеличиваться в размерах, с 32x32 до 48x48 пикселей (почти прям как в 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.
Ну и просто, спрашивайте ответы.

Автор: Spoofing

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js