diff --git a/editor/src/main.cpp b/editor/src/main.cpp index dc1119e..2a5fe35 100644 --- a/editor/src/main.cpp +++ b/editor/src/main.cpp @@ -15,16 +15,23 @@ using namespace Nova; int main() { Debug::get_logger()->set_level(spdlog::level::trace); - const auto wd = WindowDriver::create(); - const auto rd = RenderDriver::create(RenderAPI::VULKAN, wd); + auto wd = WindowDriver::create(); + auto rd = RenderDriver::create(RenderAPI::VULKAN, wd); + auto window = wd->create_window("Nova", 1280, 720); + auto surface = rd->create_surface(window); + + // TODO: select_device should probably consider what surface is + // being used as not all devices support all surfaces. alternatively + // the caller chould check if the device supports the surface rd->select_device(RenderDevice::AUTO); - wd->create_window("Nova", 1280, 720); while (wd->get_window_count() > 0) { wd->poll_events(); } + rd->destroy_surface(surface); + delete rd; delete wd; return EXIT_SUCCESS; diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp index 4594282..4db9cef 100644 --- a/engine/src/drivers/vulkan/render_driver.cpp +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -97,14 +97,12 @@ void VulkanRenderDriver::select_device(u32 index) { SurfaceID VulkanRenderDriver::create_surface(const WindowID window) { NOVA_AUTO_TRACE(); - NOVA_ASSERT(m_instance); NOVA_ASSERT(m_window_driver); return m_window_driver->create_surface(window, this); } void VulkanRenderDriver::destroy_surface(const SurfaceID surface) { NOVA_AUTO_TRACE(); - NOVA_ASSERT(m_instance); SurfaceData* data = reinterpret_cast(surface); vkDestroySurfaceKHR(m_instance, data->handle, get_allocator(VK_OBJECT_TYPE_SURFACE_KHR)); delete data; diff --git a/engine/src/drivers/x11/window_driver.cpp b/engine/src/drivers/x11/window_driver.cpp index a07bc63..0f17ffc 100644 --- a/engine/src/drivers/x11/window_driver.cpp +++ b/engine/src/drivers/x11/window_driver.cpp @@ -16,6 +16,7 @@ #endif #include +#include #include @@ -46,26 +47,38 @@ X11WindowDriver::~X11WindowDriver() { } void X11WindowDriver::poll_events() { - NOVA_AUTO_TRACE(); + while (XPending(m_display)) { + XEvent event; + XNextEvent(m_display, &event); - XEvent event; - XNextEvent(m_display, &event); + const WindowID window = event.xany.window; + WindowData& data = m_windows[window]; - const WindowID window = event.xany.window; - NOVA_ASSERT(m_windows.contains(window)); - - switch (event.type) { - case Expose: - break; - case ClientMessage: { - if (event.xclient.data.l[0] == static_cast(m_window_close_atom)) { - destroy_window(window); + switch (event.type) { + case ConfigureNotify: { + XConfigureEvent xce = event.xconfigure; + if (xce.width != data.width || xce.height != data.height) { + data.width = xce.width; + data.height = xce.height; + NOVA_DEBUG("Window event: RESIZED ({}x{})", xce.width, xce.height); + } + break; } - break; + case ClientMessage: { + if (event.xclient.data.l[0] == static_cast(m_window_close_atom)) { + NOVA_DEBUG("Window event: CLOSED"); + destroy_window(window); + } + break; + } + case MapNotify: + case ReparentNotify: + // Ignore these events + break; + default: + NOVA_WARN("Unhandled X11 event: {}", event.type); + break; } - default: - NOVA_WARN("Unhandled X11 event: {}", event.type); - break; } } @@ -81,11 +94,12 @@ WindowID X11WindowDriver::create_window(const std::string_view title, const u32 NOVA_AUTO_TRACE(); const WindowID window = XCreateSimpleWindow(m_display, DefaultRootWindow(m_display), 0, 0, width, height, 0, 0, 0); - const WindowData& data = m_windows[window]; - (void)data; // TODO: Initialize window data + WindowData& data = m_windows[window]; + data.width = width; + data.height = height; XSetWMProtocols(m_display, window, &m_window_close_atom, 1); - XSelectInput(m_display, window, ExposureMask); + XSelectInput(m_display, window, StructureNotifyMask); XStoreName(m_display, window, title.data()); XMapWindow(m_display, window); XFlush(m_display); @@ -147,9 +161,10 @@ SurfaceID X11WindowDriver::create_surface(const WindowID window, RenderDriver* r != VK_SUCCESS) { throw std::runtime_error("Failed to create Vulkan surface"); } - return reinterpret_cast(surface); + + return SurfaceID(surface); #else - return SurfaceID(); + return SurfaceID(nullptr); #endif } diff --git a/engine/src/drivers/x11/window_driver.h b/engine/src/drivers/x11/window_driver.h index e5e9c15..8a10411 100644 --- a/engine/src/drivers/x11/window_driver.h +++ b/engine/src/drivers/x11/window_driver.h @@ -15,7 +15,8 @@ namespace Nova { struct WindowData { - // TODO: Add stuff here + int width = 0; + int height = 0; }; class X11WindowDriver final : public WindowDriver {