diff --git a/CMakeLists.txt b/CMakeLists.txt index b908fcaf8..41a6aa113 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -288,7 +288,7 @@ set(LIBFASTFETCH_SRC src/modules/localip/localip.c src/modules/memory/memory.c src/modules/opencl.c - src/modules/opengl.c + src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c src/modules/player.c diff --git a/src/common/init.c b/src/common/init.c index 4e952ca26..a96984042 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -52,7 +52,6 @@ static void defaultConfig(FFinstance* instance) instance->config.hideCursor = true; instance->config.escapeBedrock = true; instance->config.binaryPrefixType = FF_BINARY_PREFIX_TYPE_IEC; - instance->config.glType = FF_GL_TYPE_AUTO; instance->config.pipe = false; instance->config.multithreading = true; instance->config.stat = false; @@ -99,7 +98,7 @@ static void defaultConfig(FFinstance* instance) ffInitDateTimeOptions(&instance->config.dateTime); initModuleArg(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); - initModuleArg(&instance->config.openGL); + ffInitOpenGLOptions(&instance->config.openGL); initModuleArg(&instance->config.openCL); initModuleArg(&instance->config.users); ffInitBluetoothOptions(&instance->config.bluetooth); @@ -318,7 +317,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); destroyModuleArg(&instance->config.vulkan); - destroyModuleArg(&instance->config.openGL); + ffDestroyOpenGLOptions(&instance->config.openGL); destroyModuleArg(&instance->config.openCL); destroyModuleArg(&instance->config.users); ffDestroyBluetoothOptions(&instance->config.bluetooth); diff --git a/src/detection/opengl/opengl_linux.c b/src/detection/opengl/opengl_linux.c index a959578f8..8a274e68f 100644 --- a/src/detection/opengl/opengl_linux.c +++ b/src/detection/opengl/opengl_linux.c @@ -315,7 +315,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) { #if FF_HAVE_GL - if(instance->config.glType == FF_GL_TYPE_GLX) + if(instance->config.openGL.type == FF_OPENGL_TYPE_GLX) { #ifdef FF_HAVE_GLX return glxPrint(instance, result); @@ -324,7 +324,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) #endif } - if(instance->config.glType == FF_GL_TYPE_EGL) + if(instance->config.openGL.type == FF_OPENGL_TYPE_EGL) { #ifdef FF_HAVE_EGL return eglPrint(instance, result); @@ -333,7 +333,7 @@ const char* ffDetectOpenGL(FFinstance* instance, FFOpenGLResult* result) #endif } - if(instance->config.glType == FF_GL_TYPE_OSMESA) + if(instance->config.openGL.type == FF_OPENGL_TYPE_OSMESA) { #ifdef FF_HAVE_OSMESA return osMesaPrint(instance, result); diff --git a/src/fastfetch.c b/src/fastfetch.c index b0714a9c8..1ae686a41 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1015,7 +1015,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(optionParseModuleArgs(key, value, "vulkan", &instance->config.vulkan)) {} - else if(optionParseModuleArgs(key, value, "opengl", &instance->config.openGL)) {} + else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} else if(optionParseModuleArgs(key, value, "opencl", &instance->config.openCL)) {} else if(optionParseModuleArgs(key, value, "users", &instance->config.users)) {} else if(ffParseBluetoothCommandOptions(&instance->config.bluetooth, key, value)) {} @@ -1098,16 +1098,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.weatherOutputFormat); else if(strcasecmp(key, "--weather-timeout") == 0) instance->config.weatherTimeout = optionParseUInt32(key, value); - else if(strcasecmp(key, "--gl") == 0) - { - optionParseEnum(key, value, &instance->config.glType, - "auto", FF_GL_TYPE_AUTO, - "egl", FF_GL_TYPE_EGL, - "glx", FF_GL_TYPE_GLX, - "osmesa", FF_GL_TYPE_OSMESA, - NULL - ); - } else if(strcasecmp(key, "--percent-type") == 0) instance->config.percentType = optionParseUInt32(key, value); @@ -1250,8 +1240,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintColors(instance); else if(strcasecmp(line, "vulkan") == 0) ffPrintVulkan(instance); - else if(strcasecmp(line, "opengl") == 0) - ffPrintOpenGL(instance); + else if(strcasecmp(line, FF_OPENGL_MODULE_NAME) == 0) + ffPrintOpenGL(instance, &instance->config.openGL); else if(strcasecmp(line, "opencl") == 0) ffPrintOpenCL(instance); else if(strcasecmp(line, "users") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index e3941f719..a7d9f90c6 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -26,14 +26,6 @@ typedef enum FFBinaryPrefixType FF_BINARY_PREFIX_TYPE_JEDEC, // 1024 Bytes = 1 kB, 1024 K = 1 MB, ... } FFBinaryPrefixType; -typedef enum FFGLType -{ - FF_GL_TYPE_AUTO, - FF_GL_TYPE_EGL, - FF_GL_TYPE_GLX, - FF_GL_TYPE_OSMESA -} FFGLType; - typedef struct FFconfig { FFLogoOptions logo; @@ -51,7 +43,6 @@ typedef struct FFconfig bool hideCursor; bool escapeBedrock; FFBinaryPrefixType binaryPrefixType; - FFGLType glType; bool pipe; //disables logo and all escape sequences bool multithreading; bool stat; @@ -98,7 +89,7 @@ typedef struct FFconfig FFModuleArgs media; FFDateTimeOptions dateTime; FFModuleArgs vulkan; - FFModuleArgs openGL; + FFOpenGLOptions openGL; FFModuleArgs openCL; FFModuleArgs users; FFBluetoothOptions bluetooth; @@ -205,7 +196,6 @@ void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); void ffPrintColors(FFinstance* instance); void ffPrintVulkan(FFinstance* instance); -void ffPrintOpenGL(FFinstance* instance); void ffPrintOpenCL(FFinstance* instance); void ffPrintUsers(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 0af047407..bd876fb9c 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -61,7 +61,7 @@ int main(int argc, char** argv) //ffPrintDate(&instance); //ffPrintTime(&instance); //ffPrintVulkan(&instance); - //ffPrintOpenGL(&instance); + //ffPrintOpenGL(&instance, &instance.config.openGL); //ffPrintOpenCL(&instance); //ffPrintUsers(&instance); //ffPrintWeather(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 7e6253da9..d6f4a6060 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -103,6 +103,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'O': { return + tryModule(instance, type, module, FF_OPENGL_MODULE_NAME, ffParseOpenGLJsonObject) || tryModule(instance, type, module, FF_OS_MODULE_NAME, ffParseOSJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 48a7ee415..e05b959a2 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -27,6 +27,7 @@ #include "modules/locale/locale.h" #include "modules/localip/localip.h" #include "modules/memory/memory.h" +#include "modules/opengl/opengl.h" #include "modules/os/os.h" #include "modules/packages/packages.h" #include "modules/poweradapter/poweradapter.h" diff --git a/src/modules/opengl.c b/src/modules/opengl.c deleted file mode 100644 index 61e78451b..000000000 --- a/src/modules/opengl.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/opengl/opengl.h" - -#define FF_OPENGL_MODULE_NAME "OpenGL" -#define FF_OPENGL_NUM_FORMAT_ARGS 4 - -void ffPrintOpenGL(FFinstance* instance) -{ - FFOpenGLResult result; - ffStrbufInit(&result.version); - ffStrbufInit(&result.renderer); - ffStrbufInit(&result.vendor); - ffStrbufInit(&result.slv); - - const char* error = ffDetectOpenGL(instance, &result); - if(error) - { - ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, "%s", error); - return; - } - - if(instance->config.openGL.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL.key); - puts(result.version.chars); - } - else - { - ffPrintFormat(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, FF_OPENGL_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result.version}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.renderer}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.vendor}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.slv} - }); - } - - ffStrbufDestroy(&result.version); - ffStrbufDestroy(&result.renderer); - ffStrbufDestroy(&result.vendor); - ffStrbufDestroy(&result.slv); -} diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c new file mode 100644 index 000000000..ae551fb35 --- /dev/null +++ b/src/modules/opengl/opengl.c @@ -0,0 +1,117 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/opengl/opengl.h" +#include "modules/opengl/opengl.h" + +#define FF_OPENGL_NUM_FORMAT_ARGS 4 + +void ffPrintOpenGL(FFinstance* instance, FFOpenGLOptions* options) +{ + FFOpenGLResult result; + ffStrbufInit(&result.version); + ffStrbufInit(&result.renderer); + ffStrbufInit(&result.vendor); + ffStrbufInit(&result.slv); + + const char* error = ffDetectOpenGL(instance, &result); + if(error) + { + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, "%s", error); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs.key); + puts(result.version.chars); + } + else + { + ffPrintFormat(instance, FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_OPENGL_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result.version}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.renderer}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.vendor}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.slv} + }); + } + + ffStrbufDestroy(&result.version); + ffStrbufDestroy(&result.renderer); + ffStrbufDestroy(&result.vendor); + ffStrbufDestroy(&result.slv); +} + +void ffInitOpenGLOptions(FFOpenGLOptions* options) +{ + options->moduleName = FF_OPENGL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + #if defined(__linux__) || defined(__FreeBSD__) + options->type = FF_OPENGL_TYPE_AUTO; + #endif +} + +bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_OPENGL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + #if defined(__linux__) || defined(__FreeBSD__) + options->type = (FFOpenGLType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { + { "auto", FF_OPENGL_TYPE_AUTO }, + { "egl", FF_OPENGL_TYPE_EGL }, + { "glx", FF_OPENGL_TYPE_GLX }, + { "osmesa", FF_OPENGL_TYPE_OSMESA }, + {} + }); + #endif + + return false; +} + +void ffDestroyOpenGLOptions(FFOpenGLOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseOpenGLJsonObject(FFinstance* instance, json_object* module) +{ + FFOpenGLOptions __attribute__((__cleanup__(ffDestroyOpenGLOptions))) options; + ffInitOpenGLOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + #if defined(__linux__) || defined(__FreeBSD__) + if (strcasecmp(key, "type") == 0) + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "auto", FF_OPENGL_TYPE_AUTO }, + { "egl", FF_OPENGL_TYPE_EGL }, + { "glx", FF_OPENGL_TYPE_GLX }, + { "osmesa", FF_OPENGL_TYPE_OSMESA }, + {}, + }); + if (error) + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options.moduleArgs, "Invalid %s value: %s", key, error); + else + options.type = (FFOpenGLType) value; + continue; + } + #endif + + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintOpenGL(instance, &options); +} +#endif diff --git a/src/modules/opengl/opengl.h b/src/modules/opengl/opengl.h new file mode 100644 index 000000000..d2322addf --- /dev/null +++ b/src/modules/opengl/opengl.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_OPENGL_MODULE_NAME "OpenGL" + +void ffPrintOpenGL(FFinstance* instance, FFOpenGLOptions* options); +void ffInitOpenGLOptions(FFOpenGLOptions* options); +bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, const char* value); +void ffDestroyOpenGLOptions(FFOpenGLOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseOpenGLJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/opengl/option.h b/src/modules/opengl/option.h new file mode 100644 index 000000000..72e29c980 --- /dev/null +++ b/src/modules/opengl/option.h @@ -0,0 +1,25 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +#if defined(__linux__) || defined(__FreeBSD__) +typedef enum FFOpenGLType +{ + FF_OPENGL_TYPE_AUTO, + FF_OPENGL_TYPE_EGL, + FF_OPENGL_TYPE_GLX, + FF_OPENGL_TYPE_OSMESA +} FFOpenGLType; +#endif + +typedef struct FFOpenGLOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + #if defined(__linux__) || defined(__FreeBSD__) + FFOpenGLType type; + #endif +} FFOpenGLOptions; diff --git a/src/modules/options.h b/src/modules/options.h index 40cef1062..fa40194dc 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -25,6 +25,7 @@ #include "modules/locale/option.h" #include "modules/localip/option.h" #include "modules/memory/option.h" +#include "modules/opengl/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" #include "modules/poweradapter/option.h"