Закат эпохи Тома

$Id: vtwm.texi,v 1.2 2007/06/19 13:24:46 alex Exp $

Copyright © 2003 Alexander Gromnizki <iwerdon.at.gmail.com>.

Update: с начала апреля 2007 года я, к сожалению, больше не использую VTWM. О подробностях перехода см. запись в блоге.

Когда-то давным давно, когда еще понятие desktop плохо ассоциировалось с привычно-скучным изречением "рабочий стол", а корпоративные пользователи еще весьма смутно представляли себе преимущества графического интерфейса, как такового в общем, и его "глубокий смысл", в частности... Короче говоря, в те счастливые времена, когда еще вместо ПК были распространены рабочие станции, тихой сапой, Том ЛаСтренж (Tom LaStrange) написал... свой оконный менеджер.

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

В наше время, когда вполне естественным считается, что такая утилитарная вещица как оконный менеджер (ОМ) должна занимать никак не меньше пару мегабайт исходных текстов, быть напичканной по самое "не могу" тучей иконок и прочего мусора, внешний вид скромного детища Тома способен только рассмешить. Действительно, по сравнению с дальними (хоть и хорошими) родственниками, например AfterStep, Tom's Window Manager (TWM, впоследствии расшифровывающемся как Tab Window Manager) выглядит жалко и убого, а в стандартной настройке вполне способен вывести из себя непривычного пользователя. И в то же время... Что в нем такого, что X Consortium включил его в поставку X Window, и не меняет его до сих пор?

Чтобы дать ответ на этот вопрос пользователю погребленному за стандартными настройками какого-нибудь дистрибутива Linux и не высовывающего носа из оболочек KDE/Gnome, нужно хоть немного попытаться сформулировать требования предъявляемые к оконному менеджеру. Исключить из них бессмысленные дублирующие функции, обратить внимание на совместимость с протоколом ICCCM, и на закуску, приплюсовать некоторые положительные сдвиги в пользовательских красотах. Субъективно, но только так можно определить полезность конкретного оконного менеджера.

ICC... что?

The ICCCM is generally the M in RTFM
— Дэвид Росенталь (David Rosenthal)

Inter-Client Communication Conventions Manual (ICCCM) - это один из официальных документов, который определяет среду X окружения (прочитать его можно с http://tronche.com/gui/x/icccm/). Разные клиенты для корректной работы в пределах одного и того же X-сервера должны без паники взаимодействовать с ОМ, соблюдая установленные перечни договора. Если договор нарушается с чей-либо стороны, противоположной становиться очень плохо (в худшем случаи, результатом плохого контакта будет беспощадное генерирование известных core-файлов).

Чтобы почувствовать на себе тяжесть протокола ICCCM нужно попробовать написать хоть одну X-программу с использованием библиотеки Xlib. Так Вы быстро определите способ, с помощью которого оконный менеджер взаимодействует с X-клиентами. Таким способом является механизм "свойств", фундаментом которого есть не что иное, как обычная C-структура по типу:

     typedef struct {
        	unsigned char *value;
     	Atom encoding;
     	int format;
     	unsigned long nitems;
     } XTextProperty;

Пользуясь функцией XStringListToTextProperty() можно конвертировать C-строку в "свойство" X, а затем, например, назначить окну клиента имя, вызвав функцию XSetWMName(). Обычно таким использованием X-свойств, естественно, не ограничиваются. К примеру, для изменения размеров окна клиента вы должны заполнить структуру XSizeHints и вызвать функцию XSetWMNormalhints(). Список всевозможных свойств таких как "хинты" и разных функций преобразования рядом с ними, по сути и есть тот "страшный" протокол ICCCM, которым впору пугать, как электорат инфляцией, некоторых ленивых X-программистов, которые умудряются, однако, со скоростью кроликов, штамповать новые кучки своих ОМ.

Major features

Если Microsoft выпуская в 1990 году Windows 3.0, пыталась сделать свой интерфейс унифицированным "для всех и навсегда", то известно, что архитекторы X Window, к счастью, этого не сделали. Сшитый с ядром ОМ Windows, к 95 году похорошел, но остался таким же близоруким. Вместо того, чтобы купить очки и обзавестись нормальной обувью, он одел только костюм нового фасона. На вопросы почему, господин ОМ хвастаясь обновкой, отвечал, что видеть все он может и через откидывающее стекло часов, а туфли - вот они, а что жмут - не слишком важно. Глядя по проишествии восьми лет, как ОМ все так же (но в новым костюме!) натыкается на прохожих и подпрыгивает, бедняга, во время ходьбы от жмущей обуви, невольно улыбаешься.

Поразительно, но глядя на мучения ОМ Windows, новая волна создателей ОМ под X Window с каким-то ненормальным, явно мазохизическим упорством перенимает абсолютно все неудачные решения противника. Разбирать проблемы строителей "коммунизма" свободного десктопа мы не будем, ибо тема сия бесконечна как звезды и темна как ночь. Нас с вами должны интересовать только те удачные элементы, которые облегчают работу. Не больше и не меньше.

Перебирая на своем пути множество различных ОМ под X Window, пристально рассматривая использованные концепции, можно сделать робкую попытку перечислить некоторые из "носовых платков", т.е. весьма сомнительных решений, слишком явно бросающиеся в глаза.

  1. Иконки на корневом окне. Эта штука отлично смотрится на рекламе мониторов и/или ноутбуков вместе с красивыми обоями там же. Но... Вам часто удается добраться к этим иконкам в процессе работы? Если же их сделать без функции "allways on top", пропадет основное их преимущество перед пунктом 1.
  2. Всевозможные панельки для быстрого запуска приложений. Понятно, что функция их аналогична пресловутым иконкам, но обычно разница в том, что панелька, постоянно "висит" поверх других окон. Недостатки также очевидны: отбирается полезная площадь, часто затрудняется работа с программами рассчитанными на весь экран (как с 3D-моделлером Blender3D).
  3. Горизонтальные панельки переключения задач. Недостаток у них один, но решающий - они не вертикальны.
  4. Уменьшение приложения в иконку. Частично здесь "виноваты" авторы Xlib включившие в эту библиотеку функцию XReadBitmapFile(), позволяющую загрузить битовое изображение в любое окно (в данном случае root окно приложения). В чем ценность такого способа минимизации окна, продолжает оставаться загадкой.

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

Modern times

Вопрос, может ли компьютер плавать, более интересен, чем вопрос, может ли подводная лодка думать
— Ленни Декстра (Lenny Dykstra)

Пожалуй, мы немного отвлеклись. Перечисленные нами возможные неоднозначности в современных ОМ слишком скользкие, чтобы на них можно было опереться. Хотя, если уж завели речь о такой программе как TWM, то надо признать, что их там нет. Или почти нет (пункт 4 там все-таки присутствует...). А уж чтобы совсем запутать читателя сообщу, что стареньким TWM сейчас пользоваться нет никакого смысла. При всех его достоинствах, возможности для современного десктопа чересчур ограничены. Если взглянуть на его историю появления, бросается в глаза мгновенное отпочковывание нескольких независимых ОМ с, естественно, уже другими названиями (что интересно, первые два, SWM и TVTWM, были написаны собственноручно Томом). Как правило, главным новшеством у них было появления виртуальных экранов. К сожалению, дыхания у почитателей традиций Тома хватило ненадолго и большинство проектов давно почили в бозе.

Одним из выживших и успевшего уже несколько раз поменять maintainer'а (хотя все поголовно, включая и последнего, Дэвида Хавки (David Hawke), личности, к слову, весьма известной, на первых порах всячески от этой должности открещивались) является славный потомок TWM, продолжатель традиций - VTWM, самые первые версии которого создавались двумя людьми: Дайвой Эдмонсоном (Dave Edmondson) и Ником Уильямсом (Nick Williams).

Как вы, наверное, догадались, первая буква V - означает virtual. Если в подавляющем большинстве других ОМ, таких как WindowMaker, между виртуальными экранами идет жесткое переключение по величине одного из них, то в VTWM ехать можно сколь угодно малыми/большими порциями. Виртуальный экран здесь один, но большой. Величину его визуально можно контролировать пейджером, на лету меняя размер виртуального экрана.

Единственное неудобство, которое, по-началу, может ииспытать на себе новый пользователь программы, это, как ни удивительно, справочное руководство vtwm(1). Оно, по существу, взяв за основу man-страницу twm(1), обросло описанием функций добавленных в VTWM. В остальном, хоть и дает исчерпывающую информацию, сохранило не слишком удачную структуру: описание всех функций просто идет по алфавиту.

В VTWM достаточно много усовершенствований (например, добавлена поддержка звуковых схем), исправлено тьму ошибок TWM, но, тем не менее он остается быть обратно совместимым со своим родителем. Что это означает? Вся настройка этого ОМ производится в одном файле (обычно $HOME/.twmrc) и он может быть общим для обоих ОМ (TWM и VTWM). Причем первый будет просто игнорировать незнакомые для себя параметры. Для любителей всевозможных GUI надстроек на сайте VTWM ехидно замечено о "нанесении вреда потенциалу программы" попытками их создания. Пугаться такой принципиальности не стоит. Указанный файл настроек VTWM логически делится на три секции: переменный, bindings и меню. Первая секция описывает всевозможные настройки шрифтов, цветов, декораций окон, использования пейджера и т.д. Вторая служит для ассоциации событий, поступающих от устройств ввода (клавиатуры, мыши) с перечнем встроенных функций. Третья (меню) достаточно характеризует себя названием и на ней мы останавливаться не будем.

Для начала, уделим некоторое внимание, так называемому, менеджеру иконок (IconManager). Именно эта функция позволила TWM взвиться, подобно птице, ввысь, оставляя далеко внизу мучительно копошащихся конкурентов в хаосе мира X Window. Менеджер иконок (МИ) наполнен кнопками с названиями всех запущенных клиентов, показывающими текущее состояние каждого окна. Достаточно нескольких запрограммированных клавиш и вы получите общий эффект много большим, нежели можно было бы ожидать от такой, в общем то, тривиальной вещицы.

     Function "deiconify-or-warp"
     {
     	f.deiconify
     	f.warp
     }
     
     "Up" = m4 : all : f.upiconmgr
     "Down" = m4 : all : f.downiconmgr
     "Up" = : iconmgr : f.upiconmgr
     "Down" = : iconmgr : f.downiconmgr
     "Return" = : iconmgr : f.function "deiconify-or-warp"
     "BackSpace" = : iconmgr : f.iconify

В правой части выражения - встроенные функции VTWM, ассоциирующиеся с определенной клавишей. Как вы могли заметить, возможно написание собственных функций. Сразу после знака '=' - возможный список модификаторов, здесь m4 - клавиша с логотипом MS Windows (та, что сразу после левого Ctrl). Модификаторами могут быть комбинации из клавиш control, shift, meta и т.д. Заключенный с обоих сторон знаками ':' - предопределенные области окон, где будут работать назначенные клавиши (root, title, etc), где, all - означает "повсюду", iconmgr - только в МИ.

В указанном примере, при нажатии комбинаций m4+Up, m4+Down можно переключаться между запущенными клиентами (нажимать можно в любом активном приложении), Просто "вверх/вниз" - конкретно только в МИ. Там же (имеется ввиду ситуация, когда МИ в фокусе ввода клавиатуры) нажатие Enter активирует выделенный клиент (если, от был минимизирован, окно распахнется снова. Клавиша Backspace лично проделает обратную операцию).

МИ совсем не обязательно может быть один. Если вы желаете, скажем, все запущенные эмуляторы терминала xterm "держать под рукой", сделайте для них отдельный менеджер. Например, вот так

     IconManagers
     {
     	"XTerm"			"258x0+267+0" 1
     }

где, "258x0+267+0" - стандартное указание X-геометрии, цифра 1 - количество столбцов.

Из нехарактерных для не-TWM-подобных ОМ следует отметить необычайную гибкость в оформлении каждого из окон клиента. Как Вам следующая запись:

     NoTitle
     {
     	"VTWM *"
     	"XXkb"
     	"wmsmixer"
     	"wmCalClock"
     }

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

В последних версиях VTWM значительно упростилась работа с приложениями, вроде wmCalClock, написанными для WindowMaker/AfterStep (обычно размером 64x64 пикселей). Ведь ранее, кроме указывания их в списках NoTitle, NoBorder приходилось для каждого такого клиента отдельно задавать геометрию. Теперь же, после того, как добавилась переменная AppletRegion, можно раз и навсегда под эту цель выделить некую область экрана.

     AppletRegion	"64x384-0-0" South West 64 64
     {
     	"XXkb"
     	"asclock"
     	"wmsmixer"
     	"wmCalClock"
     }

Остается одна мелочь, которая, однако, может здорово подпортить нервы, а именно проблема доступа к МИ, пейджеру и, например, AppletRegion, когда экран сильно загружен. TWM предлагает функцию f.warpto, которая "выносит" окно указанного в ней приложения наверх стека окон (вместе с курсором мыши). Взяв ее на вооружение, достаточно написать

     "q" = m4 : all : f.warpto "VTWM Icon Manager"
     "e" = m4 : all : f.warpto "VTWM Desktop"
     
     Function "raise_applets"
     {
     	f.warpto "wmsmixer"
     	f.warpto "wmCalClock"
     	f.warpto "XXkb"
     }
     
     "w" = m4 : all : f.function "raise_applets"

и с помощью комбинаций m4+q, m4+e и m4+w будут "всплывать" МИ, пейджер и группа клиентов, перечисленных в функции raise_applets.

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

     Doors
     {
     	"Screen 2"	"60x15+960+239"	"+1024+0"
     }

Здесь "Screen 2" - название нашей "двери", "60x15+960+239" - собственно геометрия окошка телепорта. Последний же параметр определяет позицию, к которой нужно передвинуться в виртуальном пространстве (в примере было взято предположение, что реальный экран у вас шириной 1024 пиксела).

На радость любителям звуковых эффектов VTWM, наконец, обзавелся их поддержкой. Озвучиванию поддаются абсолютно все функции перечисленные в секции bindings справочного руководства программы, а также такие как "(vtwm start)", "(vtwm stop)" и т.д. Чтобы это работало, не забудьте еще при компилировании ОМ проверить у себя наличие библиотеки rplay. Без нее VTWM останется немым.

Конечно, как и в любой, наверное, программе, в этом ОМ есть несколько неприятных шероховатостей, или, если, хотите "багов". Например, никогда не выставляете опцию StayUpMenus. Почему? По идее, она (опция) включает режим отображения всех меню VTWM в режиме ожидания следующего события нажатия клавиши, т.е. вариант очень похож на работу меню в Windows. Опция работает, но вместе с ней появляется странный эффект, как будто в один момент, что бы не находилось на экране он (экран) ведет себя как корневое (root) окно. Такая ситуация продолжается ровно до нажатия любой клавиши мыши, что не может не раздражать. Так что, как говорится, ждем-с последующих версий.

Подводя итог обзору некоторых интересных особенностей VTWM, пожалуй, пора вспомнить про очень субъективные, но очень популярные в наш век, проблемы внешней "красивости" программ. Общеизвестно, что пользователя мало беспокоит, как хороша внутренняя архитектура продукта, важно только то, как он выглядит. Если TWM мог откровенно испугать своим "отсутствием внешнего вида", то с VTWM стало, хоть не намного, но все-таки легче. По крайней мере, любители Motif-виджетов, признают в VTWM "своего". А если покопаться в настройках, вполне возможно отыскать для себя более-менее удобоваримый вариант. С хорошими примерами таких настроек (как визуальных, так и звуковых) имеет смысл начать знакомится с каталога contrib в поставке VTWM.

Main banality

Я думаю, что нам нужно немного замедлить и остановиться, если возможно, на тех дефинициях, которые ты привел: могут ли они таковым быть?
— Петр Абеляр

Конечно, никакой VTWM вовсе не уникален. Ибо кто-то болеет за "бело-голубых", кто-то за "оранжево-черных", а кто-то, прости Г-споди, и за "красно-белых".

Разумеется, здесь не описаны многие другие возможности VTWM. Как правило, они довольно тонки, и открытие их для себя доставит Вам массу удовольствия, как и чтение исходных текстов программы "которую начал писать Том". Познакомиться с этим ОМ можно (и, наверное, нужно) хотя бы из-за того, чтобы взглянуть на истоки культуры X Window изнутри, а заодно сопоставить размер этой программы с Вашим любимым ОМ. Ради эксперимента, распакуйте VTWM и в том же каталоге дайте команду

     % du -hc *.[chy] | grep total

Трудяга grep выдаст Вам размер всех исходных текстов VTWM. Проделайте тоже самое с файлами любого другого ОМ (не забудьте, что в Вашем случаи, они (файлы) могут быть разбросаны по вложенным каталогах).

Любителям же классики в современной реинкарнации можно посоветовать зайти на сайт http://www.xfce.org/en/documentation.html#wmhints и почитать любопытные строки (перевод не дословный):

"Почему нет опций запуска приложения без любых обрамлений на окнах, функции "поверх остальных" или, почему не сделать так, чтобы приложение было невидимо в панели задач?

xfwm4 не имеет и не будет никогда включать в себя какой-либо механизм для обхода желаний приложения"

Вот так, достаточно безапелляционно. И это говорят разработчики среды, претендующей на "альтернативность" в гигантам KDE/Gnome. Среды с очень эффектной обверткой.

Так что читатель, давай, выбрасывай все наши рассуждения из головы. Последние разработки свидетельствуют о эре стойкого внушения, почему мы должны выбрать их продукт. Ведь если не пользователь управляет приложением, то приложение им. Жаль, что идеи TWM навсегда уходят в забвение... Остается только поднять бокал за Тома и его мысли, воплощение которых впервые появились в comp.sources.x пасмурного дня - 22 сентября, далекого 1988 года...