Made window hinting/param system easier

This commit is contained in:
NaifBanana
2026-10-12 16:54:36 -05:00
parent c6ab0327c1
commit 416446206f
4 changed files with 46 additions and 70 deletions
+37 -14
View File
@@ -9,6 +9,8 @@
#include <functional>
#include <memory>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
#include <NBCore/Errors.hpp>
@@ -126,21 +128,26 @@ class OGLWindow {
static thread_local GLFWwindow* _currWindow;
static thread_local const GLFWwindow* _currArena;
static void SetHintInteger(const std::array<int, 2>&);
static void SetHintString(const std::tuple<int, std::string>&);
template<typename T>
static void SetHint(std::pair<int, T> hint) {
if constexpr ( std::is_same_v<T, std::string> ) {
glfwWindowHintString(std::get<0>(hint), std::get<1>(hint).c_str());
} else if constexpr ( std::is_same_v<T, int> ) {
glfwWindowHint(std::get<0>(hint), std::get<1>(hint));
}
}
std::string _title;
GLFWwindow* _window_ptr;
const GLFWwindow* _arena;
OGLWindow(
unsigned int,
unsigned int,
unsigned int x,
unsigned int y,
const std::string&,
const std::vector<std::array<int, 2>>& integerWindowHints,
const std::vector<std::tuple<int, std::string>>& stringWindowHints={},
GLFWwindow* sharingContext = NULL
);
GLFWwindow* makeCurrent() const;
void detachWindow();
@@ -154,21 +161,37 @@ class OGLWindow {
static GLFWwindow* MakeCurrent(const std::shared_ptr<OGLWindow>&);
static inline GLFWwindow* DropCurrent() { return MakeCurrent(nullptr); }
static void DestroyWindow(std::shared_ptr<OGLWindow>&);
template <typename... T>
static std::shared_ptr<OGLWindow> CreateWindow(
unsigned int x,
unsigned int y,
const std::string& title,
const std::vector<std::array<int, 2>>& integerHints={},
const std::vector<std::tuple<int, std::string>>& stringHints={}
);
const std::pair<int, T>&... windowHints
) {
(SetHint(std::pair(windowHints)),... );
return std::shared_ptr<OGLWindow>(new OGLWindow(
x,
y,
title,
nullptr
) );
}
template<typename... T>
static std::shared_ptr<OGLWindow> CreateSharedWindow(
unsigned int x,
unsigned int y,
const std::string& title,
std::shared_ptr<OGLWindow> sharingWindow,
const std::vector<std::array<int, 2>>& integerHints={},
const std::vector<std::tuple<int, std::string>>& stringHints={}
);
std::shared_ptr<OGLWindow> sharingWindow = NULL,
const std::pair<int, T>&... windowHints
) {
(SetHint(std::pair(windowHints)),... );
return std::shared_ptr<OGLWindow>(new OGLWindow(
x,
y,
title,
sharingWindow->_window_ptr
) );
}
OGLWindow(OGLWindow&&) = delete;
OGLWindow(const OGLWindow&) = delete;