Взаимодействие Xlib и Вулкана, сбой приложения на XNextEvent()

#c #gcc #crash #vulkan #xlib

Вопрос:

У меня есть приложение Vulkan, которое использует Xlib для создания окна. Вулкан инициализируется без проблем. Программа завершает работу с SIGABRT в строке 72: XNextEvent(отображение и событие). Это не приведет к сбою, если экземпляр Vulkan не инициализирован. Он также не завершается сбоем, если XNextEvent получает новый указатель отображения через XOpenDisplay(nullptr) каждый тик, но затем окно не отображается.

 #include <iostream>
#include "dynamo.hpp"

int width = 1920 / 2;
int height = 1080 / 2;


App::App(int width, int height)
{
    XInitThreads();
    display = XOpenDisplay(nullptr);

    if(display == nullptr)
    {
        throw std::runtime_error("failed to open display");
    }
    
    int screen = DefaultScreen(display);
    int depth = DefaultDepth(display, screen);
    Visual* visual = DefaultVisual(display, screen);
    int root = RootWindow(display, screen);

    XSetWindowAttributes window_attributes;
    window_attributes.background_pixel = 0;
    window_attributes.border_pixel = 0;
    window_attributes.bit_gravity = StaticGravity;
    window_attributes.event_mask = 0 | ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | StructureNotifyMask;

    window = XCreateWindow(display, root, 0, 0, width, height, 0, depth, InputOutput, visual, CWBorderPixel | CWEventMask | CWBackPixel | CWBitGravity, amp;window_attributes);

    XStoreName(display, window, "Dynamo");

    XSelectInput(display, window, ExposureMask | KeyPressMask);
    XMapWindow(display, window);

    VkApplicationInfo application_info{};
    application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    application_info.pNext = nullptr;
    application_info.pApplicationName = "Dynamo";
    application_info.applicationVersion = VK_MAKE_VERSION(0, 1, 0);
    application_info.pEngineName = "Dynamo";
    application_info.engineVersion = VK_MAKE_VERSION(0, 1, 0);
    application_info.apiVersion = VK_API_VERSION_1_0;

    VkInstanceCreateInfo instance_create_info{};
    instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    instance_create_info.pApplicationInfo = amp;application_info;

    VkInstance instance;
    if (vkCreateInstance(amp;instance_create_info, nullptr, amp;instance) != VK_SUCCESS)
    {
        throw std::runtime_error("failed to create instance!");
    }
}

App::~App()
{
    XCloseDisplay(display);
}

void App::main_loop()
{
    XEvent event;
    while (true)
    {
        XNextEvent(display, amp;event);
        if (event.type == KeyPress)
            break;
    }
}

int main() 
{
    std::cout << "Hello world!" << std::endl;

    App app(1920 / 2, 1080 / 2);
    app.main_loop();    

    return 0;
}