LINUX.ORG.RU

«Виртуальный шрифт» в fontconfig.

 ,


0

1

Поставил я себе известный шрифт Iosevka. Вернее, семейство шрифтов («family»), в которое входит куча стилей: 9 «весов» (Thin, ExtraLight, Light, Regular, Medium, SemiBold, Bold, ExtraBold, Heavy), 3 наклона (Upright, Oblique, Italic), 2 ширины (Normal, Extended), всего 54 шрифта.

Но оказалось, многие программы с таким разнообразием работать не вполне умеют.

Например, редактор Geany позволяет выбрать любой шрифт из 54, но из выбранного шрифта используется только «family» и херится «style», т. е. при выборе любой ёсевки реально будет использоваться Iosevka Regular (Upright, Nornal). То есть я выбираю «Iosevka Extended», а текст отображается «Iosevka Regular» (это ещё полбеды, см. ниже).

Второй пример ещё хуже: Gnome Terminal. Этот в диалоге выбора шрифта показывает не 54 шрифта, а одну фамилию (т. е. Iosevka), и при выборе этой ёсевки реально используется Iosevka Thin (Upright, Normal), буквы в котором настолько тонкие, что их почти не видно.

Некоторые программы ведут себя более прилично. Gedit, к примеру, херит только наклон, и всегда рисует прямым шрифтом, даже если выбран италик, но уважает вес и ширину выбранного шрифта.

Баги на Geany и Gnome Terminal я повешу, а меж тем хотелось бы сделать какой-нить костыль, так как на скорое решение проблемы рассчитывать не приходится.

(Кстати, вместо Gnome Terminal можно использовать Tilix — у него проблем со шрифтами не наблюдается.)

Я подумал, костыль можно сделать с помощью fontconfig. Он, вроде бы, как раз и предназначен для таких костылей. Я нарисовал вот такой файл:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
    <match>
        <test name="family">
            <string>Iosevka Wide</string>
        </test>
        <edit name="family" mode="assign">
            <string>Iosevka</string>
        </edit>
        <edit name="style" mode="assign">
            <string>Extended</string>
        </edit>
    </match>
</fontconfig>

Теперь если приложение запрашивает шрифт с family == «Iosevka Wide», то fontconfig отдаёт ей «Iosevka» (family) «Extended» (style).

Но костыль получился неполноценный. Если в конфиге Geany я ручками пропишу шрифт «Iosevka Wide», то всё работает как надо. Но если я в редакторе пойду View → Change Font, то в диалоге выбора шрифта 54 варианта ёсевки есть, но «Iosevka Wide» нет. :-( В Gnome Terminal аналогично: «Iosevka Wide» в диалоге выбора шрифта нет. (В Gedit тоже нет (но там и не надо).) Видимо, алиасы в диалоге выбора шрифта не отображаются.

Собственно, вопрос: Как сделать э-э-э… «виртуальный шрифт», который отображается в диалоге выбора шрифта, но который реально не существует, а является алиасом для другого?

Видимо, алиасы в диалоге выбора шрифта не отображаются.

Так ты не прописал алиас:

<!-- ... -->
<alias>
  <family>Iosevka Wide</family>
    <default><family>Iosevka Wide</family></default>
</alias>
<!-- ... -->

Или как-то так.

А у тебя со style твой Wide будет там, где обычно Regular/Bold/Italic, обычно это отдельное поле в диалоге выбора шрифта.

mord0d ★★★★★ ()
Ответ на: комментарий от mord0d

Не понял. Алиас «Iosevka Wide» на «Iosevka WIde»? Какая-то бесконечная рекурсия получается.

Или как-то так.

В этом-то всё и дело. Как именно?

А у тебя со style твой Wide будет там, где обычно Regular/Bold/Italic, обычно это отдельное поле в диалоге выбора шрифта.

Во-первых, ты где последний раз видел отдельное поле для выбора стиля в диалоге выбора шрифта? В Geany диалог выбора шрифта такой: поле для ввода фильтра, список полных имён шрифтов (полное имя = фамилия + стили), сэмпл текстa (The quick brown fox…), ползунок размера, кнопки Select и Cancel. Всё. В Gnome Terminal, Gedit, Tilix диалоги точно такие же. Да, у меня DE — гном, если что, и Xorg (не вайланд), если это важно.

У меня со style всё нормально. Фамилия «Iosevka Wide» («Wide» — часть фамилии, а не стиль!) фонтконфигом заменяется на фамилию «Iosevka» + стиль «Extended». Это работает. Если я в конфиге Geany пропишу:

editor_font=Iosevka Wide 18

То реально текст рисуется шрифтом Iosevka Extended 18, что и требовалось. А вот если писать

editor_font=Iosevka Extended 18

то Geany стиль херит, и выводит текст шрифтом Iosevka (Regular) 18. Это не только с ёсевкой, со всеми остальными тоже. Кузину можно выбирать хоть жирную, хоть итальянскую — один хер, печатает нормальной. (Хотя хз кто там на самом деле стиль херит — Geany или Scintilla.)

Итого: мой костыль работает, но проблема в том, что «Iosevka Wide» не появляется в диалогах выбора шрифта.

А то, что ты нарисовал — это замена одной фамилии на другую (ну, фактически ты нарисовал замену одной фамилии на ту же самую, что есть глупость). Это не то, что мне нужно. Мне нужна новая фамилия «Iosevka Wide», которая преобразовывалась бы в фамилию «Iosevka» + стиль «Extended», и которая отображалась бы в диалогах выбора.

debugger ★★★ ()
Последнее исправление: debugger (всего исправлений: 1)
Ответ на: комментарий от debugger

Не понял. Алиас «Iosevka Wide» на «Iosevka WIde»? Какая-то бесконечная рекурсия получается.

Я дал только направление. Фиг знает как со style это делается.

Как именно?

Если б я знал, я бы выложил конкретный пример. Попробуй поиграться с тегами, почитай DTD наконец.

Во-первых, ты где последний раз видел отдельное поле для выбора стиля в диалоге выбора шрифта?

Где-то видел. Не помню, давно это было. Я обычно в терминале сижу, а там шрифт в конфиге лапками прописан.

В Geany диалог выбора шрифта такой: поле для ввода фильтра, список полных имён шрифтов (полное имя = фамилия + стили), сэмпл текстa (The quick brown fox…), ползунок размера, кнопки Select и Cancel. Всё. В Gnome Terminal, Gedit, Tilix диалоги точно такие же.

Это всё про GTK+3, насколько я понимаю. У меня нет софта на GTK+3 чтобы проверить. Терминал на, но у него конфиг только текстовый.

и Xorg (не вайланд), если это важно

Про Wayland вообще не в теме.

«Wide» — часть фамилии, а не стиль!

С-who-я ли?!

<edit name="style" mode="assign">
 <string>Extended</string>
</edit>

Твой код, не мой. ☺

Итого: мой костыль работает, но проблема в том, что «Iosevka Wide» не появляется в диалогах выбора шрифта.

Потому что это не алиас и не шрифт, а комбинация со стилем. Ну и потому что в GTK+3 снова намутили с юзабилити.

А то, что ты нарисовал — это замена одной фамилии на другую

Это алиас. Вот алиас точно отображается.

Мне нужна новая фамилия «Iosevka Wide», которая преобразовывалась бы в фамилию «Iosevka» + стиль «Extended», и которая отображалась бы в диалогах выбора.

Уже б тыщу раз попробовал что-то типа <default><family>Iosevka</family><style>Extended</style></default>, ну. У меня всё равно нет софта на GTK+3 чтобы потестить (а собирать remmina, если там вообще есть этот диалог выбора шрифта, мне щаз ну совсем не в кайф, п’ятниця), так что пока только так.

mord0d ★★★★★ ()
Ответ на: комментарий от e1nste1n

Удали просто ненужные варианты.

Не получится. Нормальный вариант мне тоже нужен — он узкий, отлично подходит для логов. В том же Geany, окно с кодом рисуется Iosevka Extended, окошко с выводом компилятора — Iosevka.

debugger ★★★ ()
Ответ на: комментарий от mord0d
«Wide» — часть фамилии, а не стиль!

С-who-я ли?!

??

<match>
    <test name="family">
        <string>Iosevka Wide</string>
    </test>

Имеющий глаза да увидит, что фамилия шрифта сравнивается со строкой «Iosevka Wide».

Уже б тыщу раз попробовал что-то типа <default>\<family>Iosevka</family><style>Extended</style></default>, ну.

Прежде чем писать пост, я посмотрел доки на фонтконфиг. Элемента <style> в его языке нет.

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

debugger ★★★ ()
Последнее исправление: debugger (всего исправлений: 2)
Ответ на: комментарий от debugger

Тогда или правь метаданные в файлах с fontforge например, или генерируй шрифты сам, там практически все можно настроить — fontconfig не создает виртуальные шрифты, только задает правила выбора.

e1nste1n ★★★★★ ()

Iosevka Wide

Ужс. Я обычный-то еще дожимаю.

По теме: предлагаю вариацию на тему «удали ненужные» под названием «сделай два»: просто сгенери их два с разным family, один узкий, один широкий.

t184256 ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.