From 214540e7ef91f71bcc3942ca6e48bab27f222cfb Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Tue, 9 Nov 2021 15:14:25 +0100 Subject: [PATCH] Logo revolution --- CMakeLists.txt | 18 -- src/common/init.c | 8 +- src/common/logo.c | 465 ++++++++++++++++++++++++------------- src/data/logos.txt | 15 -- src/data/logos/arch.fflogo | 32 --- src/data/logos/arch.json | 32 --- src/fastfetch.c | 10 +- src/fastfetch.h | 17 +- src/fastfetch_config.h.in | 4 - src/flashfetch.c | 5 +- 10 files changed, 315 insertions(+), 291 deletions(-) delete mode 100644 src/data/logos.txt delete mode 100644 src/data/logos/arch.fflogo delete mode 100644 src/data/logos/arch.json diff --git a/CMakeLists.txt b/CMakeLists.txt index d3ff48d83..1a24230eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,13 +28,6 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process ( - COMMAND bash -c "awk -F= '/^ID=/{print $2}' /etc/os-release |tr -d '\n' | tr -d '\"'" - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - OUTPUT_VARIABLE BUILD_DISTRIBUTION_ID - OUTPUT_STRIP_TRAILING_WHITESPACE -) - set(PROJECT_VERSION "r${GIT_REV_LIST}.${GIT_REV_PARSE}") function(fastfetch_load_text FILENAME OUTVAR) @@ -48,22 +41,11 @@ endfunction(fastfetch_load_text) fastfetch_load_text(src/data/structure.txt DATATEXT_STRUCTURE) fastfetch_load_text(src/data/config.txt DATATEXT_CONFIG) fastfetch_load_text(src/data/modules.txt DATATEXT_MODULES) -fastfetch_load_text(src/data/logos.txt DATATEXT_LOGOS) fastfetch_load_text(src/data/help.txt DATATEXT_HELP) fastfetch_load_text(src/data/help_color.txt DATATEXT_HELP_COLOR) fastfetch_load_text(src/data/help_format.txt DATATEXT_HELP_FORMAT) fastfetch_load_text(src/data/help_config.txt DATATEXT_HELP_CONFIG) -file(GLOB LOGOS "src/data/logos/*.fflogo") -foreach(LOGO_FILE ${LOGOS}) - file(READ "${LOGO_FILE}" LOGO_RAW) - - string(REGEX MATCH "names {[^}]*" LOGO_NAMES "${LOGO_RAW}") - message("${LOGO_NAMES}") - -endforeach() - - configure_file(src/fastfetch_config.h.in fastfetch_config.h) set(THREADS_PREFER_PTHREAD_FLAG ON) diff --git a/src/common/init.c b/src/common/init.c index 98fbe4dec..5541dbe3a 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -115,12 +115,8 @@ static void defaultConfig(FFinstance* instance) instance->config.disableLinewrap = true; instance->config.hideCursor = true; - //This is basically the none logo - for(uint8_t i = 0; i < sizeof(instance->config.logo.colors) / sizeof(instance->config.logo.colors[0]); ++i) - instance->config.logo.colors[i] = ""; - instance->config.logo.allLinesSameLength = true; - instance->config.logo.freeable = false; - instance->config.logo.lines = ""; + ffLoadLogo(instance); + instance->config.logoIsFromUserFile = false; //Since most of these properties are unlikely to be used at once, give them minimal heap space (the \0 character) ffStrbufInitA(&instance->config.osFormat, 1); diff --git a/src/common/logo.c b/src/common/logo.c index 00f6af942..feb1c0199 100644 --- a/src/common/logo.c +++ b/src/common/logo.c @@ -4,9 +4,17 @@ #include #include -static void initLogoUnknown(FFinstance* instance) +#define FF_LOGO_INIT static FFlogo logo; static bool init = false; if(init) return &logo; init = true; +#define FF_LOGO_NAMES(...) static const char* names[] = (const char*[]) { __VA_ARGS__, NULL }; logo.names = names; +#define FF_LOGO_LINES(x) logo.lines = x; +#define FF_LOGO_COLORS(...) static const char* colors[] = (const char*[]) { __VA_ARGS__, NULL }; logo.colors = colors; +#define FF_LOGO_RETURN return &logo; + +static FFlogo* getLogoUnknown() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("unkown", "question mark") + FF_LOGO_LINES( " ________ \n" " _jgN########Ngg_ \n" " _N##N@@\"\" \"\"9NN##Np_ \n" @@ -24,12 +32,26 @@ static void initLogoUnknown(FFinstance* instance) " \n" " ___ \n" " q###r \n" - " \"\" "; + " \"\" " + ) + FF_LOGO_COLORS("") + FF_LOGO_RETURN } -static void initLogoArch(FFinstance* instance) +static FFlogo* getLogoNone() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("none", "empty", "") + FF_LOGO_LINES("") + FF_LOGO_COLORS("") + FF_LOGO_RETURN +} + +static FFlogo* getLogoArch() +{ + FF_LOGO_INIT + FF_LOGO_NAMES("arch", "archlinux", "arch-linux") + FF_LOGO_LINES( "$1 -` \n" "$1 .o+` \n" "$1 `ooo/ \n" @@ -49,12 +71,18 @@ static void initLogoArch(FFinstance* instance) "$1 `+sso+:-` `.-/+oso: \n" "$1`++:. `-/+/\n" "$1.` `/"; - instance->config.logo.colors[0] = "\033[36m"; //cyan + ) + FF_LOGO_COLORS( + "\033[36m" //cyan + ) + FF_LOGO_RETURN } -static void initLogoArtix(FFinstance* instance) +static FFlogo* getLogoArtix() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("artix", "artixlinux", "artix-linux") + FF_LOGO_LINES( "$1 ' \n" "$1 'o' \n" "$1 'ooo' \n" @@ -75,12 +103,18 @@ static void initLogoArtix(FFinstance* instance) "$1 'ooooi:'` `'';ioxxo' \n" "$1'i:'` '':io' \n" "$1'` `'"; - instance->config.logo.colors[0] = "\033[36m"; //cyan + ) + FF_LOGO_COLORS( + "\033[36m" //cyan + ) + FF_LOGO_RETURN } -static void initLogoCelOS(FFinstance* instance) +static FFlogo* getLogoCelOS() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("celos", "celos-linux") + FF_LOGO_LINES( "$1 `-:/++++/:-` \n" "$1 -/syyyyyyyyyyyyy+- \n" "$1 :ssssyyyyyyyyyyyyyyyy/ \n" @@ -95,14 +129,20 @@ static void initLogoCelOS(FFinstance* instance) "$1 -ssss$2hmmmmmmmmmmmmmmmmmmmyssss-\n" "$1 `/ssssyyyyyyyyyyyyyyyy+` \n" "$1 `:osyyyyyyyyyyyyys/` \n" - "$1 `.:/+ooooo+:-` "; - instance->config.logo.colors[0] = "\033[35m"; //magenta - instance->config.logo.colors[1] = "\033[30m"; //black + "$1 `.:/+ooooo+:-` " + ) + FF_LOGO_COLORS( + "\033[35m", //magenta + "\033[30m" //black + ) + FF_LOGO_RETURN } -static void initLogoDebian(FFinstance* instance) +static FFlogo* getLogoDebian() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("debian", "debian-linux") + FF_LOGO_LINES( "$2 _,met$$$$$$$$$$gg. \n" "$2 ,g$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$P. \n" "$2 ,g$$$$P\" \"\"\"Y$$$$.\". \n" @@ -119,14 +159,20 @@ static void initLogoDebian(FFinstance* instance) "$2 `$$$$b. \n" "$2 `Y$$$$b. \n" "$2 `\"Y$$b._ \n" - "$2 `\"\"\" "; - instance->config.logo.colors[0] = "\033[31m"; //red - instance->config.logo.colors[1] = "\033[37m"; //white + "$2 `\"\"\" " + ) + FF_LOGO_COLORS( + "\033[31m", //red + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoFedora(FFinstance* instance) +static FFlogo* getLogoFedora() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("fedora", "fedora-linux") + FF_LOGO_LINES( "$1 .',;::::;,'. \n" "$1 .';:cccccccccccc:;,. \n" "$1 .;cccccccccccccccccccccc;. \n" @@ -145,14 +191,20 @@ static void initLogoFedora(FFinstance* instance) "$1cccccccc;$2.:odl:.$1;cccccccccccccc:,. \n" "$1ccccccccccccccccccccccccccccc:'. \n" "$1:ccccccccccccccccccccccc:;,.. \n" - "$1 ':cccccccccccccccc::;,. "; - instance->config.logo.colors[0] = "\033[34m"; //blue - instance->config.logo.colors[1] = "\033[37m"; //white + "$1 ':cccccccccccccccc::;,. " + ) + FF_LOGO_COLORS( + "\033[34m", //blue + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoFedoraOld(FFinstance* instance) +static FFlogo* getLogoFedoraOld() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("fedora_old", "fedora-old", "fedora-linux-old", "fedora-linux_old") + FF_LOGO_LINES( "$1 /:-------------:\\ \n" "$1 :-------------------:: \n" "$1 :-----------$2/shhOHbmp$1---:\\ \n" @@ -169,14 +221,20 @@ static void initLogoFedoraOld(FFinstance* instance) "$1:--$2 :dMNdhhdNMMNo$1------------; \n" "$1:---$2:sdNMMMMNds:$1------------: \n" "$1:------$2:://:$1-------------:: \n" - "$1:---------------------:// "; - instance->config.logo.colors[0] = "\033[34m"; //blue - instance->config.logo.colors[1] = "\033[37m"; //white + "$1:---------------------:// " + ) + FF_LOGO_COLORS( + "\033[34m", //blue + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoGaruda(FFinstance* instance) +static FFlogo* getLogoGaruda() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("garuda", "garuda-linux") + FF_LOGO_LINES( "$1 .%;888:8898898: \n" "$1 x;XxXB%89b8:b8%b88: \n" "$1 .8Xxd 8X:. \n" @@ -194,13 +252,19 @@ static void initLogoGaruda(FFinstance* instance) "$1 dxx8o .@@;. \n" "$1 dx88 .t@x. \n" "$1 d:SS@8ba89aa67a853Sxxad. \n" - "$1 .d988999889889899dd. "; - instance->config.logo.colors[0] = "\033[31m"; //red + "$1 .d988999889889899dd. " + ) + FF_LOGO_COLORS( + "\033[31m" //red + ) + FF_LOGO_RETURN } -static void initLogoGentoo(FFinstance* instance) +static FFlogo* getLogoGentoo() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("gentoo", "gentoo-linux") + FF_LOGO_LINES( "$1 -/oyddmdhs+:. \n" "$1 -o$2dNMMMMMMMMNNmhy+$1-` \n" "$1 -y$2NMMMMMMMMMMMNNNmmdhy$1+- \n" @@ -218,14 +282,20 @@ static void initLogoGentoo(FFinstance* instance) "$1yM$2MNNNNNNNmmmmmNNMmhs+/$1-` \n" "$1/h$2MMNNNNNNNNMNdhs++/$1-` \n" "$1`/$2ohdmmddhys+++/:$1.` \n" - "$1 `-//////:--. "; - instance->config.logo.colors[0] = "\033[35m"; //magenta - instance->config.logo.colors[1] = "\033[37m"; //white + "$1 `-//////:--. " + ) + FF_LOGO_COLORS( + "\033[35m", //magenta + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoManjaro(FFinstance* instance) +static FFlogo* getLogoManjaro() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("manjaro", "manjaro-linux") + FF_LOGO_LINES( "$1██████████████████ ████████\n" "$1██████████████████ ████████\n" "$1██████████████████ ████████\n" @@ -239,13 +309,19 @@ static void initLogoManjaro(FFinstance* instance) "$1████████ ████████ ████████\n" "$1████████ ████████ ████████\n" "$1████████ ████████ ████████\n" - "$1████████ ████████ ████████"; - instance->config.logo.colors[0] = "\033[32m"; //green + "$1████████ ████████ ████████" + ) + FF_LOGO_COLORS( + "\033[32m" //green + ) + FF_LOGO_RETURN } -static void initLogoMint(FFinstance* instance) +static FFlogo* getLogoMint() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("mint", "mint-linux") + FF_LOGO_LINES( "$2 ...-:::::-... \n" "$2 .-MMMMMMMMMMMMMMM-. \n" "$2 .-MMMM$1`..-:::::::-..`$2MMMM-. \n" @@ -264,14 +340,20 @@ static void initLogoMint(FFinstance* instance) "$2 '-MMMM$1.-MMMMMMMMMMMMMMM-.$2MMMM-' \n" "$2 '.-MMMM$1``--:::::--``$2MMMM-.' \n" "$2 '-MMMMMMMMMMMMM-' \n" - "$2 ``-:::::-`` "; - instance->config.logo.colors[0] = "\033[32m"; //green - instance->config.logo.colors[1] = "\033[37m"; //white + "$2 ``-:::::-`` " + ) + FF_LOGO_COLORS( + "\033[32m", //green + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoPop(FFinstance* instance) +static FFlogo* getLogoPop() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("pop", "pop-linux") + FF_LOGO_LINES( "$1 ///////////// \n" "$1 ///////////////////// \n" "$1 ///////$2*767$1//////////////// \n" @@ -291,14 +373,20 @@ static void initLogoPop(FFinstance* instance) "$1 /////$2767676767676767676767$1///// \n" "$1 /////////////////////////// \n" "$1 ///////////////////// \n" - "$1 ///////////// "; - instance->config.logo.colors[0] = "\033[36m"; //cyan - instance->config.logo.colors[1] = "\033[37m"; //white + "$1 ///////////// " + ) + FF_LOGO_COLORS( + "\033[36m", //cyan + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoUbuntu(FFinstance* instance) +static FFlogo* getLogoUbuntu() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("ubuntu", "ubuntu-linux") + FF_LOGO_LINES( "$1 .-/+oossssoo+/-. \n" "$1 `:+ssssssssssssssssss+:` \n" "$1 -+ssssssssssssssssssyyssss+- \n" @@ -318,14 +406,20 @@ static void initLogoUbuntu(FFinstance* instance) "$1 .ossssssssssssssssss$2dMMMNy$1sssso. \n" "$1 -+sssssssssssssssss$2yyy$1ssss+- \n" "$1 `:+ssssssssssssssssss+:` \n" - "$1 .-/+oossssoo+/-. "; - instance->config.logo.colors[0] = "\033[31m"; //red - instance->config.logo.colors[1] = "\033[37m"; //white + "$1 .-/+oossssoo+/-. " + ) + FF_LOGO_COLORS( + "\033[31m", //red + "\033[37m" //white + ) + FF_LOGO_RETURN } -static void initLogoVoid(FFinstance* instance) +static FFlogo* getLogoVoid() { - instance->config.logo.lines = + FF_LOGO_INIT + FF_LOGO_NAMES("void", "void-linux") + FF_LOGO_LINES( "$1 __.;=====;.__ \n" "$1 _.=+==++=++=+=+===;. \n" "$1 -=+++=+===+=+=+++++=_ \n" @@ -343,58 +437,74 @@ static void initLogoVoid(FFinstance* instance) "$1 -Invnvvnsi..___..=sv=. ` \n" "$1 +Invnvnvnnnnnnnnvvnn;. \n" "$1 ~|Invnvnvvnvvvnnv}+` \n" - "$1 -~|{*l}*|~ "; - instance->config.logo.colors[0] = "\033[32m"; //green - instance->config.logo.colors[1] = "\033[30m"; //black + "$1 -~|{*l}*|~ " + ) + FF_LOGO_COLORS( + "\033[32m", //green + "\033[30m" //black + ) + FF_LOGO_RETURN } -static bool loadLogoSet(FFinstance* instance, const char* logo) +typedef FFlogo*(*getLogoMethod)(); + +static getLogoMethod* getLogoMethods() { - if(instance->config.logo.freeable) - free(instance->config.logo.lines); + static getLogoMethod logoMethods[] = { + getLogoNone, + getLogoUnknown, + getLogoArch, + getLogoArtix, + getLogoCelOS, + getLogoDebian, + getLogoFedora, + getLogoFedoraOld, + getLogoGaruda, + getLogoGentoo, + getLogoManjaro, + getLogoMint, + getLogoPop, + getLogoUbuntu, + getLogoVoid, + NULL + }; - instance->config.logo.freeable = false; - instance->config.logo.allLinesSameLength = true; + return logoMethods; +} - if(logo == NULL || *logo == '\0') - return false; - else if(strcasecmp(logo, "none") == 0) +static bool logoHasName(FFlogo* logo, const char* name) +{ + const char** logoName = logo->names; + + while(*logoName != NULL) { - instance->config.logo.lines = ""; - instance->config.logoKeySpacing = 0; //This is wanted in most cases, so just set it. None logo is set in src/common/init.c - } - else if(strcasecmp(logo, "unknown") == 0) - initLogoUnknown(instance); - else if(strcasecmp(logo, "arch") == 0) - initLogoArch(instance); - else if(strcasecmp(logo, "artix") == 0) - initLogoArtix(instance); - else if(strcasecmp(logo, "celos") == 0) - initLogoCelOS(instance); - else if(strcasecmp(logo, "debian") == 0) - initLogoDebian(instance); - else if(strcasecmp(logo, "fedora") == 0) - initLogoFedora(instance); - else if(strcasecmp(logo, "fedora_old") == 0) - initLogoFedoraOld(instance); - else if(strcasecmp(logo, "garuda") == 0) - initLogoGaruda(instance); - else if(strcasecmp(logo, "gentoo") == 0) - initLogoGentoo(instance); - else if(strcasecmp(logo, "manjaro") == 0) - initLogoManjaro(instance); - else if(strcasecmp(logo, "mint") == 0) - initLogoMint(instance); - else if(strcasecmp(logo, "pop") == 0 || strcasecmp(logo, "pop_os") == 0) - initLogoPop(instance); - else if(strcasecmp(logo, "ubuntu") == 0) - initLogoUbuntu(instance); - else if(strcasecmp(logo, "void") == 0) - initLogoVoid(instance); - else - return false; + if(strcasecmp(*logoName, name) == 0) + return true; - return true; + ++logoName; + } + + return false; +} + +static bool loadLogoSet(FFinstance* instance, const char* name) +{ + getLogoMethod* logoMethod = getLogoMethods(); + + while(*logoMethod != NULL) + { + FFlogo* logo = (*logoMethod)(); + if(logoHasName(logo, name)) + { + instance->config.logo = logo; + instance->config.logoIsFromUserFile = false; + return true; + } + + ++logoMethod; + } + + return false; } void ffLoadLogoSet(FFinstance* instance, const char* logo) @@ -410,18 +520,18 @@ void ffLoadLogoSet(FFinstance* instance, const char* logo) ffStrbufDestroy(&logoChars); if(instance->config.showErrors) printf(FASTFETCH_TEXT_MODIFIER_ERROR"Error: unknown logo / logo file not found: %s"FASTFETCH_TEXT_MODIFIER_RESET"\n", logo); - initLogoUnknown(instance); + instance->config.logo = getLogoUnknown(); return; } - instance->config.logo.allLinesSameLength = false; - instance->config.logo.freeable = true; - instance->config.logo.lines = logoChars.chars; + instance->config.logoIsFromUserFile = true; + instance->config.logo->colors = getLogoNone()->colors; + instance->config.logo->lines = logoChars.chars; } static bool loadLogoSetWithVersion(FFinstance* instance, const FFstrbuf* versionID, const FFstrbuf* name) { - bool isFedora = ffStrbufIgnCaseCompS(name, "fedora") == 0; + bool isFedora = logoHasName(getLogoFedora(), name->chars); if(versionID->length == 0 || ( !isFedora @@ -452,7 +562,7 @@ void ffLoadLogo(FFinstance* instance) !loadLogoSetWithVersion(instance, &result->versionID, &result->id) && !loadLogoSetWithVersion(instance, &result->versionID, &result->systemName) && !loadLogoSetWithVersion(instance, &result->versionID, &result->idLike) - ) initLogoUnknown(instance); + ) instance->config.logo = getLogoUnknown(); } static uint32_t strLengthUTF8(const char* str, uint32_t bytesLength) @@ -475,47 +585,57 @@ static uint32_t strLengthUTF8(const char* str, uint32_t bytesLength) return length; } +#define LOGO_LINE_PRINT_CHAR(c, cut) \ + if(cut == 0) \ + putchar(c); \ + else \ + --cut; + void ffPrintLogoLine(FFinstance* instance) { + //If offset x is positive, print it as whitespaces left from the logo for(int16_t i = 0; i < instance->config.offsetx; i++) putchar(' '); - if(*instance->config.logo.lines == '\0') + //If we have more informations than lines in the logo, print whitespaces. + //We can return after this, since logoWidth includes logoKeySpacing. + if(*instance->config.logo->lines == '\0') { for(uint32_t i = 0; i < instance->state.logoWidth; ++i) putchar(' '); return; } - if(*instance->config.logo.lines == '\n') - { - ++instance->config.logo.lines; - return; - } - - const char* start = instance->config.logo.lines; + //Save the start of the line and the length of color placeholders, so we can calculate the length of the line at the end + const char* start = instance->config.logo->lines; uint32_t colorPlaceholdersLength = 0; + + //If offset x is negative, we will cut the logo. Save the totol amount to cut, and the currently cut amount uint32_t cutValue = instance->config.offsetx < 0 ? (uint32_t) (instance->config.offsetx * -1) : 0; uint32_t cut = cutValue; + //Logo is always bold fputs(FASTFETCH_TEXT_MODIFIER_BOLT, stdout); - while(*instance->config.logo.lines != '\n' && *instance->config.logo.lines != '\0') + while(*instance->config.logo->lines != '\n' && *instance->config.logo->lines != '\0') { - char current = *instance->config.logo.lines; - ++instance->config.logo.lines; + //Get the current char + char current = *instance->config.logo->lines; + ++instance->config.logo->lines; - if(current != '$') + //Not a color placeholder, just print it. User files don't support colors this way. + if(current != '$' || instance->config.logoIsFromUserFile) { - if(cut > 0) --cut; - else putchar(current); + LOGO_LINE_PRINT_CHAR(current, cut); continue; } - current = *instance->config.logo.lines; - ++instance->config.logo.lines; + //Skip the dollar sign + current = *instance->config.logo->lines; + ++instance->config.logo->lines; + //We have a dollar sign at the end of the line. Just print it. if(current == '\n' || current == '\0') { if(cut == 0) @@ -523,61 +643,60 @@ void ffPrintLogoLine(FFinstance* instance) break; } + //We have two dollar signs. Print one. if(current == '$') { ++colorPlaceholdersLength; - if(cut > 0) --cut; - else putchar('$'); + LOGO_LINE_PRINT_CHAR('$', cut); continue; } + //Map the number to an array index, so that '1' -> 0, '2' -> 1, etc. int index = ((int) current) - 49; + //Invalid index, just print the $ and the following char if(index < 0 || index > 9) { - if(cut > 0) --cut; - else putchar('$'); - - if(cut > 0) --cut; - else putchar(current); - + LOGO_LINE_PRINT_CHAR('$', cut); + LOGO_LINE_PRINT_CHAR(current, cut); continue; } + //Index can maximal be 9, so we have exactly two chars for the color colorPlaceholdersLength += 2; - if(!instance->config.colorLogo) - continue; - - fputs(instance->config.logo.colors[index], stdout); + //Print the color, if color support is on. + if(instance->config.colorLogo) + fputs(instance->config.logo->colors[index], stdout); } + //Reset out bold logo fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout); + //Print the whitespaces between logo and keys. If cut is left, substract it from the spacing. Never go below a spacing of 0. const uint32_t logoKeySpacing = cut > instance->config.logoKeySpacing ? 0 : instance->config.logoKeySpacing - cut; for(uint32_t i = 0; i < logoKeySpacing; ++i) putchar(' '); - if(instance->state.logoWidth == 0 || !instance->config.logo.allLinesSameLength) + //If we haven't yet calculated the length of the line, do it now + if(instance->state.logoWidth == 0) { - uint32_t lineLength = strLengthUTF8(start, (uint32_t) (instance->config.logo.lines - start)) - colorPlaceholdersLength + instance->config.logoKeySpacing; + instance->state.logoWidth = strLengthUTF8(start, (uint32_t) (instance->config.logo->lines - start)) - colorPlaceholdersLength + instance->config.logoKeySpacing; - if(cutValue > lineLength) - lineLength = 0; + if(cutValue > instance->state.logoWidth) + instance->state.logoWidth = 0; else - lineLength -= cutValue; - - if(instance->state.logoWidth < lineLength) - instance->state.logoWidth = lineLength; + instance->state.logoWidth -= cutValue; } - if(*instance->config.logo.lines == '\n') - ++instance->config.logo.lines; + //If we just finished a line and not the entire logo, skip the newline char + if(*instance->config.logo->lines == '\n') + ++instance->config.logo->lines; } void ffPrintRemainingLogo(FFinstance* instance) { - while(*instance->config.logo.lines != '\0') + while(*instance->config.logo->lines != '\0') { ffPrintLogoLine(instance); putchar('\n'); @@ -588,26 +707,38 @@ void ffPrintRemainingLogo(FFinstance* instance) void ffPrintLogos(FFinstance* instance) { - #define FF_LOGO_PRINT(name, loadFunction) \ - loadFunction(instance); \ - printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s" #name FASTFETCH_TEXT_MODIFIER_RESET":\n", instance->config.colorLogo ? instance->config.logo.colors[0] : ""); \ - ffPrintRemainingLogo(instance); \ + getLogoMethod* methods = getLogoMethods(); + + while(*methods != NULL) + { + instance->config.logo = (*methods)(); + printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET":\n", instance->config.colorLogo ? instance->config.logo->colors[0] : "", instance->config.logo->names[0]); + ffPrintRemainingLogo(instance); + putchar('\n'); + ++methods; + } +} + +void ffListLogos() +{ + getLogoMethod* methods = getLogoMethods(); + + while(*methods != NULL) + { + FFlogo* logo = (*methods)(); + + const char** names = logo->names; + + while(*names != NULL) + { + printf("\"%s\" ", *names); + ++names; + } + putchar('\n'); - FF_LOGO_PRINT(unknown, initLogoUnknown) - FF_LOGO_PRINT(arch, initLogoArch) - FF_LOGO_PRINT(artix, initLogoArtix) - FF_LOGO_PRINT(celos, initLogoCelOS) - FF_LOGO_PRINT(debian, initLogoDebian) - FF_LOGO_PRINT(fedora, initLogoFedora) - FF_LOGO_PRINT(fedora_old, initLogoFedoraOld) - FF_LOGO_PRINT(garuda, initLogoGaruda) - FF_LOGO_PRINT(gentoo, initLogoGentoo) - FF_LOGO_PRINT(manjaro, initLogoManjaro) - FF_LOGO_PRINT(mint, initLogoMint) - FF_LOGO_PRINT(pop, initLogoPop) - FF_LOGO_PRINT(ubuntu, initLogoUbuntu) - FF_LOGO_PRINT(void, initLogoVoid) + ++methods; + } } #endif diff --git a/src/data/logos.txt b/src/data/logos.txt deleted file mode 100644 index 751d6881a..000000000 --- a/src/data/logos.txt +++ /dev/null @@ -1,15 +0,0 @@ -none -unknown -arch -artix -celos -debian -fedora -fedora_old -garuda -gentoo -manjaro -mint -pop -ubuntu -void diff --git a/src/data/logos/arch.fflogo b/src/data/logos/arch.fflogo deleted file mode 100644 index 926011e8c..000000000 --- a/src/data/logos/arch.fflogo +++ /dev/null @@ -1,32 +0,0 @@ -names { - arch - archlinux - arch-linux -} -prettyName { - Arch Linux -} -chars { - $1 -` - $1 .o+` - $1 `ooo/ - $1 `+oooo: - $1 `+oooooo: - $1 -+oooooo+: - $1 `/:-:++oooo+: - $1 `/++++/+++++++: - $1 `/++++++++++++++: - $1 `/+++ooooooooooooo/` - $1 ./ooosssso++osssssso+` - $1 .oossssso-````/ossssss+` - $1 -osssssso. :ssssssso. - $1 :osssssss/ osssso+++. - $1 /ossssssss/ +ssssooo/- - $1 `/ossssso+/:- -:/+osssso+- - $1 `+sso+:-` `.-/+oso: - $1`++:. `-/+/ - $1.` `/ -} -colors { - 36 -} diff --git a/src/data/logos/arch.json b/src/data/logos/arch.json deleted file mode 100644 index 21aa417e6..000000000 --- a/src/data/logos/arch.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "names": [ - "arch", - "archlinux", - "arch-linux" - ], - "prettyName": "Arch", - "chars": [ - "$1 -` ", - "$1 .o+` ", - "$1 `ooo/ ", - "$1 `+oooo: ", - "$1 `+oooooo: ", - "$1 -+oooooo+: ", - "$1 `/:-:++oooo+: ", - "$1 `/++++/+++++++: ", - "$1 `/++++++++++++++: ", - "$1 `/+++ooooooooooooo/` ", - "$1 ./ooosssso++osssssso+` ", - "$1 .oossssso-````/ossssss+` ", - "$1 -osssssso. :ssssssso. ", - "$1 :osssssss/ osssso+++. ", - "$1 /ossssssss/ +ssssooo/- ", - "$1 `/ossssso+/:- -:/+osssso+- ", - "$1 `+sso+:-` `.-/+oso: ", - "$1`++:. `-/+/", - "$1.` `/" - ], - "colors" : [ - "36" - ] -} diff --git a/src/fastfetch.c b/src/fastfetch.c index 50e1650dd..eb4d2ab7b 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -512,7 +512,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con } else if(strcasecmp(key, "--list-logos") == 0) { - fputs(FASTFETCH_DATATEXT_LOGOS, stdout); + ffListLogos(); exit(0); } else if(strcasecmp(key, "--print-logos") == 0) @@ -816,15 +816,11 @@ static void parseArguments(FFinstance* instance, FFdata* data, int argc, const c static void applyData(FFinstance* instance, FFdata* data) { - //We must do this after parsing all options because of color options - if(data->logoName.length == 0) - ffLoadLogo(instance); - else + if(data->logoName.length > 0) ffLoadLogoSet(instance, data->logoName.chars); - //This must be done after loading the logo if(instance->config.color.length == 0) - ffStrbufSetS(&instance->config.color, instance->config.logo.colors[0]); + ffStrbufSetS(&instance->config.color, instance->config.logo->colors[0]); } static void parseStructureCommand(FFinstance* instance, FFdata* data, const char* line) diff --git a/src/fastfetch.h b/src/fastfetch.h index 022212007..c697f6e53 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -25,15 +25,17 @@ static inline void ffUnused(int dummy, ...) { (void) dummy; } #define FASTFETCH_TEXT_MODIFIER_ERROR "\033[1;31m" #define FASTFETCH_TEXT_MODIFIER_RESET "\033[0m" +typedef struct FFlogo +{ + const char** names; //Null terminated + char* lines; + const char** colors; // colors[0] is used as key color +} FFlogo; + typedef struct FFconfig { - struct - { - char* lines; - const char* colors[9]; // colors[0] is used as key color - bool freeable; - bool allLinesSameLength; // a performance optimization - } logo; + FFlogo* logo; + bool logoIsFromUserFile; uint16_t logoKeySpacing; FFstrbuf separator; @@ -312,6 +314,7 @@ void ffPrintRemainingLogo(FFinstance* instance); #ifndef FASTFETCH_BUILD_FLASHFATCH void ffPrintLogos(FFinstance* instance); + void ffListLogos(); #endif //common/format.c diff --git a/src/fastfetch_config.h.in b/src/fastfetch_config.h.in index 583a080b2..657f14a8d 100644 --- a/src/fastfetch_config.h.in +++ b/src/fastfetch_config.h.in @@ -7,13 +7,9 @@ #define FASTFETCH_DATATEXT_STRUCTURE "@DATATEXT_STRUCTURE@" #define FASTFETCH_DATATEXT_CONFIG "@DATATEXT_CONFIG@" //Requires FASTFETCH_PROJECT_VERSION and FASTFETCH_DATATEXT_STRUCTURE to be set #define FASTFETCH_DATATEXT_MODULES "@DATATEXT_MODULES@" -#define FASTFETCH_DATATEXT_LOGOS "@DATATEXT_LOGOS@" #define FASTFETCH_DATATEXT_HELP "@DATATEXT_HELP@" #define FASTFETCH_DATATEXT_HELP_COLOR "@DATATEXT_HELP_COLOR@" #define FASTFETCH_DATATEXT_HELP_FORMAT "@DATATEXT_HELP_FORMAT@" #define FASTFETCH_DATATEXT_HELP_CONFIG "@DATATEXT_HELP_CONFIG@" -//Needed for flashfetch logo -#define FASTFETCH_BUILD_DISTRIBUTION_ID "@BUILD_DISTRIBUTION_ID@" - #endif // FASTFETCH_INDLUDED_fastfetch_config_h_in diff --git a/src/flashfetch.c b/src/flashfetch.c index ff4e16cc7..a89726a6f 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -8,9 +8,8 @@ int main(int argc, char** argv) FFinstance instance; ffInitInstance(&instance); //This also applys default configuration to instance.config - //Configuration - ffLoadLogoSet(&instance, FASTFETCH_BUILD_DISTRIBUTION_ID); - ffStrbufSetS(&instance.config.color, instance.config.logo.colors[0]); //Use the primary color of the logo as key color + //ffLoadLogoSet(&instance, "my custom logo"); + ffStrbufSetS(&instance.config.color, instance.config.logo->colors[0]); //Use the primary color of the logo as key color //Multithreading --> better performance ffStartDetectionThreads(&instance);