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 появится:
