diff --git a/CMakeLists.txt b/CMakeLists.txt index 67e4808d9..b908fcaf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,7 +311,7 @@ set(LIBFASTFETCH_SRC src/modules/wallpaper/wallpaper.c src/modules/weather.c src/modules/wifi/wifi.c - src/modules/wm.c + src/modules/wm/wm.c src/modules/wmtheme/wmtheme.c src/modules/jsonconfig/jsonconfig.c src/util/FFlist.c diff --git a/src/common/init.c b/src/common/init.c index 25407f2e8..4e952ca26 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -73,7 +73,7 @@ static void defaultConfig(FFinstance* instance) ffInitShellOptions(&instance->config.shell); ffInitDisplayOptions(&instance->config.display); ffInitDEOptions(&instance->config.de); - initModuleArg(&instance->config.wm); + ffInitWMOptions(&instance->config.wm); ffInitWMThemeOptions(&instance->config.wmTheme); initModuleArg(&instance->config.theme); ffInitIconsOptions(&instance->config.icons); @@ -292,7 +292,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyShellOptions(&instance->config.shell); ffDestroyDisplayOptions(&instance->config.display); ffDestroyDEOptions(&instance->config.de); - destroyModuleArg(&instance->config.wm); + ffDestroyWMOptions(&instance->config.wm); ffDestroyWMThemeOptions(&instance->config.wmTheme); destroyModuleArg(&instance->config.theme); ffDestroyIconsOptions(&instance->config.icons); diff --git a/src/fastfetch.c b/src/fastfetch.c index 310c26881..b0714a9c8 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -990,7 +990,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseBrightnessCommandOptions(&instance->config.brightness, key, value)) {} else if(ffParseDECommandOptions(&instance->config.de, key, value)) {} else if(ffParseWifiCommandOptions(&instance->config.wifi, key, value)) {} - else if(optionParseModuleArgs(key, value, "wm", &instance->config.wm)) {} + else if(ffParseWMCommandOptions(&instance->config.wm, key, value)) {} else if(ffParseWMThemeCommandOptions(&instance->config.wmTheme, key, value)) {} else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {} else if(ffParseIconsCommandOptions(&instance->config.icons, key, value)) {} @@ -1194,8 +1194,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintDisplay(instance, &instance->config.display); else if(strcasecmp(line, FF_DE_MODULE_NAME) == 0) ffPrintDE(instance, &instance->config.de); - else if(strcasecmp(line, "windowmanager") == 0 || strcasecmp(line, "wm") == 0) - ffPrintWM(instance); + else if(strcasecmp(line, FF_WM_MODULE_NAME) == 0) + ffPrintWM(instance, &instance->config.wm); else if(strcasecmp(line, "theme") == 0) ffPrintTheme(instance); else if(strcasecmp(line, FF_WMTHEME_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 53a43d80a..e3941f719 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -73,7 +73,7 @@ typedef struct FFconfig FFDEOptions de; FFWallpaperOptions wallpaper; FFWifiOptions wifi; - FFModuleArgs wm; + FFWMOptions wm; FFWMThemeOptions wmTheme; FFModuleArgs theme; FFIconsOptions icons; @@ -198,7 +198,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); -void ffPrintWM(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); void ffPrintMedia(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 320357e65..0af047407 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -35,7 +35,7 @@ int main(int argc, char** argv) ffPrintDisplay(&instance, &instance.config.display); // ffPrintBrightness(&instance); ffPrintDE(&instance, &instance.config.de); - ffPrintWM(&instance); + ffPrintWM(&instance, &instance.config.wm); ffPrintWMTheme(&instance, &instance.config.wmTheme); ffPrintTheme(&instance); ffPrintIcons(&instance, &instance.config.icons); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 5c0769dc9..7e6253da9 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -140,6 +140,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'W': { return tryModule(instance, type, module, FF_WALLPAPER_MODULE_NAME, ffParseWallpaperJsonObject) || + tryModule(instance, type, module, FF_WM_MODULE_NAME, ffParseWMJsonObject) || tryModule(instance, type, module, FF_WIFI_MODULE_NAME, ffParseWifiJsonObject) || tryModule(instance, type, module, FF_WMTHEME_MODULE_NAME, ffParseWMThemeJsonObject) || false; diff --git a/src/modules/modules.h b/src/modules/modules.h index d6dd4eb6c..48a7ee415 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -41,4 +41,5 @@ #include "modules/uptime/uptime.h" #include "modules/wallpaper/wallpaper.h" #include "modules/wifi/wifi.h" +#include "modules/wm/wm.h" #include "modules/wmtheme/wmtheme.h" diff --git a/src/modules/options.h b/src/modules/options.h index 01d13a26c..40cef1062 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -38,4 +38,5 @@ #include "modules/uptime/option.h" #include "modules/wallpaper/option.h" #include "modules/wifi/option.h" +#include "modules/wm/option.h" #include "modules/wmtheme/option.h" diff --git a/src/modules/wm.c b/src/modules/wm.c deleted file mode 100644 index 38cf9f5a3..000000000 --- a/src/modules/wm.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "detection/displayserver/displayserver.h" - -#define FF_WM_MODULE_NAME "WM" -#define FF_WM_NUM_FORMAT_ARGS 3 - -void ffPrintWM(FFinstance* instance) -{ - #ifdef __ANDROID__ - ffPrintError(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, "WM detection is not supported on Android"); - return; - #endif - - const FFDisplayServerResult* result = ffConnectDisplayServer(instance); - - if(result->wmPrettyName.length == 0) - { - ffPrintError(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, "No WM found"); - return; - } - - if(instance->config.wm.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm.key); - - ffStrbufWriteTo(&result->wmPrettyName, stdout); - - if(result->wmProtocolName.length > 0) - { - fputs(" (", stdout); - ffStrbufWriteTo(&result->wmProtocolName, stdout); - putchar(')'); - } - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_WM_MODULE_NAME, 0, &instance->config.wm, FF_WM_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProcessName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmPrettyName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProtocolName} - }); - } -} diff --git a/src/modules/wm/option.h b/src/modules/wm/option.h new file mode 100644 index 000000000..fcc7b0231 --- /dev/null +++ b/src/modules/wm/option.h @@ -0,0 +1,11 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFWMOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFWMOptions; diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c new file mode 100644 index 000000000..172066fe8 --- /dev/null +++ b/src/modules/wm/wm.c @@ -0,0 +1,83 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "detection/displayserver/displayserver.h" +#include "modules/wm/wm.h" + +#define FF_WM_NUM_FORMAT_ARGS 3 + +void ffPrintWM(FFinstance* instance, FFWMOptions* options) +{ + const FFDisplayServerResult* result = ffConnectDisplayServer(instance); + + if(result->wmPrettyName.length == 0) + { + ffPrintError(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs, "No WM found"); + return; + } + + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs.key); + + ffStrbufWriteTo(&result->wmPrettyName, stdout); + + if(result->wmProtocolName.length > 0) + { + fputs(" (", stdout); + ffStrbufWriteTo(&result->wmProtocolName, stdout); + putchar(')'); + } + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_WM_MODULE_NAME, 0, &options->moduleArgs, FF_WM_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProcessName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmPrettyName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->wmProtocolName} + }); + } +} + +void ffInitWMOptions(FFWMOptions* options) +{ + options->moduleName = FF_WM_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_WM_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyWMOptions(FFWMOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseWMJsonObject(FFinstance* instance, json_object* module) +{ + FFWMOptions __attribute__((__cleanup__(ffDestroyWMOptions))) options; + ffInitWMOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_WM_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintWM(instance, &options); +} +#endif diff --git a/src/modules/wm/wm.h b/src/modules/wm/wm.h new file mode 100644 index 000000000..86214a3dc --- /dev/null +++ b/src/modules/wm/wm.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_WM_MODULE_NAME "WM" + +void ffPrintWM(FFinstance* instance, FFWMOptions* options); +void ffInitWMOptions(FFWMOptions* options); +bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* value); +void ffDestroyWMOptions(FFWMOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseWMJsonObject(FFinstance* instance, json_object* module); +#endif