Материал из Tkabber Wiki
Внимание! В систему управления настройками шрифтов версии 0.11.0 были внесены изменения; если вы по какой-то причине используете более старую версию (до 0.10.0 включительно), читайте эту статью.
Содержание
- 1 Предисловие
- 2 Где и как Ткаббер получает шрифты
- 3 Что настраивать
- 4 Как настраивать
- 5 Подводные камни
- 6 Примечания
Предисловие
Tk), который используется Ткаббером для создания GUI, является жертвой "true-unix-way" гибкости, которую в него вложили, глядя на Xt, — настраивать у него можно практически любые аспекты интерфейса по отдельности, включая их шрифты. К сожалению, бесплатно такие вещи не даются, и для владения этим предметом нужно понимать, как работает база данных опций Tk (и родственная ей XRDB в X Window System).
Масла в огонь подливает и тот факт, что у большого количества пользователей систем, основанных на X Window (Linux, xBSD и т.п.), возникают проблемы со шрифтами в Ткаббере, поскольку они (пользователи) запускают его в окружениях, сплошь основанных на GTK (GNOME) или Qt (KDE), которые имеют свои собственные, глобальные в пределах "десктопа", системы управления шрифтами, "вражеские" для всех других систем поддержки GUI. Здесь мы не будем развивать эту тему — за подробностями обращайтесь к статье Особенности реализации.
Ещё немного усложняет проблему со шрифтами в "иксах" то, что начиная с версии 8.5 Tk поддерживает Xft/fontconfig, который реализует другой подход к управлению шрифтами, нежели тот, который работал в версиях Tk <= 8.4.
Ткаббер, однако, идёт путём таких программ, как FireFox, предлагая простые средства настройки некоторых шрифтов, в то время как для более тонкой настройки интерфейса пользователю приходится засучивать рукава и читать документацию.
В этой статье мы попробуем осветить все аспекты настройки шрифтов в Ткаббере.
Где и как Ткаббер получает шрифты
Шрифты Ткаббер, естественно, получает от системы, в которой работает. Однако на то, какой именно шрифт он получает, влияет несколько механизмов. Ниже перечислены цепочки этих механизмов, выстроенные в порядке уменьшения их приоритета.
Microsoft® Windows™:
- Опции конфигурации ::ifacetk::options(font) и ::ifacetk::options(roster_font).
- База данных опций Tk.
- Система.
X Window System:
- Tk без поддержки Xft/fontconfig (версия <= 8.4):
- База данных опций Tk.
- XRDB.
- Сервер шрифтов.
- Tk с поддержкой Xft/fontconfig:
- Опции конфигурации ::ifacetk::options(font) и ::ifacetk::options(roster_font).
- База данных опций Tk.
- XRDB.
- Подсистема fontconfig.
Почему под X Window опции конфигурации недоступны, если Tk не поддерживает Xft/fontconfig? Потому что они позволяют задавать шрифт при помощи набора параметров, а в Tk содержится баг, который при этом условии может приводить к некорректному выбору глифов. Причём баг проявляется, в основном, при работе с символами, находящимися за пределами набора Laitin-1, что может на практике приводить к визуальному эффекту "русские символы сильно отличаются от обычных". Способ обхода этой проблемы прост: шрифт нужно задавать в формате XLFD, однако этот формат описания шрифта несовместим с "крутилками" шрифтов в интерфейсе настроек. В итоге в Ткаббере пришлось реализовать "костыль": не показывать указанные настройки в интерфейсе.
Что настраивать
Исходя из приведённых выше схем, основная идея состоит в том, что настраивать можно любой механизм в этих цепочках, или комбинации этих механизмов. Нелишним будет заметить, что так называемые "цветовые схемы" или "скины" Ткаббера пользуются исключительно возможностями механизма "база данных опций Tk".
"Путь наименьшего сопротивления" в настройке шрифтов таков:
- В нормально настроенной системе Ткаббер использует те же шрифты, что и остальные приложения. На самом деле это как раз и есть Правильная Вещь.
- Если что-то не устраивает, можно "покрутить" упомянутые опции в интерфейсе настроек. Этот путь, однако, доступен только в Windows и в X Window при условии, что Tk поддерживает Xft/fontconfig.
В некоторых случаях этот путь непригоден или недостаточен, например:
- Ваш Tk в "иксах" не поддерживает Xft/fontconfig.
- Вам нужна тонкая настройка шрифтов, например, шрифтов меню или шрифтов закладок окон разговоров.
В этом случае, как следует из приведённых схем, вам придётся освоить азы работы с базой данных опций Tk и/или XRDB.
Как настраивать
В любом случае удобнее всего сначала подобрать требуемый шрифт при помощи какого-либо специального программного средства, а затем уже указывать этот шрифт в конфигурации. В X Window такой программой является, к примеру, xfontsel, а в Windows можно воспользоваться средствами апплета "Экран" Панели управления. Шрифты в Ткаббере также можно подбирать интерактивно.
Настройка системы
Windows
В Microsoft® Windows™ шрифты системы можно настроить штатным конфигуратором, который доступен в виде апплета "Экран" "Панели инструментов".
Xft/fontconfig
Проще всего настроить шрифты для ваших приложений, создав и заполнив пользовательский файл конфигурации для fontconfig — ~/.fonts.conf.
Редактирование этого файла — процесс творческий. Полные сведения о возможностях настройки содержатся в официальной документации, а для начала рекомендуется ознакомиться с "рекомендациями лучших собаководов". Также достаточно подробно вопросы конфигурирования Xft/fontconfig и отличия этой подсистемы от "старой" описаны здесь.
XRDB
X Resource DataBase. Очень гибкое средство, позволяющее связать набор настроек в виде пар "ключ/значение" с конкретным экраном X-сервера. В этой статье невозможно вкратце рассказать о том как работает XRDB (это когда-нибудь будет сделано в специальной статье), но несколько ключевых моментов отметим:
- База данных опций Tk работает очень похожим на XRDB образом; не вдаваясь в тонкие технические детали, можно считать, что они работают по одному принципу.
- В системах, основанных на X Window System, База данных опций Tk берёт настройки из XRDB при старте приложения. Это означает, что "в иксах", в принципе, нет особой разницы между ковырянием опций Tk в конфиге Ткаббера и ковырянием тех же ресурсов в XRDB.
Между ресурсами в XRDB и ресурсами в базе данных опций Tk есть по-сути только одна разница: XRDB глобальна и поэтому в ресурсах надо указывать, к какому приложению они относятся, а база данных опций Tk у каждого приложения своя, и поэтому такого требования нет. Пример: вы хотите поменять шрифт, используемый при отрисовке меню. Команда для добавления опции в базу данных опций Tk будет такой:
option add *Menu.font Tahoma
а строка в файле ~/.Xresources, который обычно используется для инициализации XRDB, — такой:
Tkabber*Menu.font: Tahoma
Если не обращать внимание на разницу в синтаксисе, видно, что настройка XRDB имеет в начале строки с ресурсом класс приложения.
Сделать: -name Tkabber; разбить на введение и основную часть, которая должна идти после описания ресурсов БД опций ТК в "настройках Ткаббера"
Настройка Ткаббера
Опции конфигурации
В стандартном интерфейсе настроек Настройки → Main Interface доступны две опции:
::ifacetk::options(font)
Задаёт шрифт текста в окне чата. "Окно чата" в данном случае — это та часть интерфейса, которая отображает ход беседы; сюда не относится поле для ввода отсылаемого текста, а также окно со списком участников конференции.
::ifacetk::options(roster_font)
Шрифт окна списков контактов, а также окон списков участников конференций.
При помощи интерфейса управления настройками можно по отдельности менять:
- Семейство шрифта.
- Его размер — положительные значения задают размер в "пунктах" (point), размер которых зависит от разрешающей способности вашего монитора (параметра DPI — "точек на дюйм"), а отрицательные — в пикселях.
- Модификаторы начертания (полужирное, наклонное, подчёркнутое, перечёркнутое).
Естественно, обе эти опции можно устанавливать и из файла конфигурации; при этом можно использовать различные способы задания шрифта, которые описаны ниже. Например:
set ::ifacetk::options(font) {-family Arial -size 12}
База данных опций Tk
Погружаться в пучину базы данных опций Tk нужно в двух случаях:
- Вас не устраивают возможности по настройке, описанные в предыдущей секции.
- Эти настройки вам недоступны (например, у вас Tk без поддержки Xft).
Придётся отредактировать файл config.tcl в каталоге настроек Ткаббера. Если вы собираетесь делать это в первый раз, обязательно прочитайте эту статью!
Сделать: развить: 1) config.tcl 2) собственный .xrdb
Спецификации шрифтов Tk
Если шрифты настраиваются в файле конфигурации Ткаббера (а не средствами системы), для их спецификации можно использовать дополнительные возможности подсистемы Tk для работы со шрифтами.
Строго говоря, все эти возможности подробно изложены на соответствующей странице руководства, однако тут мы "расшифруем" основные её положения.
Tk поддерживает пять способов указания шрифтов; приведённый в "каноническом" примере стиль "XLFD" ("X Logical Font Description") является одним из них, и вообще говоря, для пользователей систем, не основанных на X Window System, он является непонятным и неудобным.
Внимание! Прежде чем вы ринетесь применять изложенное ниже на практике, имейте в виду, что Tk без поддержки Xft/fontconfig (<= 8.4) имеет проблемы с не-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 *Chat.input.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}
Шрифт вкладок окон разговоров:
option add *ButtonBar.Button.font {-size 9}
Шрифт окна ввода текста:
option add *Chat.input.font {{Times New Roman} 14 bold italic}
...
Быстрый подбор шрифтов
Вовсе необязательно "до посинения" повторять цикл "редактирование файла конигурации + перезапуск Ткаббера" — Ткаббер написан на тикле и поэтому позволяет управлять собой интерактивно. Это можно использовать для быстрого — "натурного" — подбора подходящих шрифтов, чтобы затем один раз вписать правильные строчки в файл конфигурации.
Откройте консоль Ткаббера. Здесь можно
вводить те же самые команды, которые предназначены для помещения в файл
конфигурации, в точно таком же формате. Имейте также в виду, что как встроенная
консоль Ткаббера, так и 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.