Современная мода по какой-то неясной мне причине диктует тенденцию НЕ рисовать иконки приложения в верхних рамках («загривках») окон. Так, этих иконок нет в новых версиях Windows и в подавляющем большинстве тем для DE Linux. В данной статье легко и без заморочек научимся добавлять иконки к любой metacity-теме.
Отрисовка иконок в metacity производится всего одной простой командой\тегом — <icon>. Именно его необходимо добавить в нужное место той или иной темы. Вооружаемся текстовым редактором (желательно, с подсветкой синтаксиса — встроенный в MC вполне сгодится) и вперёд. Но сперва кратко опишем необходимую часть окна, дабы понимать, с чем мы вообще будем работать.
Структура окна.
Итак, перед нами:
1 — Загривок. Так мы будем называть всю верхнюю часть окна.
2 — Заголовок. Название приложения, окна. Без иконки.
3 — Иконка. Собственно, виновница торжества.
4 — Основные кнопки работы с окном. Стандартные развернуть, свернуть и закрыть.
5 — Кнопка сворачивания в полосу и 6 — кнопка меню. Необязательные кнопки, присутствующие в некоторых темах оформления.
В статье мы будем касаться только первых трех элементов, остальные даны для общей наглядности.
Алгоритм работы.
- Для начала найдем xml файл интересующей нас темы. Он может быть в двух местах:
~\Themes\<Имя_темы>\metacity-1\metacity-theme.xml или
\Usr\Share\Themes\<Имя_темы>\metacity-1\metacity-theme.xml. В первом случае — тема располагается в домашнем каталоге пользователя, во втором — в общем каталоге системы (обязательно загляните в Пример №1). Открываем файл для редактирования (для надежности, можно создать резервную копию исходного файла). - Теперь необходимо найти все(!) моменты отрисовки заголовка (названия приложения), т.к. иконка приложения располагается непосредственно перед ним (или после — в зависимости от предпочтений, мы разберем стандартные варианты с иконкой, находящейся слева от заголовка и в самом начале загривка). За отрисовку заголовка отвечает тег <title>.
Помните, что необходимо найти ВСЕ теги <title>, обычно, в зависимости от состояния окна (см. полянку ссылок под номером 1) применяется несколько вариантов отрисовки элементов, в т.ч. и заголовка. Если иконка приложения нужна вам всегда (в активном и не активном окне и т.д.) — её отрисовку также нужно прописать во всех состояниях. - Формируем содержимое <icon>. Разберем как минимум два варианта + рассмотрим универсальную формулу.
- Первый, нарисует иконку с левого края заголовка окна, который располагается по середине:Поясним. Координата X (положение по горизонтали) вычисляется по формуле: ((ширина окна МИНУС ширина текста заголовка) РАЗДЕЛИТЬ на 2) МИНУС ширина иконки. Тем самым, мы сперва находим координату начала текста заголовка, т.е., его X (при условии, что он находится по середине), затем отнимаем ширину иконки, дабы вписать её рядом (слева). С координатой Y еще проще, тут просто вычисляется середина загривка окна по вертикале и отнимается половина высоты иконки, чтобы та вошла и оказалась ровно по центру (относительно вертикали). С шириной и высотой иконки всё еще понятней: она просто берётся из уже имеющихся констант, содержащих ширину и высоту мини-иконки (именно она по традиции используется в загривке окна).Иконка слева от заголовка<icon x=»((width-title_width)/2)-mini_icon_width» y=»(height / 2) — ( mini_icon_width / 2)» width=»mini_icon_width» height=»mini_icon_height»/>
- Второй вариант отобразит иконку в левом углу загривка: Как видно, здесь поменялась только координата X — теперь она указывает значение один, что обозначает практически самый левый угол загривка. Все остальные значения менять нет необходимости.Иконка в левом углу загривка<icon x=»1″ y=»(height / 2) — ( mini_icon_width / 2)» width=»mini_icon_width» height=»mini_icon_height»/>
- Универсальный вариант. Любое положение иконки всегда можно задать относительно заголовка. Достаточно взять координату X у <title> и подставить его в первую часть формулы для <icon>. А именно в часть до отнимания mini_icon_width. Вот так: (X у <title>)-mini_icon_width. В таком случае, вы всегда получите иконку, находящуюся ровно слева от текста заголовка.
- Первый, нарисует иконку с левого края заголовка окна, который располагается по середине:
- Добавляем составленный <icon> рядом с <title>. Сохраняем изменение. Затем, выбираем в темах оформлениях любую другую тему рамки окон (metacity) и вновь выбираем только что отредактированную. Если же текущей тема была тема, отличная от редактируемой — можно сразу выбрать её: переключение необходимо лишь для подгрузки изменений в случае, если редактируемая тема использовалась.
- Иногда, бывает недостаточно просто добавить <icon> рядом с <title>. Есть несколько тем, которые отрисовывают загривок особым образом. Например, используя какие-либо текстуры (изображения). В таком случае отображение иконки в них может быть непредусмотрено. Но выход есть: нужно найти отрисовку этих злополучных текстур и вставить <icon> после них, чтобы тот рисовался поверх. См. пример № 2 для детального разбора данного случая.
- Проверяем результат. Необходимо проверить все состояния окон и убедиться, что всё получилось, как было задумано и всё всегда корректно отрисовывается.
Примеры.
Пример №1. Обычная тема.
Для разбора обычного варианта возьмем тему Linux Mint под одноименными названием Mint-X. Данная тема у меня находится в системной папке /usr/share/theme/MintX. Обратите внимание, в некоторых темах содержится несколько файлов metacity-theme.xml. Отличаются они лишь конечными числами. Тема будет использовать самый последний по номеру, игнорируя все предыдущие. В моем случае, последним оказался файл metacity-theme-3.xml.
Открываем его в встроенном редакторе MC. Находим элемент <title>. Здесь видно, что титлов в данной теме несколько, используется это для «красивости» отрисовки. Находим окончание первой группы\функции отрисовки титлов (найти его можно по закрывающемуся тегу </draw_ops>). Вписываем после первой группы <title> элемент <icon>, используя универсальную формулу (Шаг 3.C у алгоритма выше) для подсчета координаты X . После этого не забываем про еще одну группу тегов <title>, которые отрабатывают, когда окно не в фокусе. Добавляем им в конец точно такой же тег <icon>, как и ранее. Сохраняем результирующий файл. Тема готова.
Пример №2. Тема с текстурными вставками, перекрывающими иконку.
Из тем с текстурами у меня нашлась тема Hello. Она, в отличии от предыдущей, находится в пользовательском каталоге и имеет всего один файл с описанием темы. И уже имеет иконки у левого края загривка. Поэтому, мы ее просто разберем по кусочкам..
Если мы попробуем найти тег <title> то увидим, что рядом нет <icon>.
Находим, где используется функция рисования draw_title_text_normal и draw_title_text_inactive. Видим, что после него идет прорисовка title_bar, которая и перекроет иконку в предыдущей функции.
Сама же иконка находится в функциях button_menu_*, которые на предыдущем рисунке выше идут в самом конце.
Тема же выглядит вот так:
Полянка ссылок.
- О темах Metacity на Opennet.ru. Основа для моей статьи.
- Архив с темами, рассмотренными в примерах.