From 192cf571b10fcf1351f76f29207e87dbbded8f5f Mon Sep 17 00:00:00 2001 From: klemek Date: Fri, 21 Aug 2026 23:17:21 +0200 Subject: [PATCH] feat(glfw): allow to switch backend --- src/args.c | 21 ++++++++++++++++++++- src/constants.h | 6 ++++++ src/forge.c | 2 +- src/types.h | 1 + src/window.c | 32 +++++++++++++++++++++++++++++--- src/window.h | 2 +- 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/args.c b/src/args.c index 6f3b40b..3dc51c2 100644 --- a/src/args.c +++ b/src/args.c @@ -7,6 +7,8 @@ #include "types.h" +#include "constants.h" + #include "args.h" #include "config.h" #include "string.h" @@ -42,6 +44,10 @@ static void print_help(int status_code) { "[-mr / -nmr] " "[-tm] " "[-tf] " + "[--x11] " + "[--wayland] " + "[--cocoa] " + "[--win32] " "\n\n" "Fusion Of Real-time Generative Effects.\n\n" "options:\n" @@ -81,7 +87,11 @@ static void print_help(int status_code) { " -mr, --midi-reconnect auto-reconnect midi (default)\n" " -nmr, --no-midi-reconnect do not auto-reconnect midi\n" " -tm, --trace-midi print midi code and values\n" - " -tf, --trace-fps print fps status of subsystems\n"); + " -tf, --trace-fps print fps status of subsystems\n" + " --x11 force X11 GLFW backend\n" + " --wayland force Wayland GLFW backend\n" + " --cocoa force Cocoa GLFW backend\n" + " --win32 force Win32 GLFW backend\n"); exit(status_code); } @@ -152,6 +162,7 @@ void args_parse(Parameters *params, int argc, char **argv) { params->midi_reconnect = true; params->trace_midi = false; params->trace_fps = false; + params->glfw_backend = GLFW_BACKEND_ANY; for (int i = 1; i < argc; i++) { arg = argv[i]; @@ -220,6 +231,14 @@ void args_parse(Parameters *params, int argc, char **argv) { params->trace_midi = true; } else if (is_arg(arg, "-tf") || is_arg(arg, "--trace-fps")) { params->trace_fps = true; + } else if (is_arg(arg, "--x11")) { + params->glfw_backend = GLFW_BACKEND_X11; + } else if (is_arg(arg, "--wayland")) { + params->glfw_backend = GLFW_BACKEND_WAYLAND; + } else if (is_arg(arg, "--cocoa")) { + params->glfw_backend = GLFW_BACKEND_COCOA; + } else if (is_arg(arg, "--win32")) { + params->glfw_backend = GLFW_BACKEND_WIN32; } else { #ifdef VIDEO_IN if (is_arg(arg, "-vi") || is_arg(arg, "--video-in")) { diff --git a/src/constants.h b/src/constants.h index 2aa99cb..9cca3f2 100644 --- a/src/constants.h +++ b/src/constants.h @@ -3,6 +3,12 @@ #ifndef CONSTANTS_H #define CONSTANTS_H +static const unsigned int GLFW_BACKEND_ANY = 0; +static const unsigned int GLFW_BACKEND_X11 = 1; +static const unsigned int GLFW_BACKEND_WAYLAND = 2; +static const unsigned int GLFW_BACKEND_COCOA = 3; +static const unsigned int GLFW_BACKEND_WIN32 = 4; + static const char *vertex_shader_text = "#version 460\n" "const mat4 mvp = " diff --git a/src/forge.c b/src/forge.c index 0e95694..0540c92 100644 --- a/src/forge.c +++ b/src/forge.c @@ -286,7 +286,7 @@ static bool init(const Parameters *params) { start_state_background_write(); - window_startup(error_callback); + window_startup(error_callback, params->glfw_backend); context.tex_resolution[0] = params->internal_size; context.tex_resolution[1] = params->internal_size; diff --git a/src/types.h b/src/types.h index 8afca99..2f11524 100644 --- a/src/types.h +++ b/src/types.h @@ -58,6 +58,7 @@ typedef struct Parameters { bool midi_reconnect; bool trace_midi; bool trace_fps; + unsigned int glfw_backend; } Parameters; // file.c diff --git a/src/window.c b/src/window.c index f8f9b94..0984718 100644 --- a/src/window.c +++ b/src/window.c @@ -5,9 +5,12 @@ #include "types.h" +#include "constants.h" + #include "window.h" -static void init_glfw(void (*error_callback)(int, const char *)) { +static void init_glfw(void (*error_callback)(int, const char *), + const unsigned int backend) { log_info("[GLFW] Initializing..."); // set errors handler @@ -16,6 +19,28 @@ static void init_glfw(void (*error_callback)(int, const char *)) { // print current GLFW version log_info("[GLFW] %s", glfwGetVersionString()); + switch (backend) { + case GLFW_BACKEND_X11: + glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); + log_info("[GLFW] platform: X11"); + break; + case GLFW_BACKEND_WAYLAND: + glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WAYLAND); + log_info("[GLFW] platform: Wayland"); + break; + case GLFW_BACKEND_COCOA: + glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_COCOA); + log_info("[GLFW] platform: Cocoa"); + break; + case GLFW_BACKEND_WIN32: + glfwInitHint(GLFW_PLATFORM, GLFW_BACKEND_WIN32); + log_info("[GLFW] platform: Win32"); + break; + default: + log_info("[GLFW] platform: Any"); + break; + } + // init GLFW if (!glfwInit()) { log_error("[GLFW] Initialization failed"); @@ -86,8 +111,9 @@ create_window(GLFWmonitor *monitor, const char *title, Window *shared_context, static void use_window(GLFWwindow *window) { glfwMakeContextCurrent(window); } -void window_startup(void (*error_callback)(int, const char *)) { - init_glfw(error_callback); +void window_startup(void (*error_callback)(int, const char *), + const unsigned int backend) { + init_glfw(error_callback, backend); } void window_terminate() { diff --git a/src/window.h b/src/window.h index 7579111..ba12382 100644 --- a/src/window.h +++ b/src/window.h @@ -3,7 +3,7 @@ #ifndef WINDOW_H #define WINDOW_H -void window_startup(void (*error_callback)(int, const char *)); +void window_startup(void (*error_callback)(int, const char *), const unsigned int backend); void window_terminate();