LINUX.ORG.RU

Xlib: Нарисовать utf-8 текст в окне

 , ,


0

2

Как сделать сабж?
Пробовал Xutf8DrawString, но там, видимо, говнокод, несовместимый с моим многопоточным говнокодом. Русский всё равно не печатает (видимо, в fixed его нет), и при вызове из соседнего потока получаю разнообразные ошибки:
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
cedarx-gui: /var/tmp/portage/x11-libs/libX11-1.6.2/work/libX11-1.6.2/src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
Аварийный останов

XInitThreads разумеется был.

[xcb] Extra reply data still left in queue
[xcb] This is most likely caused by a broken X extension library
[xcb] Aborting, sorry about that.
cedarx-gui: /var/tmp/portage/x11-libs/libX11-1.6.2/work/libX11-1.6.2/src/xcb_io.c:576: _XReply: Assertion `!xcb_xlib_extra_reply_data_left' failed.
Аварийный останов

Через XDrawString работает.
Как загрузить шрифты, отличные от fixed так и не нашёл.
Многопоточость можно убрать (после некоторых изменений всё можно сделать через select), но пока что лень.

★★★★★

Как загрузить шрифты, отличные от fixed так и не нашёл.

Ты используешь механизм server-side fonts. То есть ты не можешь использовать сглаженные шрифты TTF, Type1 и т. д. Это старый механизм. Новый механизм - это через библиотеку Xft, т. е. client-side fonts.

Я не буду пытаться выяснять, заключается ли основаная твоя идея в использовании именно server-side fonts. Я исхожу из того, что ты понимаешь, что ты делаешь. Поэтому ничего не спрашиваю, отвечаю на вопрос про шрифты. Все server-side шрифты, которые видит сервер с уникодом, ты можешь посмотреть командой

$ xlsfonts | grep iso10646

Есть пути по умолчанию, где сервер смотрит эти шрифты. Обычно это /usr/share/fonts/X11/. Дополнительные пути можно добавить при запущенном сервере командой xset либо в xorg.conf.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

русский всё равно не печатает (видимо, в fixed его нет),

В fixed он есть.

и при вызове из соседнего потока получаю разнообразные ошибки

Код надо было выложить на pastebin - так тебе с большей вероятностью помогут. Если не весь, то хотя бы тестовый пример, который приводит к ошибке.

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

С ошибкой разобрался, надо загружать шрифты заранее.

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

Таких шрифтов не оказалось. Действительно, я хотел использовать server-side, но думал, что там будут доступны все шрифты (включая масштабируемые). unicode-шрифтов у меня не оказалось, только iso8859-1.
Подскажите, как с наименьшими усилиями использовать client-side шрифты. Желательно с возможностью масштабирования.

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

с наименьшими усилиями

http://www.keithp.com/~keithp/render/Xft.tutorial если у тебя нет тулкитов (начни с пункта 5, если умеешь в X Core fonts). Чуть правильнее pango с любым бэкэндом (cairo — минимум телодвижений, но pango+cairo — заметная часть Gtk+). Либо использовать любой тулкит и не мучаться.

Без pango либо Qt у тебя вряд ли выйдет нормально разобраться с лигатурами и (меньшей степени) комбинирующими символами, но для многих языков оно не нужно. Ну и RTL-письмо, емнип, нужно будет обрабатывать руками, если понадобится.

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

Спасибо, перевёл на Xft, теперь работает. Осталось убрать многопоточность, ибо иногда всплывают неуловимые сегфолты (в gdb они не происходят).

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

Спасибо, перевёл на Xft, теперь работает. Осталось убрать многопоточность, ибо иногда всплывают неуловимые сегфолты (в gdb они не происходят).

Если тебе важно очень взаимодействовать напрямую с иксами и очень многопоточность важна, то тогда напрямую не с xlib работай, а лучше с xcb. Она как раз написана с упопром на это дело. xlib уже сама через xcb работает. Но в XCB там API несколько по-другому устроено.

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

В данном случае не важно, но учту.

mittorn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.