diff --git a/src/modules/swap/option.h b/src/modules/swap/option.h index d6e7965ad..e0f44e02a 100644 --- a/src/modules/swap/option.h +++ b/src/modules/swap/option.h @@ -11,4 +11,5 @@ typedef struct FFSwapOptions FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; + bool separate; } FFSwapOptions; diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index e6cfa8c0c..1f864562a 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -6,34 +6,44 @@ #include "modules/swap/swap.h" #include "util/stringUtils.h" -void ffPrintSwap(FFSwapOptions* options) +void printSwap(FFSwapOptions* options, uint8_t index, FFSwapResult* storage) { - FFSwapResult storage = {}; - const char* error = ffDetectSwap(&storage); + FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); - if(error) + if (options->moduleArgs.key.length == 0) { - ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error); - return; + if (storage->name.length > 0) + ffStrbufSetF(&key, "%s (%s)", FF_SWAP_MODULE_NAME, storage->name.chars); + else + ffStrbufSetS(&key, FF_SWAP_MODULE_NAME); + } + else + { + ffStrbufClear(&key); + FF_PARSE_FORMAT_STRING_CHECKED(&key, &options->moduleArgs.key, ((FFformatarg[]) { + FF_FORMAT_ARG(index, "index"), + FF_FORMAT_ARG(storage->name, "name"), + FF_FORMAT_ARG(options->moduleArgs.keyIcon, "icon"), + })); } FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate(); - ffParseSize(storage.bytesUsed, &usedPretty); + ffParseSize(storage->bytesUsed, &usedPretty); FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate(); - ffParseSize(storage.bytesTotal, &totalPretty); + ffParseSize(storage->bytesTotal, &totalPretty); - double percentage = storage.bytesTotal == 0 + double percentage = storage->bytesTotal == 0 ? 0 - : (double) storage.bytesUsed / (double) storage.bytesTotal * 100.0; + : (double) storage->bytesUsed / (double) storage->bytesTotal * 100.0; FFPercentageTypeFlags percentType = options->percent.type == 0 ? instance.config.display.percentType : options->percent.type; if(options->moduleArgs.outputFormat.length == 0) { - ffPrintLogoAndKey(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); + ffPrintLogoAndKey(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY); FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); - if (storage.bytesTotal == 0) + if (storage->bytesTotal == 0) { if(percentType & FF_PERCENTAGE_TYPE_BAR_BIT) { @@ -71,15 +81,56 @@ void ffPrintSwap(FFSwapOptions* options) FF_STRBUF_AUTO_DESTROY percentageBar = ffStrbufCreate(); if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT) ffPercentAppendBar(&percentageBar, percentage, options->percent, &options->moduleArgs); - FF_PRINT_FORMAT_CHECKED(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]){ + FF_PRINT_FORMAT_CHECKED(key.chars, index, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, ((FFformatarg[]){ FF_FORMAT_ARG(usedPretty, "used"), FF_FORMAT_ARG(totalPretty, "total"), FF_FORMAT_ARG(percentageNum, "percentage"), FF_FORMAT_ARG(percentageBar, "percentage-bar"), + FF_FORMAT_ARG(storage->name, "name"), })); } } +void ffPrintSwap(FFSwapOptions* options) +{ + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFSwapResult)); + const char* error = ffDetectSwap(&result); + + if(error) + { + ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error); + return; + } + + if (options->separate) + { + uint8_t index = 0; + FF_LIST_FOR_EACH(FFSwapResult, storage, result) + { + ++index; + printSwap(options, index, storage); + } + } + else + { + FFSwapResult total = { + .name = ffStrbufCreate(), + }; + FF_LIST_FOR_EACH(FFSwapResult, storage, result) + { + total.bytesUsed += storage->bytesUsed; + total.bytesTotal += storage->bytesTotal; + } + printSwap(options, 0, &total); + ffStrbufDestroy(&total.name); + } + + FF_LIST_FOR_EACH(FFSwapResult, storage, result) + { + ffStrbufDestroy(&storage->name); + } +} + bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const char* value) { const char* subKey = ffOptionTestPrefix(key, FF_SWAP_MODULE_NAME); @@ -90,6 +141,12 @@ bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const ch if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) return true; + if (ffStrEqualsIgnCase(subKey, "separate")) + { + options->separate = ffOptionParseBoolean(value); + return true; + } + return false; } @@ -109,6 +166,12 @@ void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; + if (ffStrEqualsIgnCase(key, "separate")) + { + options->separate = yyjson_get_bool(val); + continue; + } + ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); } } @@ -125,8 +188,8 @@ void ffGenerateSwapJsonConfig(FFSwapOptions* options, yyjson_mut_doc* doc, yyjso void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - FFSwapResult storage = {}; - const char* error = ffDetectSwap(&storage); + FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFSwapResult)); + const char* error = ffDetectSwap(&result); if(error) { @@ -134,9 +197,19 @@ void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut return; } - yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result"); - yyjson_mut_obj_add_uint(doc, obj, "total", storage.bytesTotal); - yyjson_mut_obj_add_uint(doc, obj, "used", storage.bytesUsed); + yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); + FF_LIST_FOR_EACH(FFSwapResult, storage, result) + { + yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr); + yyjson_mut_obj_add_strbuf(doc, obj, "name", &storage->name); + yyjson_mut_obj_add_uint(doc, obj, "used", storage->bytesUsed); + yyjson_mut_obj_add_uint(doc, obj, "total", storage->bytesTotal); + } + + FF_LIST_FOR_EACH(FFSwapResult, storage, result) + { + ffStrbufDestroy(&storage->name); + } } static FFModuleBaseInfo ffModuleInfo = { @@ -152,6 +225,7 @@ static FFModuleBaseInfo ffModuleInfo = { {"Total size", "total"}, {"Percentage used (num)", "percentage"}, {"Percentage used (bar)", "percentage-bar"}, + {"Name", "name"}, })) }; @@ -160,6 +234,7 @@ void ffInitSwapOptions(FFSwapOptions* options) options->moduleInfo = ffModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰓡"); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; + options->separate = false; } void ffDestroySwapOptions(FFSwapOptions* options)