Я зарегистрировался на Ubuntu 20.04, сконструированной на английском и других языках, но проблема все еще сохраняется. Причина, по -видимому, не заключается в том, что какие -либо шрифты, не имеющие на машине; Все это больше похоже на то, что X11 не используется или неправильно настроен. Также я не мог выяснить, возможно ли смешивание шрифтов из нескольких наборов шрифтов (возможно (
Код: Выделить всё
-misc-fixed-medium-r-normal--*-*-*-*-*-*-iso8859-5< /code> в любом случае содержит кириллические символы, поэтому, по крайней мере, российский язык в любом случае должен отображаться, но есть только пустое пространство). < /p>
Пример - три файла, предоставленные Nuklear (фиксированная версия 4.12.4): < /p>
[list]
[*]nuklear.h[*]
Код: Выделить всё
nuklear_xlib.h[*]
Код: Выделить всё
main.c[/list]
Код: Выделить всё
#include
#include
#include
#include
#include
#include [*]
#include
#include
#include
#include
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_IMPLEMENTATION
#define NK_XLIB_IMPLEMENTATION
#include "nuklear.h"
#include "nuklear_xlib.h"
// Window
#define WINDOW_DEFAULT_WIDTH 420
// Text
#define TEXT_TOP_BORDER 24
#define TEXT_BOTTOM_BORDER 24
#define TEXT_LEFT_BORDER 10
#define TEXT_RIGHT_BORDER 10
#define TEXT_LINE_HEIGHT 20
#define TEXT_DISTANCE 4
// Buttons
#define BUTTON_TOP_BORDER 10
#define BUTTON_BOTTOM_BORDER 10
#define BUTTON_LEFT_BORDER 10
#define BUTTON_RIGHT_BORDER 10
#define BUTTON_SPACING 10
#define BUTTON_FIXED_WIDTH 72
#define BUTTON_FIXED_HEIGHT 20
// Window minimal height (without title bar)
#define WINDOW_MIN_HEIGHT \
(TEXT_TOP_BORDER + TEXT_LINE_HEIGHT + TEXT_BOTTOM_BORDER + \
BUTTON_TOP_BORDER + BUTTON_FIXED_HEIGHT + BUTTON_BOTTOM_BORDER)
#define DTIME 20
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
typedef struct XWindow XWindow;
struct XWindow {
Display *dpy;
Window root;
Visual *vis;
Colormap cmap;
XWindowAttributes attr;
XSetWindowAttributes swa;
Window win;
int screen;
XFont *font;
unsigned int width;
unsigned int height;
Atom wm_delete_window;
};
static void
die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputs("\n", stderr);
exit(EXIT_FAILURE);
}
static long
timestamp(void)
{
struct timeval tv;
if (gettimeofday(&tv, NULL) < 0) return 0;
return (long)((long)tv.tv_sec * 1000 + (long)tv.tv_usec/1000);
}
static void
sleep_for(long t)
{
struct timespec req;
const time_t sec = (int)(t/1000);
const long ms = t - (sec * 1000);
req.tv_sec = sec;
req.tv_nsec = ms * 1000000L;
while(-1 == nanosleep(&req, &req));
}
static void elide(const XFont* font, const char** lines)
{
// TBD
(void)font;
(void)lines;
}
int
main(void)
{
long dt;
long started;
int running = 1;
XWindow xw;
struct nk_context *ctx;
#define TEXT_ENG "Hello, world!"
#define TEXT_ESP /*"¡Hola Mundo!"*/ "Hola, Mundo del español!"
#define TEXT_RUS "Привет, мир!"
#define TEXT_JAP "こんにちは世界!"
const char* text[] = {
/*"ENG: "*/ TEXT_ENG " (ENG)",
/*"ESP: "*/ TEXT_ESP " (ESP)",
/*"RUS: "*/ TEXT_RUS " (RUS)",
/*"JAP: "*/ TEXT_JAP " (JAP)",
};
/* X11 */
memset(&xw, 0, sizeof xw);
xw.dpy = XOpenDisplay(NULL);
if (!xw.dpy) die("Could not open a display; perhaps $DISPLAY is not set?");
xw.root = DefaultRootWindow(xw.dpy);
xw.screen = XDefaultScreen(xw.dpy);
xw.vis = XDefaultVisual(xw.dpy, xw.screen);
xw.cmap = XCreateColormap(xw.dpy,xw.root,xw.vis,AllocNone);
xw.swa.colormap = xw.cmap;
xw.swa.event_mask =
ExposureMask | KeyPressMask | KeyReleaseMask |
ButtonPress | ButtonReleaseMask| ButtonMotionMask |
Button1MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask|
PointerMotionMask | KeymapStateMask;
const char* fontName = "fixed";
xw.font = nk_xfont_create(xw.dpy, fontName);
if (xw.font == NULL)
printf("nk_xfont_create() returned null font!\n");
int width = WINDOW_DEFAULT_WIDTH;
int height = WINDOW_MIN_HEIGHT;
elide(xw.font, text);
for (size_t i = 0; i < sizeof(text)/sizeof(text[0]); ++i)
height += TEXT_DISTANCE + TEXT_LINE_HEIGHT;
xw.win = XCreateWindow(xw.dpy, xw.root, 0, 0, width, height, 0,
XDefaultDepth(xw.dpy, xw.screen), InputOutput,
xw.vis, CWEventMask | CWColormap, &xw.swa);
XStoreName(xw.dpy, xw.win, "X11");
XMapWindow(xw.dpy, xw.win);
xw.wm_delete_window = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wm_delete_window, 1);
XGetWindowAttributes(xw.dpy, xw.win, &xw.attr);
xw.width = (unsigned int)xw.attr.width;
xw.height = (unsigned int)xw.attr.height;
ctx = nk_xlib_init(xw.font, xw.dpy, xw.screen, xw.win, xw.width, xw.height);
struct nk_style_window* style = &ctx->style.window;
style->spacing.x = 0;
style->spacing.y = 0;
style->padding.x = 0;
style->padding.y = 0;
//style->background = nk_rgba(255, 0, 255, 255);
int dw = style->scrollbar_size.x; // width delta
while (running)
{
/* Input */
XEvent evt;
started = timestamp();
nk_input_begin(ctx);
while (XPending(xw.dpy)) {
XNextEvent(xw.dpy, &evt);
if (evt.type == ClientMessage) goto cleanup;
if (XFilterEvent(&evt, xw.win)) continue;
nk_xlib_handle_event(xw.dpy, xw.screen, xw.win, &evt);
}
nk_input_end(ctx);
/* GUI */
if (nk_begin(ctx, "Demo", nk_rect(0, 0, width + dw, height),
0))
{
// Text area top indent
nk_layout_row_begin(ctx, NK_STATIC, TEXT_TOP_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);
// Number of buttons (currently only "OK")
int number = 1;
// Text area text labels (several lines are possible)
for (size_t i = 0; i < sizeof(text)/sizeof(text[0]); ++i)
{
const char* line = text[i];
nk_layout_row_begin(ctx, NK_STATIC, TEXT_LINE_HEIGHT, 3);
nk_layout_row_push(ctx, TEXT_LEFT_BORDER);
nk_spacer(ctx);
nk_layout_row_push(ctx,
width - TEXT_LEFT_BORDER -
TEXT_RIGHT_BORDER);
nk_label(ctx, line, NK_TEXT_LEFT);
//nk_label_wrap(ctx, line);
nk_layout_row_push(ctx, TEXT_RIGHT_BORDER);
nk_spacer(ctx);
nk_layout_row_end(ctx);
nk_layout_row_begin(ctx, NK_STATIC, TEXT_DISTANCE, 1);
nk_spacer(ctx);
nk_layout_row_end(ctx);
}
// Text area bottom indent
nk_layout_row_begin(ctx, NK_STATIC, TEXT_BOTTOM_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);
// Button area top indent
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_TOP_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);
// Preparing for the OK button
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_FIXED_HEIGHT,
(number + 1) * 2);
nk_layout_row_push(ctx, BUTTON_LEFT_BORDER);
nk_spacer(ctx);
nk_layout_row_push(ctx, (width -
BUTTON_LEFT_BORDER -
BUTTON_FIXED_WIDTH * number -
BUTTON_SPACING * (number - 1) -
BUTTON_RIGHT_BORDER));
nk_spacer(ctx);
// OK button
{
nk_layout_row_push(ctx, BUTTON_FIXED_WIDTH);
if (nk_button_label(ctx, "OK"))
{
// Do nothing yet
}
}
nk_layout_row_push(ctx, BUTTON_RIGHT_BORDER);
nk_spacer(ctx);
nk_layout_row_end(ctx);
// Button area bottom indent
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_BOTTOM_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);
}
nk_end(ctx);
// if (nk_window_is_hidden(ctx, "MyMessageBox")) break;
/* Draw */
XClearWindow(xw.dpy, xw.win);
nk_xlib_render(xw.win, nk_rgb(45,45,45));
XFlush(xw.dpy);
/* Timing */
dt = timestamp() - started;
if (dt < DTIME)
sleep_for(DTIME - dt);
}
cleanup:
nk_xfont_del(xw.dpy, xw.font);
nk_xlib_shutdown();
XUnmapWindow(xw.dpy, xw.win);
XFreeColormap(xw.dpy, xw.cmap);
XDestroyWindow(xw.dpy, xw.win);
XCloseDisplay(xw.dpy);
return 0;
}
< /code>
Я пробовал эти шрифты: < /p>
[list]
"IPAexGothic"[*]
Код: Выделить всё
"-misc-fixed-medium-r-normal--*-*-*-*-*-*-iso8859-5"[*]
Код: Выделить всё
"-jis-fixed-medium-r-normal--*-*-*-*-*-*-jisx0208.1983-0"[/list]
Как я могу узнать, что не так? Я особенно заинтересован в X11, так что использование другой структуры (или другой нуклеарной задней части) не вариант.
Подробнее здесь: https://stackoverflow.com/questions/797 ... characters