diff --git a/CMakeLists.txt b/CMakeLists.txt index 04164e2b8..d1fa527ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ set(PROJECT_VERSION "r${GIT_REV_LIST}.${GIT_REV_PARSE}") include (${CMAKE_ROOT}/Modules/FindX11.cmake) -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -march=native -O3 -pipe -fno-plt") # for testing +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -march=native -O3 -pipe -fno-plt") # for testing configure_file(src/fastfetch_config.h.in fastfetch_config.h) include_directories(${PROJECT_BINARY_DIR}) diff --git a/src/fastfetch.c b/src/fastfetch.c index 3e9e28214..9576acb6b 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -186,6 +186,9 @@ static void printHelp() " -l , --logo : sets the shown logo. Also changes the main color accordingly\n" " -c , --color : sets the color of the keys. Must be a linux console color code\n" " -s , --seperator : sets the distance between logo and text\n" + " -x , --offsetx : sets the x offset. Can be negative to cut the logo, but no more than logo width.\n" + " --no-color: disables all colors. This MUST be before -l/--logo or --print-logos\n" + " --no-color-logo: disables the coloring of the logo. This MUST be before -l/--logo or --print-logos\n" " -r --recache: dont use cached values and generate new ones\n" " --show-errors: if an error occurs, show it instead of discarding the category\n" " --list-logos: lists the names of available logos and exits\n" @@ -218,19 +221,22 @@ static void printCommandHelp(const char* command) static void initState(FFstate* state) { - ffLoadLogo(state); //also sets color state->current_row = 0; state->passwd = getpwuid(getuid()); uname(&state->utsname); sysinfo(&state->sysinfo); state->logo_seperator = 4; + state->offsetx = 0; state->titleLength = 20; // This is overwritten by ffPrintTitle + state->colorLogo = true; state->showErrors = false; state->recache = false; } static void parseArguments(int argc, char** argv, FFstate* state) { + bool colorText = true; + for(int i = 1; i < argc; i++) { if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) @@ -254,7 +260,7 @@ static void parseArguments(int argc, char** argv, FFstate* state) } else if(strcmp(argv[i], "--print-logos") == 0) { - ffPrintLogos(); + ffPrintLogos(state->colorLogo); exit(0); } else if(strcmp(argv[i], "--show-errors") == 0) @@ -302,16 +308,45 @@ static void parseArguments(int argc, char** argv, FFstate* state) } ++i; } + else if(strcmp(argv[i], "-x") == 0 || strcmp(argv[i], "--offsetx") == 0) + { + if(i == argc -1) + { + printf("Error: usage: %s \n", argv[i]); + exit(46); + } + if(sscanf(argv[i + 1], "%hi", &state->offsetx) != 1) + { + printf("Error: couldn't parse %s to int16_t\n", argv[i + 1]); + exit(47); + } + ++i; + } else if(strcmp(argv[i], "-r") == 0 || strcmp(argv[i], "--recache") == 0) { state->recache = true; } + else if(strcmp(argv[i], "--no-color") == 0) + { + colorText = false; + state->colorLogo = false; + } + else if(strcmp(argv[i], "--no-color-logo") == 0) + { + state->colorLogo = false; + } else { printf("Error: unknown option: %s\n", argv[i]); exit(40); } } + + ffLoadLogo(state); //We need to do this here, because of --no-color + if(colorText) + strcpy(state->color, state->logo.color); + else + state->color[0] = '\0'; } int main(int argc, char** argv) diff --git a/src/fastfetch.h b/src/fastfetch.h index 66c44c0cb..40052f3c9 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -36,8 +36,10 @@ typedef struct FFstate //Configuration stuff FFlogo logo; uint16_t logo_seperator; + int16_t offsetx; char color[32]; uint8_t titleLength; + bool colorLogo; bool showErrors; bool recache; @@ -61,7 +63,7 @@ void ffPrintAndSaveCachedValue(FFstate* state, const char* key, const char* valu void ffLoadLogoSet(FFstate* state, const char* logo); void ffLoadLogo(FFstate* state); void ffListLogos(); -void ffPrintLogos(); +void ffPrintLogos(bool color); void ffPrintBreak(FFstate* state); void ffPrintTitle(FFstate* state); diff --git a/src/logo.c b/src/logo.c index ee669812e..afe485a25 100644 --- a/src/logo.c +++ b/src/logo.c @@ -28,54 +28,55 @@ static void loadUnknownLogo(FFlogo* logo) strcpy(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT" \"\" "FASTFETCH_TEXT_MODIFIER_RESET); } -static void loadArchLogo(FFlogo* logo) +static void loadNoneLogo(FFlogo* logo) +{ + logo->width = 0; + logo->height = 0; + strcpy(logo->name, "none"); + strcpy(logo->color, ""); +} + +static void loadArchLogo(FFlogo* logo, bool doColor) { logo->width = 37; logo->height = 20; strcpy(logo->name, "arch"); + + const char* color = doColor ? "\033[36m" : ""; strcpy(logo->color, "\033[36m"); - strcpy(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m -` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m -` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m .o+` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `ooo/ "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `+oooo: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `+oooooo: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m -+oooooo+: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `/:-:++oooo+: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `/++++/+++++++: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `/++++++++++++++: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `/+++ooooooooooooo/` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m ./ooosssso++osssssso+` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m .oossssso-````/ossssss+` "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m -osssssso. :ssssssso. "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m :osssssss/ osssso+++. "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m /ossssssss/ +ssssooo/- "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `/ossssso+/:- -:/+osssso+- "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m `+sso+:-` `.-/+oso: "FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[18], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m`++:. `-/+/"FASTFETCH_TEXT_MODIFIER_RESET); - strcpy(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"\033[36m.` `/"FASTFETCH_TEXT_MODIFIER_RESET); -} -static FFlogo* getLogos(uint8_t* size) -{ - #define FASTFETCH_LOGO_AMOUNT 2 - - *size = FASTFETCH_LOGO_AMOUNT; - static FFlogo logos[FASTFETCH_LOGO_AMOUNT]; - - #undef FASTFETCH_LOGO_AMOUNT - - loadUnknownLogo(&logos[0]); - loadArchLogo(&logos[1]); - - return logos; + sprintf(logo->chars[0], FASTFETCH_TEXT_MODIFIER_BOLT"%s -` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[1], FASTFETCH_TEXT_MODIFIER_BOLT"%s -` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[2], FASTFETCH_TEXT_MODIFIER_BOLT"%s .o+` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[3], FASTFETCH_TEXT_MODIFIER_BOLT"%s `ooo/ "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[4], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+oooo: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[5], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+oooooo: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[6], FASTFETCH_TEXT_MODIFIER_BOLT"%s -+oooooo+: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[7], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/:-:++oooo+: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[8], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/++++/+++++++: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[9], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/++++++++++++++: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[10], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/+++ooooooooooooo/` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[11], FASTFETCH_TEXT_MODIFIER_BOLT"%s ./ooosssso++osssssso+` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[12], FASTFETCH_TEXT_MODIFIER_BOLT"%s .oossssso-````/ossssss+` "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[13], FASTFETCH_TEXT_MODIFIER_BOLT"%s -osssssso. :ssssssso. "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[14], FASTFETCH_TEXT_MODIFIER_BOLT"%s :osssssss/ osssso+++. "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[15], FASTFETCH_TEXT_MODIFIER_BOLT"%s /ossssssss/ +ssssooo/- "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[16], FASTFETCH_TEXT_MODIFIER_BOLT"%s `/ossssso+/:- -:/+osssso+- "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[17], FASTFETCH_TEXT_MODIFIER_BOLT"%s `+sso+:-` `.-/+oso: "FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[18], FASTFETCH_TEXT_MODIFIER_BOLT"%s`++:. `-/+/"FASTFETCH_TEXT_MODIFIER_RESET, color); + sprintf(logo->chars[19], FASTFETCH_TEXT_MODIFIER_BOLT"%s.` `/"FASTFETCH_TEXT_MODIFIER_RESET, color); } void ffLoadLogoSet(FFstate* state, const char* logo) { - if(strcmp(logo, "arch") == 0) + if(strcasecmp(logo, "none") == 0) { - loadArchLogo(&state->logo); + loadNoneLogo(&state->logo); + state->logo_seperator = 0; //This is wanted in most cases, so just set it + } + else if(strcasecmp(logo, "arch") == 0) + { + loadArchLogo(&state->logo, state->colorLogo); } else { @@ -83,8 +84,6 @@ void ffLoadLogoSet(FFstate* state, const char* logo) printf(FASTFETCH_TEXT_MODIFIER_ERROR"Error: unknown logo: %s"FASTFETCH_TEXT_MODIFIER_RESET"\n", logo); loadUnknownLogo(&state->logo); } - - strcpy(state->color, state->logo.color); } void ffLoadLogo(FFstate* state) @@ -105,13 +104,19 @@ void ffLoadLogo(FFstate* state) void ffPrintLogoLine(FFstate* state) { + for(int16_t i = 0; i < state->offsetx; i++) + putchar(' '); + + int16_t cut = state->offsetx >= 0 ? 0 : + (state->logo.width > state->offsetx * -1 ? state->offsetx * -1 : state->logo.width); + if(state->current_row < state->logo.height) { - printf(state->logo.chars[state->current_row]); + printf(state->logo.chars[state->current_row] + cut); } else { - for(uint8_t i = 0; i < state->logo.width; i++) + for(uint8_t i = 0; i < state->logo.width - cut; i++) putchar(' '); } @@ -121,23 +126,39 @@ void ffPrintLogoLine(FFstate* state) ++state->current_row; } +static FFlogo* getLogos(uint8_t* size, bool color) +{ + #define FASTFETCH_LOGO_AMOUNT 3 + + *size = FASTFETCH_LOGO_AMOUNT; + static FFlogo logos[FASTFETCH_LOGO_AMOUNT]; + + #undef FASTFETCH_LOGO_AMOUNT + + loadNoneLogo(&logos[0]); + loadUnknownLogo(&logos[1]); + loadArchLogo(&logos[2], color); + + return logos; +} + void ffListLogos() { uint8_t size; - FFlogo* logos = getLogos(&size); + FFlogo* logos = getLogos(&size, false); for(uint8_t i = 0; i < size; i++) puts(logos[i].name); } -void ffPrintLogos() +void ffPrintLogos(bool doColor) { uint8_t size; - FFlogo* logos = getLogos(&size); + FFlogo* logos = getLogos(&size, doColor); for(uint8_t i = 0; i < size; i++) { - printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET":\n", logos[i].color, logos[i].name); + printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET":\n", doColor ? logos[i].color : "", logos[i].name); for(uint8_t k = 0; k < logos[i].height; k++) puts(logos[i].chars[k]); putchar('\n');