Logo revolution

This commit is contained in:
Linus Dierheimer
2021-11-09 15:14:25 +01:00
parent e9db9ac87a
commit 214540e7ef
10 changed files with 315 additions and 291 deletions
-18
View File
@@ -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)
+2 -6
View File
@@ -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);
+298 -167
View File
@@ -4,9 +4,17 @@
#include <string.h>
#include <unistd.h>
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
-15
View File
@@ -1,15 +0,0 @@
none
unknown
arch
artix
celos
debian
fedora
fedora_old
garuda
gentoo
manjaro
mint
pop
ubuntu
void
-32
View File
@@ -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
}
-32
View File
@@ -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"
]
}
+3 -7
View File
@@ -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)
+10 -7
View File
@@ -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
-4
View File
@@ -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
+2 -3
View File
@@ -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);