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;
}