X11. Не рисуется линия в окне

У меня Ubuntu 24.04. Может не рисуется, из-за устаревания X11, и нужно использовать другую либу?

Вот мой код:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

Display *display;
Window window;
GC graphics;

int main(int argc,char **argv) {
    // Init
    display = XOpenDisplay(NULL);
    window = XCreateSimpleWindow(display,DefaultRootWindow(display),64,64,512,512,4,0x000000,0xffffff);
    graphics = XCreateGC(display,window,0,NULL);
    XMapWindow(display,window);
    XFlush(display);

    // Drawing
    XDrawLine(display,window,graphics,0,0,512,512);
    XFlushGC(display,graphics);

    // Wait for user input
    scanf("%s",NULL);

    // Freeing
    XFreeGC(display,graphics);
    XUnmapWindow(display,window);
    XDestroyWindow(display,window);
    XCloseDisplay(display);
}

Но вот вроде бы должна нарисоваться какая-то линия из левого верхнего края до правого нижнего края окна. Но никакой линии не рисуется. Почему?


Ответы (1 шт):

Автор решения: qwardo

Линия не рисуется из-за того, что программа не обрабатывает события, а запросы на X сервер не отправляются должным образом. В X11 важно обрабатывать события, такие как Expose, чтобы обновлять содержимое окна.

Исправленный код

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

Display *display;
Window window;
GC graphics;

XEvent event; // В event будут храниться события.

int main(int argc,char **argv) {
    // Init
    display = XOpenDisplay(NULL);
    window = XCreateSimpleWindow(display,DefaultRootWindow(display),64,64,512,512,4,0x000000,0xffffff);
    graphics = XCreateGC(display,window,0,NULL);
    XMapWindow(display,window);
    XFlush(display);

    XSelectInput(display, window, ExposureMask); // Выбор событий для обработки.
    XNextEvent(display, &event); // Получение следующего события.

    // Drawing
    XDrawLine(display,window,graphics,0,0,512,512);

    XFlush(display); // Вместо XFlushGC(display,graphics);.

    // Wait for user input
    scanf("%s",NULL);

    // Freeing
    XFreeGC(display,graphics);
    XUnmapWindow(display,window);
    XDestroyWindow(display,window);
    XCloseDisplay(display);
}

Линия рисуется, но код может функционировать некорректно из-за того, что нет основного цикла, в котором будут обрабатываться события.

Дополнения в код

#include <X11/Xlib.h>

int main(void)
{
    Display *display;
    Window window;
    GC graphics;
    XEvent event;

    display = XOpenDisplay(NULL);
    window = XCreateSimpleWindow(display, DefaultRootWindow(display), 64, 64, 512, 512, 4, 0x000000, 0xffffff);
    XSelectInput(display, window, ExposureMask | KeyPressMask);
    XMapWindow(display, window);
    graphics = XCreateGC(display, window, 0, NULL);

    while (1) // Основной цикл с обработкой событий.
    {
        XNextEvent(display, &event);

        if (event.type == Expose)
            XDrawLine(display, window, graphics, 0, 0, 512, 512);

        if (event.type == KeyPress)
            break;
    }

    XFreeGC(display, graphics);
    XDestroyWindow(display, window);
    XCloseDisplay(display);

    return 0;
}
→ Ссылка