Linux Corner #6





introduction

articles


КPOBb te4et..
Creative Down
Chill..
Dnevnik Gubnyh
Infernal Flame
IRCZlo
Kazantip '98
Litestep
MSX Culture
Parashoot
SceneUp!
Underground
One day..
Virus inside me
Harmed

interview

Catbones
God Among Lice
Jazztiz
Encore
Nixus
Mutant

lits

Bound
Harmless
Manifesto
Mirage
Nika Bathen 95-97
Alka
Allegory
An other side

tutorials

Textmode Art FAQ
Inet Couriers
NukeM3
MegaDemos Review
Drugz Corner 1
Drugz Corner 2
Linux Corner 1
Linux Corner 2
Linux Corner 3
Linux Corner 4
Linux Corner 5
Linux Corner 6
RTM

download
feedback

home

Переодически на #ruslinux заходят люди и задают такой вопрос: "А какой window manager самый лучший ?" Хмм.. Ну на самом деле window manager каждый вибирает для себя сам. Например, мне нравится Window Maker... Попробую о нем рассказать :)

Что же такое Window Maker?
Посмотрите на http://www.windowmaker.org...

Хехе..

Начну с того, что это NeXT Step-подобный manager, с кучей всяких удобных и полезных вещей. Кроме того, это один из самых быстрых менеджеров, не считая twm, конечно :)

Window Maker был разработан в рамках проекта GNUstep (http://www.GNUstep.org) и перенял все, что раньше так радовало людей в NeXt Step'e, плюс совершенно новые качества, которые так радуют людей сейчас.

Представьте себе window manager, где вся служебная информация и наиболее используемые приложения всегда под рукой, а приложения, которые используются реже, вызываются из удобного меню, которое само по себе может быть окном (с несколько специфичными свойствами) и вести себя как приложение. Сами окна можно сворачивать и минимизировать, можно отключить обрамление окна, установить специальные параметры и прочее, прочее, прочее...

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

Здорово? А как же :)

При всем при этом Window Manager очень быстро работает и не очень требователен к аппаратному обеспечению. Конечно, эффект сюрреалистическо-футуристического окружения может быть достигнут только с определенным количеством bpp, но я думаю, что сейчас уже все имеют хотя бы 1Mb video и монитор с 800x600x16bpp. :)

Цвета и текстуры, определяющие внешний вид Window Maker'a, называются темой. В принципе, готовые темы можно взять с ftp://wm.themes.org, однако, я думаю, никто не сможет сделать тему именно для вас, а тем более несколько тем под разные настроения :)

Сделать свою тему не так сложно. Однако есть ряд ограничений, возникающих при использовании ранних версий Window Maker'a. Другими словами, вам нужен Window Maker версии не ниже 0.15.0. Лучший вариант 0.20.?? - это одни из последних версий, которые можно найти на ftp://ftp.windowmaker.org. Скажу по секрету, я пользуюсь 0.17.5, но собираюсь поиметь какую-нибудь 0.20.??.

Да, и не забудьте взять там же data файл!

Скачали? Ща поставим...

Я надеюсь, вы скачали версию в исходном коде... Ставить Window Maker не сложно. Он ставится как все, что подходит под GNU лицензию, т.е.

# ./configure
# make
# make install

Конечно, перед установкой не мешает почитать INSTALL и посмотреть, какие опции есть у configure, чтобы не пропустить всякие модные фичи :) В процессе конфигурирования может выявиться нехватка той или иной библиотеки, обычно это libtiff и libgif. Перед конфигурацией вы можете проверить их наличие в lib/ директориях и по необходимости выкачать с ftp://ftp.windowmaker.org. Кстати, в самом пакете имеется библиотека PropList, которая должна быть собрана и установлена перед конфигурированием Window Maker'a.

Все библиотеки установлены?

Начинаем конфигурировать Window Maker. Сначала посмотрите, какие опции доступны в configure:

# ./configure --help

Если у вас все стандартно, то можете сделать так:

# ./configure --enable-FEATURE

что бы в вашем Window Maker'e были доступны различные приятные фичи, типа выезжающего меню, если оно попало за границу экрана и т.д.

Думаю, что конфигурирование прошло успешно :)

Теперь компиляция.. Это происходит как обычно:

# make
# make install

Вот так...

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

# wmaker.inst

и укажите, какой файл нужно отредактировать, чтобы пустить Window Maker. Обычно это .Xclients, причем старый .Xclients будет сохранен, а новый будет содержать одну строчку:

exec wmaker

Да, да, он вот так просто пускается...

Если у вас уже стоял Window Maker, но версии ниже 0.15.00, то советую все к нему относящееся удалить и ставить новый по "свежевспаханному" :)

Если же ранее установленный Window Maker имеет версию выше 0.15.00, то вам необходимо просто заменить соответственно старые файлы на новые в /usr/local/share/WindowMaker и, по необходимости, в ~/GNUstep/Library/WindowMaker, не запуская wmaker.inst.

Второй из оставшихся пунктов прост - нужно не забыть установить содержимое data файла, обычно в /usr/local/share/pixmaps.

Ну что, готовы? :) Пускаем:

# startx -- -16bpp

16bpp это тот минимум, который необходим нам для использования тем с текстурами

Заработало ? Я не сомневался, что у вас получится :)

Теперь можете запустить какое-нибудь приложение. Видите, внизу появилась иконка

Если вы хотите, то можете добавить ее в DockApp, это то, что справа :) Возьмите иконку и перетащите ее к правому краю и, как появится белый квадратик, отпустите ее... Неплохо, да? Теперь вы можете вызывать это приложение, просто нажав на нее два раза... Со временем вы настроите DockApp так, что на него будет страшно смотреть :)))

Ну как? Займемся темами?

Вот это уже интересно, это уже творчество... :) Для создания темы с текстурированными меню и окнами вам понадобится какой-либо графический редактор, помощнее xpaint ;) и любой текстовый редактор. В качестве графического редактора я рекомендую GIMP (ftp://ftp.gimp.org), а в качестве текстового редактора.. скажем так, я предпочитаю jed/xjed.

Готово?

Далее необходимо создать текстуры для верхней панели окна, называемой Title Bar

и для меню, причем для меню создается две текстуры: одна для заголовка меню, которая обычно называется Title Menu, а вторая для самого меню - Text Menu. Начнем с первого - Title Bar. Window Maker обрабатывает Title Bar достаточно необычно. Если размер окна по длине меньше или больше, чем размер текстуры, заполняющей Title Bar, то текстура сжимается или растягивается соответственно, стараясь сохранить ту часть градиента, которая была под кнопками и под названием окна. Отсюда видно, что, во-первых, размер текстуры должен быть корректным, но он может изменяться по длине, а во-вторых текстура ложится на весь Title Bar. Это важно иметь ввиду при создании текстуры для Title Bar'a.

Определитесь с цветом текста на Title Bar'e. Допустим, он будет белый. Теперь можно начать рисовать. Обычно я выбираю размер текстуры для Title Bar'a примерно 800x20 пикселей, где 20 - это его постоянная ширина, а длина 800 может варьироваться. Я не рекомендую делать текстуру менее 600 и более 1000 пикселей по длине, чистааа по опыту :) Так как мы остановились на белом цвете для текста на Title Bar'e, то края текстуры и место, где будет название окна, необходимо сделать темным, что бы и кнопки и название были читаемыми. Можете сделать их градиированными от черного к средне-серому и снова к черному.. Я думаю это вы сделаете так, как захотите :) Сделали? Сохраните как .tif (просто он быстрее грузится :) с именем типа:

Ftitle.mytheme.tif

Почему Ftitle ? А вот почему: окна бывают активными и неактивными. Соответственно, текстуры для них немного разные. Ftitle - так обычно называется Title Bar активного окна. Что бы сделать Title Bar для неактивного окна, просто затемните предыдущую текстуру и "сохраните как", например, с именем:

Utitle.mytheme.tif

Сделали?

Дальше - больше :)

Теперь займемся текстурами для меню. Нам нужно сделать две текстуры: одна для заголовка меню (Title Menu), а другая - для самого меню (Text Menu). Здесь нужно учесть, что текст на заголовке и самом меню расположен слева. Допустим, текст в меню будет светло серым. Соответственно, при отрисовке текстур необходимо затемнить левый край примерно на 3/4 от всей длины текстуры. Размер текстур для заголовка меню и для самого меню одинаков и составляет примерно 120x20 пикселей. При этом, как и у Title Bar'a, размер по длине может меняться, но не стоит делать его менее 100 и более 150 пикселей. Сохраните текстуру для заголовка меню как:

TitleMenu.mytheme.tif

а для самого меню как:

TextMenu.mytheme.tif

Готово? Ок.

Все хорошо, но осталость нарисовать еще кое-что... Я имею ввиду текстуру для иконок DockApp'a, это тот, что справа :) Эта текстура обычно называется Tile и имеет строго ограниченный размер 64x64 пикселя. Вы можете нарисовать любую текстуру, но советую подобрать цвета так, чтобы они гармонировали с цветами Title Bar'a и меню. Маленький нюанс - если для текстуры в меню и окне Window Maker применяет выдавливание вне зависимости от того, об'емная она у вас или нет, то текстура нa иконках DockApp'a - плоская! Не забудьте придать ей об'ем :) Сохраните ее как:

Tile.mytheme.tif

Так, вроде с картинками покончили :) Приступим к созданию файла описания темы. Я думаю, что это не менее важно, чем отрисовка текстур. Файл описания темы имеет определенный формат и называется по названию темы, т.е. у нас это:

mytheme

Начинаем создавать? Начали...

Сразу покажу весь файл описания:


# cd ~/GNUstep/Library/WindowMaker/Themes
# cat mytheme
{
  TitleJustify = right;
  WindowTitleFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";
  MenuTitleFont = "-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*";
  MenuTextFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";
  IconTitleFont = "-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*";
  HighlightColor = Gray45;
  HighlightTextColor = black;
  FTitleColor = white;
  UTitleColor = Gray50;
  FTitleBack = (spixmap, Ftitle.mytheme.tif, grey);
  UTitleBack = (spixmap, Utitle.mytheme.tif, Gray45);
  MenuTitleColor = white;
  MenuTextColor = white;
  MenuDisabledColor = Gray40;
  MenuTitleBack = (spixmap, TitleMenu.mytheme.tif, black);
  MenuTextBack = (spixmap, TextMenu.mytheme.tif, white);
  WorkspaceBack = (vgradient, black, gray30);
  IconBack = (spixmap, Tile.mytheme.tif, black);
}

Правда, небольшой такой? :) Просто это тот минимум, достаточный для описания своей собственной темы.

Теперь о том, что все это значит. Видите фигурные скобки? Все поля, описывающие вашу тему, должны быть заключены именно в такие скобки. Первое поле указывает расположение текста на Title Bar'e

Это поле называется:

TitleJustify

У TitleJustify есть три параметра: left, center и right. Таким образом, чтобы задать расположение текста на Title Bar'e, допустим в центре, напишем:

TitleJustify = center;

Следующие поля описывают фонты, применяемые в вашей теме:

WindowTitleFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";
MenuTitleFont = "-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*";
MenuTextFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";
IconTitleFont = "-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*";
DisplayFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";
Описание фонтов выглядит как стандартное описание в X system, т.е. чтобы получить русский фонт, например в меню, нужно написать:

MenuTitleFont = "-*-helvetica-bold-r-*-*-10-*-*-*-*-*-koi8-r";
MenuTextFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-koi8-r";

Конкретнее:

WindowTitleFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";

Описывает фонт для Title Bar'a - заголовка окна.

MenuTitleFont = "-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*";

Описывает фонт для Title Menu - заголовка меню.

MenuTextFont = "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*";

Описывает фонт для Text Menu - самого меню.

IconTitleFont = "-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*";

Описывает фонт для Icon Title - текст на иконках, при минимизации и у WorkSpace switcher'a.

Далее описываются цвета подсветки. Их реальное применение вы увидите при нажатии на какую-либо строку в меню, при этом

HighlightColor = Gray45;

будет цветом фона, а

HighlightTextColor = black;

цветом символов. В качестве цветов можно установить стандартные цвета, описанны в /usr/X11R6/lib/X11/rgb.txt, или описать свой цвет шестнадцатеричными значения и так, как вы это делаете в HTML документах, т.е.

HighlightTextColor = "#abcdef";

Такое описание цвета обязательно берется в двойные ковычки.

Наконец-то добрались до описания Title Bar'a :) Как я уже говорил, имеется активный и неактивный Title Bar. Соответственно все, что начинается с FTitle - относится к активному Title Bar'y, а все что начинается с UTitle - к неактивному. Тогда

FTitleColor = white;

описывает цвет текста на активном Title Bar'e, a

UTitleColor = Gray50;

на неактивном Title Bar'e.

В свою очередь

FTitleBack = (spixmap, Ftitle.mytheme.tif, grey);

описывает текстуру, натянутую на активный Title Bar, а

UTitleBack = (spixmap, Utitle.mytheme.tif, Gray45);

соответственно на неактивный...

Здесь я думаю остановиться и рассказать подробнее о формате определения текстур. Понятно, что текстура задается именем файла, но что означает ключевое слово spixmap и какие еще бывают способы описать текстуру? Оказывается, все просто! Ключевых слова в описании текстуры может быть два:

spixmap - говорит о том, что при заполнении Title Bar'a нужно использовать текстуру, которая будет масштабирована (scale).

tpixmap - говорит о том, что при заполнении Title Bar'a тоже нужно использовать текстуру, которая будет наложена методом tile, как есть.

Т.е. это выглядит так:

( <spixmap|tpixmap>, <file name>, <color> )

<color> - в данном случае будет заполнять все прозрачные места в вашей текстуре

Цвет может быть как стандартным, определенным в /usr/X11R6/lib/X11/rgb.txt, так и определяемым вами в формате "rgb:??/??/??". Выглядит это так:

FTitleBack = (spixmap, Ftitle.mytheme.tif, "rgb:aa/bb/cc");

Так как мы хотим использовать текстуру, которая маштабируется, то пишем:

FTitleBack = (spixmap, Ftitle.mytheme.tif, gray);

для активного Title Bаr'a и

UTitleBack = (spixmap, Utitle.mytheme.tif, Gray45);

для неактивного.

Теперь о меню.

Меню описывается по тому же принципу, что и Title Bar. Здесь тоже указываются цвета текста для заголовка меню, самого меню и для неактивных полей меню. Соответственно:

MenuTitleColor = white; - цвет текста заголовка меню.
MenuTextColor = white; - цвет текста в самом меню.
MenuDisabledColor = Gray40; - цвет текста неактивного поля меню.

Как и везде действует стандартное соглашение о цветах.

Текстуры для меню накладываются похожим образом:

Для заголовка меню:

MenuTitleBack = (spixmap, TitleMenu.mytheme.tif, black);

Для самого меню:

MenuTextBack = (spixmap, TextMenu.mytheme.tif, white);

Вроде все понятно? Ну и хорошо :)

Уффф... Последние приготовления :) Поле, которое описывает заполнение фона выглядит так:

WorkspaceBack = (vgradient, black, gray30);

Причем вы можете использовать и текстуру для заполнения фона:

WorkspaceBack = (spixmap, mybackground.jpg, black);

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

WorkspaceBack = (vgradient, <color1>, <color2>); - вертикальный градиент от <color1> до <color2>.

WorkspaceBack = (hgradient, <color1>, <color2>); - горизонтальный градиент от <color1> до <color2>.

WorkspaceBack = (mdgradient, <color1>, <color2>, <color3>, <color4>); - - диагональный градиент от <color1> до <color4> через <color2> и <color3>.

Для создания цельного цвета:

WorkspaceBack = (solid, <color>); - заливка фоном цветом <color>.

Теперь о текстуре для иконок. Вы уже поняли, что наложение текстур происходит примерно одинаково. Так мы и поступим при наложении текстуры для иконок:

IconBack = (spixmap, Tile.mytheme.tif, black);

Теперь вы знаете, что означают поля в структуре описания, поэтому не буду повторяться.

Мои темы можно найти на ftp://wolfa.mik.ru/linux/x11/theme/WindowMaker.

Надеюсь, я ничего не забыл :)

Screep
 


[c] HARM on-line      
1996-1999