From 556cf073d61875368fe8511b75f5cb7db04ccb52 Mon Sep 17 00:00:00 2001 From: Marc Sunet Date: Wed, 19 Nov 2025 11:24:21 -0800 Subject: Use C++ modules --- dxwindow/dxwindow.ixx | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 dxwindow/dxwindow.ixx (limited to 'dxwindow/dxwindow.ixx') diff --git a/dxwindow/dxwindow.ixx b/dxwindow/dxwindow.ixx new file mode 100644 index 0000000..6efcc18 --- /dev/null +++ b/dxwindow/dxwindow.ixx @@ -0,0 +1,113 @@ +module; + +// Include Windows.h before GLFW to avoid macro redefinition warnings. +#define WIN32_LEAN_AND_MEAN +#include + +#define GLFW_INCLUDE_NONE // Do not include OpenGL headers. +#include + +#define GLFW_EXPOSE_NATIVE_WIN32 +#include + +#include +#include + +export module dxwindow; + +namespace dx { + +char glfw_error[1024] = {}; + +void glfw_error_callback(int error, const char* description) +{ + sprintf_s(glfw_error, sizeof(glfw_error), + "GLFW error %d: %s", error, description); +} + +export { + +class Window +{ +public: + ~Window() + { + if (m_window != nullptr) + { + glfwDestroyWindow(m_window); + } + } + + /// Creates the window. + bool Initialise(int width, int height, const char* title) + { + // GLFW by default creates an OpenGL context with the window. + // Use GLFW_NO_API to tell it not to do so. + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + + if ((m_window = glfwCreateWindow( + width, height, title, /*monitor=*/NULL, /*share=*/NULL)) == nullptr) + { + return false; + } + + return true; + } + + /// Returns the native window handle. + /// If the window has not been initialized, returns an invalid handle. + HWND GetWindowHandle() + { + if (!m_window) + { + return NULL; + } + return glfwGetWin32Window(m_window); + } + + /// Updates the window by polling for user input. + void Update() + { + assert(m_window); + glfwPollEvents(); + } + + /// Returns true if the user tried to close the window, false otherwise. + bool ShouldClose() const + { + assert(m_window); + return glfwWindowShouldClose(m_window) == GLFW_TRUE; + } + +private: + GLFWwindow* m_window = nullptr; +}; + +/// Initialise the window subsystem. +/// +/// This function must be called at the start of your application before any +/// Windows are created. +bool WindowInitialise() +{ + glfwSetErrorCallback(glfw_error_callback); + return glfwInit() == GLFW_TRUE; +} + +/// Terminate the window subsystem. +/// +/// This function should be called at the end of your application. Any existing +/// Windows are destroyed and are invalid beyond this call. +void WindowTerminate() +{ + glfwTerminate(); +} + +/// Returns the last Window error. +const char* GetWindowError() +{ + return glfw_error; +} + +} // export + +} // namespace dx -- cgit v1.2.3