diff --git a/completions/bash b/completions/bash index 10356ce85..22d6142c5 100644 --- a/completions/bash +++ b/completions/bash @@ -196,6 +196,7 @@ __fastfetch_completion() "--logo-padding" "--logo-padding-left" "--logo-padding-right" + "--logo-padding-top" "--logo-color-1" "--logo-color-2" "--logo-color-3" diff --git a/src/common/init.c b/src/common/init.c index 37cf2f9aa..6bd70680b 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -130,6 +130,7 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.logo.colors[i]); instance->config.logo.width = 0; instance->config.logo.height = 0; //preserve aspect ratio + instance->config.logo.paddingTop = 0; instance->config.logo.paddingLeft = 0; instance->config.logo.paddingRight = 4; instance->config.logo.printRemaining = true; diff --git a/src/common/printing.c b/src/common/printing.c index 4b593001a..31775d8c7 100644 --- a/src/common/printing.c +++ b/src/common/printing.c @@ -130,6 +130,9 @@ void ffPrintColor(const FFstrbuf* colorValue) void ffPrintCharTimes(char c, uint32_t times) { + if(times == 0) + return; + char str[32]; memset(str, c, sizeof(str)); //2 instructions when compiling with AVX2 enabled for(uint32_t i = sizeof(str); i <= times; i += sizeof(str)) diff --git a/src/data/config_user.txt b/src/data/config_user.txt index 9725c0f81..bd3563640 100644 --- a/src/data/config_user.txt +++ b/src/data/config_user.txt @@ -114,6 +114,12 @@ # Default is 0. #--logo-padding-right 0 +# Logo padding top option: +# Adds a padding to the top side of the logo. +# Must be a positive integer. +# Default is 0. +#--logo-padding-top 0 + # Logo print remaining option: # Sets if the remaining logo should be printed, it is has more lines than modules to show. # Must be true or false. diff --git a/src/data/help.txt b/src/data/help.txt index dea266a24..be4d1b329 100644 --- a/src/data/help.txt +++ b/src/data/help.txt @@ -31,6 +31,7 @@ Logo options: --logo-padding : Set the padding on the left and the right of the logo --logo-padding-left : Set the padding on the left of the logo --logo-padding-right : Set the padding on the right of the logo + --logo-padding-top : Set the padding on the top of the logo --logo-print-remaining : Whether to print the remaining logo, if it has more lines than modules to display --file : Short for --logo-type file --logo --file-raw : Short for --logo-type file-raw --logo diff --git a/src/fastfetch.c b/src/fastfetch.c index 246f6b037..f5c522864 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -939,6 +939,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //this is usally wanted when using the none logo if(strcasecmp(value, "none") == 0) { + instance->config.logo.paddingTop = 0; instance->config.logo.paddingRight = 0; instance->config.logo.paddingLeft = 0; } @@ -987,6 +988,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.logo.paddingLeft = padding; instance->config.logo.paddingRight = padding; } + else if(strcasecmp(subkey, "-padding-top") == 0) + instance->config.logo.paddingTop = optionParseUInt32(key, value); else if(strcasecmp(subkey, "-padding-left") == 0) instance->config.logo.paddingLeft = optionParseUInt32(key, value); else if(strcasecmp(subkey, "-padding-right") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index d292e5983..58ca227b0 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -71,6 +71,7 @@ typedef struct FFconfig FFstrbuf colors[FASTFETCH_LOGO_MAX_COLORS]; uint32_t width; uint32_t height; + uint32_t paddingTop; uint32_t paddingLeft; uint32_t paddingRight; bool printRemaining; diff --git a/src/logo/image/image.c b/src/logo/image/image.c index bb1b2f46a..f17cd8a09 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -44,16 +44,17 @@ static bool printImageIterm(FFinstance* instance) } ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + ffPrintCharTimes('\n', instance->config.logo.paddingTop); FFstrbuf base64 = base64Encode(&buf); + instance->state.logoWidth = instance->config.logo.width + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; + instance->state.logoHeight = instance->config.logo.paddingTop + instance->config.logo.height; printf("\033]1337;File=inline=1;width=%u;height=%u;preserveAspectRatio=%u:%s\a\033[9999999D\n\033[%uA", (unsigned) instance->config.logo.width, (unsigned) instance->config.logo.height, (unsigned) instance->config.logo.preserveAspectRadio, base64.chars, - (unsigned) instance->config.logo.height + (unsigned) instance->state.logoHeight ); - instance->state.logoWidth = instance->config.logo.width + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; - instance->state.logoHeight = instance->config.logo.height; ffStrbufDestroy(&buf); ffStrbufDestroy(&base64); @@ -64,6 +65,7 @@ static bool printImageIterm(FFinstance* instance) static bool printImageKittyDirect(FFinstance* instance) { ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + ffPrintCharTimes('\n', instance->config.logo.paddingTop); FFstrbuf base64 = base64Encode(&instance->config.logo.source); printf("\033_Ga=T,f=100,t=f,c=%u,r=%u,C=1;%s\033\\\033[9999999D", (unsigned) instance->config.logo.width, @@ -72,7 +74,7 @@ static bool printImageKittyDirect(FFinstance* instance) ); instance->state.logoWidth = instance->config.logo.width + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; - instance->state.logoHeight = instance->config.logo.height; + instance->state.logoHeight = instance->config.logo.paddingTop + instance->config.logo.height; ffStrbufDestroy(&base64); @@ -205,7 +207,7 @@ static void printImagePixels(FFinstance* instance, FFLogoRequestData* requestDat //Calculate character dimensions instance->state.logoWidth = requestData->logoCharacterWidth + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; - instance->state.logoHeight = requestData->logoCharacterHeight; + instance->state.logoHeight = requestData->logoCharacterHeight + instance->config.logo.paddingTop; if(requestData->type == FF_LOGO_TYPE_IMAGE_KITTY) instance->state.logoHeight -= 1; @@ -219,6 +221,7 @@ static void printImagePixels(FFinstance* instance, FFLogoRequestData* requestDat writeCacheUint32(requestData, instance->state.logoHeight, FF_CACHE_FILE_HEIGHT); //Write result to stdout + ffPrintCharTimes('\n', instance->config.logo.paddingTop); ffPrintCharTimes(' ', instance->config.logo.paddingLeft); fflush(stdout); ffWriteFDBuffer(STDOUT_FILENO, result); @@ -600,6 +603,7 @@ static bool printCachedPixel(FFinstance* instance, FFLogoRequestData* requestDat if(fd == -1) return false; + ffPrintCharTimes('\n', instance->config.logo.paddingTop); ffPrintCharTimes(' ', instance->config.logo.paddingLeft); fflush(stdout); @@ -611,7 +615,7 @@ static bool printCachedPixel(FFinstance* instance, FFLogoRequestData* requestDat close(fd); instance->state.logoWidth = requestData->logoCharacterWidth + instance->config.logo.paddingLeft + instance->config.logo.paddingRight; - instance->state.logoHeight = requestData->logoCharacterHeight; + instance->state.logoHeight = requestData->logoCharacterHeight + instance->config.logo.paddingTop; //Go to upper left corner fputs("\033[9999999D", stdout); diff --git a/src/logo/logo.c b/src/logo/logo.c index c259d8ca9..85ed46791 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -11,11 +11,12 @@ static void ffLogoPrintCharsRaw(FFinstance* instance, const char* data, size_t length) { fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); + ffPrintCharTimes('\n', instance->config.logo.paddingTop); ffPrintCharTimes(' ', instance->config.logo.paddingLeft); fwrite(data, length, 1, stdout); - printf("\033[9999999D\n\033[%uA", instance->config.logo.height); + instance->state.logoHeight = instance->config.logo.paddingTop + instance->config.logo.height; instance->state.logoWidth = instance->config.logo.paddingLeft + instance->config.logo.width + instance->config.logo.paddingRight; - instance->state.logoHeight = instance->config.logo.height; + printf("\033[9999999D\n\033[%uA", instance->state.logoHeight); } void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplacement) @@ -23,8 +24,11 @@ void ffLogoPrintChars(FFinstance* instance, const char* data, bool doColorReplac uint32_t currentlineLength = 0; fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); + ffPrintCharTimes('\n', instance->config.logo.paddingTop); ffPrintCharTimes(' ', instance->config.logo.paddingLeft); + instance->state.logoHeight = instance->config.logo.paddingTop; + //Use logoColor[0] as the default color if(doColorReplacement) ffPrintColor(&instance->config.logo.colors[0]);