Я получил этот XWindows "привет, мир" из сети. У меня есть поведение, которое я не понимаю в более сложной программе, но простая программа здесь также отображает его:
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
Display *d;
Window w;
XEvent e;
const char *msg = "Hello, World!";
int s;
int x;
d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);
XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));
//XFlush(d);
while (1) {
XNextEvent(d, &e);
if (e.type == Expose) {
// XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));
}
if (e.type == KeyPress) break;
}
XCloseDisplay(d);
return 0;
}
Таким образом, первый вызов XDrawString () на самом деле не записывает в окно, а раскомментирует тот, что в событии expose. Я нахожу это поведение запутанным. Во время первого XDrawString () дисплей, экран и окно все настроены. Тем не менее, он не рисует, а тот, который появляется в обработчике событий. Я также пробовал XFlush () в очереди, это не имеет значения.
Этот эффект имел отношение к (гораздо) более сложному коду, над которым я работаю, а именно к размещению символов на экране. Я помещаю их в нужное место в растровом изображении, которое поддерживает экран, и затем делаю то же самое рисование на реальном экране, чтобы синхронизировать его. Обработчик экспозиции скопирует растровое изображение на экран, который обновляет его, но событие выставления не произойдет до позднего времени, и, кроме того, копирование всего растрового изображения обратно на экран обходится дороже, чем размещение одного символа.
Я подозреваю, что мне нужно проследить отрисовку в буфер с помощью операции, помечающей прямоугольник под символом как недопустимый (это было бы способом MS Windows) и позволяющего обработчику событий позаботиться об этом, но я хотел бы понять, что продолжается внутри X11, чтобы это произошло.