dwm — это динамический оконный менеджер (dynamic window manager) для X’ов. Отличается своей предельной простотой — весь его исходный код меньше 3000 строчек, а сама конфигурация происходит путём его модификации. Эта статья полностью не описывает настройку оконного менеджера как таковую, а лишь поможет появиться русским буквам в статусбаре.

Русский шрифт для dwm

Первое, и самое очевидное — шрифт должен поддерживать кириллицу. Учитывая, что оконный менеджер поддерживает ttf шрифты — выбор действительно огромный.

Мне вот по душе шрифты Droid, установить их можно в archlinux можно с помощью комманды:

# pacman -S ttf-droid

После чего остаётся лишь изменить исходный файл config.h dwm, переопределив массив fonts:

static const char *fonts[]          = { "Droid Sans Mono:size=10" };

В этот массив через запятую можно добавить больше шрифтов, логика простая: шрифты по-порядку будут проверяться на наличие символа, в котором он найдётся первым — тем шрифтом и будет напечатан. К примеру, можно использовать такую конфигурацию:

static const char *fonts[]          = { "Droid Sans Mono:size=10",
                                        "DejaVu Sans Mono:size=12" };

Но это уже для экспериментов, для начала попробуйте мой вариант с одним шрифтом Droid.

Нет русских букв в статусбаре dwm

Ииии, это очевидный способ не заработал у меня. Я очень долго искал ответ в гугле и не нашёл. Пришлось углубиться в исходный код:

/// файл drw.c
void
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
{
/// тут немножко кода...
	XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
	if (w)
		*w = ext.xOff;
/// и тут...
}

Путём отладки обнаружилось, что как минимум эта функция вычисляет неправильно ширину текста, кроме того, в этом же файле есть вызов функции XftDrawStringUtf8(), которая тоже отрабатывает некорректно.

Я очень долго медитировал на мануалы по этим функциям, перепроверял строку — действительно ли она UTF-8, долго смотрел на определённый в заголовке библиотеки иксов макрос X_HAVE_UTF8_STRING и бился головой об стену. Пока не додумался проверить свою локаль:

$ locale
LANG=C
...
LC_ALL=C

И с такой локалью действительно эти функции работают неверно, нужно определить что-то с utf8, к примеру, en_US.UTF-8. В разных дистрибутивах (да даже в одном) это можно сделать по-разному, к примеру, настроить в файле инициализации bash — если X-сервер запускается из консоли, как в моём случае.

После чего русский язык в статусбаре dwm появится:

Русский язык в статусбаре dwm
Кириллица в статусбаре dwm

Навигация по записям