TWM

Материал из OpenWiki
Перейти к: навигация, поиск

Лирическое вступление

Помню как впервые столкнулся с twm. За окном была ночь, а я, недавно вставший на путь освоения unix, настраивал X Window System, сидя перед своим семнадцати-дюймовым ЭЛТ-монитором, освещающим темную комнату, в которой все уже давно крепко спали, только изредка вздрагивая то от стука клавиш, то от незначительных изменений освещенности, вызванных вспышками люминофора на поверхности кинескопа.

Читать документацию в разнообразных форматах в консоли, да еще и при частоте 75 Герц, было неудобно, поэтому и решено было провести установку X. После первоначальной правки конфигурационного файла, клавиатура прогремела `startx` и я увидел это:

Twm Default.png

Решив, что здесь что-то не так, я нажал "ctr+alt+backspace" и занялся установкой KDE.

Мне и в голову не пришло, что передо мной была вполне полноценная среда для работы, а я ей — "ctr+alt+backspace". Да, это был twm, Timeless (Tabbed (Tom's)) Window Manager. Прошедший сквозь десятилетия (timeless), с возможностью организации приложений в виде вкладок (tabbed) оконный менеджер Тома Лестрейнджа (Tom's). А понять это можно было, нажав, хотя бы, левую кнопку мыши:

Twm default desktop with menu.png

Вот так. А я сразу и не догадался.

Мотивация к чтению

Я понимаю, что "за такого дедушку никто так просто не пойдет". Поэтому, обеспечу его "приданным":

  • В twm впервые была реализована концепция похожая на современную панель задач, на что, согласитесь, просто интересно посмотреть;
  • Он написан на C без использования каких-либо тулкитов, а напрямую, используя Xlib. Оттого, требования к ресурсам системы у него минимальны;
  • Разобравшись в twm, вы легко сможете освоить другие оконные менеджеры, так как многие переняли у него концепции и идеи, а то и код;
  • Его можно хорошо настроить (делая небольшую скидку на возраст):

Twm teaser.png

  • Вы сможете видеть у вас на экране тоже самое, что и на скриншоте выше, если скачаете конфигурационный файл, ссылка на который присутствует в тексте статьи; *Вообще, наличие конфига является очень хорошей чертой. Особенно это радует на фоне таких менеджеров как wm2 или karmen, где отсутствие конфигов возведено в ранг фич.

История

На дворе стоял 1987 год. В то время, в дистрибутив X Window System, по-умолчанию, включали оконный менеджер uwm, который многих не устраивал, но с ним мирились, так как альтернатив ему не было. А Тому Лестрейнджу позарез нужен был хороший менеджер окон. И вот, в один прекрасный момент, он сел за свою машину и так, как бы от нечего делать, написал:

vi twm.c

Потом открыл документацию по недавно вышедшему X11 и, изучая её, написал свою первую X-программу — twm. Изначально, название программы было связано с именем автора первой буквой "t" — "Tom's".

То есть всё было довольно прозаично. Понадобился человеку инструмент, он его сам и сделал. Тут даже никакого "Just For Fun" (хотя это и понятно, его тогда еще не изобрели).

Вот. А потом исходники twm были отправлены в comp.unix.sources. Странно, но после этого в компании Тома начались технические проблемы с usenet, и автор twm не читал конференций около месяца. Как раз в этот период, в usenet, вовсю шло обсуждение вопроса о включении twm в дистрибутив X как стандартного менеджера окон. Вопрос был решен в пользу twm и с Томом официально связались люди из Консорциума X. Они хотели получить бразды правления детищем Лестрейнджа, на что Том с радостью согласился. По-другому, кроме как официально, связаться с ним не получалось, из-за описанных выше технических неурядиц.

Новая власть, как это положено, должна что-то изменить. Веру, календарь, названия улиц или городов, алфавит... На худой конец снести пару памятников и не забыть смениться другой, оставляя все дальше уходящих от своих корней людей на растерзание приемникам. Но, в случае мира информационных технологий, не всё так грустно. Консорциум изменил значение первой буквы в названии программы, теперь она значила "tabbed". Это от того, что кроме приведения кода в соответствие с Inter-Client Communication Conventions Manual (ICCCM), новые хозяева добавили возможность менять вид заголовков окон таким образом, что расположенные рядом окна стали походить на папку документов с закладками:

Twm tabbed win.png

Кроме того, Том теперь не был в ответе за twm, поскольку оконный менеджер уже включал код добавленный другими людьми. Поэтому, сменой значения первой буквы, связь между Томом Лестрейнджем и twm была разорвана.

Четвертый релиз X11 увидел свет 22 декабря 1989 уже вместе с twm. С этого дня, мир, в очередной раз, изменился. Мир оконных менеджеров, во всяком случае. В промежуток равный чуть более года появляется, как минимум, четыре оконных менеджера основанных на коде twm: swm, dwim (распространялся как патч к twm), vtwm, tvtwm. Первый и последний, кстати, написаны Лестрейнджем. При чем, написав tvtwm, Том опять связывает себя и свою программу первой буквой имени ("tvtwm" расшифровывается как "Tom's Virtual Tab Window Manager"). Затем выходят ctwm, fvwm и piewm. Два первых, это прямые наследники twm, а piewm унаследовал код tvtwm. Помимо этого, многие, написанные с нуля, менеджеры базируются на идеях, появившихся в twm или его производных.

Сам же twm, в скором времени перестал развиваться и новые менеджеры быстро оставили своего отца и вдохновителя позади. Но не смотря ни на что, тот факт, что вклад twm в облик и принципы работы современных оконных систем достаточно велик, никто оспаривать не будет. Пусть даже Лестрейндж и называет twm "гадким утенком".

Twm и по сей день часто входит в дистрибутивы реализаций X Window System. Например, в XFree86 (http://cvsweb.xfree86.org/cvsweb/xc/programs/twm) или Xorg (http://cgit.freedesktop.org/xorg/app/twm). Многие люди отдают ему предпочтение когда необходим быстрый, нетребовательный к ресурсам, надежный менеджер окон. А недавно он получил третье значение первой буквы. Теперь "twm" значит "Timeless Window Manager" ("Вневременный Менеджер Окон"). Что ж, он такое название вполне заслужил.

Работа с конфигурацией по-умолчанию

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

Перед работой с twm, осмелюсь напомнить, хотя это и выходит за рамки этого повествования, что те кому не нравиться "фон рабочего стола" предлагаемый X11 по-умолчанию могут с легкостью его сменить сказав прямо во время сеанса работы с twm, например, вот это:

xsetroot -solid black

То, как ведет себя twm без предварительного внимания пользователя к себе, описано на странице руководства twm(1) в разделе "DESCRIPTION" с третий по шестой абзацы включительно. Здесь я перескажу информацию содержащуюся там и, по возможности, дополню её.

С помощью техники "подмены родителя" (reparenting), twm может поместить окно программы в еще одно окно-рамку. Это дает возможность предоставить всем окнам общие инструменты управления. Одним из таких инструментов является заголовок окна, по-умолчанию создаваемый для всех окон:

Twm default title.png

В заголовке мы видим (слева направо): кнопку минимизации окна, название окна, индикатор фокуса и кнопку изменения размера окна.

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

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

Кликнув по заголовку ЛЕВОЙ кнопкой мыши, вы переместите окно по оси "z" ближе всего к вам, перекрывая другие окна. Того же можно добиться, если щелкнуть в рабочей части окна ПРАВОЙ кнопкой мыши с зажатой "alt"("meta").

Используя колесико мыши(среднюю кнопку) и заголовок для реализации клика, можно переместить окно в самую глубь по оси "z", спрятав его за другие окна. Это произойдет также если вы щелкнете по рабочей части окна ЛЕВОЙ кнопкой мыши одновременно удерживая "alt".

"Ухватившись" за заголовок можно перемещать окно по осям "x" и "y". Этому есть альтернатива — взяться за рабочую область окна левой или правой кнопками мыши с зажатой клавишей "alt" и двигать окно так. Также, чтобы перемещать окно более точно, а именно, только по "x" или "y" необходимо выполнить двойной щелчок по заголовку окна и, не отпуская кнопку мыши после второго щелчка, начать перемещать окно по одной из этих осей. По какой оси сперва потащите, по такой окно и будет перемещаться, ни на йоту не отклоняясь в сторону.

Если кликнуть по кнопке минимизации, окно свернется в иконку:

Twm default icon.png

В точно такую же иконку окно свернется, если кликнуть по рабочей части окна колесиком мыши с одновременно зажатой клавишей "alt"(meta). Иконки передвигаются по осям "x" и "y" с помощью "ухвата левой" (можно с зажатой "alt"). По оси "z" иконки можно перемещать также как и обычные окна с помощью описанных выше комбинаций кнопок мыши и клавиши "alt". Кликнув по иконке, мы вернем окну первоначальное положение и размер.

Название окна информирует нас, как минимум, об имени запущенного приложения. Иногда там отображаются сведения с дополнительной информацией, к примеру, о статусе выполняемого процесса, о названии открытого документа, и о других подобных вещах.

Индикатор фокуса делает работу соответствующую его названию. Вот так фокуса у окна нет:

Twm title without focus.png

А так есть:

Twm title with focus.png

Кнопка изменения размера окна работает несколько непривычно для современного пользователя. Хотя, само её наличие вообще является странноватым. Чтобы изменить размер окна, нужно нажать на эту кнопку и, не отпуская клавишу мыши, переместить курсор к границе которую мы хотим расширить или сузить, после чего, изменив расположение границы, отпустить клавишу.

Отлично. Как управлять окнами разобрались. Теперь посмотрим, что предоставляет нам менюшка, доступная при клике на свободном месте "рабочего стола":

Twm default menu.png

Первые пять пунктов дублируют уже изученный нами функционал по работе с окнами. Это свертывание окна в иконку ("Iconify"), измение размера ("Resize") и перемещение по осям "x", "y" ("Move") и "z"("Raise" и "Lower"). Чтобы им воспользоваться отсюда, достаточно выбрать необходимое действие мышкой, навести курсор на окно и кликнуть по нему.

Воспользовавшись пунктом меню "Focus", можно закрепить фокус на каком-то окне таким образом, что он будет там оставаться независимо от месторасположения курсора мыши до тех пор, пока к этому окну не будет применен пункт меню "Unfocus" или пока не будет закреплен фокус к какому-нибудь другому окну.

Пункт меню "Show Iconmgr" даст нам возможность работать с менеджером иконок:

Twm default iconmgr.png

Через него доступны все открытые на данный момент приложения. Мы можем с помощью него минимизировать любое окно или, наоборот, развернуть, применяя для этого простой клик мышки по значку программы (левой или средней кнопкой мыши). Также, выбрав в менеджере иконок развернутое приложение оно получает фокус и мы сразу же можем использовать его для ввода данных, даже не видя его. Соответственно, чтобы скрыть менеджер значков необходимо воспользоваться пунктом "Hide Iconmgr".

Щелкнув по "Xterm" у нас откроется одноименное приложение. Но не сразу. Сначала будет показано только прозрачное очертание окна и курсор мыши будет привязан к нему. Дело в том, что по-умолчанию, перед тем как разместить новое окно, twm просит указать пользователя место и размеры этого окна.

Расположение указывается с помощью перемещения очертания окна в то место где мы хотим видеть наше окно. Далее, если нас устраивают размеры окна, то щелчком левой кнопки мыши мы размещаем окно.

Если необходимо произвольно изменить размеры окна, то их можно указать, нажав среднюю кнопку мыши и далее действовать как при обычном изменении размера окна (этот процесс мы уже обсуждали), после, отпустив кнопку мыши, окно разместиться с указанными размерами в указанном месте.

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

Воспользовавшись пунктом "Kill", можно завершить работу приложения, которое создало указанное окно. С помощью "Delete" же просто закрывают окно.

"Restart" перезапускает twm. Замечательно то, что при этом перечитывается конфигурационный файл, что бывает весьма полезно при частом изменении оного.

Выбором в меню пункта "Exit" осуществляется завершение работы twm.

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

Вы всё можете настроить сами...

...и вы будете это делать.

Именно так. Страница руководства twm(1) вам в этом поможет. Так же, есть хороший [обзор менеджера] от Тома Лестрейнджа.

В сети есть достаточно примеров конфигураций. Кроме того, хороший конфиг, с комментариями, прилагается к этой статье. Он реализует более удобную и функциональную среду для работы, к примеру:

  1. Многоуровневое пользовательское меню лично настроено самим пользователем:
    Twm menu.png

    Вызывается при щелчке правой кнопки мыши по корневому окну ("рабочему столу") или в любом другом месте с зажатой клавишей "alt".
  2. Специальное меню, содержащее все открытые окна:
    Twm win menu.png

    Вызывается по тому же принципу, что и описаннное выше меню, только по правой кнопке мыши.
  3. Моментальное размещение окон, вместо просьбы к пользователю о предварительных параметрах будущего окна.
  4. Менять размеры окон можно более привычним способом, просто взявшись за край окна.
  5. Свертывание окон не приводит к образованию иконок. Управление иконками осуществляется только через "панель задач".
  6. По "панели задач", которая на самом деле, всего лишь частный случай менеджера иконок, можно "гулять" с помощью alt+tab и alt+shift+tab, окно можно развернуть и (или) вывести на передний план с помощью "alt+1", а свернуть — "alt+2". "Перелистывать" несвернутые окна можно с помощью "ctr+shift", а закрывать, конечно же, по "alt+F4".
  7. В заголовке окна имеются весьма функциональные кнопки: Twm title.png

    Первые четыре распахивают окно на всю левую, верхнюю, нижнюю или правую части экрана соответственно. То есть, двумя кликами мышки можно организовать вот это: Twm split screen.png

    Пять кнопок справа, это немного дополненная известная всем триада "свернуть-распахнуть-закрыть". Дополнительные две кнопки, стоящие между ними, распахивают окно только по ширине или высоте.

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

Приложение

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

# By Bisyarin Artyom, 2009-2010
# http://zool.in.ua/articles/twm/files/twm_config.tar.gz
#
# Конфигурационный файл TWM разбит на три основные части:
# - переменные
# - привязки
# - меню
# Порядок появления этих частей в файле важен. По крайней мере, 
# документация говорит, что "The Variables section must come first".
# Если этому не следовать, например, описав меню, перед заданием
# значения некой переменной, то можно получить сложно предсказуемые 
# результаты. Удавалось наблюдать увеличение размеров заголовков окон
# и пунктов меню вдвое, или невозможность указать свой шрифт.
# Внутри этих частей имеется разделение по объектам воздействия 
# конфигурационных директив(на меню, на менеджер иконок, на окна).

# * * * * * * * *
# * Переменные  * 
# * * * * * * * *
### Окна
# Не предоставлять умолчательных кнопок в заголовке окна
# и привязок (клавиатурных или мышинных). Мы их потом сами
# определим.
NoDefaults

# Восстанавливать положения и состояния окон после перезапуска twm.
RestartPreviousState

# Создавать элементы управления окнами для вспомагательных окон, 
# таких как диалоги для открытия файлов, подтверждения ("Yes"/"No"),
# и т.д. 
DecorateTransients

# При перемещении окон делать их "непрозрачными", то есть
# будет видно содержимое перетаскиваемого окна. Без этого
# при перемещении мы будем видеть только прозрачное очертание окна.
OpaqueMove

# При перемещении "непрозрачных" окон или при показе меню, 
# давать возможность прорисовываться содержимому других окон.
NoGrabServer

# Сделать невозможным вынос окон за видимые границы экрана.
#DontMoveOff

# Сколько пикселей нужно протянуть окно чтобы оно действительно
# начало перемещаться.
MoveDelta 3

# Время в миллисекундах между двумя кликами мышки, чтобы эти клики 
# защитались как двойной клик. Двойной клик начнет операцию ограниченного
# перемещения окна (только по "x" или "y") вместо обычного перемещения.
# Если поставить "0", то мы этим отключим ограниченное пермещение.
ConstrainedMoveTime 200

# Когда мы изменяем размеры или перемещаем окно без включенной
# OpaqueMove, то мы видим только контуры окна. Чтобы контур был нам
# полезен, мы должны видеть его постоянно. Поскольку окно с которым мы
# работаем может быть над другими окнами, а в них могут отображаться
# данные разных цветов, то возможна такая ситуация, что контур
# сольется с этими цветами. Для решения этой проблемы сделано так, что
# цвет каждой точки контура зависит от цветов, которые отображаются в
# окнах под ним.  Перед тем как нарисовать контур в определенном
# месте, twm смотрит на низлежащие цвета, применяет 
# " xor 'значение низлежащего цвета' 'XorValue' " и пользуется 
# полученным результатом как цветом для контура в этой точке.  
XorValue 16777215

# Размещать окна сразу, а не требовать передавать "-geometry" или 
# просить пользователя для начала разместить и настроить размеры окна
# по очертанию.
RandomPlacement

# Заголовки окон сжимать до минимально возможного размера, а не растягивать
# на всю ширину окна.
#SqueezeTitle

# Ширина границ окон.
BorderWidth 3

# Не выносить окно на передний план при перемещении.
NoRaiseOnMove

# Не выносить окно на передний план при изменении размеров.
NoRaiseOnResize

# Размер зазора меж элементами управления окном в заголовке и границей.
FramePadding 0

# Не использовать индикатор фокуса в заголовке.
#NoTitleHighlight

# Размещать окна так как просят программы.
UsePPosition "on"

# Картинка для индикатора фокуса
Pixmaps { TitleHighlight ".twm/bitmaps/focus_indicator.xbm" }

# Цвета
Color
{
BorderTileBackground "rgb:C/C/C"
BorderTileForeground "rgb:C/C/C"
BorderColor          "rgb:C/C/C"
TitleForeground "rgb:A/9/1"
TitleBackground "rgb:E/E/D"
}

# Шрифты
TitleFont  "-*-*sans-bold-r-normal-*-12-*-*-*-*-*-*-*"
ResizeFont "-*-*mono-bold-r-normal-*-16-*-*-*-*-*-*-*"

# Курсоры
# Список встроенных курсоров здесь:
# /usr/local/include/X11/cursorfont.h
Cursors{
Frame "hand2"
}
### /Окна

### Управление иконками
# Переносить курсор на окно которое мы развернули
WarpCursor

# После сворачивания окон их можно будет найти только в менеджере
# иконок, а сами иконки создаваться не будут.
IconifyByUnmapping

# Если уж включили иконки, то аккуратно их складываем в одно место.
IconRegion "400x700+0+80" North West 70 20

IconBorderWidth 1

# Наша панель задач (сделанная из одного менеджера иконок).
# Запускать при старте.
#ShowIconManager

# Убираем заголовок из панели задач.
NoTitle {"TWM Icon Manager"}

# Вертикально-ориентированная панель задач, справа, в один столбец.
IconManagerGeometry "170x1-3+23" 1

# Сортировать иконки в менеджере.
#SortIconManager

# Цвета иконок и менеджера иконок
Color {
IconBackground "rgb:0/0/0"
IconForeground "rgb:5/5/5"
IconBorderColor "rgb:3/3/3"
IconManagerBackground "rgb:1/1/1"
IconManagerForeground "rgb:5/5/5"
IconManagerHighlight "rgb:8/7/2"
BorderTileBackground "" {"TWM Icon Manager" "rgb:0/0/0"}
BorderTileForeground "" {"TWM Icon Manager" "rgb:0/0/0"}
BorderColor          "" {"TWM Icon Manager" "rgb:0/0/0"}
}

# Шрифты
IconFont "-*-*sans-bold-i-normal-*-12-*-*-*-*-*-*-*"
IconManagerFont "-*-*sans-bold-r-normal-*-12-*-*-*-*-*-*-*"
### /Управление иконками

# Особая настройка конкретных окон
NoTitle {"oclock"}
IconManagerDontShow {"oclock"}

NoTitle {"Запуск GIMP"}

# /Особая настройка конкретных окон

### Меню
# Плавно менять цвет пунктов меню у который не заданы цвета, но которые 
# находяться между двумя другими пунктами с заданными цветами
InterpolateMenuColors

# Ширина границы менюшек
MenuBorderWidth 0

# Шрифты
MenuFont "-*-*sans-bold-r-normal-*-12-*-*-*-*-*-*-*"

# Цвета менюшек
Color {
MenuBackground "rgb:3/3/1"
MenuForeground "white"
MenuTitleBackground "white"
MenuBorderColor "black"
MenuTitleBackground "black"
MenuTitleForeground "gold"
MenuShadowColor "rgb:1/1/0"
}
### /Меню

# * * * * * * * 
# * Привязки  *
# * * * * * * * 
### Окна
# Ф-ции
Function "resize-or-lower" { f.resize f.deltastop f.lower }
Function "move-or-raise"   { f.move f.deltastop f.raise }
# Переключение между несвернутыми окнами
Function "next-win"   { f.hideiconmgr f.circleup }
Function "prev-win"   { f.hideiconmgr f.circledown }

# Окно влево, вверх, вниз, вправо
LeftTitleButton "~/.twm/bitmaps/left.xbm" = f.leftzoom
LeftTitleButton "~/.twm/bitmaps/top.xbm" = f.topzoom
LeftTitleButton "~/.twm/bitmaps/bottom.xbm" = f.bottomzoom
LeftTitleButton "~/.twm/bitmaps/right.xbm" = f.rightzoom
#LeftTitleButton "~/.twm/bitmaps/focus_indicator.xbm" = f.nop

# Картинки и действия для свернуть-развернуть-закрыть
RightTitleButton "~/.twm/bitmaps/minimize.xbm" = f.iconify
RightTitleButton "~/.twm/bitmaps/ch_size_hor.xbm" = f.horizoom
RightTitleButton "~/.twm/bitmaps/ch_size.xbm" = f.fullzoom
RightTitleButton "~/.twm/bitmaps/ch_size_ver.xbm" = f.zoom
RightTitleButton "~/.twm/bitmaps/close.xbm" = f.delete

"F4" = mod1 : iconmgr|window|frame|title : f.delete
"z"  = mod1 : iconmgr|window|frame|title : f.fullzoom 
"i"  = mod1 : iconmgr|window|frame|title : f.identify

Button1 = : root : f.menu "main"
Button2 = : root : f.showiconmgr
Button3 = : root : f.menu "TwmWindows"

Button1 = : title : f.function "move-or-raise"
Button1 = : frame : f.function "resize-or-lower"

Button1 = m : root|window|frame|title : f.menu "main"
Button3 = m : root|window|frame|title : f.menu "TwmWindows"

# Переключение между несвернутыми окнами
"Tab"= control : all : f.function "next-win"
"Tab"= mod1 control : all : f.function "prev-win"
### /Окна

### Менеджер иконок
# Ф-ции для реализации менеджера задач
# Подразумевается, что менеджер иконок имеет только один
# столбец. Поэтому "down" всегда будет значить "следующий",
# а "up" --- "предыдущий".
Function "taskbar-next" { f.showiconmgr f.downiconmgr }
Function "taskbar-prev" { f.showiconmgr f.upiconmgr }
#Function "taskbar-app-raise-lower" { f.hideiconmgr f.raiselower f.showiconmgr }
Function "taskbar-app-raise-hide" { f.iconify f.raise f.showiconmgr }
Function "taskbar-app-raise" { f.deiconify f.raise }
# также разворачивает окно, если оно уже свернуто
Function "taskbar-app-hide"  { f.iconify f.function "taskbar-next"}

Button1 = : iconmgr : f.raiselower
Button2 = : iconmgr : f.hideiconmgr
Button3 = : iconmgr : f.function "taskbar-app-raise-hide"

"Tab" = mod1 : root|window|frame|title|iconmgr : f.function "taskbar-next"
"Tab" = mod1 shift: root|window|frame|title|iconmgr : f.function "taskbar-prev"
"1" = mod1 : iconmgr|window|frame|title : f.function "taskbar-app-raise"
"2" = mod1 : iconmgr|window|frame|title : f.function "taskbar-app-hide"
### /Менеджер иконок

### Иконки
Function "move-or-iconify" { f.move f.deltastop f.iconify }

Button1 = : icon : f.function "move-or-iconify"
Button3 = : icon : f.lower
### /Иконки

# * * * * *
# * Menu  *
# * * * * *
### Главное Меню
menu "main"
{
"::..                                               " f.title
"Xterm"                      ("rgb:e/e/e" : "rgb:a/9/1")        
                             f.exec "xterm -r -geometry 80x25+0+0 -fn -cronyx-fixed-*-r-normal--16-120-100-100-c-80-koi8-r &"
"Opera"                      f.exec "opera -geometry 1000x750+0+0 &"
"Pidgin"                     f.exec " pidgin &"
"Kate"                       f.exec "kate -geometry 872x576+0+0 >/dev/null 2>&1 &"
"Emacs"                      f.exec "emacs &"
"Djview"                     f.exec "djview &"
"XPDF"                       f.exec "xpdf &"
"StarDict"                   f.exec "stardict >/dev/null 2>&1 &"
"SWriter"                    f.exec "openoffice.org-2.0.4-swriter >/dev/null 2>&1 &"
"Gimp"                       f.exec "gimp >/dev/null 2>&1 &"
""              f.nop
"Win management..."          f.menu "win_tools"
#""                          f.nop
#"Monitor management..."      f.menu "monitor_tools"
""                           f.nop
"Refresh"                    f.refresh
"Restart"                    f.restart
"Exit"                       ("rgb:e/e/e": "rgb:1/1/1") 
                             f.quit
}

### Команды для управления окнами
menu "win_tools"
{
"                                      " f.nop
"Iconify"              f.iconify
"Resize"               f.resize
"Move"                 f.move
"Raise"                f.raise
"Lower"                f.lower
""                     f.nop
"Delete"               f.delete
""                     f.nop
"Kill"                 f.destroy
}