Program Listing for File window.hpp

Return to documentation for file (inexor/vulkan-renderer/wrapper/window.hpp)

#pragma once

#include <GLFW/glfw3.h>

#include <cstdint>
#include <string>

namespace inexor::vulkan_renderer::wrapper {

class Window {
public:
    enum class Mode { WINDOWED, FULLSCREEN, WINDOWED_FULLSCREEN };

private:
    std::uint32_t m_width;
    std::uint32_t m_height;
    Mode m_mode;
    GLFWwindow *m_window{nullptr};

public:
    Window(const std::string &title, std::uint32_t width, std::uint32_t height, bool visible, bool resizable,
           Mode mode);
    Window(const Window &) = delete;
    Window(Window &&) = delete;
    ~Window();

    Window &operator=(const Window &) = delete;
    Window &operator=(Window &&) = delete;

    void wait_for_focus();

    void set_title(const std::string &title);

    // @note Since GLFW is a C-style API, we can't use a class method as callback for window resize.
    void set_user_ptr(void *user_ptr);

    void set_resize_callback(GLFWframebuffersizefun frame_buffer_resize_callback);

    void set_keyboard_button_callback(GLFWkeyfun keyboard_button_callback);

    void set_cursor_position_callback(GLFWcursorposfun cursor_pos_callback);

    void set_mouse_button_callback(GLFWmousebuttonfun mouse_button_callback);

    void set_mouse_scroll_callback(GLFWscrollfun mouse_scroll_callback);

    void show();

    static void poll();

    bool should_close();

    [[nodiscard]] GLFWwindow *get() const {
        return m_window;
    }

    [[nodiscard]] std::uint32_t width() const {
        return m_width;
    }

    [[nodiscard]] std::uint32_t height() const {
        return m_height;
    }

    [[nodiscard]] Mode mode() const {
        return m_mode;
    }
};

} // namespace inexor::vulkan_renderer::wrapper