Tkabber Wiki

0.10.x/Шрифты
Login

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

(!) Внимание!

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

Содержание

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

У Ткаббера можно "покрутить" настройки двух шрифтов:

Первый шрифт является главным, и если второй не задан явно, то шрифт интерфейса используется для отрисовки всего и везде.

Если ни один из шрифтов не задан явно, для всего используется шрифт по умолчанию данной оконной системы.

Это означает, что в 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

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


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

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

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

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

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

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

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

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

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

Примеры:

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

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

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

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

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

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

Если она не "заругалась" и выдала строку "xft", — ваш Tcl/Tk поддеживает 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.