vk-book/shared/HelpersGLFW.cpp
2025-05-23 21:13:53 -04:00

55 lines
1.3 KiB
C++

#include "HelpersGLFW.h"
GLFWwindow* initWindow(const char* windowTitle, uint32_t& outWidth, uint32_t& outHeight)
{
glfwSetErrorCallback([](int error, const char* description) { printf("GLFW Error (%i): %s\n", error, description); });
if (!glfwInit()) {
return nullptr;
}
const bool wantsWholeArea = !outWidth || !outHeight;
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, wantsWholeArea ? GLFW_FALSE : GLFW_TRUE);
// render full screen without overlapping taskbar
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
int x = 0;
int y = 0;
int w = mode->width;
int h = mode->height;
if (wantsWholeArea) {
glfwGetMonitorWorkarea(monitor, &x, &y, &w, &h);
} else {
w = outWidth;
h = outHeight;
}
GLFWwindow* window = glfwCreateWindow(w, h, windowTitle, nullptr, nullptr);
if (!window) {
glfwTerminate();
return nullptr;
}
if (wantsWholeArea) {
glfwSetWindowPos(window, x, y);
}
glfwGetWindowSize(window, &w, &h);
glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int, int action, int) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
});
outWidth = (uint32_t)w;
outHeight = (uint32_t)h;
return window;
}