Merge pull request #57 from alborrajo/master

Custom logos read from files
This commit is contained in:
Linus Dierheimer
2021-05-28 13:48:03 +02:00
committed by GitHub
4 changed files with 98 additions and 23 deletions
+1
View File
@@ -187,6 +187,7 @@ __fastfetch_completion()
"--lib-XFConf"
"--battery-dir"
"--load-config"
"--logo-file"
)
local FF_OPTIONS_LOGO=(
+87 -22
View File
@@ -1,6 +1,26 @@
#include "fastfetch.h"
#include <string.h>
#include <unistd.h>
// http://www.zedwood.com/article/cpp-utf8-strlen-function
// Code snippet licensed under Creative Commons CC-By-SA 3.0
static int utf8_strlen(const char* str)
{
int c,i,ix,q;
for (q=0, i=0, ix=strlen(str); i < ix; i++, q++)
{
c = (unsigned char) str[i];
if (c>=0 && c<=127) i+=0;
else if ((c & 0xE0) == 0xC0) i+=1;
else if ((c & 0xF0) == 0xE0) i+=2;
else if ((c & 0xF8) == 0xF0) i+=3;
//else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
//else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
else return 0;//invalid utf8
}
return q;
}
static void loadUnknownLogo(FFlogo* logo)
{
@@ -236,9 +256,9 @@ static void loadGarudaLogo(FFlogo* logo, bool doColor)
sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s ,tSXX° .bbbbbbbbbbbbbbbbbbbB8x@;"FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s .SXxx bBBBBBBBBBBBBBBBBBBBbSBX8;"FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s ,888S pd!"FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s8X88/ qp"FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s8X88/ qp"FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%s8X88/ "FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%sGBB. "FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%sGBB. "FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s x%%88 d888@8@X@X@X88X@@XX@@X@8@X. "FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s dxXd dB8b8b8B8B08bB88b998888b88x. "FASTFETCH_TEXT_MODIFIER_RESET, color);
sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s dxx8o .@@;. "FASTFETCH_TEXT_MODIFIER_RESET, color);
@@ -249,29 +269,74 @@ static void loadGarudaLogo(FFlogo* logo, bool doColor)
sprintf(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"%s "FASTFETCH_TEXT_MODIFIER_RESET, color);
}
static void loadLogoFromFile(FFlogo* logo, bool doColor, FFstrbuf* configColor, const char* pathToFile)
{
const char* color = doColor ? configColor->chars : "";
strcpy(logo->color, color);
FILE* fp = fopen(pathToFile, "r");
char* buff = NULL;
size_t buffLen = 0;
int lineBytes;
int lineLength;
int logoWidth = 0, logoHeight = 0;
while( (lineBytes=getline(&buff, &buffLen, fp)) != -1 ) {
// Remove trailing newline
if(buff[lineBytes-1] == '\n')
buff[lineBytes-1] = '\0';
sprintf(logo->chars[logoHeight++], FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET, color, buff);
lineLength = utf8_strlen(buff);
logoWidth = lineLength > logoWidth
? lineLength
: logoWidth;
}
// Clean up
fclose(fp);
if(buff != NULL)
free(buff);
logo->width = logoWidth;
logo->height = logoHeight;
}
void ffLoadLogoSet(FFconfig* config, const char* logo)
{
if(strcasecmp(logo, "none") == 0)
{
loadNoneLogo(&config->logo);
config->logo_spacing = 0; //This is wanted in most cases, so just set it
if(config->readLogoFromFile) {
ffLoadLogoFromFile(config, logo);
} else {
if(strcasecmp(logo, "none") == 0)
{
loadNoneLogo(&config->logo);
config->logo_spacing = 0; //This is wanted in most cases, so just set it
}
else if(strcasecmp(logo, "arch") == 0)
loadArchLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "artix") == 0)
loadArtixLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "ubuntu") == 0)
loadUbuntuLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "debian") == 0)
loadDebianLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "manjaro") == 0)
loadManjaroLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "void") == 0)
loadVoidLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "garuda") == 0)
loadGarudaLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "unknown") == 0)
loadUnknownLogo(&config->logo);
else
ffLoadLogoFromFile(config, logo);
}
else if(strcasecmp(logo, "arch") == 0)
loadArchLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "artix") == 0)
loadArtixLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "ubuntu") == 0)
loadUbuntuLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "debian") == 0)
loadDebianLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "manjaro") == 0)
loadManjaroLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "void") == 0)
loadVoidLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "garuda") == 0)
loadGarudaLogo(&config->logo, config->colorLogo);
else if(strcasecmp(logo, "unknown") == 0)
loadUnknownLogo(&config->logo);
}
void ffLoadLogoFromFile(FFconfig* config, const char* logo) {
if(access(logo, R_OK) == 0)
loadLogoFromFile(&config->logo, config->colorLogo, &config->color, logo);
else
{
if(config->showErrors)
+9 -1
View File
@@ -62,6 +62,7 @@ static inline void printHelp()
"\n"
"Logo options:\n"
" -l <name>, --logo <name>: sets the shown logo. Also changes the main color accordingly\n"
" --logo-file <path>: sets the path of the file to use as the logo\n"
" --color-logo <?value>: if set to false, the logo will be black / white\n"
"\n"
"Format options: Provide the format string for custom output. Use fastfetch --help *-format for specific help.\n"
@@ -789,8 +790,15 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
instance->config.allowSlowOperations = optionParseBoolean(value);
else if(strcasecmp(key, "--structure") == 0)
optionParseString(key, value, &data->structure);
else if(strcasecmp(key, "-l") == 0 || strcasecmp(key, "--logo") == 0)
else if(strcasecmp(key, "--logo-file") == 0)
{
optionParseString(key, value, &data->logoName);
instance->config.readLogoFromFile = true;
}
else if(strcasecmp(key, "-l") == 0 || strcasecmp(key, "--logo") == 0) {
optionParseString(key, value, &data->logoName);
instance->config.readLogoFromFile = false;
}
else if(strcasecmp(key, "-s") == 0 || strcasecmp(key, "--separator") == 0)
optionParseString(key, value, &instance->config.separator);
else if(strcasecmp(key, "-c") == 0 || strcasecmp(key, "--color") == 0)
+1
View File
@@ -41,6 +41,7 @@ typedef struct FFconfig
int16_t offsetx;
FFstrbuf color;
uint32_t titleLength;
bool readLogoFromFile;
bool colorLogo;
bool showErrors;
bool recache;