IntroТем, кому, как и мне, openbox начинает казаться скучным, негибким и недостойным истинного адепта красноглазия и ручной правки конфигов (при том, что я лично очень люблю openbox и в основном пользуюсь именно им), предлагаю попробовать FVWM - оконный менеджер, в котором пользователь может (и должен, бугага) настроить каждую мелочь сообразно своим представлениям об удобстве и красоте.
Средствами fvwm можно реализовать такие вещи, как pipe и tear-off меню, виртуальные рабочие столы, настроить поведение окон индивидуально для каждой программы гораздо более гибко, чем позволяет /скверно документированный и глючный/ devilspie, создать док - пусть не awn, но нечто вполне юзабельное и быстрое, переставить декорации окон с верхнего края на правый, строить невообразимые комбайны при помощи fvwm buttons, возможно, даже осуществить захват Вселенной. По увлекательности настройка fvwm превосходит копипастинг разных ништяков в ~/.conkyrc и прикручивание пяти (или шести, не помню) реально работающих pipe-меню-скриптов в ~/.config/openbox/menu.xml, просмотр "Теории большого взрыва", а также работу, пьянство и иногда даже секс.
Собственно, fvwm "из коробки" - это среда для построения собственного wm, позволяющая определить поведение всех окон и их элементов, меню, субмен- ю, рабочих столов, сочетаний клавиш и кнопок мыши самостоятельно. Настройки живут в /.fvwm/.fvwm2rc.
Этот пост - компиляция из
руководства по FVWM для начинающих, весьма подробного и пространного man fvwm,
FVWM FAQ и разных находок с форумов.
Существует "de на базе fvwm" - fvwm-crystal, оно есть в репозитариях и желающие могут попробовать, но лично мне интереснее разбираться с нуля.
Извиняюсь за стиль изложения. Приглашаю специалистов по fvwm делиться наработками, а всех остальных - идеями.
Буду дописывать по мере готовности отдельными постами и, возможно, переносить что-то в wiki, не обещаю, что быстро, но тем не менее. Привожу только то, что хотя бы приблизительно понимаю и пробовал сам, за теоретией - в man, он действительно очень подробный.
В конце каждого поста, где описываются те или иные танцы с бубном буду вешать пару спойлеров - со скриншотом результата и промежуточной редакцией файла конфигурации.
Итак.
УстановкаУстанавливается fvwm не просто, а очень просто: sudo apt-get install fvwm, после завершения установки в gdm/kdm можно выбирать сессию fvwm точно так же, как сессию любого другого de/wm.
Минимальное обустройствоДефолтный fvwm изрядно напоминает голый X11 без виндоуменеджера или, скажем, свежеустановленный на archlinux openbox, безвиден и пуст, и курсор носится над чёрным экраном.
Для того, чтобы более-менее сносно существовать в любом окружении, нужен трей (чтобы поселить туда nm-applet, fbxkb, eee-control-tray /невозможно печатать при включенном тачпаде/ и прочее по вкусу), а также средство для запуска браузера и терминала. Политика фокуса окон тоже диковата, и я предпочитаю сменить её на нечто более привычное. Для наглядности нужно будет делать скриншоты, поэтому на PrtSc для начала прикручу scrot.
Создаём файл конфигурации, который fvwm будет читать при каждой загрузке и в котором определяются все аспекты его работы:
gedit ~/.fvwm/.fvwm2rc
Код можно вставлять прямо в файл конфигурации, по ходу повествования буду возвращаться к той или иной секции файла и дописывать в неё необходимое. Сначала - самое нужное на первое время, все красивости - позже.
Jaimos F Skriletz, автор вышеупомянутого руководства по fvwm, рекомендует хранить всё, что будет связано с fvwm, в отдельной папке (~/.fvwm) и начать файл конфигурации с
задания переменных окружения. (Ахтунг! Несколько абзацев бесполезных инструкций!)
От себя рекомендую тщательно всё комментировать, чтобы через неделю не вспоминать, что значат эти закорюки.
#ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
# Директории
SetEnv fvwm_img $[FVWM_USERDIR]/images
SetEnv fvwm_icon $[FVWM_USERDIR]/icons
SetEnv fvwm_scrpt $[FVWM_USERDIR]/.scripts
SetEnv fvwm_wallpapers $[FVWM_USERDIR]/images/walls
Здесь заданы пути к папкам с иконками, скриптами и обоями. НО! По каким-то таинственным причинам текущий убунтовский bash плюётся на переменные окружения fvwm, так что эта секция - больше для красоты. Задавая пути к иконкам, обоям и элементам декорации окон, я буду указывать _полный путь к файлу_, это прекрасно работает.
Определим несколько предпочитаемых приложений:
#Приложения по умолчанию
SetEnv fvwm_webbrowser /usr/bin/firefox
SetEnv fvwm_term /usr/bin/gnome-terminal
Определим Image Path - объясним fvwm, где искать изображения для иконок, обоев и прочего:
#Image path
ImagePath $[fvwm_icon]:$[fvwm_icon];.png:$[fvwm_wallpapers]:+
Как видим, это ссылки на переменные окружения, $[fvwm_icon];.png добавлено для того, чтобы отображались иконки в формате png.
Вышеописанное не работает с текущей версией убунты, так что секции я оставляю, но везде, где будет нужно что-то вызвать, буду вместо переменных окружения использовать полные пути к файлам! Определим количество и размеры виртуальных рабочих столов. FVWM позволяет задать произвольное количество рабочих столов, размером m на n страниц каждый, размер страницы в пикселях равен текущему разрешению экрана и присвоить им имена.
Создаём два виртуальных рабочих стола, по две страницы в высоту и по одной в ширину, с именами First и Second.
#ВИРТУАЛЬНЫЕ РАБОЧИЕ СТОЛЫ
#Количество, размеры и имена
DesktopSize 1x2
DesktopName 0 First
DesktopName 1 Second
Определяем переключение между рабочими столами - область экрана, при попадании курсора на которую будет происходить прокрутка (ширина в пикселях, EdgeThickness), часть ширины/высоты экрана, на которую будет производиться прокрутка (в процентах длины/ширины экрана, EdgeScroll) и время, которое курсор должен провести в области прокрутки, чтобы произошло переключение (EdgeResistance).
Те, кому не нравится концепция "страниц", могут задать размер виртуального рабочего стола 1x1. Те, кому не нравится прокрутка, могут задать EdgeScroll 0 0 или Edge Thickness 0
#Переключение между рабочими столами и страницами
EdgeScroll 100 100
EdgeResistance 150 150
EdgeThickness 1
Дрессировка мыши. Пропишем, что считать кликом, а что - удержанием и начиная с какого сдвига осуществлять передвижение элемента. Это очень важные опции, и каждый может методом проб и ошибок определить удобные для себя значения.
#НАСТРОЙКИ МЫШИ
ClickTime 350
MoveThreshold 1
ClickTime - количество миллисекунд между нажатием и освобождением кнопки мыши, в которые нужно уложиться, чтобы произвести клик, более длительное время будет расцениваться как удержание. MoveThreshold 3 означает, что FVWM будет считать сдвигом перемещение удерживаемого элемента более, чем на один пиксель.
Первоначальная настройка фокуса. Для того, чтобы окна получали фокус и выдвигались на передний план более-менее привычным образом, зададим пока следующую политику фокуса:
Style * FPClickToFocus, FPClickDecorToFocus, FPClickIconToFocus, MouseFocusClickRaises
Style (стиль) используется в FVWM для определения разных аспектов поведения wm, в данном случае мы задаём стиль для всех окон (*), касающийся присвоения фокуса и выдвижения окна на передний план. FPClickToFocus, FPClickDecorToFocus, FPClickIconToFocus определяют, что при щелчке по внутренности окна, его декорации или иконке окно получает фокус, MouseFocusClickRaises определяет, что окно, "сфокусированное" мышкой, перекрывает все остальные.
В man описано несколько десятков моделей фокуса по всем мыслимым и немыслимым признакам, и в дальнейшем какие-то из них могут пригодиться, например, для того же терминала в качестве обоев, трея или чего-то ещё, но в рамках начальной настройки я их не рассматриваю.
Автостарт приложений и немного о функциях. Как уже было сказано, находиться в дефолтном FVWM - сомнительное удовольствие. Для того, чтобы работать над настройкой FWVM из самого FVWM, необходимо добавить несколько вещей в автозапуск, это делается посредством функций.
В самом общем виде функция выглядит так:
# DestroyFunc FuncName
# AddToFunc FuncName
# + I (Немедленно выполняемое действие)
# + C (Действие, выполняемое по клику)
# + D (Действие, выполняемое по дабл-клику)
# + H (Действие, выполняемое при удержании)
# + M (Действие, выполняемое при перетаскивании)
Задание функции начинается с "очистки" функции от всего, что по тем или иным причинам может в неё попасть до того, как мы её определим, DestroyFunc FuncName - очистка функции FuncName. После этого начинается собственно задание функции: AddToFunc FuncName - добавление действий. В соответствующем разделе man и в
здесь можно найти более подробные сведения о функциях, их параметрах и прочем, сейчас же я просто пропишу в автозапуск нужные на первое время приложения.
#АВТОЗАПУСК
DestroyFunc StartFunction
AddToFunc StartFunction
+ I Module FvwmTaskBar
+ I Module FvwmPager 0 2
DestroyFunc InitFunction
AddToFunc InitFunction
+ I Exec exec stalonetray --sticky --window-type normal --window-layer bottom --transparent --skip-taskbar --grow-gravity E --icon-gravity E --geometry 124x24+900-0 &
+ I Exec exec nm-applet &
+ I Exec exec gnome-power-manager &
+ I Exec exec eee-control-tray &
+ I Exec exec fbxkb &
Про Start/Restart/InitFunction разъясняется понятно уже где, здесь, традиционно, практическое применение. Когда разберусь с теорией, распишу подробнее с конкретными примерами, а пока в автозапуск на Start прописаны таскбар и пэйджер - внутренние модули FWVM, поэтому вызываются командой Module, и сторонние приложения - stalonetray, который есть в репозитарии, с нужными мне ключами, nm-applet, gnome-power-manager, fbxkb для переключения раскладок и eee-control-tray - sine qua non для работы на EEEPC.
Пара кейбиндингов. Хорошее разъяснение про кейбиндинги -
здесь, и я обязательно к нему вернусь, а пока просто назначу ctrl+f2 для gmrun и PrtSc для scrot и сделаю пару пояснений.
#КЕЙБИНДИНГИ
Key F2 A C Exec exec gmrun
Key Print A N Exec exec scrot
Примерно такие области выделяет на десктопе FVWM.
Расшифровка:
R - root window
I - иконка
F - углы декорации окна
S - стороны декорации окна
T - заголовок окна
W - окно приложения
0-9 - кнопки
Любое место на десктопе - A
Описание комбинации клавиш начинается с Key, кнопок мыши - с Mouse и имеет вид Key(или Mouse) Клавиша (или кнопка) Контекст (см. иллюстрацию с расшифровкой) Модификатор (A)ny, (C)ontrol, (S)hift, (M)eta, (N)othing или несколько модификаторов Действие.
Таким образом, вышеприведённый код значит, что при нажатии клавиши (Key) F2 (F2) в любом контексте (A) с модификатором ctrl (C) выполнится команда gmrun, при нажатии клавиши Print в любом контексте без модификатора выполнится команда scrot.
Получается вот что:
###############
#tartan's fvwm#
#config file #
###############
#ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
#Директории
SetEnv fvwm_img /home/tartan/.fvwm/images
SetEnv fvwm_icon /home/tartan/.fvwm/icons
SetEnv fvwm_scrpt /home/tartan/.fvwm/.scripts
SetEnv fvwm_wallpapers /home/tartan/.fvwm/images/walls
#Приложения по умолчанию
SetEnv fvwm_webbrowser /usr/bin/firefox
SetEnv fvwm_term /usr/bin/gnome-terminal
#Image path
ImagePath $[fvwm_icon]:$[fvwm_icon];.png:$[fvwm_wallpapers]:+
#ВИРТУАЛЬНЫЕ РАБОЧИЕ СТОЛЫ
#Количество, размеры и имена
DesktopSize 2x1
DesktopName 0 First
DesktopName 1 Second
#Переключение между рабочими столами и страницами
EdgeScroll 100 100
EdgeResistance 150 150
EdgeThickness 1
#НАСТРОЙКИ МЫШИ
ClickTime 350
MoveThreshold 3
#ФОКУС
Style * FPClickToFocus, FPClickDecorToFocus or FPClickIconToFocus, MouseFocusClickRaises
#АВТОЗАПУСК
DestroyFunc StartFunction
AddToFunc StartFunction
+ I Module FvwmTaskBar
+ I Module FvwmPager 0 2
DestroyFunc InitFunction
AddToFunc InitFunction
+ I Exec exec stalonetray --sticky --window-type normal --window-layer bottom --transparent --skip-taskbar --grow-gravity E --icon-gravity E --geometry 124x24+900-0 &
+ I Exec exec fvwm-root -r /home/tartan/images/walls/jdwall.png
+ I Exec exec nm-applet &
+ I Exec exec gnome-power-manager &
+ I Exec exec eee-control-tray &
+ I Exec exec fbxkb &
#КЕЙБИНДИНГИ
Key F2 A C Exec exec gmrun
Key Print A N Exec exec scrot