OpenGL: add JSON config support

This commit is contained in:
李通洲
2023-06-07 14:44:27 +08:00
committed by 李通洲
parent d731051cb7
commit e484c6cdfc
13 changed files with 171 additions and 74 deletions
+1 -1
View File
@@ -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
+2 -3
View File
@@ -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);
+3 -3
View File
@@ -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);
+3 -13
View File
@@ -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)
+1 -11
View File
@@ -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);
+1 -1
View File
@@ -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);
+1
View File
@@ -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;
}
+1
View File
@@ -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"
-42
View File
@@ -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);
}
+117
View File
@@ -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
+15
View File
@@ -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
+25
View File
@@ -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;
+1
View File
@@ -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"