10bool GLFWSingleton::s_initialized {};
11uint32_t GLFWSingleton::s_window_count {};
12std::function<void(
int,
const char*)> GLFWSingleton::s_error_callback;
14bool GLFWSingleton::s_configured {};
16GlfwPreInitConfig GLFWSingleton::s_preinit_config {};
18void GLFWSingleton::configure(
const GlfwPreInitConfig& config)
22 "GLFWSingleton::configure() called after GLFW was initialized — pre-init hints will be ignored");
26 glfwInitHint(GLFW_COCOA_CHDIR_RESOURCES, config.cocoa_chdir_resources ? GLFW_TRUE : GLFW_FALSE);
27 glfwInitHint(GLFW_COCOA_MENUBAR, config.cocoa_menubar ? GLFW_TRUE : GLFW_FALSE);
30 s_preinit_config = config;
33 "GLFW pre-initialization configured: cocoa_chdir_resources={}, cocoa_menubar={}",
34 config.cocoa_chdir_resources ?
"enabled" :
"disabled",
35 config.cocoa_menubar ?
"enabled" :
"disabled");
38bool GLFWSingleton::initialize()
45 "GLFWSingleton::initialize() called without prior configure() — using default pre-init hints");
47 configure(s_preinit_config);
50 glfwSetErrorCallback([](
int error,
const char* description) {
64void GLFWSingleton::terminate()
66 if (s_initialized && s_window_count == 0) {
68 s_initialized =
false;
72std::vector<MonitorInfo> GLFWSingleton::enumerate_monitors()
78 GLFWmonitor** monitors = glfwGetMonitors(&
count);
80 std::span<GLFWmonitor*> monitor_span(monitors,
count);
82 std::vector<MonitorInfo> infos;
85 GLFWmonitor* primary = glfwGetPrimaryMonitor();
87 for (
int i = 0; i <
count; ++i) {
88 auto*
mode = glfwGetVideoMode(monitor_span[i]);
90 glfwGetMonitorPhysicalSize(monitor_span[i], &w_mm, &h_mm);
92 infos.push_back({ .id = i,
93 .name = glfwGetMonitorName(monitor_span[i]),
97 .width =
static_cast<uint32_t
>(
mode->width),
98 .height =
static_cast<uint32_t
>(
mode->height),
99 .refresh_rate =
static_cast<uint32_t
>(
mode->refreshRate),
100 .red_bits =
static_cast<uint8_t
>(
mode->redBits),
101 .green_bits =
static_cast<uint8_t
>(
mode->greenBits),
102 .blue_bits =
static_cast<uint8_t
>(
mode->blueBits) },
103 .is_primary = (monitor_span[i] == primary) });
109MonitorInfo GLFWSingleton::get_primary_monitor()
111 auto monitors = enumerate_monitors();
112 for (
const auto& m : monitors) {
119std::string GLFWSingleton::get_platform()
127MonitorInfo GLFWSingleton::get_monitor(int32_t
id)
129 auto monitors = enumerate_monitors();
130 if (
id >= 0 &&
static_cast<size_t>(
id) < monitors.size()) {
136void GLFWSingleton::set_error_callback(std::function<
void(
int,
const char*)> callback)
138 s_error_callback = std::move(callback);
141std::vector<const char*> GLFWSingleton::get_required_instance_extensions()
145 std::source_location::current(),
146 "GLFW must be initialized before querying required instance extensions");
150 const char** extensions = glfwGetRequiredInstanceExtensions(&
count);
151 if (!extensions ||
count == 0) {
153 "No required instance extensions reported by GLFW");
157 return { extensions, extensions +
count };
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
@ WindowingSubsystem
Windowing system operations (GLFW, SDL)
@ Core
Core engine, backend, subsystems.
std::vector< double > mode(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Mode per window via tolerance-bucketed frequency count.