Первые шаги с FVWM

в 7:10, , рубрики: fvwm, Графические оболочки, метки:

За долгое время использования FVWM накопились мысли, которыми теперь хочу поделиться с будущими пользователями данного оконного менеджера.

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 в действии

// В данный момент видео по неизвестной причине не отображается,
// ссылка на видео: www.youtube.com/watch?v=8PLfzEaGc5s

Автор: Spoofing

Источник

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


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