Материал из Tkabber Wiki
Внимание!
В систему управления настройками шрифтов версии 0.11.0 были внесены изменения, и данная статья относится ко всем версиям, вышедшим до 0.11.0 (как минимум, к 0.9.7–0.10.0); если вас интересует современная версия Ткаббера (0.11.0 и выше), читайте эту статью.
Содержание
- 1 Что настраивать
- 2 Как настраивать
- 3 Подводные камни
- 4 Примечания
Что настраивать
У Ткаббера можно "покрутить" настройки двух шрифтов:
- Шрифт интерфейса (меню, всевозможные подписи, поля ввода и т.д.);
- Шрифт окна чата и ростера.
Первый шрифт является главным, и если второй не задан явно, то шрифт интерфейса используется для отрисовки всего и везде.
Если ни один из шрифтов не задан явно, для всего используется шрифт по умолчанию данной оконной системы.
Это означает, что в X Window System, в которой Tk "поднимает" настройки из XRDB, если таковая есть, будет взят указанный там шрифт. Если подходящего шрифта там нет, Tk попросит сервер шрифтов выдать нечто, удовлетворяющее формулировке "шрифт по умолчанию в такой-то кодировке". Поскольку в "иксах" достоверно существует только шрифт "fixed", подобный запрос для случая отрисовки кириллического текста обычно удовлетворяется первым попавшимся кириллическим шрифтом семейства "fixed"; нередко это совершенно не то, что вы хотели бы видеть.
Непонимание этого факта порождает печально известный миф о "кривых шрифтах в Ткаббере"; так вот: в Ткаббере не бывает кривых шрифтов — бывают криво настроенные системы.
Примечание: приведённая выше дихотомия настроек шрифтов является сознательным упрощением, так как база данных опций Tk (и родственная ей XRDB) позволяют настраивать шрифты отдельно для разных классов виджетов и даже отдельно — для каждого виджета, поддерживающего настройку шрифта. Тема чуть подробнее изложена ниже.
Как настраивать
Есть два варианта:
- Настроить систему;
- Настроить Ткаббер.
А также можно сначала настроить систему, а потом отдельно настроить шрифт для чата и ростера.
Настройка системы
В Microsoft® Windows™ шрифты системы можно настроить штатным конфигуратором, который доступен в виде апплета "Экран" "Панели инструментов".
В X Window настраивать нужно XRDB.
Настройка Ткаббера
Придётся отредактировать файл config.tcl в каталоге настроек Ткаббера. Если вы собираетесь делать это первый раз, обязательно прочитайте эту статью!
Настройки, интересующие нас, должны находиться либо "на верхнем уровне" файла конфигурации (проще говоря, на чистом месте: вне каких-либо блоков) или в обработчике хука postload_hook.
Настроек, как говорилось, две:
Шрифт интерфейса
Настраивается через базу данных опций Tk с использованием команды option, например:
option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1
Шрифт окон чата и ростера
Настраивается установкой глобальной переменной font, например:
set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1
Итак, минимальный пример куска конфигурации, устанавливающего оба шрифта Ткаббера, выглядит следующим образом:
# Шрифт элементов интерфейса:
option add *font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1
# Шрифт окон чата и ростера:
set font -monotype-arial-medium-r-*-*-11-*-100-100-*-*-iso10646-1
Внимание! Внутри обработчика хука postload_hook необходимо ссылаться на глобальную
переменную font, используя её полностью квалифицированное имя: ::font, либо вначале
объявить, что эта переменная глобальна, такой командой: global font
. В противном случае
тикль создаст локальную (в пределах обработчика хука) переменную и будет изменять её.
Интересный факт: даже в X Window System кодировка шрифта не обязана совпадать с локалью.
Подсказка: в любой системе удобнее всего сначала подобрать требуемый шрифт при помощи какого-либо специального программного средства, а затем уже указывать этот шрифт в конфигурации Ткаббера. В X Window такой программой является, к примеру, xfontsel, а в Windows можно воспользоваться средствами упомянутого апплета "Экран". Шрифты в Ткаббере также можно подбирать интерактивно.
Продвинутые спецификации шрифтов
Если шрифты настраиваются в файле конфигурации Ткаббера (а не средствами системы), для их спецификации можно использовать дополнительные возможности подсистемы Tk для работы со шрифтами.
Строго говоря, все эти возможности подробно изложены на соответствующей странице руководства, однако тут мы "расшифруем" основные её положения.
Tk поддерживает пять способов указания шрифтов; приведённый в "каноническом" примере стиль "XLFD" ("X Logical Font Description") является одним из них, и вообще говоря, для пользователей систем, не основанных на X Window System, он является непонятным и неудобным.
Внимание! прежде, чем вы ринетесь применять изложенное ниже на практике, имейте в виду, что Tk имеет проблемы с не-XLFD спецификациями шрифтов в X Window. Подробнее об этом написано ниже.
Вот эти пять способов:
"Программное имя" шрифта
Это имя шрифта, созданного при помощи команды Tk font create
: Это — наименее
интересный для нас способ, так как в основном предназначен для облегчения написания программ.
Пример:
# Создаём новый шрифт:
set myfont [font create {"Comic Sans MS" 12}]
# Теперь переменная myfont содержит программное имя созданного шрифта.
# Используем наш новый шрифт для настройки Ткаббера:
set font $myfont
Имя системного шрифта
Имеет смысл только в Windows и Macintosh. Позволяет сослаться на один из шрифтов, настроенных для использования в системе.
Системные шрифты Windows
system, ansi, device, systemfixed, ansifixed, oemfixed
Системные шрифты Macintosh
system, application
"Иксовый" формат
Это формат XLFD, представляющий собой строку вида
-foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding
Любое из полей может быть заменено символом "*", что означает "любое значение".
Теперь перейдём к наиболее интересным форматам.
Следует заметить, что совокупность параметров, формирующих представление шрифта в этих форматах, должна представлять собой "правильно сформированный список". Академическое описание этого понятия, как ни странно, достаточно трудно для понимания; полные правила, которыми руководствуется тикль, осуществляя группировку, можно изучить здесь. А в рамках данной статьи мы просто дадим пару советов, как получить такой список из набора параметров:
Список с точки зрения тикля должен представлять собой одно слово. Это значит, что элементы списка нужно сгруппировать друг с другом. Проще всего это сделать фигурными скобками или двойными кавычками, например:
# Список из трёх элементов: {a b c} # Список из четырёх элементов: "d ef gh ij"
Список состоит из слов, слова отделяются друг от друга пробельными символами. Это означает, что если элементы-слова вашего списка сами содержат пробелы, их придётся сгруппировать, например:
# Список из трёх элементов: {{первый элемент} второй {и третий элемент}}
Не стоит отчаиваться, если правила группировки вам не вполне понятны — ниже приводятся готовые примеры, которые позволят вам "почувствовать", как работают эти правила.
"Свободный" формат
Является "человекопонятным" и представляет собой список из одного или более значений в указанном порядке:
семейство ?размер? ?стиль? ?стиль ...?
(Запись ?foo? означает "необязательный параметр класса foo".)
Обязательным является только семейство шрифта (font family).
Доступные стили:
Толщина начертания:
- normal — обычная;
- bold — полужирный шрифт;
Наклон символов:
- roman — обычное (прямое) начертание;
- italic — курсивное начертание;
Дополнительные стили:
- underline — подчёркнутый шрифт;
- overstrike — перечёркнутый шрифт.
Примеры:
set font Tahoma
set font {Arial 12}
option add *font {{Times New Roman} 14 bold italic}
Формат "пары опция/значение"
Представляет собой список пар опция/значение:
опция значение ?опция значение ...?
Доступные опции и значения:
-family
Семейство шрифтов.
-size
Размер шрифта.
-weight
Толщина начертания шрифта. Доступные значения: bold (полужирный) и normal (обычный).
-slant
Наклон символов шрифта. Доступные значения: italic (курсив) и roman (прямой).
-underline
Подчёркивание. Значением является значение булевого типа (true, yes, ненулевое число — истина; false, no, 0 — ложь).
-overstrike
Зачёркивание. Доступные значения: истина и ложь.
В отличие от предыдущего способа, в этом:
- Пары могут следовать в произвольном порядке;
- Возможно не указывать семейство шрифтов и/или размер, а указать только один или несколько стилей начертания.
Примеры:
set font "-family {Comic Sans MS} -overstrike yes"
option add *font {-weight bold -size 12}
set font {-underline 1}
Проблемы не-XLFD спецификаций в X Window
К сожалению, версия Tk для X Window имеет баг с подбором глифов к символам, не входящим в Latin-1 (и поэтому он затрагивает русскоговорящих, а точнее, кириллически пишущих пользователей Ткаббера).
Баг проявляется в том, что при использовании не-XLFD спецификаций шрифтов Tk иногда сильно ошибается с подбором глифов к символам, отсутствующим в шрифте, который был выбран в соответствии со специфиацией как основной. Выглядит это, например, как сильно отличающиеся от основного шрифта глифы кириллических символов.
Насколько нам известно, работы по переписыванию алгоритма подбора шрифтов в X Window ведутся, но проблема всё ещё не решена.
Выходов из данной ситуации два:
- Использовать XLFD-спецификацию для шрифтов.
- Использовать версию 8.5 Tcl/Tk, собранную с поддержкой технологии Xft.
Остановимся подробнее на втором варианте.
Поддержка Xft появилась в Tk начиная с версии 8.5. Как для подбора, так и для отображения шрифтов используются совершенно другие механизмы, и, в частности, при использовании Xft полностью отсутствует обсуждаемая проблема.
Однако, надо понимать последствия перехода на Xft:
- Подсистема Xft имеет собственные настройки, не имеющие отношения к стандартным механизмам X Window. В частности, вам, возможно, придётся познакомиться с fontconfig.
- Несмотря на поддержку TrueType и полную поддержку Unicode шрифтов, Xft также использует антиалиасинг, который нравится далеко не всем.
Узнать, поддерживает ли ваша версия wish Xft, можно двумя способами:
В Linux можно узнать, слинкован ли wish с соответствующей динамической библиотекой, примерно так:
$ ldd `which wish` | grep -i xft
В любой системе можно запустить wish и выполнить там команду:
tk::pkgconfig get fontsystem
Если она не "заругалась" и выдала строку "xft", — ваш Tcl/Tk поддеживает Xft.
О борьбе с антиалиазингом в Xft рассказано ниже.
Тонкая настройка шрифта интерфейса
Для понимания того, чего и где крутить, нужно осмыслить работу базы данных опций Tk и XRDB.
Приведём пару готовых примеров:
Шрифт меню:
option add *Menu.font "Arial 10"
Шрифт однострочных полей ввода:
option add *Entry.font {-weight bold}
Шрифт меток (статического текста):
option add *Label.font {-slant italic}
Шрифт табов (<= 0.10.0):
option add *nb.font {-size 8}
Шрифт "новых табов" (альфа 0.10.1):
option add *nb.Button.font {-size 9}
...
Быстрый подбор шрифтов
Вовсе необязательно "до посинения" повторять цикл "редактирование файла конигурации + перезапуск Ткаббера" — Ткаббер написан на тикле и поэтому позволяет управлять собой интерактивно. Это можно использовать для быстрого — "натурного" — подбора подходящих шрифтов чтобы затем один раз вписать правильные строчки в файл конфигурации.
Откройте консоль Ткаббера. Здесь можно вводить те же самые команды, которые предназначены для помещения в файл конфигурации, в точно таком же формате. Имейте также в виду, что как встроенная консоль Ткаббера, так и tkcon, поддерживают историю введённых команд, доступную по нажатиям клавиш ↑ и ↓.
Как было сказано выше, у Ткаббера есть две группы элементов интерфейса, у которых можно настроить шрифты. Для быстрого тестирования нам нужно понять, как заставить Ткаббер "применить" изменённый шрифт.
Это несложно:
Шрифт интерфейса
Используется, помимо прочего, для отрисовки всевозможных меню.
Это означает, что для того, чтобы посмотреть настройку, изменённую при помощи
option add *font ...
, нужно просто открыть какое-либо динамически создаваемое меню.
Главное меню для этого не подходит, а вот меню на элементах ростера подходят замечательно.
Итак, для быстрого подбора шрифта для элементов интерфейса выполняйте такую последовательность действий:
- Запустите Ткаббер, залогиньтесь на сервер, чтобы получить ростер, откройте консоль.
Напишите там
option add *font ваша_спецификация_шрифта
Откройте меню на любом контакте в ростере, рассмотрите шрифт.
Повторяйте процедуру до получения удобоваримого результата.
Шрифт окон чата и ростера
Для тестирования этого шрифта нам нужно открыть (или переоткрыть) какое-либо окно чата.
Лучше всего для этого подходит какая-либо специальная тестовая комната, например,
test@conference.jabber.ru
. Также ничего не мешает вам открыть окно чата с самим собой
(или со второй копией Ткаббера).
Есть и более быстрый способ: вызов процедуры Ткаббера
::ifacetk::roster::redraw
перерисовывает основной ростер, применяя установленный шрифт.
Итак, для быстрого подбора шрифта для окон чата выполняйте такую последовательность действий:
- Запустите Ткаббер, залогиньтесь на сервер, чтобы получить доступ к чатам, откройте консоль.
Напишите там
set font ваша_спецификация_шрифта
(Пере)откройте какое-либо окно чата или вызовите указанную выше процедуру, рассмотрите шрифт.
Повторяйте процедуру до получения удобоваримого результата.
Сделать: Выяснить применимы ли тут команды ifacetk::switch_font
и ifacetk::define_fonts
Немножко хардкора
Вы можете узнать, что именно думает Tk по поводу шрифта, который вы установили. Для этого
используется команда font actual
.
Используется она следующим образом:
Для шрифта интерфейса:
font actual [option get . font [winfo class .]]
Для шрифта чатов и ростера:
font actual $font
За подробностями обращайтесь к соответствующей странице руководства.
Другие полезные средства
Интерес может представлять команда
font families
которая возвращает список всех семейств шрифтов, доступных Ткабберу.
Её можно ввести с консоли работающего Ткаббера.
Подводные камни
Файлы с настройками Tk ("Tk option database") — те самые файлы с расширением ".xrdb",
называемые кое-кем "темами", — иногда содержат настройку шрифтов интерфейса. Подгрузка
такого файла при помощи option readfile
"перекроет" системную настройку.
Иногда это то, что вам нужно, иногда — нет. В таком случае после подгрузки xrdb-файла
нужно переписать настройку шрифта при помощи option add
как описано выше.
Примечания
Отдельная настройка шрифта ростеров
Существует "хак", позволяющий отдельно настраивать шрифт ростеров.
Борьба с антиалиасингом в Xft
Известно, что антиалиасинг был "введён в оборот" для борьбы с дешёвыми китайскими TFT-мониторами и нравится далеко не всем. Те, кто обладает качественным монитором и нормальным набором шрифтов под его рабочий DPI, вероятно, захотят антиалиасинг отключить.
Это делается при помощи настройки fontconfig. Настраивать эту подсистему можно как на уровне параметров отдельных шрифтов (то есть, к примеру, можно отключить антиалиасинг для определённых семейств шрифтов, если используется размер символов менее определённого порога, и т.д.), так и глобально — для всех шрифтов с любыми параметрами.
Потребуется отредактировать либо ~/.fonts.conf — файл настроек конкретного пользователя, либо /etc/fonts/fonts.conf — системный файл настроек.
Полное отключение антиалиасинга делается так:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font" >
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
</fontconfig>
В качестве примера конфигурирования избирательного отключения антиалиасинга приведём настройку его подавления для шрифтов с размером символов от 8 до 15 пунктов (points) (позаимствовано отсюда):
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font" >
<test compare="more" name="size" qual="any">
<double>8</double>
</test>
<test compare="less" name="size" qual="any">
<double>15</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
<match target="font" >
<test compare="more" name="pixelsize" qual="any">
<double>11</double>
</test>
<test compare="less" name="pixelsize" qual="any">
<double>20</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
</fontconfig>
Для того, чтобы новые настройки вступили в силу, достаточно перезапустить приложения, использующие Xft.
За подробностями по поводу конфигурирования fontconfig обращайтесть к его вики, а также официальной документации: fonts.conf(5).
Ещё одним хорошим ресурсом по шрифтам и их приложению к Xft является официальная документация на Xfree86.