Tkabber Wiki

Шрифты
Login

Материал из Tkabber Wiki

(!) Внимание! В систему управления настройками шрифтов версии 0.11.0 были внесены изменения; если вы по какой-то причине используете более старую версию (до 0.10.0 включительно), читайте эту статью.

Содержание

Предисловие

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™:

  1. Опции конфигурации ::ifacetk::options(font) и ::ifacetk::options(roster_font).
  2. База данных опций Tk.
  3. Система.

X Window System:

Почему под X Window опции конфигурации недоступны, если Tk не поддерживает Xft/fontconfig? Потому что они позволяют задавать шрифт при помощи набора параметров, а в Tk содержится баг, который при этом условии может приводить к некорректному выбору глифов. Причём баг проявляется, в основном, при работе с символами, находящимися за пределами набора Laitin-1, что может на практике приводить к визуальному эффекту "русские символы сильно отличаются от обычных". Способ обхода этой проблемы прост: шрифт нужно задавать в формате XLFD, однако этот формат описания шрифта несовместим с "крутилками" шрифтов в интерфейсе настроек. В итоге в Ткаббере пришлось реализовать "костыль": не показывать указанные настройки в интерфейсе.

Что настраивать

Исходя из приведённых выше схем, основная идея состоит в том, что настраивать можно любой механизм в этих цепочках, или комбинации этих механизмов. Нелишним будет заметить, что так называемые "цветовые схемы" или "скины" Ткаббера пользуются исключительно возможностями механизма "база данных опций Tk".

"Путь наименьшего сопротивления" в настройке шрифтов таков:

  1. В нормально настроенной системе Ткаббер использует те же шрифты, что и остальные приложения. На самом деле это как раз и есть Правильная Вещь.
  2. Если что-то не устраивает, можно "покрутить" упомянутые опции в интерфейсе настроек. Этот путь, однако, доступен только в Windows и в X Window при условии, что 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 (это когда-нибудь будет сделано в специальной статье), но несколько ключевых моментов отметим:

(!) Сделать: -name Tkabber; разбить на введение и основную часть, которая должна идти после описания ресурсов БД опций ТК в "настройках Ткаббера"

Настройка Ткаббера

Опции конфигурации

В стандартном интерфейсе настроек Настройки → Main Interface доступны две опции:

::ifacetk::options(font)

Задаёт шрифт текста в окне чата. "Окно чата" в данном случае — это та часть интерфейса, которая отображает ход беседы; сюда не относится поле для ввода отсылаемого текста, а также окно со списком участников конференции.

::ifacetk::options(roster_font)

Шрифт окна списков контактов, а также окон списков участников конференций.

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

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

set ::ifacetk::options(font) {-family Arial -size 12}

База данных опций Tk

Погружаться в пучину базы данных опций Tk нужно в двух случаях:

Придётся отредактировать файл 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

Любое из полей может быть заменено символом "*", что означает "любое значение".


Теперь перейдём к наиболее интересным форматам.

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

"Свободный" формат

Является "человекопонятным" и представляет собой список из одного или более значений в указанном порядке:

семейство ?размер? ?стиль? ?стиль ...?

(Запись ?foo? означает "необязательный параметр класса foo".)

Обязательным является только семейство шрифта (font family).

Доступные стили:

Примеры:

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 ведутся, но проблема всё ещё не решена.

Выходов из данной ситуации два:

Остановимся подробнее на втором варианте.

Поддержка Xft появилась в Tk начиная с версии 8.5. Как для подбора, так и для отображения шрифтов используются совершенно другие механизмы, и, в частности, при использовании Xft полностью отсутствует обсуждаемая проблема.

Однако, надо понимать последствия перехода на Xft:

Узнать, поддерживает ли ваша версия wish Xft, можно двумя способами:

О борьбе с антиалиазингом в Xft рассказано ниже.

Тонкая настройка шрифта интерфейса

Для понимания того, чего и где крутить, нужно осмыслить работу базы данных опций Tk и XRDB.

Приведём пару готовых примеров:

...

Быстрый подбор шрифтов

Вовсе необязательно "до посинения" повторять цикл "редактирование файла конигурации + перезапуск Ткаббера" — Ткаббер написан на тикле и поэтому позволяет управлять собой интерактивно. Это можно использовать для быстрого — "натурного" — подбора подходящих шрифтов, чтобы затем один раз вписать правильные строчки в файл конфигурации.

Откройте консоль Ткаббера. Здесь можно вводить те же самые команды, которые предназначены для помещения в файл конфигурации, в точно таком же формате. Имейте также в виду, что как встроенная консоль Ткаббера, так и tkcon, поддерживают историю введённых команд, доступную по нажатиям клавиш <↑> и <↓>.

Как было сказано выше, у Ткаббера есть две группы элементов интерфейса, у которых можно настроить шрифты. Для быстрого тестирования нам нужно понять, как заставить Ткаббер "применить" изменённый шрифт.

Это несложно:

Шрифт интерфейса

Используется, помимо прочего, для отрисовки всевозможных меню.

Это означает, что для того, чтобы посмотреть настройку, изменённую при помощи option add *font ..., нужно просто открыть какое-либо динамически создаваемое меню. Главное меню для этого не подходит, а вот меню на элементах ростера подходят замечательно.

Итак, для быстрого подбора шрифта для элементов интерфейса выполняйте такую последовательность действий:

  1. Запустите Ткаббер, залогиньтесь на сервер, чтобы получить ростер, откройте консоль.
  2. Напишите там

    option add *font ваша_спецификация_шрифта
    
  3. Откройте меню на любом контакте в ростере, рассмотрите шрифт.

  4. Повторяйте процедуру до получения удобоваримого результата.

Шрифт окон чата и ростера

Для тестирования этого шрифта нам нужно открыть (или переоткрыть) какое-либо окно чата. Лучше всего для этого подходит какая-либо специальная тестовая комната, например, test@conference.jabber.ru. Также ничто не мешает вам открыть окно чата с самим собой (или со второй копией Ткаббера).

Есть и более быстрый способ: вызов процедуры Ткаббера

::ifacetk::roster::redraw

перерисовывает основной ростер, применяя установленный шрифт.

Итак, для быстрого подбора шрифта для окон чата выполняйте такую последовательность действий:

  1. Запустите Ткаббер, залогиньтесь на сервер, чтобы получить доступ к чатам, откройте консоль.
  2. Напишите там

    set font ваша_спецификация_шрифта
    
  3. (Пере)откройте какое-либо окно чата или вызовите указанную выше процедуру, рассмотрите шрифт.

  4. Повторяйте процедуру до получения удобоваримого результата.

(!) Сделать: Выяснить, применимы ли тут команды ifacetk::switch_font и ifacetk::define_fonts

Немножко хардкора

Вы можете узнать, что именно думает Tk по поводу шрифта, который вы установили. Для этого используется команда font actual.

Используется она следующим образом:

За подробностями обращайтесь к соответствующей странице руководства.

Другие полезные средства

Интерес может представлять команда

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.