82 lines
2.1 KiB
C++
82 lines
2.1 KiB
C++
#define GLFW_INCLUDE_NONE
|
|
#include <GLFW/glfw3.h>
|
|
|
|
#include <libreborn/glfw.h>
|
|
#include <libreborn/util.h>
|
|
#include <libreborn/log.h>
|
|
#include <libreborn/config.h>
|
|
|
|
// Handle GLFW Error
|
|
static void glfw_error(__attribute__((unused)) int error, const char *description) {
|
|
WARN("GLFW Error: %s", description);
|
|
}
|
|
|
|
// Init
|
|
void init_glfw() {
|
|
reborn_check_display();
|
|
glfwSetErrorCallback(glfw_error);
|
|
if (!glfwInit()) {
|
|
ERR("Unable To Initialize GLFW");
|
|
}
|
|
}
|
|
|
|
// Create Window
|
|
GLFWwindow *create_glfw_window(const char *title, const int width, const int height) {
|
|
// App ID
|
|
glfwWindowHintString(GLFW_X11_CLASS_NAME, MCPI_APP_ID);
|
|
glfwWindowHintString(GLFW_WAYLAND_APP_ID, MCPI_APP_ID);
|
|
// Create Window
|
|
GLFWwindow *window = glfwCreateWindow(width, height, title, nullptr, nullptr);
|
|
if (!window) {
|
|
ERR("Unable To Create GLFW Window");
|
|
}
|
|
// Make Window Context Current
|
|
glfwMakeContextCurrent(window);
|
|
// Return
|
|
return window;
|
|
}
|
|
|
|
// Cleanup
|
|
void cleanup_glfw(GLFWwindow *window) {
|
|
// Ignore GLFW Errors During Termination
|
|
glfwSetErrorCallback(nullptr);
|
|
// Terminate GLFW
|
|
glfwDestroyWindow(window);
|
|
glfwTerminate();
|
|
}
|
|
|
|
// Framebuffer Scaling
|
|
void get_glfw_scale(GLFWwindow *window, float *x_scale_ptr, float *y_scale_ptr) {
|
|
// Output
|
|
float x_scale;
|
|
float y_scale;
|
|
|
|
// Default
|
|
x_scale = y_scale = 1.0f;
|
|
|
|
// Detect Platform
|
|
if (glfwGetPlatform() == GLFW_PLATFORM_X11) {
|
|
// X11 Has No Scaling
|
|
} else {
|
|
// Get Window Size
|
|
int window_width;
|
|
int window_height;
|
|
glfwGetWindowSize(window, &window_width, &window_height);
|
|
// Get Framebuffer Size
|
|
int framebuffer_width;
|
|
int framebuffer_height;
|
|
glfwGetFramebufferSize(window, &framebuffer_width, &framebuffer_height);
|
|
|
|
// Calculate
|
|
if (window_width > 0 && window_height > 0) {
|
|
x_scale = float(framebuffer_width) / float(window_width);
|
|
y_scale = float(framebuffer_height) / float(window_height);
|
|
}
|
|
}
|
|
|
|
// Return
|
|
#define ret(x) if (x##_ptr) *x##_ptr = x
|
|
ret(x_scale);
|
|
ret(y_scale);
|
|
#undef ret
|
|
} |