FVWM - один для всех: OpenBSD 5 и Linux

THE HOLY BIBLE - King James Version - БИБЛИЯ в Синодальном переводе
"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу

FVWM - один для всех: OpenBSD 5 и Linux

Операционные системы Линукс и Опен БСД зачастую используются вместе в "мульти-загрузочной" конфигурации на одном компьютере. Разработка ПО, тестирование, разделение "личной" и "рабочей" систем, сетевые задачи - вот некоторые из причин иметь обе эти ОС на вашем лаптопе.

В то же время значительные различия во внешнем виде и скорости пользовательского интерфейса этих систем могут причинять неудобства в повседневной работе при достаточно частом переключении между ними. Предлагаемый в Fedora Linux Gnome 3 явно несоответствует требованиям высокой скорости отклика, предъявляемым пользователями FVWM в OpenBSD. Соответственно, устаревшая версия диспетчера окон в OpenBSD не в состоянии удовлетворить придирчивый вкус любителей "сглаженных" шрифтов.

В предлагаемой заметке я делюсь своим опытом установки и конфигурации последней версии FVWM как "унифицированного" диспетчера окон для обеих систем OpenBSD и Fedora Linux. Во всех случаях FVWM предоставляет совершенно идентичное современное пользовательское окружение, пригодное для быстрой и комфортной работы в любой ОС. Также я привожу общие советы, помогающие пользователю выполнять действия в системе без помощи "мастеров" Гном и способствующие более глубокому пониманию работы самой ОС и её компонентов (сетевые подключения, аппаратные средства, графика X window и тому подобных).

Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:



........ == Послание к Римлянам святого апостола Павла == ............
=== Глава 13, Стих 14 ===
13 Как днем, будем вести себя благочинно, не предаваясь ни
 пированиям и пьянству, ни сладострастию и распутству, ни ссорам и
 зависти;
14 но облекитесь в Господа нашего Иисуса Христа, и попечения о
 плоти не превращайте в похоти. 

Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.

Но как часто на этой дороге нам встречаются препятствия и какими непреодолимыми они кажутся для нас! Редко кто задумывается о действительном смысле слов Господа - а ведь Он ясно предупреждает нас, давая подробный перечень вещей, которые не следует делать. Но ведь в этом перечне находятся все "мирские удовольствия", как же быть? И на этот вопрос нам дан ответ, причём прямо в том же месте Писания. Да, нам предписано заботиться о своём теле - но не потакать ему! Следуй Божиим заповедям в своей жизни и борись с влечением к мирским похотям - вот и весь секрет. Только стой твёрдо в своём решении идти за Господом и Он не оставит тебя. И как бы ни было трудно противостоять мерзким влечениям повседневного быта - держись, молись и ни за что не поддавайся, и Господь поддержит и укрепит тебя. И не оборачивайся назад!

Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.

Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.

На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.


Вернёмся к нашим техническим деталям.

В процессе работы мы рассмотрим следующие вопросы:

  • Общие принципы запуска системы X window
  • Диспетчер окон
  • Диспетчер X дисплеев
  • Специфика для Fedora Linux
  • Open BSD - живое воплощение стандарта
  • Компиляция FVWM
  • Беспроводное сетевое подключение - Fedora
  • Беспроводное сетевое подключение - OpenBSD
  • Фоновое изображение экрана Xorg
  • Более одного монитора на столе
  • Русская фонетическая клавиатура
  • Подсветка (яркость) и копии экрана
  • "Личные" конфигурационные скрипты пользователя
  • Я постараюсь быть краток, но при этом осветить достаточное количество необходимых, как мне кажется, деталей.

    Общие принципы запуска системы X window

    В мире современных технологий даже Линукс умудрился обрости всякими программами-помощниками, отвлекающими пользователя от понимания процессов, происходящих в его UNIX-системе в действительности. Особо плохой репутацией среди пользователей пользуется графическая подсистема X Window, несмотря на её значительное упрощение за последние годы. Понимание основных моментов работы Xorg сервера является действительно ценным и необходимым навыком для человека, всерьёз решившего освоить мир сегодняшнего UNIX.

    Запуск сервера Xorg

    Существует два способа запуска сервера X:

  • через диспетчер X дисплеев XDM
  • вручную с использованием xinit
  • обратитесь за подробностями к "man 7 X".

    Вместе с сервером X Window обычно запускается некий определённый пользователем минимальный набор приложений. Используемый в каждом данном случае способ запуска зависит от типа ОС и наличия других графических систем.

    Запуск посредством диспетчера Х дисплеев XDM

    Если мы установили UNIX на рабочей станции, то вероятнее всего нам понадобится постоянно работающий X сервер. Именно с этой целью в стандартную поставку Xorg включается X Display Manager XDM. Эта программа обычно автоматически запускается в процессе загрузки системы и поддерживает X сервер в работающем состоянии, перезапуская его при необходимости. Также XDM предлагает пользователям окно входа в систему. После удачного ввода имени и пароля XDM запустит вашу собственную "X сессию".

    Начальное состояние X сессии определяется файлом в вашей домашней директории:

  • ~/.xsession
  • XDM воспримет этот файл как исполняемый скрипт и, выполнив его, запустит ваши начальные программы (терминалы, часы, диспетчер окон, пользовательские настройки типа обоев рабочего стола, раскладки клавиатуры, скорости мыши и т.п.).

    Запуск вручную с использованием xinit

    Машины, использующие более одной графической системы, обычно не требуют автоматического запуска Xorg сервера. При необходимости мы запускаем скрипт под названием "startx" (или "x11", "xstart"), выполняющий начальные действия вроде установки значений ресурсов (ниже) и запуска программ. Мы можем создать такой скрипт сами, используя программу "xinit" - она запускает одну команду (скрипт), указанную пользователем как X server, и другую для запуска "пользовательского окружения". Затем "xinit" ожидает завершения одной из этих двух программ (или скриптов). Такой подход обеспечивает значительную гибкость конфигурации, но за счёт отсутствия простого интерфейса. Поэтому "xinit" не предназначен для использования конечными пользователями.

    Используемый пользователями скрипт "startx" содержит вызов "xinit" внутри и зависит от содержания двух важных файлов:

  • ~/.xinitrc
  • Используется для запуска клиентских программ (xterm, xclock, twm/fvwm etc.), например:
    ..... == Первое соборное послание святого апостола Иоанна == .........
    === Глава 4, Стих 21 ===
    20 Кто  говорит:  "я  люблю  Бога",  а  брата  своего  ненавидит,  тот
    лжец: ибо не  любящий  брата  своего,  которого  видит,  как  может
    любить Бога, Которого не видит?
    21 И мы имеем от Него такую  заповедь,  чтобы  любящий  Бога  любил  и
    брата своего.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [user@host ~]$ cat .xinitrc
    xrdb -load $HOME/.Xresources
    xsetroot -solid gray &
    xclock -g 50x50-0+0 -bw 0 &
    xload -g 50x50-50+0 -bw 0 &
    xterm -g 80x24+0+0 &
    xconsole -g 50X10+0-0 &
    xv -rmode 2 -quit Pictures/mountain-panorama.jpg &
    fvwm|twm
    [user@host ~]$
    

  • ~/.xserverrc
  • Скрипт для запуска X сервера, по умолчанию "X :0", но может быть заменён на x11vnc или другую специализированную программу. обратитесь за подробностями к "man 1 xinit".

    Ресурсы приложений для X

    Специальное приложение "Xrdb" используется для установки содержимого свойства "RESOURCE_MANAGER" для основного ("корневого") окна X-экрана 0 или свойства "SCREEN_RESOURCES" для основного окна любого другого экрана, или всех окон вместе, в любой комбинации. Как я уже показал выше, обычно эта программа вызывается из скриптов инициализации. Детали в "man 1 xrdb".

    Утилита "xrdb" обычно используется в системном файлe "Xresources" (или в домашней директории пользователя - "~/.xresources") и представляет собой современную замену файлам "~/.Xdefaults".

    Имена дисплеев

    С точки зрения конечного пользователя, каждый X сервер использует имена дисплеев такого вида (мы говорим о "Х дисплее", не о физическом мониторе):

  • hostname:displaynumber.screennumber
  • Приложения пользователя используют эту информацию для определения к какому серверу Х и к какому экрану "подключать" свой вывод (при этом каждый "Х дисплей" может иметь более одного экрана (физического монитора)). Рассмотрим составные компоненты имени X дисплея:

  • Имя компьютера (hostname)
  • Имя компьютера определяет название физической машины, к которой подключен монитор. Если имя компьютера не задано, Х сервер выберет наиболее эффективный способ обмена данными с локальной ОС (той, на которой запущен Xorg).

  • Номер дисплея (displaynumber)
  • Термин "Х дисплей" обычно обозначает совокупность физических периферийных устройств, соединённых вместе - например, два физических монитора, клавиатура и мышь. Большинство машин имеют одну клавиатуру - и, соответственно, один "Х дисплей". Большие многопользовательские системы могли иметь несколько "рабочих мест" пользователей, подключенных к одному центральному компьютеру. Во избежание путаницы каждый "Х дисплей" одной машины имеет собственный номер (начиная с нуля), присваиваемый в момент запуска Х сервера. Номер дисплея должен указываться всегда, даже если машина имеет всего один монитор и одну клавиатуру - иначе ваши приложения не будут знать куда направлять графический вывод.

  • Номер экрана (screennumber)
  • Если наш компьютер имеет более одного монитора, каждый из них будет иметь собственный "набор" окон графических приложений. Для различения физических мониторов ("экранов") им присваиваются уникальные в пределах Х дисплея порядковые номера. Первый монитор всегда имеет номер экрана 0 (даже если монитор всего один).

    В POSIX системах имя "X дисплея по умолчанию" хранится в переменной окружения DISPLAY. Эта переменная устанавливается автоматически эмулятором терминала "xterm" - но если мы используем сессию, подключённую к другому компьютеру по сети, мы должны установить DISPLAY вручную так, чтобы она указывала на Х дисплей нашей рабочей станции (то есть "локальный" Х сервер). Подключение через OpenSSH в этом не нуждается. К примеру, такая установка: "$ DISPLAY=myOBSDws:0.1; export DISPLAY" будет выводить все графические окна сессии на втором мониторе моей рабочей станции (т.е. той, на клавиатуре которой я печатаю команды).

    Не забывайте, что "Х дисплей" - чисто "логическое" понятие, определяемое и используемое Х сервером. Существует скрипт "xon", запускающий для нас Х программу на удалённой машине, и этот скрипт устанавливает DISPLAY самостоятельно. Также большинство графических Х программ понимают параметр командной строки "-display", что позволяет "перенаправлять" вывод этих программ на удалённый дисплей.

    Не пытайтесь найти в Линукс системе детальное описание всех команд, входящих в состав Xorg - вместо этого поищите на машине с ОпенБСД или в интернете.

    Диспетчер окон

    Расположение графических окон на экране определяется и контролируется специальной программой, называемой "диспетчер окон". Диспетчеры окон очень различаются по функциональности - некоторые из них прорисовывают "окружение" окна, некоторые нет, многие диспетчеры раскладывают окна программ в разном порядке, используют виртуальные экраны и тому подобное.

    Диспетчеры окон сами по себе являются пользовательскими программами (хотя и очень сложными), чем отчасти и объясняется их разнообразие. Xorg включает один из самых старых диспетчеров - TWM. Почти все существующие сегодня window managers происходят от TWM - в том числе и FVWM (что вполне понятно из имени).

    Диспетчер X дисплеев

    Мы уже упомянули название XDM выше - именно он является тем самым диспетчером X дисплеев в стандартной поставке Xorg. Прочесть об XDM более подробно можно в "man 1 xdm".

    Как я уже говорил, после "сброса" (resetting) Х сервера XDM запускает специальный скрипт ("Xsetup"), предоставляющий пользователю окно входа в систему (используя "xlogin"). Именно "xlogin" предлагает нам ввести имя и пароль.

    После удачного входа любого пользователя в систему XDM запускает скрипт "Xstartup" - как пользователь "root".

    После этого XDM выполняет знакомый нам системный скрипт "Xsession", уже под именем нашего пользователя. Этот файл обычно включает в себя вызовы нескольких дополнительных программ, среди которых и наш файл "~/.xsession" в нашей домашней директории, содержащий специфические настройки для нашей X сессии. Наша Х сессия заканчивается как только прекращается работа скрипта "Xsession".

    После окончание сессии "Xreset" скрипт запускается снова, чтобы освободить системные ресурсы, завершить программы, "сбросить" (reset) Х сервер - и цикл начинается вновь, с нового логина пользователя.

    Логфайл "/var/log/xdm.log" содержит полезную информацию - стандартный поток ошибок (stderr) программ XDM, Xsetup, Xstartup, Xsession и Xreset. Всегда проверяйте этот файл при сложностях с запуском X сервера.

    Как уже было сказано, Display Manager (XDM из поставки Xorg или GDM из Gnome или KDM из KDE) выполняет скрипт "~/.xsession" в нашей домашней директории (как часть системного скрипта "Xsession") и наконец-то запускает Window Manager (TWM из состава Xorg или наш FVWM).

    Но это не обязательно должно происходить именно так - как мы уже знаем, диспетчер окон является обычной пользовательской программой и вместо него мы можем заставить XDM запустить для нас что угодно - например, "xterm". В этом случае именно эмулятор терминала будет программой, определяющей длительность нашей сессии Х - и наша сессия завершится, как только мы закроем терминал. При этом обычный порядок действий сохранится - XDM вызовет скрипт "Xreset" и покажет нам новое окно входа в систему.

    Очевидно, что в этом случае единственное Х-приложение (xterm) не будет иметь ни обрамления (decoration), ни кнопок, и мы не сможем переключаться между окнами программ и выполнять прочие обычные для пользователя действия. Почему? Дело в том, что обычно всю эту работу за нас выполняет диспетчер окон (TWM/FVWM) - и мы решили не запускать его вообще, запустив простой "xterm" вместо FVWM.

    Подводя итог, можно сказать что диспетчер X дисплеев (Display Manager) знает как запускать "первое" Х-приложение в Х-сессии пользователя. И обычно в этой роли выступает диспетчер окон (Window Manager) - хотя вместо него может быть запущена любая программа, скомпонованная с "XLib".

    Специфика для Fedora Linux

    В Fedora Linux (точнее, в Window Manager/Desktop Gnome) всё по-другому. Вместо использования стандартного XDM используется собственный Display Manager GDM, не имеющий внятной документации.

    Мы можем попытаться догадаться о подробностях его работы, глядя в конфигурационные файлы:

    ............. == Послание к Ефесянам святого апостола Павла == .................
    === Глава 4, Стих 19 ===
    19 Они, дойдя до  бесчувствия,  предались  распутству  так,  что  делают  всякую
    нечистоту с ненасытимостью.
    
    (b+/b-, c+/c-, +/-, *) >
    [root@host gdm]# pwd
    /etc/gdm
    [root@host gdm]# ls -la /etc/gdm
    total 36
    drwxr-xr-x.   6 root root  4096 Sep 25 23:43 .
    drwxr-xr-x. 140 root root 12288 Oct 20 13:26 ..
    -rw-r--r--.   1 root root    91 Aug 13 00:48 custom.conf
    drwxr-xr-x.   2 root root  4096 Sep 25 23:43 Init
    drwxr-xr-x.   2 root root  4096 Sep 25 23:43 PostLogin
    drwxr-xr-x.   2 root root  4096 Sep 25 23:43 PostSession
    drwxr-xr-x.   2 root root  4096 Sep 25 23:43 PreSession
    lrwxrwxrwx.   1 root root    21 Sep 25 23:43 Xsession -> ../X11/xinit/Xsession
    [root@host gdm]#
    
    [root@host gdm]# ls -la /etc/X11/
    total 40
    drwxr-xr-x.   6 root root  4096 Oct 19 22:12 .
    drwxr-xr-x. 140 root root 12288 Oct 20 13:26 ..
    drwxr-xr-x.   2 root root  4096 Jul  8 18:56 applnk
    drwxr-xr-x.   2 root root  4096 Jul  8 18:56 fontpath.d
    drwxr-xr-x.   5 root root  4096 Oct 19 22:46 xinit
    -rw-r--r--.   1 root root   547 Feb 19  2013 Xmodmap
    drwxr-xr-x.   2 root root  4096 Sep 25 23:21 xorg.conf.d
    -rw-r--r--.   1 root root   795 Oct 15 15:17 Xresources -- сюда включены XTerm resources
    [root@host gdm]#
    
    [root@host gdm]# ls -la /etc/X11/xinit/
    total 36
    drwxr-xr-x. 5 root root 4096 Oct 19 22:46 .
    drwxr-xr-x. 6 root root 4096 Oct 19 22:12 ..
    -rwxr-xr-x. 1 root root 2030 Feb 19  2013 Xclients
    drwxr-xr-x. 2 root root 4096 Feb 19  2013 Xclients.d
    -rwxr-xr-x. 1 root root 1486 Feb 19  2013 xinitrc
    -rw-r--r--. 1 root root 2008 Feb 19  2013 xinitrc-common
    drwxr-xr-x. 2 root root 4096 Oct 15 15:30 xinitrc.d
    drwxr-xr-x. 2 root root 4096 Oct 19 22:44 xinput.d
    lrwxrwxrwx. 1 root root   26 Oct 15 15:30 xinputrc -> /etc/alternatives/xinputrc
    -rwxr-xr-x. 1 root root 3547 Feb 19  2013 Xsession
    [root@host gdm]#
    

    Дальнейшие попытки разобраться в деталях инициализации и работы Гном могут не стоить затраченного времени. Вместо этого, попробуем применить описанные выше "Общие принципы запуска системы X window" и поручим GDM те же самые задачи, которые выполняет стандартный XDM - предоставить пользователю возможность войти в систему, проверить авторизацию PAM и вызвать скрипт "~/.xsession" в нашей домашней директории. И уже в этот скрипт мы можем включить всё необходимое, включая вызов нашего любимого диспетчера окон (для меня FVWM, вам может нравиться xmonad или awesome или что-то другое). Этот подход полностью игнорирует "продвинутый" Гном и позволяет нам наконец понять что же происходит в нашей системе.

    Сделать это очень просто - я выполняю эти действия каждый раз, когда попадаю в новую систему, в которой мне необходимо продуктивно работать в привычном удобном окружении.

    Мои стандартные действия на новой системе

  • компилирую последнюю версию FVWM из исходного кода и помещаю его в мою домашнюю директорию;
  • создаю соответствующий моим требованиям "~/.fvwmrc" файл в моей домашней директории и создаю символическую ссылку на него "~/.fvwm/config";
  • добавляю необходимые ресурсы в системный файл "/etc/X11/Xresources" (или в "~/.Xresources" в моей домашней директории и "скармливаю" его программе "xrdb", я могу это делать в скрипте "~/.xinitrc" (при ручном запуске Х через "startx") или в скрипте ".xsession" (при запуске Х через диспетчер Х дисплеев));
  • создаю файл "~/.xsession" в моей домашней директории и делаю его исполняемым:
  • [user@host X11]$ ls -la ~/.xsession
    -rwx------. 1 user user 70 Oct 20 16:59 /home/user/.xsession
    [user@host X11]$
    [user@host X11]$ cat ~/.xsession
    xrdb -load $HOME/.Xresources
    echo `date` >/tmp/1
    xterm -g 140x90+0+0 &
    ~/fvwm
    [user@host X11]$
    
  • изменяю системный файл "/etc/X11/xinit/Xsession" и вставляю эту команду второй строкой сверху:
    exec -l $SHELL -c "$CK_XINIT_SESSION $HOME/.xsession"
    
  • перезапускаю Х сервер;
  • вхожу в систему под своим именем пользователя, как всегда.
  • В этот момент передо мной предстанут все мои начальные программы, включённые в файл "~/.xsession", в окружении моего любимого диспетчера окон.

    Вот и всё - просто и без "Гномовских" трюков - обычная функциональность и конфигурация Х сервера.

    Заметьте - "xterm" может испытывать трудности со "сворачиванием" в пиктограмму под FVWM, в этом случае надо отключить его (xterm) функцию под названием "ActiveIcon", используя такие ресурсы:

    XTerm*vt100.activeIcon:false
    XTerm*iconGeometry:32x32+0+0
    XTerm*iconHint:mini.xterm_32x32.xpm
    

    Иногда бывает необходимо быстро (но на время) изменить индивидуальные значения какого-либо ресурса:

    echo "XTerm*faceSize:13.0" | xrdb -override
    

    После этого изменения все последующие окна "xterm" будут временно использовать новое значение размера шрифта.

    Также может понадобиться сделать некоторые изменения для библиотеки "Xft", улучшающие прорисовку векторных шрифтов:

    Xft.dpi:        96
    Xft.hinting:    1
    Xft.hintstyle:  hintmedium
    Xft.antialias:  1
    

    Вы уже должны хорошо знать где записываются изменённые значения ресурсов для Х приложений.

    Open BSD - живое воплощение стандарта

    Названием заголовка сказано всё - ОпенБСД точно следует стандарту POSIX и использует Х сервер именно так, как описано в разделе "Общие принципы запуска системы X window". Никаких "доделок на коленках" не понадобится. Я просто выполняю шаги, описанные выше в "Мои стандартные действия на новой системе" и получаю полностью работающее привычное мне окружение новейшего FVWM со встроенными сглаженными шрифтами и прочими удобствами.

    Одна тонкость - после компиляции нового FVWM мне необходимо добавить его в мой PATH перед всеми остальными записями, чтобы новая версия диспетчера окон всегда вызывалась первой.

    Учитывая всё вышесказанное, мой файл "~/.kshrc" для OpenBSD приобретает такой вид:

    # Окончательная версия файла "~/.kshrc"
    # для запуска нового диспетчера окон FVWM.
    
    . /etc/ksh.kshrc
    export PATH=/home/user/fvwm/bin:$PATH
    export HOSTNAME=`hostname -s`
    export OS=`uname`
    
    # requires "pkg_add vim-7.3.154p2-no_x11-perl-python-ruby.tgz"
    alias vi="vim"
    
    export LC_CTYPE=en_US.UTF-8
    export EDITOR=vi
    export VISUAL=vi
    
    # Russian phonetic keyboard "яверты", switch with both shifts.
    # Also requires the line "set +o emacs-usemeta" in /etc/ksh.kshrc
    set +o emacs-usemeta
    # grp_led may be "num", "sroll"
    setxkbmap -layout 'us,ru(phonetic)' -option 'grp:shifts_toggle,grp_led:caps'
    
    set -o vi
    alias lynx="lynx -term=vt100"
    
    export PS1="\W:\\$ "
    
    if [[ $TERM == "xterm" || $TERM == "rxvt-256color" ]]
    then /usr/local/bin/read_and_think 70
    else /usr/local/bin/read_and_think.kjv 70
    fi
    

    После этого процесс работы в графическом Х-окружении Линукса и ОпенБСД становится для меня полностью идентичным.

    Компиляция FVWM

    Выше я просто упоминал вскользь "компилирую последнюю версию FVWM из исходного кода". Пришло время пояснить как выполняется этот очень простой процесс.

    Подготовка кода

    Прежде всего загрузим последнюю версию кода с официальной странички проекта FVWM - "fvwm.org".

    Разархивируем код и подготовим такой скрипт с командой конфигурации:

    ................... == Книга пророка Иеремии == ......................
    === Глава 24, Стих 4 ===
    4 И было ко мне слово Господне:
    5 так говорит Господь, Бог Израилев: подобно этим  смоквам  хорошим  Я
    признаю хорошими переселенцев Иудейских, которых Я  послал  из  сего
    места в землю Халдейскую;
    6 и обращу на них очи Мои во благо им и возвращу их  в  землю  сию,  и
    устрою их, а не разорю, и насажду их, а не искореню;
    7 и дам им сердце, чтобы знать  Меня,  что  Я  Господь,  и  они  будут
    Моим народом, а Я буду их Богом;  ибо  они  обратятся  ко  Мне  всем
    сердцем своим.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host fvwm-2.6.5]$ cat fvwm_config
    make distclean
    ./configure --disable-bidi --disable-xcursor \
    --disable-gtktest --disable-imlibtest --without-gnome \
    --disable-sm -disable-rsvg --enable-xft \
    --disable-perllib --enable-xrender \
    --prefix=/home/user/fvwm --disable-package-subdirs \
    --libexecdir='${prefix}/modules' --datadir='${prefix}/data'
    # --with-png-library=/usr/lib64 \
    # --with-xft-library=/usr/lib64 \
    # --with-xpm-library=/usr/lib64
    [user@host fvwm-2.6.5]$
    

    Запускаю конфигурационный скрипт "./fvwm_config" (ещё ничего не компилируется!) и проверяю вывод, убеждаясь что все необходимые мне опции включены:

    ...
    Fvwm Configuration:
    
    Version:     2.6.5
    
    Executables: /home/user/fvwm/bin
    Man pages:   /home/user/fvwm/share/man
    Modules:     /home/user/fvwm/modules
    Data files:  /home/user/fvwm/data
    Doc files:   /home/user/fvwm/data/doc/fvwm
    Perl lib:    (Not installed) /home/user/fvwm/data/perllib
    Locale msg:  /home/user/fvwm/data/locale  ar de fr sv_SE zh_CN
    
    With Asian bi-direct. text support? no: Explicitly disabled
    With Gettext Native Lang support?   yes (libc)
    With GTK+ required for FvwmGtk?     no: Failed to detect GTK, see config.log
    With Iconv support?                 yes (from C library)
    With Mouse strokes (gestures)?      no: Can't find working libstroke
    With PNG image support?             yes
    With ReadLine sup. in FvwmConsole?  no: Can't find working libreadline
    With RPlay support in FvwmEvent?    no: Can't find working librplay
    With Shaped window support?         yes
    With Shared memory for XImage?      yes
    With Session Management support?    no: Explicitly disabled
    With SVG image support?             no: Explicitly disabled
    With Xcursor support?               no: Explicitly disabled
    With Xinerama multi-head support?   no: Failed to detect libXinerama
    With Xft anti-alias font support?   yes (version 2)
    With XPM image support?             yes
    With Xrender image support?         yes
    Build man pages?                    yes
    Build HTML documentation?           no
    

    Если при компиляции в OpenBSD не находится уже установленная в системе "libpng", я прежде всего определяю её местоположение:

    ~:# pkg-config --libs --cflags libpng
    -I/usr/local/include/libpng -L/usr/local/lib -lpng -lz -lm
    ~:#
    

    Затем, добавляю в конфигурационный скрипт опции:

    with-png-library=PATH use png library (for coloured or shaped icons)
    with-png-includes=DIR set directory for png headers
    

    Таким образом, конфигурационная команда для компиляции FVWM под OpenBSD выглядит так:

    make distclean
    ./configure --disable-bidi --disable-xcursor \
    --disable-gtktest --disable-imlibtest --without-gnome \
    --disable-sm -disable-rsvg --enable-xft \
    --disable-perllib --enable-xrender \
    --prefix=/home/user/fvwm --disable-package-subdirs \
    --libexecdir='${prefix}/modules' --datadir='${prefix}/data' \
    --with-png-library=/usr/local/lib/libpng.so.15.0 \
    --with-png-includes=/usr/local/include/libpng
    # --with-xft-library=/usr/lib64 \
    # --with-xpm-library=/usr/lib64
    

    Компиляция кода

    Пора начать саму компиляцию и компоновку командами "make" и "make install". Проверим что моя новая версия FVWM была установлена в моей домашней директории:

    ......... == Первое послание к Коринфянам святого апостола Павла == ............
    === Глава 10, Стих 3 ===
    1 Не хочу оставить вас,  братия,  в  неведении,  что  отцы  наши  все  были  под
    облаком, и все прошли сквозь море;
    2 и    все    крестились    в    Моисея    в     облаке     и     в        море;
    3 и все ели одну и ту же духовную пищу;
    4 и все пили одно и то же духовное питие: ибо  пили  из  духовного  последующего
    камня; камень же был Христос.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host fvwm]$ pwd
    /home/user/fvwm
    [user@host fvwm]$ ls -la
    total 24
    drwxrwxr-x.  6 user user 4096 Oct 20 18:48 .
    drwx------. 94 user user 4096 Oct 20 18:48 ..
    drwxrwxr-x.  2 user user 4096 Oct 20 18:48 bin
    drwxrwxr-x.  4 user user 4096 Oct 20 18:48 data
    drwxrwxr-x.  2 user user 4096 Oct 20 18:48 modules
    drwxrwxr-x.  3 user user 4096 Oct 20 18:48 share
    [user@host fvwm]$
    [user@host fvwm]$ ls -la bin/
    total 4800
    drwxrwxr-x. 2 user user    4096 Oct 20 18:48 .
    drwxrwxr-x. 6 user user    4096 Oct 20 18:48 ..
    -rwxr-xr-x. 1 user user 4102664 Oct 20 18:48 fvwm
    lrwxrwxrwx. 1 user user       4 Oct 20 18:48 fvwm2 -> fvwm
    -rwxr-xr-x. 1 user user    4460 Oct 20 18:48 fvwm-bug
    -rwxr-xr-x. 1 user user   73129 Oct 20 18:48 FvwmCommand
    -rwxr-xr-x. 1 user user    6591 Oct 20 18:48 fvwm-config
    -rwxr-xr-x. 1 user user    9664 Oct 20 18:48 fvwm-convert-2.4
    -rwxr-xr-x. 1 user user   14482 Oct 20 18:48 fvwm-convert-2.6
    -rwxr-xr-x. 1 user user   54464 Oct 20 18:48 fvwm-menu-desktop
    -rwxr-xr-x. 1 user user   23535 Oct 20 18:48 fvwm-menu-directory
    -rwxr-xr-x. 1 user user   34772 Oct 20 18:48 fvwm-menu-headlines
    -rwxr-xr-x. 1 user user    7796 Oct 20 18:48 fvwm-menu-xlock
    -rwxr-xr-x. 1 user user   17439 Oct 20 18:48 fvwm-perllib
    -rwxr-xr-x. 1 user user  534492 Oct 20 18:48 fvwm-root
    lrwxrwxrwx. 1 user user       9 Oct 20 18:48 xpmroot -> fvwm-root
    [user@host fvwm]$
    

    Обновлю маршрут поиска файлов в файле "~/.profile" в моём домашнем каталоге:

    ..................... == Книга Екклезиаста == ........................
    === Глава 11, Стих 6 ===
    6 Утром сей семя твое, и вечером не давай отдыха  руке  твоей,  потому
    что ты не знаешь, то или другое  будет  удачнее,  или  то  и  другое
    равно хорошо будет.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host ~]$ cat .profile
    export PATH=/home/user/fvwm/bin:$PATH
    [user@host ~]$
    [user@host ~]$ which fvwm
    ~/fvwm/bin/fvwm
    [user@host ~]$
    [user@host ~]$ fvwm -V
    fvwm 2.6.5 compiled on Oct 20 2013 at 18:47:13
    with support for: XPM, PNG, Shape, XShm, XRender, XFT, NLS
    ...
    [user@host ~]$
    

    Конфигурация нового диспетчера окон

    Диспетчер окон FVWM после компиляции будет иметь некоторую конфигурацию "встроенную по умолчанию", но мне понадобится внести необходимые изменения.

    Мой подход прост - я создаю два файла: один с "общей" конфигурацией и второй с "локальной". Учитывая что вся установка нового FVWM была выполнена локально и доступна только мне, вы можете объединить оба файла в один.

    Мои конфигурационные файлы для диспетчера окон FVWM

    Все файлы находятся в одном и том же каталоге "~/.fvwm".

    Общий файл конфигурации FVWM

    Несмотря на длину файла, привожу его полностью для удобства. Заметьте - этот файл не вызывает никаких других (уже) существующих файлов из прошлых версий FVWM, присутствующих в системе. Конфигурация диспетчера окон начинается "с чистого листа" и основана только на "вкомпилированных" в исходный код значениях по умолчанию.

    ..... == Первое соборное послание святого апостола Иоанна == .........
    === Глава 3, Стих 19 ===
    19 И вот по чему узнаем, что мы от  истины,  и  успокаиваем  пред  Ним
    сердца наши;
    20 ибо если сердце  наше  осуждает  нас,  то  _кольми_  _паче_  _Бог,_
    потому что Бог больше сердца нашего и знает все.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host ~]$ cat .fvwm/system_wide_fvwmrc
    # FVwm system-wide-config file - based on OpenBSD's one.
    # (by read-and-think.org)
    
    # PixmapPath and IconPath were deprecated.
    ImagePath $HOME/.fvwm/pixmaps:+:$HOME/.fvwm/bitmaps
    ModulePath /home/user/fvwm/modules
    
    EdgeResistance 500
    EdgeScroll 100 100
    ClickTime 750
    
    DefaultFont "xft:Liberation Mono:size=14:antialias=true"
    Style * Font "xft:Liberation Mono:size=12:antialias=true"
    Style * IconFont "xft:Liberation Mono:size=10:antialias=true"
    # WindowFont and IconFont are deprecated.
    
    Style * HilightFore #bebebe, HilightBack blue
    # HilightColor is deprecated.
    
    MenuStyle * "fvwm", Foreground "#4d4d4d", Background "#bebebe", \
    Greyed "#e7e7e7", Font "xft:Liberation Mono:size=12:antialias=true", \
    "AnimationOff"
    
    DeskTopSize 3x3
    
    ColormapFocus FollowsMouse
    
    # default Styles:
    Style "*"           BorderWidth 7, HandleWidth 7
    Style "*"           Icon unknown1.xpm, Color #bebebe/darkred
    Style "*"           MWMFunctions, MWMDecor, HintOverride
    Style "*"           DecorateTransient, NoPPosition
    Style "*"           IconBox 0 -10 -280 -1
    Style "*"           FocusFollowsMouse
    Style "*"           RandomPlacement, SmartPlacement
    
    # Styles for various Fvwm modules:
    Style "Fvwm*"       NoTitle,  Sticky, WindowListSkip
    Style "Fvwm*"       BorderWidth 2, CirculateSkipIcon, CirculateSkip
    Style "FvwmPager"   StaysOnTop
    Style "FvwmBanner"  StaysOnTop
    Style "FvwmButtons" Icon toolbox.xpm, ClickToFocus
    
    # Styles for various common programs:
    Style "*lock"       NoTitle, NoHandles, Sticky, WindowListSkip, ClickToFocus
    Style "xbiff"       NoTitle, Sticky, WindowListSkip, ClickToFocus
    Style "xcalc"       Icon xcalc.xpm, NoButton 2,RandomPlacement,ClickToFocus
    Style "xmh"         Icon mail1.xpm, NoIconTitle,StickyIcon
    Style "xmh"     RandomPlacement, NoButton 2
    Style "xman"     Icon xman.xpm, RandomPlacement, ClickToFocus
    Style "xmag"     Icon mag_glass.xpm, RandomPlacement, ClickToFocus
    Style "xgraph"      Icon graphs.xpm, RandomPlacement, ClickToFocus
    Style "xmosaic"     Color Green/Yellow, ClickToFocus
    Style "xconsole"    Icon rterm.xpm, WindowListSkip, Sticky
    
    
    # some simple default key bindings:
    Key Next         A       SCM     Next [*] Focus
    Key Prior        A       SCM     Prev [*] Focus
    
    # some simple default mouse bindings:
    #   for the root window:
    Mouse 1 R    A       Menu RootMenu Nop
    Mouse 2 R     A       Menu Window-Ops Nop
    Mouse 3 R     A       WindowList
    
    #   for the title bar buttons:
    Mouse 0 1     A       Menu Window-Ops2 Close
    Mouse 0 2     A      Maximize-Func
    Mouse 0 4     A      Iconify
    
    #   for other parts of the window/borders/icons:
    Mouse 1 F A Resize-or-Raise
    Mouse 1 TS A Move-or-Raise
    Mouse 1 I A Move-or-Iconify
    Mouse 2 I A Iconify
    Mouse 2 FST A Menu Window-Ops2 Nop
    Mouse 3 TSIF A RaiseLower
    
    ######################## Initialization Functions ############################
    AddToFunc InitFunction    "I" Module FvwmPager 0 0
    #+     "I" exec /usr/X11R6/bin/xsetroot -solid black
    
    AddToFunc RestartFunction "I" Module FvwmPager 0 0
    #+     "I" exec /usr/X11R6/bin/xsetroot -solid black
    
    
    ######################## Menus ###################
    AddToMenu RootMenu "Root Menu" Title
    +   "XTerm%mini.xterm.xpm%"  Exec xterm -u8
    #+   "Rxvt"  Exec exec rxvt
    +   ""  Nop
    #+   "Remote Logins" Popup Remote-Logins
    #+   ""  Nop
    +                       "Utilities"     Popup Utilities
    +   ""  Nop
    +   "Fvwm Modules"           Popup Module-Popup
    +                       "Fvwm Window Ops"         Popup Window-Ops
    +                       "Fvwm Simple Config Ops"  Popup Misc-Ops
    +   ""  Nop
    +                       "Refresh Screen"   Refresh
    +                       "Recapture Screen" Recapture
    +   "(Re)Start" Popup Quit-Verify
    +   ""  Nop
    +                       "Exit"  Module FvwmForm QuitVerify
    
    AddToMenu Utilities     "Utilities" Title
    +   "Top"  Exec exec xterm -T Top -n Top -e top
    +   "Calculator" Exec exec xcalc
    +   "Xman"  Exec exec xman
    +   "Xmag"  Exec exec xmag
    +                       "Editres"       Exec exec editres
    +   ""  Nop
    #+   "XEmacs" Exec exec xemacs
    #+                       "Mail"          MailFunction xmh "-font fixed"
    +   ""  Nop
    +                       "XLock%mini.xlock.xpm%"         Exec exec xlock
    +   ""  Nop
    +                       "Reset X defaults" Exec xrdb -load $HOME/.Xdefaults
    
    AddToMenu Misc-Ops "Misc Config Opts" Title
    +                  "Sloppy Focus"        ChangeDefaultFocus SloppyFocus
    +                  "Click To Focus"      ChangeDefaultFocus ClickToFocus
    +                  "Focus Follows Mouse" ChangeDefaultFocus FocusFollowsMouse
    +                  "" Nop
    +                  "Colormap Follows Mouse" ColormapFocus FollowsMouse
    +                  "Colormap Follows Focus" ColormapFocus FollowsFocus
    +                  "" Nop
    +                  "Full Paging ON"         EdgeScroll 100 100
    +                  "All Paging OFF"         EdgeScroll 0 0
    +                  "Horizontal Paging Only" EdgeScroll 100 0
    +                  "Vertical Paging Only"   EdgeScroll 0 100
    +                  "Partial Paging"         EdgeScroll 50 50
    +                  "Full Paging && Edge Wrap" EdgeScroll 100000 100000
    
    AddToMenu Window-Ops "Window Ops" Title
    +   "Move%mini.move.xpm%"  Move
    +   "Resize%mini.resize.xpm%" Resize
    +   "Raise%mini.raise.xpm%"  Raise
    +   "Lower%mini.lower.xpm%"  Lower
    +    "(De)Iconify%mini.iconify.xpm%" Iconify
    +   "(Un)Stick%mini.stick2.xpm%" Stick
    +   "(Un)Maximize%mini.maximize.xpm%" Maximize
    +   ""  Nop
    +   "Delete%mini.excl.xpm%" Delete
    +   "Close%mini.cut.xpm%"  Close
    +   "Destroy%mini.destroy.xpm%" Destroy
    +   ""  Nop
    +   "Refresh Window%mini.refresh.xpm%" RefreshWindow
    
    AddToMenu Window-Ops2 "&Move%mini.move.xpm%"  Move
    +   "&Resize%mini.resize.xpm%" Resize
    +   "R&aise%mini.raise.xpm%" Raise
    +   "&Lower%mini.lower.xpm%" Lower
    +   "(De)&Iconify%mini.iconify.xpm%" Iconify
    +   "(Un)&Stick%mini.stick2.xpm%" Stick
    +                       "(Un)Ma&ximize%mini.maximize.xpm%" Maximize
    +   ""  Nop
    +   "&Delete%mini.excl.xpm%" Delete
    +   "&Close%mini.cut.xpm%" Close
    +   "Destroy%mini.destroy.xpm%" Destroy
    +   ""  Nop
    +   "ScrollBar"  Module FvwmScroll 2 2
    +   "Print"         PrintFunction
    #+                       "Print Reverse" PrintReverseFunction
    
    AddToMenu Module-Popup "FvwmModules" Title
    +   "Identify" Module FvwmIdent
    +   "Talk"   Module FvwmTalk
    +   ""  Nop
    +   "Button-Bar" Module FvwmButtons
    +   "Pager"  Module  FvwmPager 0 0
    +   "Pager (2 desks)" Module  FvwmPager 0 1
    +   "WinList" Module  FvwmWinList
    +   ""  Nop
    +   "Banner" Module FvwmBanner
    +                       "ScrollBar"     Module  FvwmScroll 50 50
    +   "Background" Module  FvwmBacker
    +                       "AutoRaise"     Module  FvwmAuto 200 Raise Nop
    +                       "Stop AutoRaise" KillModule FvwmAuto
    +   ""  Nop
    +   "IconBox" Module FvwmIconBox
    +                       "IconMan"       Module  FvwmIconMan
    +   ""  Nop
    +                       "Form - Rlogin"      Module FvwmForm Rlogin
    +                       "Form - MyFvwmTalk"  Module FvwmForm MyFvwmTalk
    +                       "Form - QuitVerify"  Module FvwmForm QuitVerify
    
    AddToMenu Quit-Verify
    +         "Restart Fvwm%mini.refresh.xpm%"     Restart fvwm
    +         ""      Nop
    +               "Start cwm"         Restart cwm
    +               "Start wm2"         Restart wm2
    +         "Start twm"         Restart twm
    +         "Start ctwm"        Restart ctwm
    +   "Start flwm"     Restart flwm
    +         "Start mwm"         Restart mwm
    +   "Start openbox"     Restart openbox
    +          "Start tvtwm"       Restart tvtwm
    +         ""      Nop
    +         "Start dummy%mini.xterm.xpm%"       Restart xterm
    +         ""      Nop
    +         "No, Don't Quit"    Nop
    
    ######################## Sample Functions ##########################
    
    AddToFunc MailFunction    "I" Next [$0] Iconify -1
    +             "I" Next [$0] Focus
    +      "I" None [$0] Exec $0 $1
    
    AddToFunc Move-or-Raise  "I" Raise
    +    "M" Move
    +      "D" Lower
    
    AddToFunc Move-or-Raise2 "M" Raise
    +    "M" Move
    +      "D" Lower
    
    AddToFunc Maximize-Func  "M" Maximize  0 100
    +    "C" Maximize  0 80
    +    "D" Maximize  100 100
    
    AddToFunc Move-or-Iconify "I" Raise
    +    "M" Move
    +    "D" Iconify
    
    AddToFunc Resize-or-Raise "I" Raise
    +    "M" Resize
    +    "D" Lower
    
    AddToFunc Resize-or-Raise2 "M" Raise
    +    "M" Resize
    +    "D" Lower
    
    AddToFunc PrintFunction  "I" Raise
    +    "I" Exec xdpr -id $w
    
    AddToFunc PrintReverseFunction  "I" Raise
    +                               "I" Exec xdpr 1/2 -h -rv -id $w
    
    AddToFunc Iconify-and-Raise     "I" Iconify
    +                               "I" Raise
    
    # RLOGIN machine fg bg
    AddToFunc RLOGIN "I" Exec xterm -fg $1 -bg $2 -e rlogin $0 -8
    
    # TELNET machine fg bg
    AddToFunc TELNET "I" Exec xterm -fg $1 -bg $2 -e telnet $0
    
    AddToFunc FocusAndWarp "I" Focus
    +                      "I" WarpToWindow 2p 2p
    
    AddToFunc DeiconifyFocusAndWarp "I" Iconify -1
    +                               "I" FocusAndWarp
    
    AddToFunc ChangeDefaultFocus "I" Style "*" $0
    +                            "I" Recapture
    
    ############################################################################
    # Now some keyboard shortcuts.
    
    # Arrow Keys
    # press arrow + control anywhere, and scroll by 1 page
    Key Left A C Scroll -100 0
    Key Right A C Scroll +100 +0
    Key Up  A C Scroll +0   -100
    Key Down A C Scroll +0   +100
    
    # press arrow + meta key, and scroll by 1/10 of a page
    #Key Left A M Scroll -10 +0
    #Key Right A M Scroll +10 +0
    #Key Up  A M Scroll +0   -10
    #Key Down A M Scroll +0   +10
    
    # press shift arrow + control anywhere, and move the pointer by 1% of a page
    Key Left A SC CursorMove -1 0
    Key Right A SC CursorMove +1 +0
    Key Up  A SC CursorMove +0   -1
    Key Down A SC CursorMove +0   +1
    
    # press shift arrow + meta key, and move the pointer by 1/10 of a page
    Key Left A SM CursorMove -10 +0
    Key Right A SM CursorMove +10 +0
    Key Up  A SM CursorMove +0   -10
    Key Down A SM CursorMove +0   +10
    
    # Keyboard accelerators
    Key F1  A M Menu RootMenu
    Key F2  A M Menu Window-Ops
    Key F3  A M WindowList "Module FvwmBanner"
    Key F4  A M Iconify
    Key F5  A M Move
    Key F6  A M Resize
    Key F7  A M CirculateUp
    Key F8  A M CirculateDown
    
    #Page Up/Page Down keys are used to scroll by one desktop page
    # in any context, press page up/down + control
    # in root context, just pressing page up/down is OK
    #
    # I prefer the non-wrapping scroll. These are for example purposes only
    #Key Next A       C       Scroll 100000 0
    #Key Next R       N       Scroll 100000 0
    #Key Prior A       C       Scroll -100000 0
    #Key Prior R       N       Scroll -100000 0
    
    ################## FvwmButtons button-bar ################################
    *FvwmButtonsBack bisque3
    *FvwmButtons(Frame 2 Padding 2 2 Container(Rows 2 Frame 1 Padding 10 0 \
    Swallow(Respawn)))
    *FvwmButtons(NoSize Title Close, Icon bomb.xpm, Action Close)
    *FvwmButtons(Title Resize Icon mini.resize.xpm Back bisque4 Action Resize)
    *FvwmButtons(Frame -3 Swallow(Respawn,NoHints) xclock \
    `Exec exec xclock -bg darkolivegreen -padding 0 -geometry +2000+0`)
    *FvwmButtons(3x1 Back darkolivegreen Fore white Frame 2 Padding 2 2 \
    Container(Rows 1 Frame -2 Padding 1 1 Back darkolivegreen))
    *FvwmButtons(Frame 2 Title(Side,Right) Mail Fore white \
    Swallow(UseOld,NoRespawn)\
    xbiff `Exec exec xbiff -bg darkolivegreen -geometry +200+200`)
    *FvwmButtons(2x1 Swallow (NoHints) "FvwmTalk" "FvwmTalk")
    *FvwmButtons(End)
    *FvwmButtons(End)
    
    
    ########################## Window-Identifier ###############################
    # Just choose colors and a fonts
    *FvwmIdentBack MidnightBlue
    *FvwmIdentFore Yellow
    #*FvwmIdentFont -adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*
    
    ########################### Pager #########################################
    #*FvwmPagerFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*
    *FvwmPagerBack darkblue
    *FvwmPagerFore white
    *FvwmPagerHilight #2d2d2d
    *FvwmPagerGeometry 110-1-1
    *FvwmPagerLabel 0 "$[USER]@$[HOSTNAME]-$[OS]"
    *FvwmPagerSmallFont 5x8
    
    ##########################FvwmWinList##################################
    *FvwmWinListBack #908090
    *FvwmWinListFore Black
    #*FvwmWinListFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*
    *FvwmWinListAction Click1 Iconify -1,Focus
    *FvwmWinListAction Click2 Iconify
    *FvwmWinListAction Click3 Module "FvwmIdent" FvwmIdent
    *FvwmWinListUseSkipList
    *FvwmWinListGeometry +0-1
    
    
    *FvwmBackerDesk 0 -solid steelblue
    *FvwmBackerDesk 1 -solid midnightblue
    
    *FvwmScrollBack grey40
    *FvwmScrollFore green
    
    ############################################################
    ############################################################
    # Note that icons are shown in the module
    #    only if NoIcon commnand is applied.
    #Style     "*"  NoIcon
    
    ############################################################
    *FvwmIconBoxIconBack    #cfcfcf
    *FvwmIconBoxIconHiFore  black
    *FvwmIconBoxIconHiBack  LightSkyBlue
    *FvwmIconBoxBack        #5f9ea0
    #*FvwmIconBoxFore       blue
    *FvwmIconBoxGeometry    5x1+0+0
    *FvwmIconBoxMaxIconSize 64x38
    #*FvwmIconBoxFont        -adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*
    *FvwmIconBoxSortIcons   IconName
    *FvwmIconBoxPadding     4
    *FvwmIconBoxLines       10
    *FvwmIconBoxSBWidth     11
    *FvwmIconBoxPlacement   Left Top
    *FvwmIconBoxPixmap      fvwm.xpm
    #*FvwmIconBoxHideSC Horizontal
    *FvwmIconBoxSetWMIconSize
    *FvwmIconBoxHilightFocusWin
    #*FvwmIconBoxResolution          Desk
    *FvwmIconBoxMouse       1       Click           RaiseLower
    *FvwmIconBoxMouse       1       DoubleClick     Iconify
    *FvwmIconBoxMouse       2       Click           Iconify -1, Focus
    *FvwmIconBoxMouse       3       Click           Module FvwmIdent
    *FvwmIconBoxKey         r       RaiseLower
    *FvwmIconBoxKey         space   Iconify
    *FvwmIconBoxKey         d       Close
    *FvwmIconBoxKey         n       Next
    *FvwmIconBoxKey         p       Prev
    *FvwmIconBoxKey         h       Left
    *FvwmIconBoxKey         j       Down
    *FvwmIconBoxKey         k       Up
    *FvwmIconBoxKey         l       Right
    #
    # Icon file specifications
    #
    # Mostly, you don't have to specify icon files, as FvwmIconBox now
    # reads icon files specified in Style commands.
    #
    *FvwmIconBox            "Fvwm*"         -
    
    # FvwmForm alias - rlogin or telnet to host via xterm
    *RloginWarpPointer
    #*RloginFont         *helvetica*m*r*n*12*
    #*RloginButtonFont   *helvetica*m*o*n*12*
    #*RloginInputFont    *cour*m*r*n*12*
    *RloginFore         Black
    *RloginBack         White
    *RloginItemFore     Yellow
    *RloginItemBack     Wheat
    # begin items
    *RloginLine         center
    *RloginText         "Login to Remote Host"
    *RloginLine         center
    *RloginText         "Host:"
    *RloginInput        HostName  30   ""
    *RloginLine         center
    *RloginSelection    meth single
    *RloginChoice       TN TN off "telnet"
    *RloginChoice       RL RL on "rlogin"
    *RloginSelection    UserSel   single
    #*RloginChoice       Default   Default   on   "same user"
    #*RloginChoice       Custom    Custom    off  "user:"
    *RloginText         "(Userid:"
    *RloginInput        UserName  10   ""
    *RloginText         ")"
    *RloginLine         center
    *RloginText         "FG:"
    *RloginInput        FgColor 15 ""
    *RloginText         "BG:"
    *RloginInput        BgColor 15 ""
    *RloginLine         expand
    *RloginButton       quit "Login" ^M
    *RloginCommand Exec xterm  $(FgColor?-fg $(FgColor)) \
    $(BgColor?-bg $(BgColor)) -T xterm@$(HostName) \
    -e $(RL?rlogin) $(TN?telnet) $(HostName) $(RL?-8 \
    $(UserName?-l $(UserName)))
    *RloginButton       restart   "Clear"
    *RloginCommand Beep
    *RloginButton       quit "Cancel"
    *RloginCommand Nop
    
    # FvwmForm alias - query exit ala mwm
    *QuitVerifyGrabServer
    *QuitVerifyWarpPointer
    #*QuitVerifyFont          *helvetica*m*r*n*14*
    #*QuitVerifyButtonFont    *helvetica*m*o*n*14*
    #*QuitVerifyButtonFont    7x13bold
    *QuitVerifyFore          Black
    *QuitVerifyBack          Light Gray
    *QuitVerifyItemFore Wheat
    *QuitVerifyItemBack Gray50
    # begin items
    *QuitVerifyLine          center
    *QuitVerifyText          "Do you really want to exit FVWM?"
    *QuitVerifyLine          expand
    *QuitVerifyButton   quit      " Exit "
    *QuitVerifyCommand  Quit
    *QuitVerifyButton   quit      "Cancel"
    *QuitVerifyCommand  Nop
    
    # MyTalk & MyFvwmTalk from Dave Goldberg
    # MyTalk Form - dissappears after use
    *MyTalkWarpPointer
    #*MyTalkFont *helvetica*m*r*n*14*
    #*MyTalkButtonFont *helvetica*m*o*n*14*
    #*MyTalkInputFont *cour*m*r*n*14*
    *MyTalkFore Red
    *MyTalkBack Gray
    *MyTalkItemFore Blue
    *MyTalkItemBack Gray
    *MyTalkLine center
    *MyTalkText "Fvwm Function"
    *MyTalkInput Func 40 ""
    *MyTalkLine expand
    *MyTalkButton quit "Run" ^M
    *MyTalkCommand $(Func)
    *MyTalkButton restart "Clear" ^R
    *MyTalkButton quit "Cancel" ^C
    *MyTalkCommand Nop
    # MyFvwmTalk Form - sticks around
    *MyFvwmTalkWarpPointer
    #*MyFvwmTalkFont *helvetica*m*r*n*14*
    #*MyFvwmTalkButtonFont *helvetica*m*o*n*14*
    #*MyFvwmTalkInputFont *cour*m*r*n*14*
    *MyFvwmTalkFore Red
    *MyFvwmTalkBack Gray
    *MyFvwmTalkItemFore Blue
    *MyFvwmTalkItemBack Gray
    *MyFvwmTalkLine center
    *MyFvwmTalkText "Fvwm Function"
    *MyFvwmTalkInput Func 40 ""
    *MyFvwmTalkLine expand
    *MyFvwmTalkButton restart "Run" ^M
    *MyFvwmTalkCommand $(Func)
    *MyFvwmTalkButton restart "Clear" ^R
    *MyFvwmTalkCommand Nop
    *MyFvwmTalkButton restart "Iconify" ^Z
    *MyFvwmTalkCommand Next [MyFvwmTalk] Iconify
    *MyFvwmTalkButton quit "Quit" ^C
    *MyFvwmTalkCommand Nop
    
    # to change banner pixmap
    #*FvwmBannerPixmap fvwm3.xpm
    #*FvwmBannerTimeout 2
    [user@host ~]$
    

    Как можно было заметить, я использую векторные шрифты почти везде. Это даёт мне возможность видеть правильные названия кириллических имён директорий в заголовках окон под OpenBSD.

    Локальный файл конфигурации FVWM

    Этот файл уже использует значения из предыдущего "общего" файла и поэтому значительно короче.

    ............................ == Книга Товита == ................................
    === Глава 13, Стих 6 ===
    6 Если вы будете обращаться к Нему  всем  сердцем  вашим  и  всею  душею  вашею,
    чтобы поступать пред Ним по истине, тогда Он обратится к вам и  не  скроет  от
    вас лица Своего. Увидите, что  Он  сделает  с  вами.  Прославляйте  Его  всеми
    _глаголами_ уст ваших и благословляйте  Господа  правды  и  превозносите  Царя
    веков. В земле плена моего я прославляю Его и проповедую силу  и  величие  Его
    народу грешников.  Обратитесь,  грешники,  и  делайте  правду  пред  Ним.  Кто
    знает, может быть, Он возблаговолит о вас и окажет вам милость?
    7 Превозношу я Бога моего, и душа моя - Небесного Царя,  и  радуется  о  величии
    Его.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host ~]$ cat .fvwm/config
    # Process system-wide configuration file first.
    Read /home/user/.fvwm/system_wide_fvwmrc
    
    # My local changes
    DeskTopSize 2x2
    # I want my terminal windows to stand out
    Style "xterm" HilightFore  #dd0000,  HilightBack darkgreen, \
    Font "xft:Liberation Mono:style=Bold Italic:size=16:antialias=true"
    
    Style "*" ClickToFocus
    Style "xclock" Borderwidth 3,NoTitle,StaysOnTop,Sticky,ActivePlacement
    # Some changes to the menu.
    Key F2          A M Menu Window-Ops2
    AddToMenu RootMenu
    + "&Web%mini.netscape.xpm%"         Exec exec firefox
    + "&Clock%jclock.xpm%"   Exec exec xclock -d -strftime "%a %b %d - %H:%M" \
    -render -face "Bitstream Charter :style=Bold Italic:size=18:antialias=true" \
    -bg black -fg green
    + "&Lynx%jwindow.xpm%" Exec exec xterm -e lynx -term=vt100 -nocolor
    Module  FvwmAuto 001 Raise Nop
    Module  FvwmBacker
    # I could use xsetroot, but it does not understand "png" files.
    *FvwmBackerDesk 0 Exec exec fvwm-root ~/Downloads/Roses_Evelin_2013.png
    # Keyboard shortcuts, using Ctrl+Alt.
    # These 2 apply only to xterm windows.
    Key n         A       CM     Next [xterm*] FlipFocus
    Key p         A       CM     Prev [xterm*] FlipFocus
    # Applies to all windows.
    Key m         A       CM     Maximize
    Key l         A       CM     Exec exec xlock -mode coral
    # Re-defining main config file's setting here.
    Key n         A       CSM     Next [*] Focus
    Key p         A       CSM     Prev [*] Focus
    Key t         A       CM     Exec exec xterm
    [user@host ~]$
    

    Я продолжаю использовать векторные шрифты, указывая "xft:" в начале имени, также я добавляю несколько полезных команд в конец меню пользователя.

    Первый запуск нового FVWM

    Первый запуск нового диспетчера окон я произвожу с включением отладочных сообщений и проверяю содержимое выходного файла на предмет ненайденных шрифтов, старых опций в конфигурации и т.п. Обратите внимание - включение отладки замедляет работу FVWM!

    # Команда для первого запуска FVWM со включённой отладкой:
    /home/user/fvwm/bin/fvwm -D >/tmp/fvwm.out 2>&1
    

    Все последующие запуски должны выполняться в нормальном режиме. Это означает, что моя окончательная версия файла "~/.xsession" выглядит так:

    # Окончательная версия файла "~/.xsession"
    # для запуска нового диспетчера окон FVWM.
    # Использует только локальные конфигурационные
    # файлы "~/.fvwm/system_wide_fvwmrc" и
    # " ~/.fvwm/config".
    
    export PATH=/home/user/fvwm/bin:$PATH
    export HOSTNAME=`hostname -s`
    export OS=`uname`
    fvwm -V > /tmp/fvwm.out
    xrdb -load $HOME/.Xresources
    xterm -g 80x25+0+0  &
    /home/user/fvwm/bin/fvwm
    # DEBUG -D >>/tmp/fvwm.out 2>&1
    

    Как видим, скрипт "~/.xsession" использует приведенный ниже файл ресурсов "~/.Xresources", определяющий вид и поведение моих Х приложений:

    ! Окончательная версия файла "~/.Xresources"
    ! для запуска нового диспетчера окон FVWM.
    
    XTerm*loginShell:true
    XTerm*vt100.activeIcon:false
    XTerm*iconGeometry:48x48+0+0
    XTerm*iconHint:mini.xterm_48x48.xpm
    XTerm*faceName:"DejaVu Sans Mono"
    XTerm*faceSize:15.0
    XTerm*cursorBlink:true
    XTerm*cursorColor:red
    XTerm*cursorOffTime:300
    XTerm*cursorOnTime:1900
    XTerm*background:black
    XTerm*foreground:green
    XTerm*saveLines:3000
    XTerm*scrollBar:false
    XTerm*locale:false
    XTerm*utf8:always
    
    Xft.dpi:        96
    Xft.hinting:    1
    Xft.hintstyle:  hintmedium
    Xft.antialias:  1
    
    XClock*Font = "xft:Bitstream Vera Sans Mono:size=8:antialias=true"
    

    Беспроводное сетевое подключение - Fedora

    Современные Linux системы повсеместно используют Network Manager для сетевых подключений. Если мне необходимо подключиться к WiFi и при этом не использовать никаких Gnome-applets, я выполняю такую последовательность команд:

    nm-connection-editor - создание и конфигурация подключения
    nmcli con list - увидеть существующие в системе подключения
    nmcli con up id enp0s25 - подключить интерфейс к сети
    nmcli con status id enp0s25 - проверить соединение
    

    Ниже я приведу скрипт, показывающий как это делается.

    Беспроводное сетевое подключение - OpenBSD

    В ОпенБСД сетевые подключения по-прежнему устанавливаются командой "ifconfig", что делает весь процесс простым и понятным. Вот последовательность команд для установки WiFi соединения в OpenBSD.

    ifconfig iwn0 scan -- найти сеть
    ifconfig iwn0 up nwid Hans wpakey ThisIsSupposedToBeSecret! -- подключиться
    dhclient iwn0  -- получить динамический IP и всю остальную информацию
    ifconfig  -- проверить подключение
    route -n show  -- убедиться что мы можем посылать и принимать пакеты
    

    Отсутствие зависимости от Network Manager делает процесс подключения понятным и позволяет нам быстро изменять (и скриптовать) его так, как нужно.

    Фоновое изображение экрана Xorg

    В системе X Window "обои рабочего стола" представляют из себя всего лишь обычный графический файл, отображённый в "корневом" окне. Любая программа, способная изменить это изображение в "root window" может быть использована для установки фонового изображения рабочего стола.

    Используя FVWM, я полагаюсь на входящую в его состав программу "fvwm-root", подключаемую посредством модуля расширения "FvwmBackerDesk".

    Но я могу изменить фоновое изображение экрана даже если я не использую никакого диспетчера окон. Именно так, например, я изменяю фоновую картинку для окна входа в систему XDM:

    xv -rmode 2 -quit Pictures/mountain-panorama.jpg
    

    Показанный выше пример файла ".xinitrc" использует эту команду для смены фона окна при ручном запуске Х посредством скрипта "startx". Чтобы установить фоновую картинку при входе в систему через XDM, я изменяю файл "/etx/X11/xdm/Xsetup_0":

    .... == Второе послание к Коринфянам святого апостола Павла == .......
    === Глава 5, Стих 19 ===
    18 Все же  от  Бога,  Иисусом  Христом  примирившего  нас  с  Собою  и
    давшего нам служение примирения,
    19 потому  что  Бог  во  Христе  примирил  с  Собою  мир,  не   вменяя
    _людям_ преступлений их, и дал нам слово примирения.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host ~]$ cat /etx/X11/xdm/Xsetup_0
    #!/bin/sh
    # $OpenBSD: Xsetup_0,v 1.3
    if [ "$DISPLAY" = ":0" -o "$DISPLAY" = ":0.0" ]
    then
    /usr/local/bin/xv -root -geometry 1600x900 -quit ~/Pictures/Roses_2013.png
    xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail
    fi
    
    #sxpm OpenBSD.xpm &
    [user@host ~]$
    

    Прочтите документацию программы "XV" в виде PDF файла, предлагаемую на вебсайте проекта - раздел "12.6: Root Window Options" поясняет значение разных "rmodes". Некоторые из них ("зеркальные") изменяют изображение действительно интересно.

    Более одного монитора на столе

    Сервер Xorg имеет расширение (extension) RandR, поставляемое с программой "xrandr". Эта программа позволяет нам оперировать расположением и настройками мониторов, не изменяя конфигурационный файл Х сервера. Более того, сегодня сервер Xorg настолько полагается на правильность работы RandR, что не имеет такого файла - конфигурация Х дисплея выполняется "на лету".

    Эта же программа "xrandr" даёт нам необходимую гибкость при организации работы на нескольких физических мониторах. Просто введя её, мы увидим текущую конфигурацию нашего Х дисплея. Вот последовательность команд для организации рабочего пространства на двух мониторах:

    xrandr --output LVDS1 --left-of DP1
    xrandr --output DP1 --pos 0x0
    xrandr --output LVDS1  --pos 1680x0
    

    Обратитесь к документации (man xrandr) за детальным объяснением всех опций. Я использую эту программу в приведенном ниже "скрипте пользователя".

    Русская фонетическая клавиатура

    Не всем пользователям Русского языка удаётся работать на компьютерах с русской клавиатурой - именно поэтому существует фонетическая раскладка, удобство и полезность которой просто невозможно переоценить. Включается она тоже очень просто, используя стандартное расширение Xorg под названием "XKB".

    # Помещается в startup файл, например ".profile"
    # Смотрите файл /usr/share/X11/xkb/symbols/ru
    setxkbmap -layout 'us,ru(phonetic)' -option 'grp:shifts_toggle,grp_led:caps'
    

    Недавно разработчики Gnome решили "переопределить" назначение некоторых клавиш в русской раскладке (ч,ю,я,ь,ё,ъ), что привело к полной путанице. Используя "setxkbmap" как показано выше я всегда нахожу свои "фонетические" русские буквы на уже привычных местах, и под Linux, и под OpenBSD.

    Подсветка (яркость) и копии экрана

    Такая вроде бы тривиальная задача как уменьшение яркости экрана или копирование его содержимого (или одного окна) в графический файл может показаться невозможной без использования функций Gnome. Решение очень просто:

    xbacklight -set 35 -- устанавливает яркость подсветки экрана на 35%
    gimp   -- программа используется для снятия копии окна
    

    "Личные" конфигурационные скрипты пользователя

    Мне нравится работать с системой, конфигурация которой мне понятна и может быть легко изменена. Для этого я создаю маленькие скрипты для установки моего рабочего окружения - для дома, работы, проектора или домашнего кинотеатра.

    Такой подход позволяет мне иметь "конфигурацию по умолчанию" для лаптопа без всякой периферии. Когда я прихожу на работу и подключаю внешние монитор, клавиатуру и мышь - я запускаю соответствующий скрипт. Для меня это просто и понятно, и я всегда точно знаю где и что изменять при необходимости. Кроме того я всегда помню как работает именно сама система, а не "как использовать Гном".

    Ниже я привожу мой скрипт для рабочего окружения.

    ........................ == Книга Иова == ............................
    === Глава 8, Стих 13 ===
    13 Таковы пути всех  забывающих  Бога,  и  надежда  лицемера погибнет;
    14 упование  его  подсечено,  и  уверенность   его   --   дом   паука.
    
    (b+/b-, c+/c-, +/-, *) >
    [user@host ~]$ cat ~/work_setup_script.sh
    #!/bin/bash
    # Work script - read-and-think.org
    
    # Setting two screens -
    # Dell 1680x1050, DisplayPort (left) and Laptop 1600x900 (right)
    xrandr --output DP1 --pos 0x0 --primary
    xrandr --output LVDS1  --pos 1680x100
    
    # Setting the wallpaper across both screens
    xv -rmode 2 -quit ~/Pictures/mountain-panorama.jpg
    
    # Connect the Ethernet network
    nmcli con up id enp0s25
    # Check connection
    if (nm-online)
    then echo "Connected!"
    else echo "No Network!"
    fi
    
    # I do not have Russian keyboard at work.
    setxkbmap -layout 'us,ru(phonetic)' -option 'grp:shifts_toggle,grp_led:caps'
    # End of script
    

    Если вы подключите другую клавиатуру в USB порт, команда "setxkbmap" должна быть запущена повторно.

    В заключение

    Я надеюсь, что эта заметка поможет читателю понять некоторые полезные но забытые тонкости работы современных UNIX-like систем, скрытые от обычного пользователя сложностями реализации графических оболочек. Мне нравится иметь простое и одинаковое рабочее окружение на многих машинах с разными ОС и я буду рад если мой опыт поможет и вам.

    Спасибо что зашли,

    Будьте благословенны!
    Денис

    24 Октября 2013 года.