diff --git a/CMakeLists.txt b/CMakeLists.txt index e2853d53..8d7b52cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,8 +291,8 @@ set(LIBFASTFETCH_SRC src/modules/opengl/opengl.c src/modules/os/os.c src/modules/packages/packages.c - src/modules/player.c src/modules/processes.c + src/modules/player/player.c src/modules/poweradapter/poweradapter.c src/modules/publicip.c src/modules/display/display.c diff --git a/src/common/init.c b/src/common/init.c index 55167ad9..fe838838 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -93,7 +93,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.publicIP); initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); - initModuleArg(&instance->config.player); + ffInitPlayerOptions(&instance->config.player); ffInitMediaOptions(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); ffInitVulkanOptions(&instance->config.vulkan); @@ -138,8 +138,6 @@ static void defaultConfig(FFinstance* instance) instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); - ffStrbufInit(&instance->config.playerName); - instance->config.percentType = 1; } @@ -313,7 +311,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyWallpaperOptions(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); - destroyModuleArg(&instance->config.player); + ffDestroyPlayerOptions(&instance->config.player); ffDestroyMediaOptions(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); ffDestroyVulkanOptions(&instance->config.vulkan); @@ -353,7 +351,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); - ffStrbufDestroy(&instance->config.playerName); } static void destroyState(FFinstance* instance) diff --git a/src/detection/media/media_linux.c b/src/detection/media/media_linux.c index f4e8c9ea..23564588 100644 --- a/src/detection/media/media_linux.c +++ b/src/detection/media/media_linux.c @@ -101,14 +101,14 @@ static bool getBusProperties(FFDBusData* data, const char* busName, FFMediaResul static void getCustomBus(FFDBusData* data, const FFinstance* instance, FFMediaResult* result) { - if(ffStrbufStartsWithS(&instance->config.playerName, FF_DBUS_MPRIS_PREFIX)) + if(ffStrbufStartsWithS(&instance->config.player.name, FF_DBUS_MPRIS_PREFIX)) { - getBusProperties(data, instance->config.playerName.chars, result); + getBusProperties(data, instance->config.player.name.chars, result); return; } FF_STRBUF_AUTO_DESTROY busName = ffStrbufCreateS(FF_DBUS_MPRIS_PREFIX); - ffStrbufAppend(&busName, &instance->config.playerName); + ffStrbufAppend(&busName, &instance->config.player.name); getBusProperties(data, busName.chars, result); } @@ -158,7 +158,7 @@ static const char* getMedia(const FFinstance* instance, FFMediaResult* result) if(error != NULL) return error; - if(instance->config.playerName.length > 0) + if(instance->config.player.name.length > 0) getCustomBus(&data, instance, result); else getBestBus(&data, result); diff --git a/src/fastfetch.c b/src/fastfetch.c index 89f69211..66672c32 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1011,7 +1011,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} - else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} + else if(ffParsePlayerCommandOptions(&instance->config.player, key, value)) {} else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} @@ -1088,8 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--player-name") == 0) - optionParseString(key, value, &instance->config.playerName); else if(strcasecmp(key, "--publicip-url") == 0) optionParseString(key, value, &instance->config.publicIpUrl); else if(strcasecmp(key, "--publicip-timeout") == 0) @@ -1230,8 +1228,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWifi(instance, &instance->config.wifi); else if(strcasecmp(line, "weather") == 0) ffPrintWeather(instance); - else if(strcasecmp(line, "player") == 0) - ffPrintPlayer(instance); + else if(strcasecmp(line, FF_PLAYER_MODULE_NAME) == 0) + ffPrintPlayer(instance, &instance->config.player); else if(strcasecmp(line, FF_MEDIA_MODULE_NAME) == 0) ffPrintMedia(instance, &instance->config.media); else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3c17da83..606ce08c 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -85,7 +85,7 @@ typedef struct FFconfig FFLocalIpOptions localIP; FFModuleArgs publicIP; FFModuleArgs weather; - FFModuleArgs player; + FFPlayerOptions player; FFMediaOptions media; FFDateTimeOptions dateTime; FFVulkanOptions vulkan; @@ -129,8 +129,6 @@ typedef struct FFconfig FFstrbuf weatherOutputFormat; uint32_t weatherTimeout; - FFstrbuf playerName; - uint32_t percentType; bool jsonConfig; @@ -190,7 +188,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintPlayer(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 4a286181..ec2d209e 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -50,7 +50,7 @@ int main(int argc, char** argv) ffPrintDisk(&instance, &instance.config.disk); ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance, &instance.config.powerAdapter); - //ffPrintPlayer(&instance); + //ffPrintPlayer(&instance, &instance.config.player); //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); //ffPrintPublicIp(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 489d7f71..e056bf21 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -113,6 +113,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'P': { return tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || + tryModule(instance, type, module, FF_PLAYER_MODULE_NAME, ffParsePlayerJsonObject) || tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index 2966d52c..b31c2af6 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -32,6 +32,7 @@ #include "modules/opencl/opencl.h" #include "modules/os/os.h" #include "modules/packages/packages.h" +#include "modules/player/player.h" #include "modules/poweradapter/poweradapter.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" diff --git a/src/modules/options.h b/src/modules/options.h index e20258d2..bd57642c 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -30,6 +30,7 @@ #include "modules/opencl/option.h" #include "modules/os/option.h" #include "modules/packages/option.h" +#include "modules/player/option.h" #include "modules/poweradapter/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" diff --git a/src/modules/player/option.h b/src/modules/player/option.h new file mode 100644 index 00000000..8fa057a4 --- /dev/null +++ b/src/modules/player/option.h @@ -0,0 +1,13 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFPlayerOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf name; +} FFPlayerOptions; diff --git a/src/modules/player.c b/src/modules/player/player.c similarity index 55% rename from src/modules/player.c rename to src/modules/player/player.c index 6f4ab0df..f461044a 100644 --- a/src/modules/player.c +++ b/src/modules/player/player.c @@ -1,19 +1,20 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/media/media.h" +#include "modules/player/player.h" #include -#define FF_PLAYER_MODULE_NAME "Media Player" +#define FF_PLAYER_DISPLAY_NAME "Media Player" #define FF_PLAYER_NUM_FORMAT_ARGS 4 -void ffPrintPlayer(FFinstance* instance) +void ffPrintPlayer(FFinstance* instance, FFPlayerOptions* options) { const FFMediaResult* media = ffDetectMedia(instance); if(media->error.length > 0) { - ffPrintError(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player, "%s", media->error.chars); + ffPrintError(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs, "%s", media->error.chars); return; } @@ -55,14 +56,14 @@ void ffPrintPlayer(FFinstance* instance) if(playerPrettyIsCustom) ffStrbufAppendC(&playerPretty, ')'); - if(instance->config.player.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player.key); + ffPrintLogoAndKey(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs.key); ffStrbufPutTo(&playerPretty, stdout); } else { - ffPrintFormat(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.player, FF_PLAYER_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_PLAYER_DISPLAY_NAME, 0, &options->moduleArgs, FF_PLAYER_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &playerPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->player}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->playerId}, @@ -70,3 +71,49 @@ void ffPrintPlayer(FFinstance* instance) }); } } + +void ffInitPlayerOptions(FFPlayerOptions* options) +{ + options->moduleName = FF_PLAYER_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInit(&options->name); +} + +bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PLAYER_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyPlayerOptions(FFPlayerOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->name); +} + +#ifdef FF_HAVE_JSONC +void ffParsePlayerJsonObject(FFinstance* instance, json_object* module) +{ + FFPlayerOptions __attribute__((__cleanup__(ffDestroyPlayerOptions))) options; + ffInitPlayerOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_PLAYER_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPlayer(instance, &options); +} +#endif diff --git a/src/modules/player/player.h b/src/modules/player/player.h new file mode 100644 index 00000000..9b19d67c --- /dev/null +++ b/src/modules/player/player.h @@ -0,0 +1,16 @@ + +#pragma once + +#include "fastfetch.h" + +#define FF_PLAYER_MODULE_NAME "Player" + +void ffPrintPlayer(FFinstance* instance, FFPlayerOptions* options); +void ffInitPlayerOptions(FFPlayerOptions* options); +bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, const char* value); +void ffDestroyPlayerOptions(FFPlayerOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePlayerJsonObject(FFinstance* instance, json_object* module); +#endif