From 414c2133020eac3ef5888e68eecfc329aa129cb2 Mon Sep 17 00:00:00 2001 From: PK Date: Fri, 12 Mar 2021 16:18:29 -0600 Subject: [PATCH 01/81] Added Alpine + APK support --- uwufetch.c | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 18776e8..0eee71a 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -83,30 +83,33 @@ int main(int argc, char *argv[]) { } int pkgman() { // this is just a function that returns the total of installed packages - int apt, dnf, emerge, flatpak, nix, pacman, rpm, xbps, total = 0; + int apt, apk, dnf, emerge, flatpak, nix, pacman, rpm, xbps, total = 0; FILE *file[8]; file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); - file[1] = popen("dnf list installed 2> /dev/null | wc -l", "r"); - file[2] = popen("qlist -I 2> /dev/null | wc -l", "r"); - file[3] = popen("flatpak list 2> /dev/null | wc -l", "r"); - file[4] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); - file[5] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); - file[6] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); - file[7] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); + file[1] = popen("apk info 2> /dev/null | wc -l", "r"); + file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); + file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); + file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); + file[5] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); + file[6] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); + file[7] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); + file[8] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); fscanf(file[0], "%d", &apt); - fscanf(file[1], "%d", &dnf); - fscanf(file[2], "%d", &emerge); - fscanf(file[3], "%d", &flatpak); - fscanf(file[4], "%d", &nix); - fscanf(file[5], "%d", &pacman); - fscanf(file[6], "%d", &rpm); - fscanf(file[7], "%d", &xbps); + fscanf(file[1], "%d", &apk); + fscanf(file[2], "%d", &dnf); + fscanf(file[3], "%d", &emerge); + fscanf(file[4], "%d", &flatpak); + fscanf(file[5], "%d", &nix); + fscanf(file[6], "%d", &pacman); + fscanf(file[7], "%d", &rpm); + fscanf(file[8], "%d", &xbps); for (int i = 0; i < 8; i++) fclose(file[i]); #define ADD_PACKAGES(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } ADD_PACKAGES(apt, "(apt)") + ADD_PACKAGES(apk, "(apk)") ADD_PACKAGES(dnf, "(dnf)") ADD_PACKAGES(emerge, "(emerge)") ADD_PACKAGES(flatpak,"(flatpak)") @@ -200,19 +203,26 @@ void list(char* arg) { // prints distribution list " %sDebian/%sUbuntu %sbased:\n" " %sdebian, %slinuxmint, %spopos\n\n" " %sOther/spare distributions:\n" - " %sfedora, %sgentoo, %svoid, android, %sunknown\n\n" + " %salpine, %sfedora, %sgentoo, %svoid, android, %sunknown\n\n" " %sBSD:\n" " freebsd, %sopenbsd\n", arg, BLUE, NORMAL, BLUE, GREEN, // Arch based colors RED, YELLOW, NORMAL, RED, GREEN, BLUE, // Debian based colors - NORMAL, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors + NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors RED, YELLOW); // BSD colors } void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. // linux - if (strcmp(version_name, "arch") == 0) { + + if (strcmp(version_name, "alpine") == 0) { + printf("\033[2E\033[4C%s. .___.\n" + " / \\/ \\ /\n" + " /OwO\\ɛU\\/ __\n" + " / \\ \\__/ \\\n" + "/ \\ \\\n\n\n", BLUE); + } else if (strcmp(version_name, "arch") == 0) { printf( "\033[1E\033[8C%s/\\\n" " / \\\n" " /\\ \\\n" @@ -370,7 +380,8 @@ void uwu_name() { // changes distro name to uwufied(?) name #define STRING_TO_UWU(original, uwufied) if (strcmp(version_name, original) == 0) sprintf(version_name, "%s", uwufied) // linux - STRING_TO_UWU("arch", "Nyarch Linuwu"); + STRING_TO_UWU("alpine", "Nyalpine"); + else STRING_TO_UWU("arch", "Nyarch Linuwu"); else STRING_TO_UWU("artix", "Nyartix Linuwu"); else STRING_TO_UWU("debian", "Debinyan"); else STRING_TO_UWU("fedora", "Fedowa"); From af0f0f3db8fa68bf30938e6606e4ea1ca1880aaa Mon Sep 17 00:00:00 2001 From: PK Date: Fri, 12 Mar 2021 16:27:43 -0600 Subject: [PATCH 02/81] Modified Tux icon --- uwufetch.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 0eee71a..5096458 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -336,13 +336,13 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " /-________-\\ \n\n", YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); } - else printf( "\033[0E\033[4C%s.--.\n" - " |o_o |\n" - " |:_/ |\n" - " // \\ \\\n" - " (| | )\n" - " %s/'\\_ _/`\\\n" - " \\___)=(___/\n\n", WHITE, YELLOW); + else printf( "\033[0E\033[2C%s._.--._.\n" + " \\|>%s_%s< |/\n" + " |%s:_/%s |\n" + " // \\ \\ ?\n" + " (| | ) /\n" + " %s/'\\_ _/`\\%s-\n" + " %s\\___)=(___/\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); } void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. From f9a1c886ea0629b6bc25f023fdd74dceb92bf65b Mon Sep 17 00:00:00 2001 From: PK Date: Fri, 12 Mar 2021 16:29:26 -0600 Subject: [PATCH 03/81] Added Nyalpine listing on README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f842546..af63a0c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A meme system info tool for (almost) all your Linux/Unix-based systems, based on ## Currently supported distros -Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, Pop OwOs, UwUntu, and OwOid; Plus Nyandroid; and FweeBSD, and OwOpenBSD. +Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, Pop OwOs, UwUntu, and OwOid; Plus Nyandroid; FweeBSD, and OwOpenBSD. ## Building and installation From ae2fcf8799404f222730b2d6b879fb59097f12e1 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sat, 13 Mar 2021 08:12:05 +0100 Subject: [PATCH 04/81] Fixed *file array size for package managers. --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 5096458..3061e6f 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -85,7 +85,7 @@ int main(int argc, char *argv[]) { int pkgman() { // this is just a function that returns the total of installed packages int apt, apk, dnf, emerge, flatpak, nix, pacman, rpm, xbps, total = 0; - FILE *file[8]; + FILE *file[9]; file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); file[1] = popen("apk info 2> /dev/null | wc -l", "r"); file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); From a9f7bcf41979e95cbbb78a7d8fc827daa0ceb949 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sat, 13 Mar 2021 21:37:27 +0100 Subject: [PATCH 05/81] Updated makefile for security reasons (special thanks to linuxreviews.org) --- Makefile | 11 +++++------ README.md | 11 ++++++----- uwufetch.c | 16 ++++++++-------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 732d8db..d146bef 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,6 @@ FILES = uwufetch.c FLAGS = -O3 FLAGS_DEBUG = -Wall -Wextra INSTALL_DIR = /usr/bin/ -all: build install build: uwufetch.c gcc $(FLAGS) -o $(NAME) $(FILES) @@ -14,13 +13,13 @@ debug: ./uwufetch install: - sudo cp $(NAME) $(INSTALL_DIR)$(NAME) - ls /usr/lib/uwufetch/ > /dev/null || sudo mkdir /usr/lib/uwufetch/ - sudo cp res/* /usr/lib/uwufetch/ + cp $(NAME) $(INSTALL_DIR)$(NAME) + ls /usr/lib/uwufetch/ 2> /dev/null || mkdir /usr/lib/uwufetch/ + cp res/* /usr/lib/uwufetch/ uninstall: - sudo rm $(INSTALL_DIR)$(NAME) - sudo rm -rf /usr/lib/uwufetch/ + rm $(INSTALL_DIR)$(NAME) + rm -rf /usr/lib/uwufetch/ termux: build cp $(NAME) /data/data/com.termux/files$(INSTALL_DIR)$(NAME) diff --git a/README.md b/README.md index af63a0c..538bfd0 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myan Right now, the package is only available on the AUR: [![uwufetch](https://img.shields.io/aur/version/uwufetch?color=1793d1&label=uwufetch&logo=arch-linux&style=for-the-badge)](https://aur.archlinux.org/packages/uwufetch/) + [![uwufetch-git](https://img.shields.io/aur/version/uwufetch-git?color=1793d1&label=uwufetch-git&logo=arch-linux&style=for-the-badge)](https://aur.archlinux.org/packages/uwufetch-git/) ##### Via source @@ -22,24 +23,24 @@ To install UwUfetch from the source, type these commands in the terminal: ```shell git clone https://github.com/TheDarkBug/uwufetch.git cd uwufetch -make +make build +sudo make install ``` To uninstall: ```shell cd uwufetch -make uninstall +sudo make uninstall ``` ##### Make options: ```shell -make all # builds and installs make build # builds uwueftch make debug # use for debug -make install # installs uwufetch -make uninstall # uninstalls uwufetch +make install # installs uwufetch (needs root permissons) +make uninstall # uninstalls uwufetch (needs root permissons) make termux # build and install for termux make termux_uninstall # uninstall for termux ``` diff --git a/uwufetch.c b/uwufetch.c index 3061e6f..9ffbb00 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -217,11 +217,11 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu // linux if (strcmp(version_name, "alpine") == 0) { - printf("\033[2E\033[4C%s. .___.\n" - " / \\/ \\ /\n" - " /OwO\\ɛU\\/ __\n" - " / \\ \\__/ \\\n" - "/ \\ \\\n\n\n", BLUE); + printf("\033[2E\033[4C%s. .___.\n" + " / \\/ \\ /\n" + " /OwO\\ɛU\\/ __\n" + " / \\ \\__/ \\\n" + "/ \\ \\\n\n\n", BLUE); } else if (strcmp(version_name, "arch") == 0) { printf( "\033[1E\033[8C%s/\\\n" " / \\\n" @@ -289,9 +289,9 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); } else if (strcasecmp(version_name, "popos") == 0) { printf("\033[2E\033[6C%s|\\.-----./|\n" - " |/ \\|\n" - " | > < |\n" - " | %s~ %sP! %s~ %s|\n" + " |/ \\|\n" + " | > < |\n" + " | %s~ %sP! %s~ %s|\n" "_ ---\\ w /\n" " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); } else if (strcmp(version_name, "ubuntu") == 0) { From d5175fc6d931b264c76292a0f9126778e8881eb2 Mon Sep 17 00:00:00 2001 From: PK Date: Sat, 13 Mar 2021 19:52:01 -0600 Subject: [PATCH 06/81] Guix pkgman support --- uwufetch.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 9ffbb00..faedc38 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -83,28 +83,30 @@ int main(int argc, char *argv[]) { } int pkgman() { // this is just a function that returns the total of installed packages - int apt, apk, dnf, emerge, flatpak, nix, pacman, rpm, xbps, total = 0; + int apt, apk, dnf, emerge, flatpak, guix, nix, pacman, rpm, xbps, total = 0; FILE *file[9]; file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); file[1] = popen("apk info 2> /dev/null | wc -l", "r"); file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); - file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); - file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); - file[5] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); - file[6] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); - file[7] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); - file[8] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); + file[3] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); + file[4] = popen("qlist -I 2> /dev/null | wc -l", "r"); + file[5] = popen("flatpak list 2> /dev/null | wc -l", "r"); + file[6] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); + file[7] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); + file[8] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); + file[9] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); fscanf(file[0], "%d", &apt); fscanf(file[1], "%d", &apk); fscanf(file[2], "%d", &dnf); fscanf(file[3], "%d", &emerge); fscanf(file[4], "%d", &flatpak); - fscanf(file[5], "%d", &nix); - fscanf(file[6], "%d", &pacman); - fscanf(file[7], "%d", &rpm); - fscanf(file[8], "%d", &xbps); + fscanf(file[5], "%d", &guix); + fscanf(file[6], "%d", &nix); + fscanf(file[7], "%d", &pacman); + fscanf(file[8], "%d", &rpm); + fscanf(file[9], "%d", &xbps); for (int i = 0; i < 8; i++) fclose(file[i]); #define ADD_PACKAGES(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } @@ -113,6 +115,7 @@ int pkgman() { // this is just a function that returns the total of installed pa ADD_PACKAGES(dnf, "(dnf)") ADD_PACKAGES(emerge, "(emerge)") ADD_PACKAGES(flatpak,"(flatpak)") + ADD_PACKAGES(guix ,"(guix)") ADD_PACKAGES(nix, "(nix)") ADD_PACKAGES(pacman, "(pacman)") ADD_PACKAGES(rpm, "(rpm)") From b0dc3a35cd8b597cf9dccafbc70fda804576b062 Mon Sep 17 00:00:00 2001 From: PK Date: Sat, 13 Mar 2021 20:01:26 -0600 Subject: [PATCH 07/81] FreeBSD icon fix --- uwufetch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index faedc38..986580d 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -321,13 +321,12 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu // BSD else if (strcmp(version_name, "freebsd") == 0) { - printf( "\032[1E\033[3C%s\n" - " /\\,-'''''-,/\\\n" + printf( "\033[2E\033[1C%s/\\,-'''''-,/\\\n" " \\_) (_/\n" " | \\ / |\n" " | O w O |\n" " ; ;\n" - " '-_____-'\n", RED); + " '-_____-'\n\n", RED); } else if (strcmp(version_name, "openbsd") == 0) { printf( "\033[1E\033[3C%s ______ \n" @@ -389,6 +388,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("debian", "Debinyan"); else STRING_TO_UWU("fedora", "Fedowa"); else STRING_TO_UWU("gentoo", "GentOwO"); + else STRING_TO_UWU("guix", "gnUwU gUwUix"); else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); else STRING_TO_UWU("manjaro", "Myanjawo"); else STRING_TO_UWU("manjaro-arm", "Myanjawo AWM"); From cd86f7a578e50dadd39c5c685bba6aa4e47cda78 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 12:41:56 +0100 Subject: [PATCH 08/81] Fix for void in #31 issue. --- "res/\"manjaro-arm\".png" | Bin 0 -> 98300 bytes res/void.png => "res/\"void\".png" | Bin uwufetch.c | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 "res/\"manjaro-arm\".png" rename res/void.png => "res/\"void\".png" (100%) diff --git "a/res/\"manjaro-arm\".png" "b/res/\"manjaro-arm\".png" new file mode 100644 index 0000000000000000000000000000000000000000..d3f867bed2d5e19312c290938155447a20908381 GIT binary patch literal 98300 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 |\n" " \\ --- _/\n" " %sC__/%s---(_)\n\n\n", LPINK, PINK, LPINK, PINK, LPINK, PINK, LPINK); - } else if (strcmp(version_name, "void") == 0){ + } else if (strcmp(version_name, "\"void\"") == 0){ printf("\033[2E\033[2C%s |\\_____/|\n" " _\\____ |\n" " | \\ \\ |\n" @@ -391,7 +391,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("manjaro-arm", "Myanjawo AWM"); else STRING_TO_UWU("popos", "PopOwOS"); else STRING_TO_UWU("ubuntu", "Uwuntu"); - else STRING_TO_UWU("void", "OwOid"); + else STRING_TO_UWU("\"void\"", "OwOid"); else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux // BSD From da1b4470a10a43f69a25f78087b8dd791b505c53 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 13:14:57 +0100 Subject: [PATCH 09/81] Possible fix for #27 --- uwufetch.c | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 391ad83..7837aa9 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -85,42 +85,44 @@ int main(int argc, char *argv[]) { int pkgman() { // this is just a function that returns the total of installed packages int apt, apk, dnf, emerge, flatpak, guix, nix, pacman, rpm, xbps, total = 0; - FILE *file[9]; + FILE *file[10]; // when you add a new package manager support, make sure to update the array size. file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); file[1] = popen("apk info 2> /dev/null | wc -l", "r"); file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); - file[3] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); - file[4] = popen("qlist -I 2> /dev/null | wc -l", "r"); - file[5] = popen("flatpak list 2> /dev/null | wc -l", "r"); + file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); + file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); + file[5] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); file[6] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); file[7] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); file[8] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); file[9] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); - fscanf(file[0], "%d", &apt); - fscanf(file[1], "%d", &apk); - fscanf(file[2], "%d", &dnf); - fscanf(file[3], "%d", &emerge); - fscanf(file[4], "%d", &flatpak); - fscanf(file[5], "%d", &guix); - fscanf(file[6], "%d", &nix); - fscanf(file[7], "%d", &pacman); - fscanf(file[8], "%d", &rpm); - fscanf(file[9], "%d", &xbps); + // the if statements are there for error handling and for preventing the #27 issue + if (fscanf(file[0], "%d", &apt) == 3) apt = 0; + if (fscanf(file[1], "%d", &apk) == 3) apk = 0; + if (fscanf(file[2], "%d", &dnf) == 3) dnf = 0; + if (fscanf(file[3], "%d", &emerge) == 3) emerge = 0; + if (fscanf(file[4], "%d", &flatpak) == 3) flatpak = 0; + if (fscanf(file[5], "%d", &guix) == 3) guix = 0; + if (fscanf(file[6], "%d", &nix) == 3) nix = 0; + if (fscanf(file[7], "%d", &pacman) == 3) pacman = 0; + if (fscanf(file[8], "%d", &rpm) == 3) rpm = 0; + if (fscanf(file[9], "%d", &xbps) == 3) xbps = 0; + for (int i = 0; i < 8; i++) fclose(file[i]); - #define ADD_PACKAGES(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } - ADD_PACKAGES(apt, "(apt)") - ADD_PACKAGES(apk, "(apk)") - ADD_PACKAGES(dnf, "(dnf)") - ADD_PACKAGES(emerge, "(emerge)") - ADD_PACKAGES(flatpak,"(flatpak)") - ADD_PACKAGES(guix ,"(guix)") - ADD_PACKAGES(nix, "(nix)") - ADD_PACKAGES(pacman, "(pacman)") - ADD_PACKAGES(rpm, "(rpm)") - ADD_PACKAGES(xbps, "(xbps)") - #undef ADD_PACKAGES + #define ADD_PKGMAN_NAME(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } + ADD_PKGMAN_NAME(apt, "(apt)") + ADD_PKGMAN_NAME(apk, "(apk)") + ADD_PKGMAN_NAME(dnf, "(dnf)") + ADD_PKGMAN_NAME(emerge, "(emerge)") + ADD_PKGMAN_NAME(flatpak,"(flatpak)") + ADD_PKGMAN_NAME(guix ,"(guix)") + ADD_PKGMAN_NAME(nix, "(nix)") + ADD_PKGMAN_NAME(pacman, "(pacman)") + ADD_PKGMAN_NAME(rpm, "(rpm)") + ADD_PKGMAN_NAME(xbps, "(xbps)") + #undef ADD_PKGMAN_NAME return total; } From 20f5477a7a4c30a00d3c0ea2c8fe43f7bf55d17e Mon Sep 17 00:00:00 2001 From: sethnine <20376332+sethnine@users.noreply.github.com> Date: Sun, 14 Mar 2021 23:48:23 +1100 Subject: [PATCH 10/81] Pop os wasn't being detected this is the patch --- uwufetch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 7837aa9..9e991b0 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -206,7 +206,7 @@ void list(char* arg) { // prints distribution list " %sArch linux %sbased:\n" " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" " %sDebian/%sUbuntu %sbased:\n" - " %sdebian, %slinuxmint, %spopos\n\n" + " %sdebian, %slinuxmint, %spop\n\n" " %sOther/spare distributions:\n" " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" " %sBSD:\n" @@ -292,7 +292,7 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " %s|| %s| %s| | %s|\n" " %s | %s| %s---- %s|\n" " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcasecmp(version_name, "popos") == 0) { + } else if (strcasecmp(version_name, "pop") == 0) { printf("\033[2E\033[6C%s|\\.-----./|\n" " |/ \\|\n" " | > < |\n" @@ -394,7 +394,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); else STRING_TO_UWU("manjaro", "Myanjawo"); else STRING_TO_UWU("manjaro-arm", "Myanjawo AWM"); - else STRING_TO_UWU("popos", "PopOwOS"); + else STRING_TO_UWU("pop", "PopOwOS"); else STRING_TO_UWU("ubuntu", "Uwuntu"); else STRING_TO_UWU("\"void\"", "OwOid"); else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux From b727eb7c04ea802f1c1f787282b56ad3af75380c Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 15:19:49 +0100 Subject: [PATCH 11/81] Finally fixed #27. --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 7837aa9..a213382 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -170,7 +170,7 @@ void get_info() { // get all necessary info sprintf(version_name, "android"); // android vars FILE *whoami = popen("whoami", "r"); - fscanf(whoami, "%s", user); + if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); fclose(whoami); while (fgets(line, sizeof(line), cpuinfo)) if (fscanf(cpuinfo, "Hardware : %[^\n]", cpu_model)) break; } else sprintf(version_name, "unknown"); From 9933280db5a2e22920fbd982c62316f3b7a391e4 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 15:29:36 +0100 Subject: [PATCH 12/81] Renamed pop os image. --- res/{popos.png => pop.png} | Bin uwufetch.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename res/{popos.png => pop.png} (100%) diff --git a/res/popos.png b/res/pop.png similarity index 100% rename from res/popos.png rename to res/pop.png diff --git a/uwufetch.c b/uwufetch.c index 2c58c44..ec69ea9 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -285,14 +285,14 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcasecmp(version_name, "linuxmint") == 0) { + } else if (strcmp(version_name, "linuxmint") == 0) { printf( "\033[2E\033[4C%s__/\\____/\\.\n" " |%s.--. %s|\n" " %s, %s¯| %s| UwU| %s|\n" " %s|| %s| %s| | %s|\n" " %s | %s| %s---- %s|\n" " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcasecmp(version_name, "pop") == 0) { + } else if (strcmp(version_name, "pop") == 0) { printf("\033[2E\033[6C%s|\\.-----./|\n" " |/ \\|\n" " | > < |\n" From dbfabb4ccba3527e239fa8be82d123f6e9ffc5ae Mon Sep 17 00:00:00 2001 From: Joe Todd <57013968+Joe-Todd0@users.noreply.github.com> Date: Sun, 14 Mar 2021 14:58:41 +0000 Subject: [PATCH 13/81] fix manjaro-arm uwu name --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index ec69ea9..f72fac3 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -393,7 +393,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("guix", "gnUwU gUwUix"); else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); else STRING_TO_UWU("manjaro", "Myanjawo"); - else STRING_TO_UWU("manjaro-arm", "Myanjawo AWM"); + else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); else STRING_TO_UWU("pop", "PopOwOS"); else STRING_TO_UWU("ubuntu", "Uwuntu"); else STRING_TO_UWU("\"void\"", "OwOid"); From 07725967870bde5b23420caa972baaa573e8520b Mon Sep 17 00:00:00 2001 From: Mikhail Koshkin Date: Sun, 14 Mar 2021 19:02:29 +0300 Subject: [PATCH 14/81] kewnel uwu --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index f72fac3..b4b4ea7 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -130,7 +130,7 @@ int pkgman() { // this is just a function that returns the total of installed pa void print_info() { // print collected info printf( "\033[9A\033[18C%s%s%s@%s\n" "\033[18C%s%sOWOS %s%s\n" - "\033[18C%s%sKERNEL %s%s %s\n" + "\033[18C%s%sKEWNEL %s%s %s\n" "\033[18C%s%sCPUWU %s%s\n" "\033[18C%s%sWAM %s%i MB/%i MB\n" "\033[18C%s%sSHELL %s%s\n" From f045e8ec00bda07caeab52fd376ab875b937929d Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 19:19:30 +0100 Subject: [PATCH 15/81] Working on gpu info --- test | 1 + uwufetch.c | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 test diff --git a/test b/test new file mode 100644 index 0000000..22b2b17 --- /dev/null +++ b/test @@ -0,0 +1 @@ +lspci -mm | awk -F '\"|\" \"|\\(' '/"Display|"3D|"VGA/ {a[$0] = $1 " " $3 " " $4}END {for(i in a) {if(!seen[a[i]]++) print a[i]}}' \ No newline at end of file diff --git a/uwufetch.c b/uwufetch.c index ec69ea9..274e346 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -195,6 +195,13 @@ void get_info() { // get all necessary info break; } } + + // gpu + FILE *gpu = popen("lspci", "r"); + if (gpu) { + + fclose(gpu); + } pkgs = pkgman(); } From 28c4c7a59f9a5e7e49932cc509e3ab70c0375478 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sun, 14 Mar 2021 21:42:52 +0100 Subject: [PATCH 16/81] Added support for raspbian, fixed #36. GPU info is wip. --- Makefile | 2 +- README.md | 2 +- test | 1 - uwufetch.c | 28 ++++++++++++++++++++-------- 4 files changed, 22 insertions(+), 11 deletions(-) delete mode 100644 test diff --git a/Makefile b/Makefile index d146bef..5ab7da2 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ build: uwufetch.c debug: clear gcc $(FLAGS_DEBUG) -o $(NAME) $(FILES) - ./uwufetch + ./uwufetch -d raspbian install: cp $(NAME) $(INSTALL_DIR)$(NAME) diff --git a/README.md b/README.md index 538bfd0..6cea587 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A meme system info tool for (almost) all your Linux/Unix-based systems, based on ## Currently supported distros -Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, Pop OwOs, UwUntu, and OwOid; Plus Nyandroid; FweeBSD, and OwOpenBSD. +Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid; FweeBSD, and OwOpenBSD. ## Building and installation diff --git a/test b/test deleted file mode 100644 index 22b2b17..0000000 --- a/test +++ /dev/null @@ -1 +0,0 @@ -lspci -mm | awk -F '\"|\" \"|\\(' '/"Display|"3D|"VGA/ {a[$0] = $1 " " $3 " " $4}END {for(i in a) {if(!seen[a[i]]++) print a[i]}}' \ No newline at end of file diff --git a/uwufetch.c b/uwufetch.c index 9d09562..a8cc502 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -38,7 +38,7 @@ struct utsname sys_var; struct sysinfo sys; int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0; -char user[32], host[256], shell[64], version_name[64], cpu_model[256], pkgman_name[64], image_name[32]; +char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[256] = {0}, pkgman_name[64], image_name[32]; int pkgman(); void get_info(); void list(); @@ -132,6 +132,7 @@ void print_info() { // print collected info "\033[18C%s%sOWOS %s%s\n" "\033[18C%s%sKEWNEL %s%s %s\n" "\033[18C%s%sCPUWU %s%s\n" + "\033[18C%s%sGPUWU %s%s\n" "\033[18C%s%sWAM %s%i MB/%i MB\n" "\033[18C%s%sSHELL %s%s\n" "\033[18C%s%sPKGS %s%s%d %s\n" @@ -141,6 +142,7 @@ void print_info() { // print collected info NORMAL, BOLD, NORMAL, version_name, NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine, NORMAL, BOLD, NORMAL, cpu_model, + NORMAL, BOLD, NORMAL, gpu_model, NORMAL, BOLD, NORMAL, (ram_max - ram_free), ram_max, NORMAL, BOLD, NORMAL, shell, NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name, @@ -191,17 +193,18 @@ void get_info() { // get all necessary info if (ram_max > 0 && ram_free > 0) { ram_max *= 0.001024; ram_free *= 0.001024; - fclose(meminfo); break; } } + fclose(meminfo); // gpu - FILE *gpu = popen("lspci", "r"); + FILE *gpu = popen("lspci -vnn | grep 'VGA\\|DISPLAY\\|3D'", "r"); if (gpu) { - + //fscanf(gpu, "%[^\n]", gpu_model); fclose(gpu); } + pkgs = pkgman(); } @@ -213,15 +216,15 @@ void list(char* arg) { // prints distribution list " %sArch linux %sbased:\n" " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" " %sDebian/%sUbuntu %sbased:\n" - " %sdebian, %slinuxmint, %spop\n\n" + " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" " %sOther/spare distributions:\n" " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" " %sBSD:\n" " freebsd, %sopenbsd\n", - arg, BLUE, NORMAL, BLUE, GREEN, // Arch based colors - RED, YELLOW, NORMAL, RED, GREEN, BLUE, // Debian based colors + arg, BLUE, NORMAL, BLUE, GREEN, // Arch based colors + RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors - RED, YELLOW); // BSD colors + RED, YELLOW); // BSD colors } void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. @@ -306,6 +309,13 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " | %s~ %sP! %s~ %s|\n" "_ ---\\ w /\n" " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); + } else if (strcmp(version_name, "raspbian") == 0) { + printf("\033[0E\033[6C%s__ __\n" + " (_\\)(/_)\n" + " %s(>(__)<)\n" + " (_(_)(_)_)\n" + " (_(__)_)\n" + " (__)\n\n\n", GREEN, RED); } else if (strcmp(version_name, "ubuntu") == 0) { printf( "\033[1E\033[9C%s_\n" " %s\u25E3%s__(_)%s\u25E2%s\n" @@ -347,6 +357,7 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " /-________-\\ \n\n", YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); } + else printf( "\033[0E\033[2C%s._.--._.\n" " \\|>%s_%s< |/\n" " |%s:_/%s |\n" @@ -402,6 +413,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("manjaro", "Myanjawo"); else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); else STRING_TO_UWU("pop", "PopOwOS"); + else STRING_TO_UWU("raspbian", "RaspNyan"); else STRING_TO_UWU("ubuntu", "Uwuntu"); else STRING_TO_UWU("\"void\"", "OwOid"); else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux From 6d71999d09d1f32fc699653ebb54520b38872ff8 Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Sun, 14 Mar 2021 18:51:25 -0300 Subject: [PATCH 17/81] Add GPUWU support --- uwufetch.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index a8cc502..0d0480f 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -199,9 +199,10 @@ void get_info() { // get all necessary info fclose(meminfo); // gpu - FILE *gpu = popen("lspci -vnn | grep 'VGA\\|DISPLAY\\|3D'", "r"); + FILE *gpu = popen("lspci -mm | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); if (gpu) { - //fscanf(gpu, "%[^\n]", gpu_model); + // Ignore error + if(fscanf(gpu, "%[^\n]", gpu_model) == 3) {}; fclose(gpu); } From bb15873fbaebab47c02814b359a4dd8f06938f97 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Mon, 15 Mar 2021 00:19:02 +0100 Subject: [PATCH 18/81] Added gpu info for termux. --- uwufetch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 0d0480f..2bf4d0d 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -199,7 +199,9 @@ void get_info() { // get all necessary info fclose(meminfo); // gpu - FILE *gpu = popen("lspci -mm | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + FILE *gpu; + if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + else gpu = popen("getprop ro.hardware.vulkan", "r"); if (gpu) { // Ignore error if(fscanf(gpu, "%[^\n]", gpu_model) == 3) {}; From 1e72210a14cc0e7860d4349e54769c5b8f98e844 Mon Sep 17 00:00:00 2001 From: PK Date: Mon, 15 Mar 2021 21:04:23 -0500 Subject: [PATCH 19/81] Image bug fix, added -l to help page --- uwufetch.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/uwufetch.c b/uwufetch.c index 2bf4d0d..b1ba57b 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -398,6 +398,7 @@ void usage(char* arg) { " -i, --image prints logo as image\n" " %sworks in most terminals\n" " read res/IMAGES.md for more info%s\n", + " -l lists all supported distributions\n", arg, BLUE, NORMAL); } @@ -409,14 +410,20 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("arch", "Nyarch Linuwu"); else STRING_TO_UWU("artix", "Nyartix Linuwu"); else STRING_TO_UWU("debian", "Debinyan"); + else STRING_TO_UWU("endeavour", "endeavOwO"); else STRING_TO_UWU("fedora", "Fedowa"); else STRING_TO_UWU("gentoo", "GentOwO"); else STRING_TO_UWU("guix", "gnUwU gUwUix"); else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); else STRING_TO_UWU("manjaro", "Myanjawo"); else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); + else STRING_TO_UWU("neon", "KDE NeOwOn"); + else STRING_TO_UWU("nixos", "nixOwOs"); + else STRING_TO_UWU("opensuse", "OwOpenSUSE"); else STRING_TO_UWU("pop", "PopOwOS"); else STRING_TO_UWU("raspbian", "RaspNyan"); + else STRING_TO_UWU("slackware", "Swackwawe"); + else STRING_TO_UWU("solus", "sOwOlus"); else STRING_TO_UWU("ubuntu", "Uwuntu"); else STRING_TO_UWU("\"void\"", "OwOid"); else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux From 694a09a47d17bd3c02e83769b885f83e2e2e72f4 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Tue, 16 Mar 2021 08:19:57 +0100 Subject: [PATCH 20/81] Cpu name fix (#39) --- Makefile | 2 +- uwufetch.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5ab7da2..d146bef 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ build: uwufetch.c debug: clear gcc $(FLAGS_DEBUG) -o $(NAME) $(FILES) - ./uwufetch -d raspbian + ./uwufetch install: cp $(NAME) $(INSTALL_DIR)$(NAME) diff --git a/uwufetch.c b/uwufetch.c index b1ba57b..5361803 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -160,7 +160,7 @@ void get_info() { // get all necessary info sscanf(line, "\nID=%s", version_name); if (strlen(version_name)) break; } - while (fgets(line, sizeof(line), cpuinfo)) if (fscanf(cpuinfo, "model name : %[^with\n]", cpu_model)) break; + while (fgets(line, sizeof(line), cpuinfo)) if (sscanf(line, "model name : %[^\n]", cpu_model)) break; sprintf(user, "%s", getenv("USER")); fclose(os_release); } else { // try for android vars, or unknown system @@ -397,7 +397,7 @@ void usage(char* arg) { " -h, --help prints this help page\n" " -i, --image prints logo as image\n" " %sworks in most terminals\n" - " read res/IMAGES.md for more info%s\n", + " read res/IMAGES.md for more info%s\n" " -l lists all supported distributions\n", arg, BLUE, NORMAL); } From a695c922f4951b16adfa2dac810dadb25de50cfb Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Tue, 16 Mar 2021 09:10:54 +0100 Subject: [PATCH 21/81] Theoretically fixed gpu name being too long, new 'Requisites' in readme, now uwufetch depends from lshw --- README.md | 5 +++++ uwufetch.c | 20 +++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6cea587..8d1504a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,11 @@ Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myan ## Building and installation +#### Requisites + +[viu](https://github.com/atanunq/viu) to use images instead of ascii art. +[lshw](https://github.com/lyonel/lshw) to get gpu info. + ##### Via package manager Right now, the package is only available on the AUR: diff --git a/uwufetch.c b/uwufetch.c index 5361803..7c38c60 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -156,10 +156,7 @@ void get_info() { // get all necessary info FILE *os_release = fopen("/etc/os-release", "r"); FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); if (os_release) { // get normal vars - while (fgets(line, sizeof(line), os_release)) { - sscanf(line, "\nID=%s", version_name); - if (strlen(version_name)) break; - } + while (fgets(line, sizeof(line), os_release)) if (sscanf(line, "\nID=%s", version_name)) break; while (fgets(line, sizeof(line), cpuinfo)) if (sscanf(line, "model name : %[^\n]", cpu_model)) break; sprintf(user, "%s", getenv("USER")); fclose(os_release); @@ -174,7 +171,7 @@ void get_info() { // get all necessary info FILE *whoami = popen("whoami", "r"); if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); fclose(whoami); - while (fgets(line, sizeof(line), cpuinfo)) if (fscanf(cpuinfo, "Hardware : %[^\n]", cpu_model)) break; + while (fgets(line, sizeof(line), cpuinfo)) if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; } else sprintf(version_name, "unknown"); } fclose(cpuinfo); @@ -200,13 +197,14 @@ void get_info() { // get all necessary info // gpu FILE *gpu; - if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); - else gpu = popen("getprop ro.hardware.vulkan", "r"); - if (gpu) { - // Ignore error - if(fscanf(gpu, "%[^\n]", gpu_model) == 3) {}; - fclose(gpu); + gpu = popen("lshw -class display 2> /dev/null", "r"); + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model)) break; + if (strlen(gpu_model) < 1) { + if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model)) break; } + fclose(gpu); pkgs = pkgman(); } From fbc9b49c90b56fb33d9e211a0fcb5491f5b2350a Mon Sep 17 00:00:00 2001 From: TheDarkBug <41623496+TheDarkBug@users.noreply.github.com> Date: Tue, 16 Mar 2021 09:13:29 +0100 Subject: [PATCH 22/81] Requisites section in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8d1504a..51d12ee 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myan #### Requisites [viu](https://github.com/atanunq/viu) to use images instead of ascii art. + [lshw](https://github.com/lyonel/lshw) to get gpu info. ##### Via package manager From 117dfe96dd55ba809bcdce90f5595fb044569be3 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Tue, 16 Mar 2021 15:26:25 +0100 Subject: [PATCH 23/81] Fixed #39 with gpu_name max length. --- uwufetch.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 7c38c60..e8329ef 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -198,13 +198,16 @@ void get_info() { // get all necessary info // gpu FILE *gpu; gpu = popen("lshw -class display 2> /dev/null", "r"); - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model)) break; + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model)) break; if (strlen(gpu_model) < 1) { if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model)) break; } fclose(gpu); + for (int i = 42; i < 256; i++) { //max gpu_name length + gpu_model[i] = '\0'; + } pkgs = pkgman(); } From 20958b61186f22e6664a3a60325f5e5cd65c7205 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Tue, 16 Mar 2021 20:25:09 +0100 Subject: [PATCH 24/81] Fixed #42, shortened shell name for termux. --- uwufetch.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index e8329ef..4823289 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -176,7 +176,8 @@ void get_info() { // get all necessary info } fclose(cpuinfo); gethostname(host, 256); - sscanf(getenv("SHELL"), "%*[bin/]%s", shell); + sscanf(getenv("SHELL"), "%s", shell); + if (strlen(shell) > 16) memmove(&shell, &shell[27], sizeof(shell)); // android shell was too long, this works only for termux // system resources uname(&sys_var); From 596b2ce458e7097573687b042e162ee484db4cbb Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 17 Mar 2021 10:38:48 +0100 Subject: [PATCH 25/81] Replaced with (line 180), trying to fix #43 --- Makefile | 2 +- uwufetch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d146bef..a98c909 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ build: uwufetch.c gcc $(FLAGS) -o $(NAME) $(FILES) debug: - clear + @clear gcc $(FLAGS_DEBUG) -o $(NAME) $(FILES) ./uwufetch diff --git a/uwufetch.c b/uwufetch.c index 4823289..3d165f6 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -177,7 +177,7 @@ void get_info() { // get all necessary info fclose(cpuinfo); gethostname(host, 256); sscanf(getenv("SHELL"), "%s", shell); - if (strlen(shell) > 16) memmove(&shell, &shell[27], sizeof(shell)); // android shell was too long, this works only for termux + if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux // system resources uname(&sys_var); From 5d91c163cb014c8ccba5f3360eaf887527526aa9 Mon Sep 17 00:00:00 2001 From: dqnk Date: Thu, 18 Mar 2021 21:54:29 +0100 Subject: [PATCH 26/81] added multi-gpu support - up to 8 gpus --- uwufetch.c | 54 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 3d165f6..1bd7010 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -38,7 +38,10 @@ struct utsname sys_var; struct sysinfo sys; int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0; -char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[256] = {0}, pkgman_name[64], image_name[32]; + +// initialise the variables to store data, gpu array can hold up to 8 gpus +char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; + int pkgman(); void get_info(); void list(); @@ -127,22 +130,32 @@ int pkgman() { // this is just a function that returns the total of installed pa return total; } -void print_info() { // print collected info - printf( "\033[9A\033[18C%s%s%s@%s\n" +void print_info() { + // print collected info - from host to cpu info + printf( "\033[9A\033[18C%s%s%s@%s\n" "\033[18C%s%sOWOS %s%s\n" "\033[18C%s%sKEWNEL %s%s %s\n" - "\033[18C%s%sCPUWU %s%s\n" - "\033[18C%s%sGPUWU %s%s\n" - "\033[18C%s%sWAM %s%i MB/%i MB\n" + "\033[18C%s%sCPUWU %s%s\n", + NORMAL, BOLD, user, host, + NORMAL, BOLD, NORMAL, version_name, + NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine, + NORMAL, BOLD, NORMAL, cpu_model); + + // print the gpus + int gpu_iter = 0; + while(gpu_model[gpu_iter][0] != '0') + { + printf( "\033[18C%s%sGPUWU %s%s\n", + NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); + gpu_iter++; + } + + // print ram to uptime and colors + printf( "\033[18C%s%sWAM %s%i MB/%i MB\n" "\033[18C%s%sSHELL %s%s\n" "\033[18C%s%sPKGS %s%s%d %s\n" "\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n" "\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", - NORMAL, BOLD, user, host, - NORMAL, BOLD, NORMAL, version_name, - NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine, - NORMAL, BOLD, NORMAL, cpu_model, - NORMAL, BOLD, NORMAL, gpu_model, NORMAL, BOLD, NORMAL, (ram_max - ram_free), ram_max, NORMAL, BOLD, NORMAL, shell, NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name, @@ -197,17 +210,26 @@ void get_info() { // get all necessary info fclose(meminfo); // gpu + int gpun = 0; // number of the gpu that the program is searching for to put in the array FILE *gpu; gpu = popen("lshw -class display 2> /dev/null", "r"); - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model)) break; - if (strlen(gpu_model) < 1) { + + // add all gpus to the array gpu_model (up to 8 gpus) + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; + if (strlen(gpu_model[0]) < 1) { if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model)) break; + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[0])) break; } fclose(gpu); - for (int i = 42; i < 256; i++) { //max gpu_name length - gpu_model[i] = '\0'; + + // format the strings a bit + for(int i = 0; i < gpun; i++) + { + for (int j = 42; j < 256; j++) //max gpu_name length + { + gpu_model[i][j] = '\0'; + } } pkgs = pkgman(); From a73c3bf70cccdc53339bb8198eb082521ee00c72 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Thu, 18 Mar 2021 22:53:32 +0100 Subject: [PATCH 27/81] Rearranged comments and some variables initialization. --- uwufetch.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 1bd7010..0455dfd 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -37,9 +37,9 @@ struct utsname sys_var; struct sysinfo sys; -int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus +int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0; char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; int pkgman(); @@ -131,8 +131,8 @@ int pkgman() { // this is just a function that returns the total of installed pa } void print_info() { - // print collected info - from host to cpu info - printf( "\033[9A\033[18C%s%s%s@%s\n" + // print collected info - from host to cpu info + printf( "\033[9A\033[18C%s%s%s@%s\n" "\033[18C%s%sOWOS %s%s\n" "\033[18C%s%sKEWNEL %s%s %s\n" "\033[18C%s%sCPUWU %s%s\n", @@ -140,18 +140,17 @@ void print_info() { NORMAL, BOLD, NORMAL, version_name, NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine, NORMAL, BOLD, NORMAL, cpu_model); - - // print the gpus + + // print the gpus int gpu_iter = 0; - while(gpu_model[gpu_iter][0] != '0') - { - printf( "\033[18C%s%sGPUWU %s%s\n", + while(gpu_model[gpu_iter][0] != '0') { + printf( "\033[18C%s%sGPUWU %s%s\n", NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); gpu_iter++; } - // print ram to uptime and colors - printf( "\033[18C%s%sWAM %s%i MB/%i MB\n" + // print ram to uptime and colors + printf( "\033[18C%s%sWAM %s%i MB/%i MB\n" "\033[18C%s%sSHELL %s%s\n" "\033[18C%s%sPKGS %s%s%d %s\n" "\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n" @@ -224,10 +223,8 @@ void get_info() { // get all necessary info fclose(gpu); // format the strings a bit - for(int i = 0; i < gpun; i++) - { - for (int j = 42; j < 256; j++) //max gpu_name length - { + for(int i = 0; i < gpun; i++) { + for (int j = 42; j < 256; j++) { //max gpu_name length gpu_model[i][j] = '\0'; } } @@ -465,4 +462,4 @@ void uwu_name() { // changes distro name to uwufied(?) name } } #undef STRING_TO_UWU -} +} \ No newline at end of file From fbadd43ad3e43124a16317235c313fd1fc42256f Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Thu, 18 Mar 2021 23:22:12 +0100 Subject: [PATCH 28/81] New ascii owosuse (I'm not an artist, so i created a minster), closed #44. --- res/opensuse.png => "res/\"opensuse-leap\".png" | Bin uwufetch.c | 12 ++++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) rename res/opensuse.png => "res/\"opensuse-leap\".png" (100%) diff --git a/res/opensuse.png "b/res/\"opensuse-leap\".png" similarity index 100% rename from res/opensuse.png rename to "res/\"opensuse-leap\".png" diff --git a/uwufetch.c b/uwufetch.c index 0455dfd..f4863d2 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -326,13 +326,21 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " %s|| %s| %s| | %s|\n" " %s | %s| %s---- %s|\n" " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "\"opensuse-leap\"") == 0) { + printf("\033[2E\033[6C%s_______\n" + " ___| %s__%s \\\n" + " / %s/ o\\%s|\n" + " %s\\__/%s|\n" + " ______/\n" + " \\_______\n" + " \\_________/\n\n", GREEN, NORMAL, GREEN, NORMAL, GREEN, NORMAL, GREEN); } else if (strcmp(version_name, "pop") == 0) { printf("\033[2E\033[6C%s|\\.-----./|\n" " |/ \\|\n" " | > < |\n" " | %s~ %sP! %s~ %s|\n" "_ ---\\ w /\n" - " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); + " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); } else if (strcmp(version_name, "raspbian") == 0) { printf("\033[0E\033[6C%s__ __\n" " (_\\)(/_)\n" @@ -440,7 +448,7 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); else STRING_TO_UWU("neon", "KDE NeOwOn"); else STRING_TO_UWU("nixos", "nixOwOs"); - else STRING_TO_UWU("opensuse", "OwOpenSUSE"); + else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE"); else STRING_TO_UWU("pop", "PopOwOS"); else STRING_TO_UWU("raspbian", "RaspNyan"); else STRING_TO_UWU("slackware", "Swackwawe"); From c3af3211968f387c26b23d322cf4419c12587de3 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 19 Mar 2021 10:54:42 +0100 Subject: [PATCH 29/81] New disclaimer in -h option, we need double-dash options (--opt) --- uwufetch.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index f4863d2..7aba4e3 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -427,8 +427,11 @@ void usage(char* arg) { " -i, --image prints logo as image\n" " %sworks in most terminals\n" " read res/IMAGES.md for more info%s\n" - " -l lists all supported distributions\n", - arg, BLUE, NORMAL); + " -l lists all supported distributions\n" + " %sNote that the long options (--opt) are currently not working\n" + " If you are reading this and you know how to implement long opts,\n" + " send a pull request on https://github.com/TheDarkBug/uwufetch%s\n", + arg, BLUE, NORMAL, RED, NORMAL); } void uwu_name() { // changes distro name to uwufied(?) name From 9e373494fe1a701c0446272060043738cc382217 Mon Sep 17 00:00:00 2001 From: zegolem Date: Fri, 19 Mar 2021 16:56:24 +0100 Subject: [PATCH 30/81] Code cleanup: rewrote pkgmans() to be cleaner It uses now a `package_manager` struct, and is overall nicer to work with, especially to add new package managers. You now just have to add a new entry to the array. --- uwufetch.c | 69 +++++++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 7aba4e3..3d750f8 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -86,46 +86,41 @@ int main(int argc, char *argv[]) { } int pkgman() { // this is just a function that returns the total of installed packages - int apt, apk, dnf, emerge, flatpak, guix, nix, pacman, rpm, xbps, total = 0; + int total = 0; - FILE *file[10]; // when you add a new package manager support, make sure to update the array size. - file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); - file[1] = popen("apk info 2> /dev/null | wc -l", "r"); - file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); - file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); - file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); - file[5] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); - file[6] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); - file[7] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); - file[8] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); - file[9] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); + // TODO: should this be at the top of the program? maybe in a config.c file? + // TODO: do we need to `free()` this? I have no idea how to do memory management in C... + struct package_manager { + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager + }; - // the if statements are there for error handling and for preventing the #27 issue - if (fscanf(file[0], "%d", &apt) == 3) apt = 0; - if (fscanf(file[1], "%d", &apk) == 3) apk = 0; - if (fscanf(file[2], "%d", &dnf) == 3) dnf = 0; - if (fscanf(file[3], "%d", &emerge) == 3) emerge = 0; - if (fscanf(file[4], "%d", &flatpak) == 3) flatpak = 0; - if (fscanf(file[5], "%d", &guix) == 3) guix = 0; - if (fscanf(file[6], "%d", &nix) == 3) nix = 0; - if (fscanf(file[7], "%d", &pacman) == 3) pacman = 0; - if (fscanf(file[8], "%d", &rpm) == 3) rpm = 0; - if (fscanf(file[9], "%d", &xbps) == 3) xbps = 0; + struct package_manager pkgmans[] = { + { "apk info 2> /dev/null | wc -l", "(apk)" }, + { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, + { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, + { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, + { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, + { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, + { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, + { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, + }; - for (int i = 0; i < 8; i++) fclose(file[i]); + const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - #define ADD_PKGMAN_NAME(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } - ADD_PKGMAN_NAME(apt, "(apt)") - ADD_PKGMAN_NAME(apk, "(apk)") - ADD_PKGMAN_NAME(dnf, "(dnf)") - ADD_PKGMAN_NAME(emerge, "(emerge)") - ADD_PKGMAN_NAME(flatpak,"(flatpak)") - ADD_PKGMAN_NAME(guix ,"(guix)") - ADD_PKGMAN_NAME(nix, "(nix)") - ADD_PKGMAN_NAME(pacman, "(pacman)") - ADD_PKGMAN_NAME(rpm, "(rpm)") - ADD_PKGMAN_NAME(xbps, "(xbps)") - #undef ADD_PKGMAN_NAME + for (int i = 0; i < pkgman_count; i++) { + struct package_manager *current = &pkgmans[i]; + + FILE *fp = popen(current->command_string, "r"); + unsigned int pkg_count; + + if (fscanf(fp, "%u", &pkg_count) == 3) continue; + fclose(fp); + + total += pkg_count; + if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); + } return total; } @@ -473,4 +468,4 @@ void uwu_name() { // changes distro name to uwufied(?) name } } #undef STRING_TO_UWU -} \ No newline at end of file +} From 16fd121d505187674eae4d41ea15d761383a6dbe Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 19 Mar 2021 17:04:50 +0100 Subject: [PATCH 31/81] Fixed #47, gpu_model[] min length is now 2. --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 7aba4e3..59f7a52 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -215,7 +215,7 @@ void get_info() { // get all necessary info // add all gpus to the array gpu_model (up to 8 gpus) while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; - if (strlen(gpu_model[0]) < 1) { + if (strlen(gpu_model[0]) < 2) { if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[0])) break; From 3ada75bbaaba26953c96f10c747cc586912c5d1b Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 19 Mar 2021 17:28:09 +0100 Subject: [PATCH 32/81] Fixed -Wsign-compare. --- uwufetch.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index a7ce5f8..fe978e2 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -91,25 +91,25 @@ int pkgman() { // this is just a function that returns the total of installed pa // TODO: should this be at the top of the program? maybe in a config.c file? // TODO: do we need to `free()` this? I have no idea how to do memory management in C... struct package_manager { - char command_string[128]; // command to get number of packages installed - char pkgman_name[16]; // name of the package manager + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager }; struct package_manager pkgmans[] = { - { "apk info 2> /dev/null | wc -l", "(apk)" }, - { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, - { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, - { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, - { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, - { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, - { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, - { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, + { "apk info 2> /dev/null | wc -l", "(apk)" }, + { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, + { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, + { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, + { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, + { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, + { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, + { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" } }; const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - for (int i = 0; i < pkgman_count; i++) { + for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare struct package_manager *current = &pkgmans[i]; FILE *fp = popen(current->command_string, "r"); @@ -121,7 +121,6 @@ int pkgman() { // this is just a function that returns the total of installed pa total += pkg_count; if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); } - return total; } From 208c40c19eafbe5710fe33344f5b35915fe87633 Mon Sep 17 00:00:00 2001 From: zegolem Date: Fri, 19 Mar 2021 17:44:35 +0100 Subject: [PATCH 33/81] gpu: forced LANG environement variable to en_US before running lshw Before, as my system is configured with LANG=fr_FR so, lshw would output in french, and the program couldn't find the right strings in the output, and so, my GPU wasn't properly detected. There may be other instances of similar issues in the code, but for now, everything shows up correctly for me. --- uwufetch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/uwufetch.c b/uwufetch.c index 3d750f8..4014123 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -205,6 +205,7 @@ void get_info() { // get all necessary info // gpu int gpun = 0; // number of the gpu that the program is searching for to put in the array + setenv("LANG", "en_US", 1); // force language to english FILE *gpu; gpu = popen("lshw -class display 2> /dev/null", "r"); From ec1af43272e62983a51322c43ca2d5d70a0b6413 Mon Sep 17 00:00:00 2001 From: Pascal Puffke Date: Fri, 19 Mar 2021 19:21:35 +0100 Subject: [PATCH 34/81] Fix CPU and GPU length based on terminal width If the CPU or GPU name strings are longer than the terminal width minus 28, truncate them --- uwufetch.c | 96 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index fe978e2..c603744 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -20,6 +20,7 @@ #include #include #include +#include // COLORS #define NORMAL "\x1b[0m" @@ -37,9 +38,10 @@ struct utsname sys_var; struct sysinfo sys; +struct winsize win; // initialise the variables to store data, gpu array can hold up to 8 gpus -int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0; +int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0, target_width = 0; char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; int pkgman(); @@ -50,6 +52,7 @@ void print_info(); void print_image(); void usage(char*); void uwu_name(); +void truncate_name(char*); int main(int argc, char *argv[]) { int opt = 0; @@ -86,41 +89,47 @@ int main(int argc, char *argv[]) { } int pkgman() { // this is just a function that returns the total of installed packages - int total = 0; + int apt, apk, dnf, emerge, flatpak, guix, nix, pacman, rpm, xbps, total = 0; - // TODO: should this be at the top of the program? maybe in a config.c file? - // TODO: do we need to `free()` this? I have no idea how to do memory management in C... - struct package_manager { - char command_string[128]; // command to get number of packages installed - char pkgman_name[16]; // name of the package manager - }; + FILE *file[10]; // when you add a new package manager support, make sure to update the array size. + file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); + file[1] = popen("apk info 2> /dev/null | wc -l", "r"); + file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); + file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); + file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); + file[5] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); + file[6] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); + file[7] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); + file[8] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); + file[9] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); - struct package_manager pkgmans[] = { - { "apk info 2> /dev/null | wc -l", "(apk)" }, - { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, - { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, - { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, - { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, - { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, - { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, - { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" } - }; + // the if statements are there for error handling and for preventing the #27 issue + if (fscanf(file[0], "%d", &apt) == 3) apt = 0; + if (fscanf(file[1], "%d", &apk) == 3) apk = 0; + if (fscanf(file[2], "%d", &dnf) == 3) dnf = 0; + if (fscanf(file[3], "%d", &emerge) == 3) emerge = 0; + if (fscanf(file[4], "%d", &flatpak) == 3) flatpak = 0; + if (fscanf(file[5], "%d", &guix) == 3) guix = 0; + if (fscanf(file[6], "%d", &nix) == 3) nix = 0; + if (fscanf(file[7], "%d", &pacman) == 3) pacman = 0; + if (fscanf(file[8], "%d", &rpm) == 3) rpm = 0; + if (fscanf(file[9], "%d", &xbps) == 3) xbps = 0; - const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); + for (int i = 0; i < 8; i++) fclose(file[i]); - for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare - struct package_manager *current = &pkgmans[i]; + #define ADD_PKGMAN_NAME(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } + ADD_PKGMAN_NAME(apt, "(apt)") + ADD_PKGMAN_NAME(apk, "(apk)") + ADD_PKGMAN_NAME(dnf, "(dnf)") + ADD_PKGMAN_NAME(emerge, "(emerge)") + ADD_PKGMAN_NAME(flatpak,"(flatpak)") + ADD_PKGMAN_NAME(guix ,"(guix)") + ADD_PKGMAN_NAME(nix, "(nix)") + ADD_PKGMAN_NAME(pacman, "(pacman)") + ADD_PKGMAN_NAME(rpm, "(rpm)") + ADD_PKGMAN_NAME(xbps, "(xbps)") + #undef ADD_PKGMAN_NAME - FILE *fp = popen(current->command_string, "r"); - unsigned int pkg_count; - - if (fscanf(fp, "%u", &pkg_count) == 3) continue; - fclose(fp); - - total += pkg_count; - if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); - } return total; } @@ -158,6 +167,12 @@ void print_info() { void get_info() { // get all necessary info char line[256]; // var to scan file lines + + // terminal width + // used for truncating long names + ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); + target_width = win.ws_col - 28; + // os version FILE *os_release = fopen("/etc/os-release", "r"); FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); @@ -185,6 +200,9 @@ void get_info() { // get all necessary info sscanf(getenv("SHELL"), "%s", shell); if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux + // truncate CPU name + truncate_name(cpu_model); + // system resources uname(&sys_var); sysinfo(&sys); @@ -215,12 +233,10 @@ void get_info() { // get all necessary info while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[0])) break; } fclose(gpu); - - // format the strings a bit - for(int i = 0; i < gpun; i++) { - for (int j = 42; j < 256; j++) { //max gpu_name length - gpu_model[i][j] = '\0'; - } + + // GPU name shortening + for (int i = 0; i < gpun; i++) { + truncate_name(gpu_model[i]); } pkgs = pkgman(); @@ -468,3 +484,9 @@ void uwu_name() { // changes distro name to uwufied(?) name } #undef STRING_TO_UWU } + +void truncate_name(char* name) { + for (int i = target_width; i < 256; i++) { + name[i] = '\0'; + } +} From 9d94953d478dea8daa924a9c2d8a9cdd1d4ff38c Mon Sep 17 00:00:00 2001 From: Pascal Puffke Date: Fri, 19 Mar 2021 19:32:12 +0100 Subject: [PATCH 35/81] Truncate kernel name From a647bfc6ba7bd36426fe42ab742020ad45ba2a1d Mon Sep 17 00:00:00 2001 From: Pascal Puffke Date: Fri, 19 Mar 2021 19:33:17 +0100 Subject: [PATCH 36/81] Truncate kernel name From 9e299dc8a490cb7c4780b37395af6889dd35ffda Mon Sep 17 00:00:00 2001 From: Pascal Puffke Date: Fri, 19 Mar 2021 19:38:46 +0100 Subject: [PATCH 37/81] I'm tired --- uwufetch.c | 79 ++++++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index c603744..c1dddf0 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -89,47 +89,41 @@ int main(int argc, char *argv[]) { } int pkgman() { // this is just a function that returns the total of installed packages - int apt, apk, dnf, emerge, flatpak, guix, nix, pacman, rpm, xbps, total = 0; + int total = 0; - FILE *file[10]; // when you add a new package manager support, make sure to update the array size. - file[0] = popen("dpkg-query -f '${binary:Package}\n' -W 2> /dev/null | wc -l", "r"); - file[1] = popen("apk info 2> /dev/null | wc -l", "r"); - file[2] = popen("dnf list installed 2> /dev/null | wc -l", "r"); - file[3] = popen("qlist -I 2> /dev/null | wc -l", "r"); - file[4] = popen("flatpak list 2> /dev/null | wc -l", "r"); - file[5] = popen("guix package --list-installed 2> /dev/null | wc -l", "r"); - file[6] = popen("nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "r"); - file[7] = popen("pacman -Qq 2> /dev/null | wc -l", "r"); - file[8] = popen("rpm -qa --last 2> /dev/null | wc -l", "r"); - file[9] = popen("xbps-query -l 2> /dev/null | wc -l", "r"); + // TODO: should this be at the top of the program? maybe in a config.c file? + // TODO: do we need to `free()` this? I have no idea how to do memory management in C... + struct package_manager { + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager + }; - // the if statements are there for error handling and for preventing the #27 issue - if (fscanf(file[0], "%d", &apt) == 3) apt = 0; - if (fscanf(file[1], "%d", &apk) == 3) apk = 0; - if (fscanf(file[2], "%d", &dnf) == 3) dnf = 0; - if (fscanf(file[3], "%d", &emerge) == 3) emerge = 0; - if (fscanf(file[4], "%d", &flatpak) == 3) flatpak = 0; - if (fscanf(file[5], "%d", &guix) == 3) guix = 0; - if (fscanf(file[6], "%d", &nix) == 3) nix = 0; - if (fscanf(file[7], "%d", &pacman) == 3) pacman = 0; - if (fscanf(file[8], "%d", &rpm) == 3) rpm = 0; - if (fscanf(file[9], "%d", &xbps) == 3) xbps = 0; + struct package_manager pkgmans[] = { + { "apk info 2> /dev/null | wc -l", "(apk)" }, + { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, + { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, + { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, + { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, + { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, + { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, + { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" } + }; - for (int i = 0; i < 8; i++) fclose(file[i]); + const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - #define ADD_PKGMAN_NAME(package_count, pkgman_to_add) if (package_count > 0) { total += package_count; strcat(pkgman_name, pkgman_to_add); } - ADD_PKGMAN_NAME(apt, "(apt)") - ADD_PKGMAN_NAME(apk, "(apk)") - ADD_PKGMAN_NAME(dnf, "(dnf)") - ADD_PKGMAN_NAME(emerge, "(emerge)") - ADD_PKGMAN_NAME(flatpak,"(flatpak)") - ADD_PKGMAN_NAME(guix ,"(guix)") - ADD_PKGMAN_NAME(nix, "(nix)") - ADD_PKGMAN_NAME(pacman, "(pacman)") - ADD_PKGMAN_NAME(rpm, "(rpm)") - ADD_PKGMAN_NAME(xbps, "(xbps)") - #undef ADD_PKGMAN_NAME + for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare + struct package_manager *current = &pkgmans[i]; + FILE *fp = popen(current->command_string, "r"); + unsigned int pkg_count; + + if (fscanf(fp, "%u", &pkg_count) == 3) continue; + fclose(fp); + + total += pkg_count; + if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); + } return total; } @@ -169,7 +163,7 @@ void get_info() { // get all necessary info char line[256]; // var to scan file lines // terminal width - // used for truncating long names + // used to truncate long names ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); target_width = win.ws_col - 28; @@ -206,7 +200,10 @@ void get_info() { // get all necessary info // system resources uname(&sys_var); sysinfo(&sys); - + + truncate_name(sys_var.release); + truncate_name(sys_var.machine); + // ram FILE *meminfo = fopen("/proc/meminfo", "r"); while (fgets(line, sizeof(line), meminfo)) { @@ -233,9 +230,9 @@ void get_info() { // get all necessary info while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[0])) break; } fclose(gpu); - - // GPU name shortening - for (int i = 0; i < gpun; i++) { + + // truncate GPU name + for(int i = 0; i < gpun; i++) { truncate_name(gpu_model[i]); } From c17d7a5a9dd615316cf0c195c176f6499f640e10 Mon Sep 17 00:00:00 2001 From: PK Date: Fri, 19 Mar 2021 16:52:51 -0500 Subject: [PATCH 38/81] OpenSUSE icon tweak, Zypper support + APT readded --- uwufetch.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index a3064c0..c92604d 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -99,6 +99,7 @@ int pkgman() { // this is just a function that returns the total of installed pa }; struct package_manager pkgmans[] = { + { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, { "apk info 2> /dev/null | wc -l", "(apk)" }, { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, @@ -108,6 +109,7 @@ int pkgman() { // this is just a function that returns the total of installed pa { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" } + { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } }; const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); @@ -335,13 +337,10 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " %s | %s| %s---- %s|\n" " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); } else if (strcmp(version_name, "\"opensuse-leap\"") == 0) { - printf("\033[2E\033[6C%s_______\n" - " ___| %s__%s \\\n" - " / %s/ o\\%s|\n" - " %s\\__/%s|\n" - " ______/\n" - " \\_______\n" - " \\_________/\n\n", GREEN, NORMAL, GREEN, NORMAL, GREEN, NORMAL, GREEN); + printf("\033[3E\033[3C%s|\\----/|\n" + " _ / %sO O%s\\\n" + " __. W /\n" + " '----'\n\n\n", GREEN, WHITE, GREEN); } else if (strcmp(version_name, "pop") == 0) { printf("\033[2E\033[6C%s|\\.-----./|\n" " |/ \\|\n" From b56336e1cc5efabc0fd47a7cdb460cae07b951b4 Mon Sep 17 00:00:00 2001 From: PK Date: Fri, 19 Mar 2021 16:54:35 -0500 Subject: [PATCH 39/81] README change --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 51d12ee..4b5b977 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,11 @@ A meme system info tool for (almost) all your Linux/Unix-based systems, based on nyan/UwU trend on r/linuxmasterrace. ## Currently supported distros +#### Full support (Both Ascii art + images are provided for the given distribution) +Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, OwOpenSUSE, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid. -Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid; FweeBSD, and OwOpenBSD. +#### Partial support (Either no Ascii art, or no image is provided) +endeavOwO, KDE NeOwOn, nixOwOs, Swackwawe, sOwOlus; Plus FweeBSD, and OwOpenBSD ## Building and installation From a0bedd1dbf789e792dbb1116cf9000e2506bb8c5 Mon Sep 17 00:00:00 2001 From: "P.K" Date: Fri, 19 Mar 2021 17:01:52 -0500 Subject: [PATCH 40/81] Quick fix --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index c92604d..0a4bafc 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -108,7 +108,7 @@ int pkgman() { // this is just a function that returns the total of installed pa { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" } + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } }; From d684bc0ec36489cc7f772e11edc6838e1413edb5 Mon Sep 17 00:00:00 2001 From: dqnk Date: Sun, 21 Mar 2021 20:07:22 +0100 Subject: [PATCH 41/81] added removing of square brackets from GPU names --- uwufetch.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 0a4bafc..5f49dce 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -53,6 +53,7 @@ void print_image(); void usage(char*); void uwu_name(); void truncate_name(char*); +void remove_brackets(char*); int main(int argc, char *argv[]) { int opt = 0; @@ -226,7 +227,8 @@ void get_info() { // get all necessary info gpu = popen("lshw -class display 2> /dev/null", "r"); // add all gpus to the array gpu_model (up to 8 gpus) - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; + if (strlen(gpu_model[0]) < 2) { if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); @@ -234,8 +236,9 @@ void get_info() { // get all necessary info } fclose(gpu); - // truncate GPU name + // truncate GPU name and remove square brackets for(int i = 0; i < gpun; i++) { + remove_brackets(gpu_model[i]); truncate_name(gpu_model[i]); } @@ -487,3 +490,20 @@ void truncate_name(char* name) { name[i] = '\0'; } } + +// remove square brackets (for gpu names) +void remove_brackets(char *str) +{ + int i,j; + i = 0; + while(i < (int)strlen(str)) + { + if (str[i] == '[' || str[i] == ']') + { + for (j = i; j < (int)strlen(str); j++) + { + str[j] = str[j+1]; + } + } else i++; + } +} From 8a9595179ea68577b06e024c705d77b14c895275 Mon Sep 17 00:00:00 2001 From: dqnk Date: Sun, 21 Mar 2021 20:17:49 +0100 Subject: [PATCH 42/81] formated the code so that it will be easier to print more data in the future if we ever decide to --- uwufetch.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 5f49dce..e98e9db 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -132,13 +132,13 @@ int pkgman() { // this is just a function that returns the total of installed pa void print_info() { // print collected info - from host to cpu info - printf( "\033[9A\033[18C%s%s%s@%s\n" - "\033[18C%s%sOWOS %s%s\n" - "\033[18C%s%sKEWNEL %s%s %s\n" - "\033[18C%s%sCPUWU %s%s\n", - NORMAL, BOLD, user, host, - NORMAL, BOLD, NORMAL, version_name, - NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine, + printf( "\033[9A\033[18C%s%s%s@%s\n", + NORMAL, BOLD, user, host); + printf( "\033[18C%s%sOWOS %s%s\n", + NORMAL, BOLD, NORMAL, version_name); + printf( "\033[18C%s%sKEWNEL %s%s %s\n", + NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); + printf( "\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); // print the gpus @@ -150,15 +150,15 @@ void print_info() { } // print ram to uptime and colors - printf( "\033[18C%s%sWAM %s%i MB/%i MB\n" - "\033[18C%s%sSHELL %s%s\n" - "\033[18C%s%sPKGS %s%s%d %s\n" - "\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n" - "\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", - NORMAL, BOLD, NORMAL, (ram_max - ram_free), ram_max, - NORMAL, BOLD, NORMAL, shell, - NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name, - NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime/60/60, sys.uptime/60%60, + printf("\033[18C%s%sWAM %s%i MB/%i MB\n", + NORMAL, BOLD, NORMAL, (ram_max - ram_free), ram_max); + printf("\033[18C%s%sSHELL %s%s\n", + NORMAL, BOLD, NORMAL, shell); + printf("\033[18C%s%sPKGS %s%s%d %s\n", + NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); + printf("\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n", + NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime/60/60, sys.uptime/60%60); + printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); } From 9787f5b394b2732ef3db541f0300506baa8bf54b Mon Sep 17 00:00:00 2001 From: dqnk Date: Sun, 21 Mar 2021 21:07:09 +0100 Subject: [PATCH 43/81] solved issue #54 --- uwufetch.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index e98e9db..70e5e1c 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -230,9 +230,12 @@ void get_info() { // get all necessary info while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; if (strlen(gpu_model[0]) < 2) { - if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\\|00:02\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + // get gpus with lspci command + if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[0])) break; + + // get all the gpus + while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; } fclose(gpu); From 6f592e3f4abced46f70c011cedf02f75767988bd Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 31 Mar 2021 12:47:07 -0300 Subject: [PATCH 44/81] Add long options support --- uwufetch.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 70e5e1c..6f12a8b 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -57,8 +58,17 @@ void remove_brackets(char*); int main(int argc, char *argv[]) { int opt = 0; + static struct option long_options[] = { + {"ascii", no_argument, NULL, 'a'}, + {"custom", required_argument, NULL, 'c'}, + {"distro", required_argument, NULL, 'd'}, + {"help", no_argument, NULL, 'h'}, + {"image", no_argument, NULL, 'i'}, + {"list", no_argument, NULL, 'l'}, + {NULL, 0, NULL, 0} + }; get_info(); - while((opt = getopt(argc, argv, "ad:hilc:")) != -1) { + while((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { switch(opt) { case 'a': a_i_flag = 0; From e1ef8a890fe5ac644f7f009bba0933d5fe63c5db Mon Sep 17 00:00:00 2001 From: Emily <36363495+em1lyy@users.noreply.github.com> Date: Wed, 31 Mar 2021 21:20:18 +0200 Subject: [PATCH 45/81] add support for openSUSE Tumbleweed --- uwufetch.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 6f12a8b..85cc253 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -352,7 +352,7 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu " %s|| %s| %s| | %s|\n" " %s | %s| %s---- %s|\n" " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "\"opensuse-leap\"") == 0) { + } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { printf("\033[3E\033[3C%s|\\----/|\n" " _ / %sO O%s\\\n" " __. W /\n" @@ -474,7 +474,8 @@ void uwu_name() { // changes distro name to uwufied(?) name else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); else STRING_TO_UWU("neon", "KDE NeOwOn"); else STRING_TO_UWU("nixos", "nixOwOs"); - else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE"); + else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE Leap"); + else STRING_TO_UWU("\"opensuse-tumbleweed\"", "OwOpenSUSE Tumbleweed"); else STRING_TO_UWU("pop", "PopOwOS"); else STRING_TO_UWU("raspbian", "RaspNyan"); else STRING_TO_UWU("slackware", "Swackwawe"); From 8d3614674d35895e018c51ad7802c0cedb4eb763 Mon Sep 17 00:00:00 2001 From: dqnk Date: Fri, 2 Apr 2021 09:41:03 +0200 Subject: [PATCH 46/81] Fixed issue with printing ram #59 --- uwufetch.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 85cc253..809dc23 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -41,8 +41,10 @@ struct utsname sys_var; struct sysinfo sys; struct winsize win; +// all possible ram values obtainable with free command +int ram_total, ram_used, ram_free, shared, buff_cache, available = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus -int ram_max = 0, ram_free = 0, pkgs, a_i_flag = 0, target_width = 0; +int pkgs, a_i_flag = 0, target_width = 0; char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; int pkgman(); @@ -161,7 +163,7 @@ void print_info() { // print ram to uptime and colors printf("\033[18C%s%sWAM %s%i MB/%i MB\n", - NORMAL, BOLD, NORMAL, (ram_max - ram_free), ram_max); + NORMAL, BOLD, NORMAL, (ram_used), ram_total); printf("\033[18C%s%sSHELL %s%s\n", NORMAL, BOLD, NORMAL, shell); printf("\033[18C%s%sPKGS %s%s%d %s\n", @@ -218,14 +220,23 @@ void get_info() { // get all necessary info truncate_name(sys_var.machine); // ram - FILE *meminfo = fopen("/proc/meminfo", "r"); + + + FILE *meminfo; + + meminfo = popen("free 2> /dev/null", "r"); while (fgets(line, sizeof(line), meminfo)) { - sscanf(line, "MemFree: %d kB", &ram_free); - sscanf(line, "MemTotal: %d kB", &ram_max); - if (ram_max > 0 && ram_free > 0) { - ram_max *= 0.001024; - ram_free *= 0.001024; - break; + // free command prints like this: "Mem:" total used free shared buff/cache available + + if(sscanf(line, "Mem: %d %d %d %d %d %d", &ram_total, &ram_used, &ram_free, &shared, &buff_cache, &available)){ + // convert to megabytes + if (ram_total > 0 && ram_free > 0) { + // data is in bytes + ram_total /= 1024; + ram_free /= 1024; + ram_used /= 1024; + break; + } } } fclose(meminfo); From 38030b0080eb08693b1d271b678e580cd10fff38 Mon Sep 17 00:00:00 2001 From: dqnk <64268180+dqnk@users.noreply.github.com> Date: Fri, 2 Apr 2021 09:47:48 +0200 Subject: [PATCH 47/81] removed calculation with unused variable --- uwufetch.c | 1 - 1 file changed, 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 809dc23..437735e 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -233,7 +233,6 @@ void get_info() { // get all necessary info if (ram_total > 0 && ram_free > 0) { // data is in bytes ram_total /= 1024; - ram_free /= 1024; ram_used /= 1024; break; } From b25524a976f0384a1ebf002be87c988531e4f277 Mon Sep 17 00:00:00 2001 From: dqnk Date: Fri, 2 Apr 2021 09:52:20 +0200 Subject: [PATCH 48/81] removed more unused variables --- uwufetch.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 809dc23..d382ef2 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -42,7 +42,7 @@ struct sysinfo sys; struct winsize win; // all possible ram values obtainable with free command -int ram_total, ram_used, ram_free, shared, buff_cache, available = 0; +int ram_total, ram_used = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus int pkgs, a_i_flag = 0, target_width = 0; char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; @@ -228,12 +228,11 @@ void get_info() { // get all necessary info while (fgets(line, sizeof(line), meminfo)) { // free command prints like this: "Mem:" total used free shared buff/cache available - if(sscanf(line, "Mem: %d %d %d %d %d %d", &ram_total, &ram_used, &ram_free, &shared, &buff_cache, &available)){ + if(sscanf(line, "Mem: %d %d", &ram_total, &ram_used)){ // convert to megabytes - if (ram_total > 0 && ram_free > 0) { + if (ram_total > 0 && ram_used > 0) { // data is in bytes ram_total /= 1024; - ram_free /= 1024; ram_used /= 1024; break; } From 6f65871a0d8dabaf3f566a9dee6c5905cc66cc50 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 15:56:57 +0200 Subject: [PATCH 49/81] Started working on a copyright file, as #55 suggests. --- COPYRIGHT.md | 43 +++++++++++++++++++++++++++++++++++++++++++ README.md | 4 +++- res/IMAGES.md | 28 ++++++++++++++++++++++------ 3 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 COPYRIGHT.md diff --git a/COPYRIGHT.md b/COPYRIGHT.md new file mode 100644 index 0000000..89fefee --- /dev/null +++ b/COPYRIGHT.md @@ -0,0 +1,43 @@ +# Introduction + +This file contains all copyright info for every image that `uwufetch` uses. If you want to remove *your* image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). + +# Copyrights + +## TEMPLATE + +image + +### Base artwork: + +- Copyright Holder: +- License: +- [License URL]() +- [Reference]() + +### Modifications + +- Description: uwu style +- Copyright Holder: +- License: +- [License URL](https://original_post_link.com) + +## Android + +image + +android at the end because it could be not considered as an actual distribution of gnu/linux + +### Base artwork: + +- Copyright Holder: Google Inc. +- License: CC-BY-3.0 +- [License URL](https://creativecommons.org/licenses/by/3.0/) +- [Reference](https://developer.android.com/distribute/marketing-tools/brand-guidelines#android_robot) + +### Modifications + +- Description: uwu style +- Copyright Holder: u/6b86b3ac03c167320d93 +- License: No license, just a reddit post +- [License URL](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) diff --git a/README.md b/README.md index 4b5b977..226a2dc 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,12 @@ make termux # build and install for termux make termux_uninstall # uninstall for termux ``` -## Images +## Images and copyright info [IMAGES.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/IMAGES.md) +[COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md) + ## License This program is provided under the [GPL-3.0 License](https://github.com/TheDarkBug/uwufetch/LICENSE). diff --git a/res/IMAGES.md b/res/IMAGES.md index fb2fc77..ba43497 100644 --- a/res/IMAGES.md +++ b/res/IMAGES.md @@ -1,7 +1,6 @@ # Image logos -Int this directory, all the images for the logos, are stored. -If you want to remove *your* image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). +Int this directory, all the images for the logos, are stored. For copyright info read [COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/blob/main/res/COPYRIGHT.md) ## How to use images @@ -11,20 +10,37 @@ Images are working in almost every terminal, for a better experience i recommend ## Credits image Nyarch Linuwu by u/Ishaan_P ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/)) + image Nyartix Linuwu by u/akzcake ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/)) + image Debinyan by u/Ishaan_P ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/)) + image Endowo Os by u/zuru2003 ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/)) + image Fedowa by u/iD3nis124 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/)) + image GentOwO by u/TheSatisfiedPig ([here](https://www.reddit.com/r/linuxmasterrace/comments/m11aml/genchu/)) + image Myanjawo by u/matrixrunner ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxx9h7/myanjawo_also_in_wallpaper/)) + image Miwint by u/iD3nis124 ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly8oy0/seen_a_lot_of_people_asking_for_mint_so_here_it_is/)) + image KDE Uwon by u/muff2 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxt82v/kde_uwon/)) + image NwnixOS by u/ant-artica ([here](https://www.reddit.com/r/linuxmasterrace/comments/lzdwl4/nixowos/)) -image OwOsuse by u/VortexAcherontic ([here](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/)) -image Pop UwUs by u/Mochimo786 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/)) + +image OwOsuse by u/VortexAcherontic ([here](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/)) + +image Pop UwUs by u/Mochimo786 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/)) + image Slawkyware by u/theldus ([here](https://www.reddit.com/r/linuxmasterrace/comments/lyt6xi/slawckyware/)) + image Sowus by u/welpelp ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly9il3/continuing_the_trend_i_made_sowus_my_first/)) -image Tuwu by u/Annual-Examination96 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/)) + +image Tuwu by u/Annual-Examination96 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/)) + image Uwuntu by u/Chicki2D ([here](https://www.reddit.com/r/linuxmasterrace/comments/lwsnul/uwuntu/)) -image Owoid by u/Satoqz ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/)) + +image Owoid by u/Satoqz ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/)) + image Nyandroid by u/6b86b3ac03c167320d93 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/)) (android at the end because it could be not considered as an actual distribution of gnu/linux) From c317bc6ad1097418c353b10508d1702435fa49ce Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 15:58:46 +0200 Subject: [PATCH 50/81] Started working on a copyright file (in res directory), as #55 suggests. --- COPYRIGHT.md => res/COPYRIGHT.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename COPYRIGHT.md => res/COPYRIGHT.md (100%) diff --git a/COPYRIGHT.md b/res/COPYRIGHT.md similarity index 100% rename from COPYRIGHT.md rename to res/COPYRIGHT.md From 1c8eb6c1b0806fe3fa25795022d79eb80e2d6570 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 16:06:43 +0200 Subject: [PATCH 51/81] Added arch logo to COPYRIGHT.md. --- res/COPYRIGHT.md | 66 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/res/COPYRIGHT.md b/res/COPYRIGHT.md index 89fefee..0294633 100644 --- a/res/COPYRIGHT.md +++ b/res/COPYRIGHT.md @@ -1,9 +1,54 @@ # Introduction This file contains all copyright info for every image that `uwufetch` uses. If you want to remove *your* image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). +I am not a copyright expert, and maybe I am doing all wrong things, please correct this file if you notice something wrong. # Copyrights +## Arch Linux + +image + +### Base artwork: + +- Copyright Holder: Arch Linux Devs +- License: Arch Linux TrademarkPolicy +- [License URL](https://archlinux.org/art/) +- [Reference](https://wiki.archlinux.org/index.php/DeveloperWiki:TrademarkPolicy) + +### Modifications + +- Description: uwu style +- Copyright Holder: +- License: +- [License URL](https://original_post_link.com) + + +## Android + +image + +android at the end because it could be not considered as an actual distribution of gnu/linux + +### Base artwork: + +- Copyright Holder: Google Inc. +- License: CC-BY-3.0 +- [License URL](https://creativecommons.org/licenses/by/3.0/) +- [Reference](https://developer.android.com/distribute/marketing-tools/brand-guidelines#android_robot) + +### Modifications + +- Description: uwu style +- Copyright Holder: u/6b86b3ac03c167320d93 +- License: No license, just a reddit post +- [License URL](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) + + + + + + From bfa7112d8e68cd8a0b74c6fa161ded6256e6ccbc Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 16:35:43 +0200 Subject: [PATCH 52/81] Added some logos, changed info template. --- res/COPYRIGHT.md | 92 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 12 deletions(-) diff --git a/res/COPYRIGHT.md b/res/COPYRIGHT.md index 0294633..7f8c490 100644 --- a/res/COPYRIGHT.md +++ b/res/COPYRIGHT.md @@ -12,17 +12,86 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: - Copyright Holder: Arch Linux Devs -- License: Arch Linux TrademarkPolicy -- [License URL](https://archlinux.org/art/) +- License: [Arch Linux TrademarkPolicy](https://archlinux.org/art/) - [Reference](https://wiki.archlinux.org/index.php/DeveloperWiki:TrademarkPolicy) ### Modifications - Description: uwu style -- Copyright Holder: -- License: -- [License URL](https://original_post_link.com) +- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/) +## Artix + +image + +### Base artwork: + +- Copyright Holder: Artix Linux Devs +- License: [Artix Brand Book](https://gitea.artixlinux.org/artix/artwork/src/branch/master/README.md) +- [Reference](https://gitea.artixlinux.org/artix/artwork) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/akzcake](https://www.reddit.com/user/akzcake) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/) + +## Debian + +image + +### Base artwork: + +- Copyright Holder: Debian Devs +- License: LGPL3 +- [License URL](https://www.gnu.org/licenses/lgpl-3.0.html) +- [Reference](https://www.debian.org/logos/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) +- License: [LGPL3](https://www.gnu.org/licenses/lgpl-3.0.html) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/) + + +## Endeavour OS + +image + +### Base artwork: + +- Copyright Holder: Endeavour OS Devs +- License: [No license was mentioned on the website](https://endeavouros.com/endeavouros-logo/) +- [Reference](https://endeavouros.com/endeavouros-logo/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/zuru2003](https://www.reddit.com/user/zuru2003) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/) + + +## Fedora + +image + +### Base artwork: + +- Copyright Holder: +- License: [Fedora logo usage guide-lines](https://fedoraproject.org/wiki/Logo/UsageGuidelines) +- [Reference](https://fedoraproject.org/wiki/Logo) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) +- License: [Fedora logo usage guide-lines (I guess)](https://fedoraproject.org/wiki/Logo/UsageGuidelines) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/) ## Android @@ -40,9 +109,9 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Modifications - Description: uwu style -- Copyright Holder: u/6b86b3ac03c167320d93 +- Copyright Holder: [u/6b86b3ac03c167320d93](https://www.reddit.com/user/6b86b3ac03c167320d93) - License: No license, just a reddit post -- [License URL](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) @@ -51,19 +120,18 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre From 62f6903c1f7a1c4de47362012a485deca367702c Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 17:46:58 +0200 Subject: [PATCH 53/81] Moved image instructions to readme file. --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 226a2dc..3168f6f 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,12 @@ make termux_uninstall # uninstall for termux ## Images and copyright info -[IMAGES.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/IMAGES.md) +### How to use images +First at all you need `viu`, to install it follow the [guide](https://github.com/atanunq/viu#installation). +Images are working in almost every terminal, for a better experience i recommend [kitty](https://github.com/kovidgoyal/kitty) -[COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md) +### For copyright and logos info +[COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md) ## License From 42e71237c8d455cabbb98e04fdadd6532f036ee2 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Fri, 2 Apr 2021 17:49:40 +0200 Subject: [PATCH 54/81] Removed IMAGES.md and finished COPYRIGHT.md, close #55. --- res/COPYRIGHT.md | 254 +++++++++++++++++++++++++++++++++++++++++++++-- res/IMAGES.md | 46 --------- 2 files changed, 245 insertions(+), 55 deletions(-) delete mode 100644 res/IMAGES.md diff --git a/res/COPYRIGHT.md b/res/COPYRIGHT.md index 7f8c490..80b49a9 100644 --- a/res/COPYRIGHT.md +++ b/res/COPYRIGHT.md @@ -1,5 +1,7 @@ # Introduction +Int this directory, all the logo images, are stored. + This file contains all copyright info for every image that `uwufetch` uses. If you want to remove *your* image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). I am not a copyright expert, and maybe I am doing all wrong things, please correct this file if you notice something wrong. @@ -22,6 +24,8 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre - License: No license, just a reddit post - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/) +# + ## Artix image @@ -39,6 +43,8 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre - License: No license, just a reddit post - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/) +# + ## Debian image @@ -57,6 +63,7 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre - License: [LGPL3](https://www.gnu.org/licenses/lgpl-3.0.html) - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/) +# ## Endeavour OS @@ -75,6 +82,7 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre - License: No license, just a reddit post - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/) +# ## Fedora @@ -93,31 +101,259 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre - License: [Fedora logo usage guide-lines (I guess)](https://fedoraproject.org/wiki/Logo/UsageGuidelines) - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/) +# + +## Gentoo + +image + +### Base artwork: + +- Copyright Holder: Gentoo Devs +- License: [Gentoo name and logo guide-lines](https://www.gentoo.org/inside-gentoo/foundation/name-logo-guidelines.html) +- [Reference](https://www.gentoo.org/inside-gentoo/artwork/gentoo-logo.html) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/TheSatisfiedPig](https://www.reddit.com/user/TheSatisfiedPig) +- License: [CC-BY-SA/2.5](https://creativecommons.org/licenses/by-sa/2.5/) +- [Reference (reddit)](https://www.reddit.com/r/linuxmasterrace/comments/m11aml/genchu/) +- [Reference (gentoo artwork)](https://wiki.gentoo.org/wiki/Project:Artwork/Artwork#Genchu) + +# + +## Manjaro + +image + +### Base artwork: + +- Copyright Holder: Manjaro GmbH & Co. KG. +- License: [Manjaro terms of use](https://manjaro.org/terms-of-use/) +- [Reference](https://gitlab.manjaro.org/artwork) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/matrixrunner](https://www.reddit.com/user/matrixrunner) +- License: [Manjaro terms of use (I guess, again)](https://manjaro.org/terms-of-use/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxx9h7/myanjawo_also_in_wallpaper/) + +# + +## Linux Mint + +image + +### Base artwork: + +- Copyright Holder: Linux mint Devs +- License: [None (I think)](https://linuxmint.com/faq.php) +- [Reference](https://linuxmint.com/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly8oy0/seen_a_lot_of_people_asking_for_mint_so_here_it_is/) + +# + +## KDE neon + +image + +### Base artwork: + +- Copyright Holder: Jens (kde team) +- License: None +- [Reference](https://community.kde.org/Neon#Logo) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/muff2](https://www.reddit.com/user/muff2) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxt82v/kde_uwon/) + +# + +## NixOS (Nix Snowflake) + +image + +### Base artwork: + +- Copyright Holder: Tim Cuthbertson (@timbertson) +- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) +- [Reference](https://github.com/NixOS/nixos-artwork/tree/master/logo#nixos-logo) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/ant-artica](https://www.reddit.com/user/ant-artica) +- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lzdwl4/nixowos/) + +# + +## OpenSuse + +image + +### Base artwork: + +- Copyright Holder: OpenSuse Devs +- License: [Opensuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) +- [Reference](https://en.opensuse.org/openSUSE:Artwork_brand#Buttons) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/VortexAcherontic](https://www.reddit.com/user/VortexAcherontic) +- License: [OpenSuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/) + +# + +## PopOS + +image + +### Base artwork: + +- Copyright Holder: System76 +- License: [System76 Terms](https://system76.com/terms) +- [Reference](https://pop.system76.com/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/Mochimo786](https://www.reddit.com/user/Mochimo786) +- License: [System76 Terms](https://system76.com/terms) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/) + +# + +## Slackware + +image + +### Base artwork: + +- Copyright Holder: Slackware Devs +- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) +- [Reference](http://www.slackware.com/~msimons/slackware/grfx/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/theldus](https://www.reddit.com/user/theldus) +- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyt6xi/slawckyware/) + +# + +## Solus + +image + +### Base artwork: + +- Copyright Holder: Solus Devs +- License: [Solus brand copyright](https://getsol.us/branding/) +- [Reference](https://getsol.us/home/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/welpelp](https://www.reddit.com/user/welpelp) +- License: [Solus brand copyright](https://getsol.us/branding/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9il3/continuing_the_trend_i_made_sowus_my_first/) + +# + +## Tux + +image + +### Base artwork: + +- Copyright Holder: Linux foundation +- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) +- [Reference](https://www.linux.org/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/Annual-Examination96](https://www.reddit.com/user/Annual-Examination96) +- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/) + +# + +## Ubuntu + +image + +### Base artwork: + +- Copyright Holder: Canonical Ltd +- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) +- [Reference](https://design.ubuntu.com/brand/ubuntu-logo/#:~:text=The%20Ubuntu%20logo%20is%20made,a%20flat%20orange%2Dcoloured%20background.) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/Chicki2D](https://www.reddit.com/user/Chicki2D) +- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lwsnul/uwuntu/) + +# + +## VoidLinux + +image + +### Base artwork: + +- Copyright Holder: VoidLinux Contributors +- License: None +- [Reference](https://voidlinux.org/) + +### Modifications + +- Description: uwu style +- Copyright Holder: [u/Satoqz](https://www.reddit.com/user/Satoqz) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/) + +# + ## Android image -android at the end because it could be not considered as an actual distribution of gnu/linux +Android at the end because it could be not considered as an actual distribution of gnu/linux ### Base artwork: - Copyright Holder: Google Inc. -- License: CC-BY-3.0 -- [License URL](https://creativecommons.org/licenses/by/3.0/) +- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) - [Reference](https://developer.android.com/distribute/marketing-tools/brand-guidelines#android_robot) ### Modifications - Description: uwu style - Copyright Holder: [u/6b86b3ac03c167320d93](https://www.reddit.com/user/6b86b3ac03c167320d93) -- License: No license, just a reddit post +- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) - [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) - - - - diff --git a/res/IMAGES.md b/res/IMAGES.md deleted file mode 100644 index ba43497..0000000 --- a/res/IMAGES.md +++ /dev/null @@ -1,46 +0,0 @@ -# Image logos - -Int this directory, all the images for the logos, are stored. For copyright info read [COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/blob/main/res/COPYRIGHT.md) - -## How to use images - -First at all you need `viu`, to install it follow the [guide](https://github.com/atanunq/viu#installation). -Images are working in almost every terminal, for a better experience i recommend [kitty](https://github.com/kovidgoyal/kitty) - -## Credits - -image Nyarch Linuwu by u/Ishaan_P ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/)) - -image Nyartix Linuwu by u/akzcake ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/)) - -image Debinyan by u/Ishaan_P ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/)) - -image Endowo Os by u/zuru2003 ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/)) - -image Fedowa by u/iD3nis124 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/)) - -image GentOwO by u/TheSatisfiedPig ([here](https://www.reddit.com/r/linuxmasterrace/comments/m11aml/genchu/)) - -image Myanjawo by u/matrixrunner ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxx9h7/myanjawo_also_in_wallpaper/)) - -image Miwint by u/iD3nis124 ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly8oy0/seen_a_lot_of_people_asking_for_mint_so_here_it_is/)) - -image KDE Uwon by u/muff2 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxt82v/kde_uwon/)) - -image NwnixOS by u/ant-artica ([here](https://www.reddit.com/r/linuxmasterrace/comments/lzdwl4/nixowos/)) - -image OwOsuse by u/VortexAcherontic ([here](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/)) - -image Pop UwUs by u/Mochimo786 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/)) - -image Slawkyware by u/theldus ([here](https://www.reddit.com/r/linuxmasterrace/comments/lyt6xi/slawckyware/)) - -image Sowus by u/welpelp ([here](https://www.reddit.com/r/linuxmasterrace/comments/ly9il3/continuing_the_trend_i_made_sowus_my_first/)) - -image Tuwu by u/Annual-Examination96 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/)) - -image Uwuntu by u/Chicki2D ([here](https://www.reddit.com/r/linuxmasterrace/comments/lwsnul/uwuntu/)) - -image Owoid by u/Satoqz ([here](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/)) - -image Nyandroid by u/6b86b3ac03c167320d93 ([here](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/)) (android at the end because it could be not considered as an actual distribution of gnu/linux) From ebd6b609e75ba788a51aaa5e408376f35b8596c2 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sat, 3 Apr 2021 23:04:27 +0200 Subject: [PATCH 55/81] Updated help message because now --opt works, fixed too high info printing with image option. --- uwufetch.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index d382ef2..4907281 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -439,6 +439,7 @@ void print_image() { // prints logo (as an image) of the given system. distribut if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); } + printf( "\n"); if (system(command) != 0) { // if viu is not installed or the image is missing printf( "\033[0E\033[3C%s\n" " There was an\n" @@ -459,12 +460,9 @@ void usage(char* arg) { " -h, --help prints this help page\n" " -i, --image prints logo as image\n" " %sworks in most terminals\n" - " read res/IMAGES.md for more info%s\n" - " -l lists all supported distributions\n" - " %sNote that the long options (--opt) are currently not working\n" - " If you are reading this and you know how to implement long opts,\n" - " send a pull request on https://github.com/TheDarkBug/uwufetch%s\n", - arg, BLUE, NORMAL, RED, NORMAL); + " read README.md for more info%s\n" + " -l lists all supported distributions\n", + arg, BLUE, NORMAL); } void uwu_name() { // changes distro name to uwufied(?) name From cf137e4155143ef795060e53aff56bc459527717 Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Sun, 4 Apr 2021 18:48:04 -0300 Subject: [PATCH 56/81] Fixes 0MB ram usage --- uwufetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uwufetch.c b/uwufetch.c index 4907281..e346a2c 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -224,7 +224,7 @@ void get_info() { // get all necessary info FILE *meminfo; - meminfo = popen("free 2> /dev/null", "r"); + meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); while (fgets(line, sizeof(line), meminfo)) { // free command prints like this: "Mem:" total used free shared buff/cache available From e923244c97d7478ede23a2fb850bc314f060a3fe Mon Sep 17 00:00:00 2001 From: Emily <36363495+em1lyy@users.noreply.github.com> Date: Tue, 6 Apr 2021 14:43:34 +0200 Subject: [PATCH 57/81] improve Makefile This commit improves various aspects of the Makefile, namely: - it re-formats the variables at the beginning of the file - it renames INSTALL_DIR to PREFIX as it is convention - it removes the previously required trailing slash from PREFIX as it is convention - it introduces the CC variable to be portable on systems with another cc instead of gcc - it makes make uninstall not fail when the program is already uninstalled - it makes make build depend on all FILES, not just uwufetch.c - it renames FLAGS and FLAGS_DEBUG to CFLAGS and CFLAGS_DEBUG to allow later introduction of LDFLAGS - it allows specification of the DESTDIR standard Makefile variable to allow binary distributions of uwufetch --- Makefile | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index a98c909..867f168 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,32 @@ -NAME = uwufetch -FILES = uwufetch.c -FLAGS = -O3 -FLAGS_DEBUG = -Wall -Wextra -INSTALL_DIR = /usr/bin/ +NAME = uwufetch +FILES = uwufetch.c +CFLAGS = -O3 +CFLAGS_DEBUG = -Wall -Wextra +PREFIX = /usr/bin +CC = cc -build: uwufetch.c - gcc $(FLAGS) -o $(NAME) $(FILES) +build: $(FILES) + $(CC) $(CFLAGS) -o $(NAME) $(FILES) debug: @clear - gcc $(FLAGS_DEBUG) -o $(NAME) $(FILES) + $(CC) $(CFLAGS_DEBUG) -o $(NAME) $(FILES) ./uwufetch install: - cp $(NAME) $(INSTALL_DIR)$(NAME) - ls /usr/lib/uwufetch/ 2> /dev/null || mkdir /usr/lib/uwufetch/ - cp res/* /usr/lib/uwufetch/ + cp $(NAME) $(DESTDIR)$(INSTALL_DIR)/$(NAME) + ls $(DESTDIR)/usr/lib/uwufetch/ 2> /dev/null || mkdir $(DESTDIR)/usr/lib/uwufetch/ + cp res/* $(DESTDIR)/usr/lib/uwufetch/ uninstall: - rm $(INSTALL_DIR)$(NAME) - rm -rf /usr/lib/uwufetch/ + rm -f $(DESTDIR)$(INSTALL_DIR)/$(NAME) + rm -rf $(DESTDIR)/usr/lib/uwufetch/ termux: build - cp $(NAME) /data/data/com.termux/files$(INSTALL_DIR)$(NAME) - ls /data/data/com.termux/files/usr/lib/uwufetch/ > /dev/null || mkdir /data/data/com.termux/files/usr/lib/uwufetch/ + cp $(NAME) $(DESTDIR)/data/data/com.termux/files$(INSTALL_DIR)/$(NAME) + ls $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ > /dev/null || mkdir $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ cp res/* /data/data/com.termux/files/usr/lib/uwufetch/ - + termux_uninstall: - rm -rf /data/data/com.termux/files$(INSTALL_DIR)$(NAME) - rm -rf /data/data/com.termux/files/usr/lib/uwufetch/ + rm -rf $(DESTDIR)/data/data/com.termux/files$(INSTALL_DIR)/$(NAME) + rm -rf $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ From 5ad00b16c8c2a0aa52a12aafe7c5064e85e5fde8 Mon Sep 17 00:00:00 2001 From: Emily <36363495+em1lyy@users.noreply.github.com> Date: Tue, 6 Apr 2021 15:56:09 +0200 Subject: [PATCH 58/81] Make Codestyle consistent When more and more people started contributing to uwufetch, consistent codestyle was quickly lost. Some people used tabs, some people used spaces. Even brace style was different for different contributors. This patch makes the codystyle consistent again, using the codestyle used by TheDarkBug on commit f12c1be5fefa1b9e596cf721e173de6f208522d1 because this was the last commit where TheDarkBug was the only contributor. Commands used: - indent -kr -slc -br -brf -brs -i4 -cli4 uwufetch.c - some emacs macros --- uwufetch.c | 882 ++++++++++++++++++++++++++--------------------------- 1 file changed, 436 insertions(+), 446 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index e346a2c..5e0868a 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -24,28 +24,35 @@ #include // COLORS -#define NORMAL "\x1b[0m" -#define BOLD "\x1b[1m" -#define BLACK "\x1b[30m" -#define RED "\x1b[31m" -#define GREEN "\x1b[32m" -#define YELLOW "\x1b[33m" -#define BLUE "\x1b[34m" +#define NORMAL "\x1b[0m" +#define BOLD "\x1b[1m" +#define BLACK "\x1b[30m" +#define RED "\x1b[31m" +#define GREEN "\x1b[32m" +#define YELLOW "\x1b[33m" +#define BLUE "\x1b[34m" #define MAGENTA "\x1b[0;35m" -#define CYAN "\x1b[36m" -#define WHITE "\x1b[37m" -#define PINK "\x1b[38;5;201m" -#define LPINK "\x1b[38;5;213m" +#define CYAN "\x1b[36m" +#define WHITE "\x1b[37m" +#define PINK "\x1b[38;5;201m" +#define LPINK "\x1b[38;5;213m" + +struct package_manager { + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager +}; struct utsname sys_var; struct sysinfo sys; struct winsize win; -// all possible ram values obtainable with free command +// all possible ram values obtainable with free command int ram_total, ram_used = 0; -// initialise the variables to store data, gpu array can hold up to 8 gpus +// initialise the variables to store data, gpu array can hold up to 8 gpus int pkgs, a_i_flag = 0, target_width = 0; -char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'},{'0'}}, pkgman_name[64], image_name[32]; +char user[32], host[256], shell[64], version_name[64], cpu_model[256], + gpu_model[8][256] = { { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' } }, + pkgman_name[64], image_name[32]; int pkgman(); void get_info(); @@ -53,479 +60,462 @@ void list(); void print_ascii(); void print_info(); void print_image(); -void usage(char*); +void usage(char *); void uwu_name(); -void truncate_name(char*); -void remove_brackets(char*); +void truncate_name(char *); +void remove_brackets(char *); int main(int argc, char *argv[]) { - int opt = 0; - static struct option long_options[] = { - {"ascii", no_argument, NULL, 'a'}, - {"custom", required_argument, NULL, 'c'}, - {"distro", required_argument, NULL, 'd'}, - {"help", no_argument, NULL, 'h'}, - {"image", no_argument, NULL, 'i'}, - {"list", no_argument, NULL, 'l'}, - {NULL, 0, NULL, 0} - }; - get_info(); - while((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { - switch(opt) { - case 'a': - a_i_flag = 0; - break; - case 'c': - a_i_flag = 1; - sprintf(image_name, "%s", optarg); - break; - case 'd': - if (optarg) sprintf(version_name, "%s", optarg); - break; - case 'h': - usage(argv[0]); - return 0; - case 'i': - a_i_flag = 1; - break; - case 'l': - list(argv[0]); - return 0; - default: - break; - } - } - if (argc == 1 || a_i_flag == 0) print_ascii(); - else if (a_i_flag) print_image(); - uwu_name(); - print_info(); + int opt = 0; + static struct option long_options[] = { + { "ascii", no_argument, NULL, 'a' }, + { "custom", required_argument, NULL, 'c' }, + { "distro", required_argument, NULL, 'd' }, + { "help", no_argument, NULL, 'h' }, + { "image", no_argument, NULL, 'i' }, + { "list", no_argument, NULL, 'l' }, + { NULL, 0, NULL, 0 } + }; + get_info(); + while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { + switch (opt) { + case 'a': + a_i_flag = 0; + break; + case 'c': + a_i_flag = 1; + sprintf(image_name, "%s", optarg); + break; + case 'd': + if (optarg) sprintf(version_name, "%s", optarg); + break; + case 'h': + usage(argv[0]); + return 0; + case 'i': + a_i_flag = 1; + break; + case 'l': + list(argv[0]); + return 0; + default: + break; + } + } + if (argc == 1 || a_i_flag == 0) print_ascii(); + else if (a_i_flag) print_image(); + uwu_name(); + print_info(); } int pkgman() { // this is just a function that returns the total of installed packages - int total = 0; + int total = 0; - // TODO: should this be at the top of the program? maybe in a config.c file? - // TODO: do we need to `free()` this? I have no idea how to do memory management in C... - struct package_manager { - char command_string[128]; // command to get number of packages installed - char pkgman_name[16]; // name of the package manager - }; + struct package_manager pkgmans[] = { + { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, + { "apk info 2> /dev/null | wc -l", "(apk)" }, + { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, + { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, + { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, + { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, + { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, + { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, + { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, + { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } + }; - struct package_manager pkgmans[] = { - { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, - { "apk info 2> /dev/null | wc -l", "(apk)" }, - { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, - { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, - { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, - { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, - { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, - { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, - { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, - { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } - }; + const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); + for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare + struct package_manager *current = &pkgmans[i]; - for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare - struct package_manager *current = &pkgmans[i]; + FILE *fp = popen(current->command_string, "r"); + unsigned int pkg_count; - FILE *fp = popen(current->command_string, "r"); - unsigned int pkg_count; + if (fscanf(fp, "%u", &pkg_count) == 3) continue; + fclose(fp); - if (fscanf(fp, "%u", &pkg_count) == 3) continue; - fclose(fp); - - total += pkg_count; - if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); - } - return total; + total += pkg_count; + if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); + } + return total; } -void print_info() { - // print collected info - from host to cpu info - printf( "\033[9A\033[18C%s%s%s@%s\n", - NORMAL, BOLD, user, host); - printf( "\033[18C%s%sOWOS %s%s\n", - NORMAL, BOLD, NORMAL, version_name); - printf( "\033[18C%s%sKEWNEL %s%s %s\n", - NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); - printf( "\033[18C%s%sCPUWU %s%s\n", - NORMAL, BOLD, NORMAL, cpu_model); +void print_info() { + // print collected info - from host to cpu info + printf("\033[9A\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); + printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); + printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); + printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); - // print the gpus - int gpu_iter = 0; - while(gpu_model[gpu_iter][0] != '0') { - printf( "\033[18C%s%sGPUWU %s%s\n", - NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); - gpu_iter++; - } + // print the gpus + int gpu_iter = 0; + while (gpu_model[gpu_iter][0] != '0') { + printf("\033[18C%s%sGPUWU %s%s\n", NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); + gpu_iter++; + } - // print ram to uptime and colors - printf("\033[18C%s%sWAM %s%i MB/%i MB\n", - NORMAL, BOLD, NORMAL, (ram_used), ram_total); - printf("\033[18C%s%sSHELL %s%s\n", - NORMAL, BOLD, NORMAL, shell); - printf("\033[18C%s%sPKGS %s%s%d %s\n", - NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); - printf("\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n", - NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime/60/60, sys.uptime/60%60); - printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", - BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); + // print ram to uptime and colors + printf("\033[18C%s%sWAM %s%i MB/%i MB\n", NORMAL, BOLD, NORMAL, (ram_used), ram_total); + printf("\033[18C%s%sSHELL %s%s\n", NORMAL, BOLD, NORMAL, shell); + printf("\033[18C%s%sPKGS %s%s%d %s\n", NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); + printf("\033[18C%s%sUWUPTIME %s" /*"%lid, " */ "%lih, %lim\n", NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24, */ sys.uptime / 60 / 60, sys.uptime / 60 % 60); + printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); } -void get_info() { // get all necessary info - char line[256]; // var to scan file lines +void get_info() { // get all necessary info + char line[256]; // var to scan file lines - // terminal width - // used to truncate long names - ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); - target_width = win.ws_col - 28; + // terminal width + // used to truncate long names + ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); + target_width = win.ws_col - 28; - // os version - FILE *os_release = fopen("/etc/os-release", "r"); - FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); - if (os_release) { // get normal vars - while (fgets(line, sizeof(line), os_release)) if (sscanf(line, "\nID=%s", version_name)) break; - while (fgets(line, sizeof(line), cpuinfo)) if (sscanf(line, "model name : %[^\n]", cpu_model)) break; - sprintf(user, "%s", getenv("USER")); - fclose(os_release); - } else { // try for android vars, or unknown system - DIR *system_app = opendir("/system/app/"); - DIR *system_priv_app = opendir("/system/priv-app/"); - if (system_app && system_priv_app) { // android - closedir(system_app); - closedir(system_priv_app); - sprintf(version_name, "android"); - // android vars - FILE *whoami = popen("whoami", "r"); - if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); - fclose(whoami); - while (fgets(line, sizeof(line), cpuinfo)) if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; - } else sprintf(version_name, "unknown"); - } - fclose(cpuinfo); - gethostname(host, 256); - sscanf(getenv("SHELL"), "%s", shell); - if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux + // os version + FILE *os_release = fopen("/etc/os-release", "r"); + FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); + if (os_release) { // get normal vars + while (fgets(line, sizeof(line), os_release)) + if (sscanf(line, "\nID=%s", version_name)) break; + while (fgets(line, sizeof(line), cpuinfo)) + if (sscanf(line, "model name : %[^\n]", cpu_model)) break; + sprintf(user, "%s", getenv("USER")); + fclose(os_release); + } else { // try for android vars, or unknown system + DIR *system_app = opendir("/system/app/"); + DIR *system_priv_app = opendir("/system/priv-app/"); + if (system_app && system_priv_app) { // android + closedir(system_app); + closedir(system_priv_app); + sprintf(version_name, "android"); + // android vars + FILE *whoami = popen("whoami", "r"); + if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); + fclose(whoami); + while (fgets(line, sizeof(line), cpuinfo)) + if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; + } else { + sprintf(version_name, "unknown"); + } + } + fclose(cpuinfo); + gethostname(host, 256); + sscanf(getenv("SHELL"), "%s", shell); + if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux - // truncate CPU name - truncate_name(cpu_model); + // truncate CPU name + truncate_name(cpu_model); - // system resources - uname(&sys_var); - sysinfo(&sys); + // system resources + uname(&sys_var); + sysinfo(&sys); - truncate_name(sys_var.release); - truncate_name(sys_var.machine); + truncate_name(sys_var.release); + truncate_name(sys_var.machine); - // ram + // ram + FILE *meminfo; + meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); + while (fgets(line, sizeof(line), meminfo)) { + // free command prints like this: "Mem:" total used free shared buff/cache available + if (sscanf(line, "Mem: %d %d", &ram_total, &ram_used)) { + // convert to megabytes + if (ram_total > 0 && ram_used > 0) { + // data is in bytes + ram_total /= 1024; + ram_used /= 1024; + break; + } + } + } + fclose(meminfo); - FILE *meminfo; - - meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); - while (fgets(line, sizeof(line), meminfo)) { - // free command prints like this: "Mem:" total used free shared buff/cache available - - if(sscanf(line, "Mem: %d %d", &ram_total, &ram_used)){ - // convert to megabytes - if (ram_total > 0 && ram_used > 0) { - // data is in bytes - ram_total /= 1024; - ram_used /= 1024; - break; - } - } - } - fclose(meminfo); + // gpu + int gpun = 0; // number of the gpu that the program is searching for to put in the array + setenv("LANG", "en_US", 1); // force language to english + FILE *gpu; + gpu = popen("lshw -class display 2> /dev/null", "r"); - // gpu - int gpun = 0; // number of the gpu that the program is searching for to put in the array - setenv("LANG", "en_US", 1); // force language to english - FILE *gpu; - gpu = popen("lshw -class display 2> /dev/null", "r"); + // add all gpus to the array gpu_model (up to 8 gpus) + while (fgets(line, sizeof(line), gpu)) + if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) + gpun++; - // add all gpus to the array gpu_model (up to 8 gpus) - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; + if (strlen(gpu_model[0]) < 2) { + // get gpus with lspci command + if (strcmp(version_name, "android") != 0) { + gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + } else { + gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); + } + } - if (strlen(gpu_model[0]) < 2) { - // get gpus with lspci command - if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); - else gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); - - // get all the gpus - while (fgets(line, sizeof(line), gpu)) if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; - } - fclose(gpu); - - // truncate GPU name and remove square brackets - for(int i = 0; i < gpun; i++) { - remove_brackets(gpu_model[i]); - truncate_name(gpu_model[i]); - } + // get all the gpus + while (fgets(line, sizeof(line), gpu)) { + if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; + } + fclose(gpu); - pkgs = pkgman(); + // truncate GPU name and remove square brackets + for (int i = 0; i < gpun; i++) { + remove_brackets(gpu_model[i]); + truncate_name(gpu_model[i]); + } + + pkgs = pkgman(); } -void list(char* arg) { // prints distribution list - /* distributions are listed by distribution branch - to make the output easier to understand by the user.*/ - printf( "%s -d \n" - " Available distributions:\n" - " %sArch linux %sbased:\n" - " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" - " %sDebian/%sUbuntu %sbased:\n" - " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" - " %sOther/spare distributions:\n" - " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" - " %sBSD:\n" - " freebsd, %sopenbsd\n", - arg, BLUE, NORMAL, BLUE, GREEN, // Arch based colors - RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors - NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors - RED, YELLOW); // BSD colors +void list(char *arg) { // prints distribution list + // distributions are listed by distribution branch + // to make the output easier to understand by the user. + printf("%s -d \n" " Available distributions:\n" " %sArch linux %sbased:\n" " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" " %sDebian/%sUbuntu %sbased:\n" " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" " %sOther/spare distributions:\n" " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" " %sBSD:\n" " freebsd, %sopenbsd\n", arg, + BLUE, NORMAL, BLUE, GREEN, // Arch based colors + RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors + NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors + RED, YELLOW); // BSD colors } -void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. - - // linux +void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. - if (strcmp(version_name, "alpine") == 0) { - printf("\033[2E\033[4C%s. .___.\n" - " / \\/ \\ /\n" - " /OwO\\ɛU\\/ __\n" - " / \\ \\__/ \\\n" - "/ \\ \\\n\n\n", BLUE); - } else if (strcmp(version_name, "arch") == 0) { - printf( "\033[1E\033[8C%s/\\\n" - " / \\\n" - " /\\ \\\n" - " / > w <\\\n" - " / __ \\\n" - " / __| |__-\\\n" - " /_-'' ''-_\\\n\n", BLUE); - } else if (strcmp(version_name, "artix") == 0) { - printf( "\033[1E\033[8C%s/\\\n" - " / \\\n" - " /`'.,\\\n" - " /\u2022 w \u2022 \\\n" - " / ,`\\\n" - " / ,.'`. \\\n" - " /.,'` `'.\\\n\n", BLUE); - } else if (strcmp(version_name, "debian") == 0) { - printf( "\033[1E\033[6C%s______\n" - " / ___ \\\n" - " | / OwO |\n" - " | \\____-\n" - " -_\n" - " --_\n\n\n", RED); - } else if (strcmp(version_name, "fedora") == 0) { - printf( "\033[1E\033[8C%s_____\n" - " / __)%s\\\n" - " %s> %s| / %s<%s\\ \\\n" - " __%s_| %sw%s|_%s_/ /\n" - " / %s(_ _)%s_/\n" - " / / %s| |\n" - " %s\\ \\%s__/ |\n" - " %s\\%s(_____/\n", BLUE, CYAN, WHITE, BLUE, WHITE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE); - } else if (strcmp(version_name, "gentoo") == 0) { - printf( "\033[1E\033[3C%s_-----_\n" - " ( \\\n" - " \\ OwO \\\n" - "%s \\ )\n" - " / _/\n" - " ( _-\n" - " \\____-\n\n", MAGENTA, WHITE); - } else if (strcmp(version_name, "manjaro") == 0) { - printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "\"manjaro-arm\"") == 0) { - printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "linuxmint") == 0) { - printf( "\033[2E\033[4C%s__/\\____/\\.\n" - " |%s.--. %s|\n" - " %s, %s¯| %s| UwU| %s|\n" - " %s|| %s| %s| | %s|\n" - " %s | %s| %s---- %s|\n" - " %s --%s'--------'\n\n",GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { - printf("\033[3E\033[3C%s|\\----/|\n" - " _ / %sO O%s\\\n" - " __. W /\n" - " '----'\n\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "pop") == 0) { - printf("\033[2E\033[6C%s|\\.-----./|\n" - " |/ \\|\n" - " | > < |\n" - " | %s~ %sP! %s~ %s|\n" - "_ ---\\ w /\n" - " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); - } else if (strcmp(version_name, "raspbian") == 0) { - printf("\033[0E\033[6C%s__ __\n" - " (_\\)(/_)\n" - " %s(>(__)<)\n" - " (_(_)(_)_)\n" - " (_(__)_)\n" - " (__)\n\n\n", GREEN, RED); - } else if (strcmp(version_name, "ubuntu") == 0) { - printf( "\033[1E\033[9C%s_\n" - " %s\u25E3%s__(_)%s\u25E2%s\n" - " _/ --- \\\n" - " (_) |>w<| |\n" - " \\ --- _/\n" - " %sC__/%s---(_)\n\n\n", LPINK, PINK, LPINK, PINK, LPINK, PINK, LPINK); - } else if (strcmp(version_name, "\"void\"") == 0){ - printf("\033[2E\033[2C%s |\\_____/|\n" - " _\\____ |\n" - " | \\ \\ |\n" - " | | %s\u00d2w\u00d3 %s| | ,\n" - " | \\_____\\_|-, |\n" - " -_______\\ \\_/\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "android") == 0) { // android at the end because it could be not considered as an actual distribution of gnu/linux - printf( "\033[2E\033[3C%s\\ _------_ /\n" - " / \\\n" - " | %s~ %s> w < %s~ %s|\n" - " ------------\n\n\n\n", GREEN, RED, GREEN, RED, GREEN); + // linux + if (strcmp(version_name, "alpine") == 0) { + printf("\033[2E\033[4C%s. .___.\n" + " / \\/ \\ /\n" + " /OwO\\ɛU\\/ __\n" + " / \\ \\__/ \\\n" "/ \\ \\\n\n\n", BLUE); + } else if (strcmp(version_name, "arch") == 0) { + printf("\033[1E\033[8C%s/\\\n" + " / \\\n" + " /\\ \\\n" + " / > w <\\\n" + " / __ \\\n" + " / __| |__-\\\n" " /_-'' ''-_\\\n\n", BLUE); + } else if (strcmp(version_name, "artix") == 0) { + printf("\033[1E\033[8C%s/\\\n" + " / \\\n" + " /`'.,\\\n" + " /\u2022 w \u2022 \\\n" + " / ,`\\\n" + " / ,.'`. \\\n" " /.,'` `'.\\\n\n", BLUE); + } else if (strcmp(version_name, "debian") == 0) { + printf("\033[1E\033[6C%s______\n" + " / ___ \\\n" + " | / OwO |\n" + " | \\____-\n" " -_\n" " --_\n\n\n", RED); + } else if (strcmp(version_name, "fedora") == 0) { + printf("\033[1E\033[8C%s_____\n" + " / __)%s\\\n" + " %s> %s| / %s<%s\\ \\\n" + " __%s_| %sw%s|_%s_/ /\n" + " / %s(_ _)%s_/\n" + " / / %s| |\n" + " %s\\ \\%s__/ |\n" + " %s\\%s(_____/\n", BLUE, CYAN, WHITE, BLUE, WHITE, CYAN, + BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, + BLUE); + } else if (strcmp(version_name, "gentoo") == 0) { + printf("\033[1E\033[3C%s_-----_\n" + " ( \\\n" + " \\ OwO \\\n" + "%s \\ )\n" + " / _/\n" + " ( _-\n" " \\____-\n\n", MAGENTA, WHITE); + } else if (strcmp(version_name, "manjaro") == 0) { + printf + ("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } else if (strcmp(version_name, "\"manjaro-arm\"") == 0) { + printf + ("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } else if (strcmp(version_name, "linuxmint") == 0) { + printf("\033[2E\033[4C%s__/\\____/\\.\n" + " |%s.--. %s|\n" + " %s, %s¯| %s| UwU| %s|\n" + " %s|| %s| %s| | %s|\n" + " %s | %s| %s---- %s|\n" + " %s --%s'--------'\n\n", GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 + || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { + printf("\033[3E\033[3C%s|\\----/|\n" " _ / %sO O%s\\\n" + " __. W /\n" " '----'\n\n\n", GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "pop") == 0) { + printf("\033[2E\033[6C%s|\\.-----./|\n" + " |/ \\|\n" + " | > < |\n" + " | %s~ %sP! %s~ %s|\n" + "_ ---\\ w /\n" + " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); + } else if (strcmp(version_name, "raspbian") == 0) { + printf("\033[0E\033[6C%s__ __\n" + " (_\\)(/_)\n" + " %s(>(__)<)\n" + " (_(_)(_)_)\n" + " (_(__)_)\n" " (__)\n\n\n", GREEN, RED); + } else if (strcmp(version_name, "ubuntu") == 0) { + printf("\033[1E\033[9C%s_\n" + " %s\u25E3%s__(_)%s\u25E2%s\n" + " _/ --- \\\n" + " (_) |>w<| |\n" + " \\ --- _/\n" + " %sC__/%s---(_)\n\n\n", LPINK, PINK, LPINK, PINK, LPINK, + PINK, LPINK); + } else if (strcmp(version_name, "\"void\"") == 0) { + printf("\033[2E\033[2C%s |\\_____/|\n" + " _\\____ |\n" + " | \\ \\ |\n" + " | | %s\u00d2w\u00d3 %s| | ,\n" + " | \\_____\\_|-, |\n" + " -_______\\ \\_/\n\n", GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "android") == 0) { // android at the end because it could be not considered as an actual distribution of gnu/linux + printf("\033[2E\033[3C%s\\ _------_ /\n" + " / \\\n" + " | %s~ %s> w < %s~ %s|\n" + " ------------\n\n\n\n", GREEN, RED, GREEN, RED, GREEN); - } + } - // BSD - else if (strcmp(version_name, "freebsd") == 0) { - printf( "\033[2E\033[1C%s/\\,-'''''-,/\\\n" - " \\_) (_/\n" - " | \\ / |\n" - " | O w O |\n" - " ; ;\n" - " '-_____-'\n\n", RED); + // BSD + else if (strcmp(version_name, "freebsd") == 0) { + printf("\033[2E\033[1C%s/\\,-'''''-,/\\\n" + " \\_) (_/\n" + " | \\ / |\n" + " | O w O |\n" + " ; ;\n" " '-_____-'\n\n", RED); - } else if (strcmp(version_name, "openbsd") == 0) { - printf( "\033[1E\033[3C%s ______ \n" - " \\- -/ %s\u2665 \n" - "%s\\_/ \\ \n" - "| %s> < %s| \n" - "|_ < %s// %sW %s// \n" - "%s/ \\ / \n" - " /-________-\\ \n\n", YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); + } else if (strcmp(version_name, "openbsd") == 0) { + printf("\033[1E\033[3C%s ______ \n" + " \\- -/ %s\u2665 \n" + "%s\\_/ \\ \n" + "| %s> < %s| \n" + "|_ < %s// %sW %s// \n" + "%s/ \\ / \n" + " /-________-\\ \n\n", YELLOW, RED, YELLOW, WHITE, + YELLOW, LPINK, WHITE, LPINK, YELLOW); - } + } - else printf( "\033[0E\033[2C%s._.--._.\n" - " \\|>%s_%s< |/\n" - " |%s:_/%s |\n" - " // \\ \\ ?\n" - " (| | ) /\n" - " %s/'\\_ _/`\\%s-\n" - " %s\\___)=(___/\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); + // everything else + else printf("\033[0E\033[2C%s._.--._.\n" + " \\|>%s_%s< |/\n" + " |%s:_/%s |\n" + " // \\ \\ ?\n" + " (| | ) /\n" + " %s/'\\_ _/`\\%s-\n" + " %s\\___)=(___/\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, + YELLOW, WHITE, YELLOW); } -void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. - char command[256]; - if (strlen(image_name) > 1) sprintf(command, "viu -t -w 18 -h 8 %s 2> /dev/null", image_name); - else { - if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); - else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); - } - printf( "\n"); - if (system(command) != 0) { // if viu is not installed or the image is missing - printf( "\033[0E\033[3C%s\n" - " There was an\n" - " error: viu\n" - " is not installed\n" - " or the image\n" - " is not fount\n" - " Read IMAGES.md\n" - " for more info.\n\n", RED); - } -} - -void usage(char* arg) { - printf("Usage: %s \n" - " -a, --ascii prints logo as ascii text (default)\n" - " -c, --custom choose a custom image\n" - " -d, --distro lets you choose the logo to print\n" - " -h, --help prints this help page\n" - " -i, --image prints logo as image\n" - " %sworks in most terminals\n" - " read README.md for more info%s\n" - " -l lists all supported distributions\n", - arg, BLUE, NORMAL); -} - -void uwu_name() { // changes distro name to uwufied(?) name - - #define STRING_TO_UWU(original, uwufied) if (strcmp(version_name, original) == 0) sprintf(version_name, "%s", uwufied) - // linux - STRING_TO_UWU("alpine", "Nyalpine"); - else STRING_TO_UWU("arch", "Nyarch Linuwu"); - else STRING_TO_UWU("artix", "Nyartix Linuwu"); - else STRING_TO_UWU("debian", "Debinyan"); - else STRING_TO_UWU("endeavour", "endeavOwO"); - else STRING_TO_UWU("fedora", "Fedowa"); - else STRING_TO_UWU("gentoo", "GentOwO"); - else STRING_TO_UWU("guix", "gnUwU gUwUix"); - else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); - else STRING_TO_UWU("manjaro", "Myanjawo"); - else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); - else STRING_TO_UWU("neon", "KDE NeOwOn"); - else STRING_TO_UWU("nixos", "nixOwOs"); - else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE Leap"); - else STRING_TO_UWU("\"opensuse-tumbleweed\"", "OwOpenSUSE Tumbleweed"); - else STRING_TO_UWU("pop", "PopOwOS"); - else STRING_TO_UWU("raspbian", "RaspNyan"); - else STRING_TO_UWU("slackware", "Swackwawe"); - else STRING_TO_UWU("solus", "sOwOlus"); - else STRING_TO_UWU("ubuntu", "Uwuntu"); - else STRING_TO_UWU("\"void\"", "OwOid"); - else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux - - // BSD - else STRING_TO_UWU("freebsd", "FweeBSD"); - else STRING_TO_UWU("openbsd", "OwOpenBSD"); - - - else { - sprintf(version_name, "%s", "unknown"); - if (a_i_flag == 1) { - print_image(); - printf("\n"); - } - } - #undef STRING_TO_UWU -} - -void truncate_name(char* name) { - for (int i = target_width; i < 256; i++) { - name[i] = '\0'; - } -} - -// remove square brackets (for gpu names) -void remove_brackets(char *str) -{ - int i,j; - i = 0; - while(i < (int)strlen(str)) - { - if (str[i] == '[' || str[i] == ']') - { - for (j = i; j < (int)strlen(str); j++) - { - str[j] = str[j+1]; - } - } else i++; +void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. + char command[256]; + if (strlen(image_name) > 1) { + sprintf(command, "viu -t -w 18 -h 8 %s 2> /dev/null", image_name); + } else { + if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + } + printf("\n"); + if (system(command) != 0) { // if viu is not installed or the image is missing + printf("\033[0E\033[3C%s\n" + " There was an\n" + " error: viu\n" + " is not installed\n" + " or the image\n" + " is not fount\n" + " Read IMAGES.md\n" " for more info.\n\n", RED); + } +} + +void usage(char *arg) { + printf("Usage: %s \n" + " -a, --ascii prints logo as ascii text (default)\n" + " -c, --custom choose a custom image\n" + " -d, --distro lets you choose the logo to print\n" + " -h, --help prints this help page\n" + " -i, --image prints logo as image\n" + " %sworks in most terminals\n" + " read README.md for more info%s\n" + " -l lists all supported distributions\n", + arg, BLUE, NORMAL); +} + +void uwu_name() { // changes distro name to uwufied(?) name + +#define STRING_TO_UWU(original, uwufied) if (strcmp(version_name, original) == 0) sprintf(version_name, "%s", uwufied) + + // linux + STRING_TO_UWU("alpine", "Nyalpine"); + else STRING_TO_UWU("arch", "Nyarch Linuwu"); + else STRING_TO_UWU("artix", "Nyartix Linuwu"); + else STRING_TO_UWU("debian", "Debinyan"); + else STRING_TO_UWU("endeavour", "endeavOwO"); + else STRING_TO_UWU("fedora", "Fedowa"); + else STRING_TO_UWU("gentoo", "GentOwO"); + else STRING_TO_UWU("guix", "gnUwU gUwUix"); + else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); + else STRING_TO_UWU("manjaro", "Myanjawo"); + else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); + else STRING_TO_UWU("neon", "KDE NeOwOn"); + else STRING_TO_UWU("nixos", "nixOwOs"); + else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE Leap"); + else STRING_TO_UWU("\"opensuse-tumbleweed\"", "OwOpenSUSE Tumbleweed"); + else STRING_TO_UWU("pop", "PopOwOS"); + else STRING_TO_UWU("raspbian", "RaspNyan"); + else STRING_TO_UWU("slackware", "Swackwawe"); + else STRING_TO_UWU("solus", "sOwOlus"); + else STRING_TO_UWU("ubuntu", "Uwuntu"); + else STRING_TO_UWU("\"void\"", "OwOid"); + else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux + + // BSD + else STRING_TO_UWU + ("freebsd", "FweeBSD"); + else STRING_TO_UWU + ("openbsd", "OwOpenBSD"); + + + else { + sprintf(version_name, "%s", "unknown"); + if (a_i_flag == 1) { + print_image(); + printf("\n"); + } + } +#undef STRING_TO_UWU +} + +void truncate_name(char *name) { + for (int i = target_width; i < 256; i++) { + name[i] = '\0'; + } +} + +// remove square brackets (for gpu names) +void remove_brackets(char *str) { + int i = 0, j; + while (i < (int) strlen(str)) { + if (str[i] == '[' || str[i] == ']') { + for (j = i; j < (int) strlen(str); j++) { + str[j] = str[j + 1]; + } + } else { + i++; + } } } From 554b9fefae25abe11b6153a912a99b6732c7cd19 Mon Sep 17 00:00:00 2001 From: dqnk Date: Wed, 7 Apr 2021 13:17:29 +0200 Subject: [PATCH 59/81] fixed issue with sys.uptime being printed as 0 --- uwufetch.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uwufetch.c b/uwufetch.c index e346a2c..f0427a4 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -143,6 +143,8 @@ int pkgman() { // this is just a function that returns the total of installed pa } void print_info() { + // store sys info in the sys again + sysinfo(&sys); // print collected info - from host to cpu info printf( "\033[9A\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); From 8205a8cad7e728628a26441969911d5f384132d7 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 7 Apr 2021 14:13:15 +0200 Subject: [PATCH 60/81] Converted all white-spaces with tabs, I'm currently planning to add a 'code of conduct' file and a 'contributing' file, to guide new contributors --- uwufetch.c | 808 +++++++++++++++++++++++++++-------------------------- 1 file changed, 405 insertions(+), 403 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 9acee22..e4083f0 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -24,36 +24,35 @@ #include // COLORS -#define NORMAL "\x1b[0m" -#define BOLD "\x1b[1m" -#define BLACK "\x1b[30m" -#define RED "\x1b[31m" -#define GREEN "\x1b[32m" -#define YELLOW "\x1b[33m" -#define BLUE "\x1b[34m" -#define MAGENTA "\x1b[0;35m" -#define CYAN "\x1b[36m" -#define WHITE "\x1b[37m" -#define PINK "\x1b[38;5;201m" -#define LPINK "\x1b[38;5;213m" +#define NORMAL "\x1b[0m" +#define BOLD "\x1b[1m" +#define BLACK "\x1b[30m" +#define RED "\x1b[31m" +#define GREEN "\x1b[32m" +#define YELLOW "\x1b[33m" +#define BLUE "\x1b[34m" +#define MAGENTA "\x1b[0;35m" +#define CYAN "\x1b[36m" +#define WHITE "\x1b[37m" +#define PINK "\x1b[38;5;201m" +#define LPINK "\x1b[38;5;213m" struct package_manager { - char command_string[128]; // command to get number of packages installed - char pkgman_name[16]; // name of the package manager + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager }; struct utsname sys_var; struct sysinfo sys; struct winsize win; - -// all possible ram values obtainable with free command int ram_total, ram_used = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus int pkgs, a_i_flag = 0, target_width = 0; -char user[32], host[256], shell[64], version_name[64], cpu_model[256], - gpu_model[8][256] = { { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' } }, - pkgman_name[64], image_name[32]; +char user[32], host[256], shell[64], version_name[64], cpu_model[256], + gpu_model[8][256] = { { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' } }, + pkgman_name[64], image_name[32]; +// functions definitions, to use them in main() int pkgman(); void get_info(); void list(); @@ -66,90 +65,90 @@ void truncate_name(char *); void remove_brackets(char *); int main(int argc, char *argv[]) { - int opt = 0; - static struct option long_options[] = { - { "ascii", no_argument, NULL, 'a' }, - { "custom", required_argument, NULL, 'c' }, - { "distro", required_argument, NULL, 'd' }, - { "help", no_argument, NULL, 'h' }, - { "image", no_argument, NULL, 'i' }, - { "list", no_argument, NULL, 'l' }, - { NULL, 0, NULL, 0 } - }; - get_info(); - while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { - switch (opt) { - case 'a': - a_i_flag = 0; - break; - case 'c': - a_i_flag = 1; - sprintf(image_name, "%s", optarg); - break; - case 'd': - if (optarg) sprintf(version_name, "%s", optarg); - break; - case 'h': - usage(argv[0]); - return 0; - case 'i': - a_i_flag = 1; - break; - case 'l': - list(argv[0]); - return 0; - default: - break; - } - } - if (argc == 1 || a_i_flag == 0) print_ascii(); - else if (a_i_flag) print_image(); - uwu_name(); - print_info(); + int opt = 0; + static struct option long_options[] = { + { "ascii", no_argument, NULL, 'a' }, + { "custom", required_argument, NULL, 'c' }, + { "distro", required_argument, NULL, 'd' }, + { "help", no_argument, NULL, 'h' }, + { "image", no_argument, NULL, 'i' }, + { "list", no_argument, NULL, 'l' }, + { NULL, 0, NULL, 0 } + }; + get_info(); + while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { + switch (opt) { + case 'a': + a_i_flag = 0; + break; + case 'c': + a_i_flag = 1; + sprintf(image_name, "%s", optarg); + break; + case 'd': + if (optarg) sprintf(version_name, "%s", optarg); + break; + case 'h': + usage(argv[0]); + return 0; + case 'i': + a_i_flag = 1; + break; + case 'l': + list(argv[0]); + return 0; + default: + break; + } + } + if (argc == 1 || a_i_flag == 0) print_ascii(); + else if (a_i_flag) print_image(); + uwu_name(); + print_info(); } -int pkgman() { // this is just a function that returns the total of installed packages - int total = 0; +int pkgman() { // this is just a function that returns the total of installed packages + int total = 0; - struct package_manager pkgmans[] = { - { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, - { "apk info 2> /dev/null | wc -l", "(apk)" }, - { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, - { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, - { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, - { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, - { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, - { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, - { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, - { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } - }; + struct package_manager pkgmans[] = { + { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, + { "apk info 2> /dev/null | wc -l", "(apk)" }, + { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, + { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, + { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, + { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, + { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, + { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, + { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, + { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, + { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } + }; - const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); + const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare - struct package_manager *current = &pkgmans[i]; + for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare + struct package_manager *current = &pkgmans[i]; - FILE *fp = popen(current->command_string, "r"); - unsigned int pkg_count; + FILE *fp = popen(current->command_string, "r"); + unsigned int pkg_count; - if (fscanf(fp, "%u", &pkg_count) == 3) continue; - fclose(fp); + if (fscanf(fp, "%u", &pkg_count) == 3) continue; + fclose(fp); - total += pkg_count; - if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); - } - return total; + total += pkg_count; + if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); + } + return total; } -void print_info() { +void print_info() { // store sys info in the sys again sysinfo(&sys); - // print collected info - from host to cpu info - printf("\033[9A\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); - printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); - printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); - printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); + // print collected info - from host to cpu info + printf("\033[9A\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); + printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); + printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); + printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); // print the gpus int gpu_iter = 0; @@ -159,7 +158,7 @@ void print_info() { gpu_iter++; } - // print ram to uptime and colors + // print ram to uptime and colors printf("\033[18C%s%sWAM %s%i MB/%i MB\n", NORMAL, BOLD, NORMAL, (ram_used), ram_total); printf("\033[18C%s%sSHELL %s%s\n", @@ -172,358 +171,361 @@ void print_info() { BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); } -void get_info() { // get all necessary info - char line[256]; // var to scan file lines +void get_info() { // get all necessary info + char line[256]; // var to scan file lines - // terminal width - // used to truncate long names - ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); - target_width = win.ws_col - 28; + // terminal width used to truncate long names + ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); + target_width = win.ws_col - 28; - // os version - FILE *os_release = fopen("/etc/os-release", "r"); - FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); - if (os_release) { // get normal vars - while (fgets(line, sizeof(line), os_release)) - if (sscanf(line, "\nID=%s", version_name)) break; - while (fgets(line, sizeof(line), cpuinfo)) - if (sscanf(line, "model name : %[^\n]", cpu_model)) break; - sprintf(user, "%s", getenv("USER")); - fclose(os_release); - } else { // try for android vars, or unknown system - DIR *system_app = opendir("/system/app/"); - DIR *system_priv_app = opendir("/system/priv-app/"); - if (system_app && system_priv_app) { // android - closedir(system_app); - closedir(system_priv_app); - sprintf(version_name, "android"); - // android vars - FILE *whoami = popen("whoami", "r"); - if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); - fclose(whoami); - while (fgets(line, sizeof(line), cpuinfo)) - if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; - } else { - sprintf(version_name, "unknown"); - } - } - fclose(cpuinfo); - gethostname(host, 256); - sscanf(getenv("SHELL"), "%s", shell); - if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux + // os version + FILE *os_release = fopen("/etc/os-release", "r"); + FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); + if (os_release) { // get normal vars + while (fgets(line, sizeof(line), os_release)) + if (sscanf(line, "\nID=%s", version_name)) break; + while (fgets(line, sizeof(line), cpuinfo)) + if (sscanf(line, "model name : %[^\n]", cpu_model)) break; + sprintf(user, "%s", getenv("USER")); + fclose(os_release); + } else { // try for android vars, or unknown system + DIR *system_app = opendir("/system/app/"); + DIR *system_priv_app = opendir("/system/priv-app/"); + if (system_app && system_priv_app) { // android + closedir(system_app); + closedir(system_priv_app); + sprintf(version_name, "android"); + // android vars + FILE *whoami = popen("whoami", "r"); + if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); + fclose(whoami); + while (fgets(line, sizeof(line), cpuinfo)) + if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; + } else + sprintf(version_name, "unknown"); + } + fclose(cpuinfo); + gethostname(host, 256); + sscanf(getenv("SHELL"), "%s", shell); + if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux - // truncate CPU name - truncate_name(cpu_model); + // truncate CPU name + truncate_name(cpu_model); - // system resources - uname(&sys_var); - sysinfo(&sys); // somehow this function has to be called again in print_info() + // system resources + uname(&sys_var); + sysinfo(&sys); // somehow this function has to be called again in print_info() - truncate_name(sys_var.release); - truncate_name(sys_var.machine); + truncate_name(sys_var.release); + truncate_name(sys_var.machine); - // ram - FILE *meminfo; + // ram + FILE *meminfo; - meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); - while (fgets(line, sizeof(line), meminfo)) { - // free command prints like this: "Mem:" total used free shared buff/cache available - if (sscanf(line, "Mem: %d %d", &ram_total, &ram_used)) { - // convert to megabytes - if (ram_total > 0 && ram_used > 0) { - // data is in bytes - ram_total /= 1024; - ram_used /= 1024; - break; - } - } - } - fclose(meminfo); + meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); + while (fgets(line, sizeof(line), meminfo)) { + // free command prints like this: "Mem:" total used free shared buff/cache available + if (sscanf(line, "Mem: %d %d", &ram_total, &ram_used)) { + // convert to megabytes + if (ram_total > 0 && ram_used > 0) { + // data is in bytes + ram_total /= 1024; + ram_used /= 1024; + break; + } + } + } + fclose(meminfo); - // gpu - int gpun = 0; // number of the gpu that the program is searching for to put in the array - setenv("LANG", "en_US", 1); // force language to english - FILE *gpu; - gpu = popen("lshw -class display 2> /dev/null", "r"); + /* ---------- gpu ---------- */ + int gpun = 0; // number of the gpu that the program is searching for to put in the array + setenv("LANG", "en_US", 1); // force language to english + FILE *gpu; + gpu = popen("lshw -class display 2> /dev/null", "r"); - // add all gpus to the array gpu_model (up to 8 gpus) - while (fgets(line, sizeof(line), gpu)) - if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) - gpun++; + // add all gpus to the array gpu_model (up to 8 gpus) + while (fgets(line, sizeof(line), gpu)) + if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; - if (strlen(gpu_model[0]) < 2) { - // get gpus with lspci command - if (strcmp(version_name, "android") != 0) { - gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); - } else { - gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); - } - } + if (strlen(gpu_model[0]) < 2) { + // get gpus with lspci command + if (strcmp(version_name, "android") != 0) + gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); + else + gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); + } - // get all the gpus - while (fgets(line, sizeof(line), gpu)) { - if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; - } - fclose(gpu); + // get all the gpus + while (fgets(line, sizeof(line), gpu)) { + if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; + } + fclose(gpu); - // truncate GPU name and remove square brackets - for (int i = 0; i < gpun; i++) { - remove_brackets(gpu_model[i]); - truncate_name(gpu_model[i]); - } + // truncate GPU name and remove square brackets + for (int i = 0; i < gpun; i++) { + remove_brackets(gpu_model[i]); + truncate_name(gpu_model[i]); + } - pkgs = pkgman(); + // package count + pkgs = pkgman(); } -void list(char *arg) { // prints distribution list - // distributions are listed by distribution branch - // to make the output easier to understand by the user. - printf("%s -d \n" " Available distributions:\n" " %sArch linux %sbased:\n" " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" " %sDebian/%sUbuntu %sbased:\n" " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" " %sOther/spare distributions:\n" " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" " %sBSD:\n" " freebsd, %sopenbsd\n", arg, - BLUE, NORMAL, BLUE, GREEN, // Arch based colors - RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors - NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors - RED, YELLOW); // BSD colors +void list(char *arg) { // prints distribution list + // distributions are listed by distribution branch + // to make the output easier to understand by the user. + printf( "%s -d \n" " Available distributions:\n" + " %sArch linux %sbased:\n" + " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" + " %sDebian/%sUbuntu %sbased:\n" + " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" + " %sOther/spare distributions:\n" + " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" + " %sBSD:\n" + " freebsd, %sopenbsd\n", + arg, + BLUE, NORMAL, BLUE, GREEN, // Arch based colors + RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors + NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors + RED, YELLOW); // BSD colors } -void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. +void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. - // linux - if (strcmp(version_name, "alpine") == 0) { - printf("\033[2E\033[4C%s. .___.\n" - " / \\/ \\ /\n" - " /OwO\\ɛU\\/ __\n" - " / \\ \\__/ \\\n" "/ \\ \\\n\n\n", BLUE); - } else if (strcmp(version_name, "arch") == 0) { - printf("\033[1E\033[8C%s/\\\n" - " / \\\n" - " /\\ \\\n" - " / > w <\\\n" - " / __ \\\n" - " / __| |__-\\\n" " /_-'' ''-_\\\n\n", BLUE); - } else if (strcmp(version_name, "artix") == 0) { - printf("\033[1E\033[8C%s/\\\n" - " / \\\n" - " /`'.,\\\n" - " /\u2022 w \u2022 \\\n" - " / ,`\\\n" - " / ,.'`. \\\n" " /.,'` `'.\\\n\n", BLUE); - } else if (strcmp(version_name, "debian") == 0) { - printf("\033[1E\033[6C%s______\n" - " / ___ \\\n" - " | / OwO |\n" - " | \\____-\n" " -_\n" " --_\n\n\n", RED); - } else if (strcmp(version_name, "fedora") == 0) { - printf("\033[1E\033[8C%s_____\n" - " / __)%s\\\n" - " %s> %s| / %s<%s\\ \\\n" - " __%s_| %sw%s|_%s_/ /\n" - " / %s(_ _)%s_/\n" - " / / %s| |\n" - " %s\\ \\%s__/ |\n" - " %s\\%s(_____/\n", BLUE, CYAN, WHITE, BLUE, WHITE, CYAN, - BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, - BLUE); - } else if (strcmp(version_name, "gentoo") == 0) { - printf("\033[1E\033[3C%s_-----_\n" - " ( \\\n" - " \\ OwO \\\n" - "%s \\ )\n" - " / _/\n" - " ( _-\n" " \\____-\n\n", MAGENTA, WHITE); - } else if (strcmp(version_name, "manjaro") == 0) { - printf - ("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "\"manjaro-arm\"") == 0) { - printf - ("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "linuxmint") == 0) { - printf("\033[2E\033[4C%s__/\\____/\\.\n" - " |%s.--. %s|\n" - " %s, %s¯| %s| UwU| %s|\n" - " %s|| %s| %s| | %s|\n" - " %s | %s| %s---- %s|\n" - " %s --%s'--------'\n\n", GREEN, WHITE, GREEN, WHITE, - GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, - GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 - || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { - printf("\033[3E\033[3C%s|\\----/|\n" " _ / %sO O%s\\\n" - " __. W /\n" " '----'\n\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "pop") == 0) { - printf("\033[2E\033[6C%s|\\.-----./|\n" - " |/ \\|\n" - " | > < |\n" - " | %s~ %sP! %s~ %s|\n" - "_ ---\\ w /\n" - " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); - } else if (strcmp(version_name, "raspbian") == 0) { - printf("\033[0E\033[6C%s__ __\n" - " (_\\)(/_)\n" - " %s(>(__)<)\n" - " (_(_)(_)_)\n" - " (_(__)_)\n" " (__)\n\n\n", GREEN, RED); - } else if (strcmp(version_name, "ubuntu") == 0) { - printf("\033[1E\033[9C%s_\n" - " %s\u25E3%s__(_)%s\u25E2%s\n" - " _/ --- \\\n" - " (_) |>w<| |\n" - " \\ --- _/\n" - " %sC__/%s---(_)\n\n\n", LPINK, PINK, LPINK, PINK, LPINK, - PINK, LPINK); - } else if (strcmp(version_name, "\"void\"") == 0) { - printf("\033[2E\033[2C%s |\\_____/|\n" - " _\\____ |\n" - " | \\ \\ |\n" - " | | %s\u00d2w\u00d3 %s| | ,\n" - " | \\_____\\_|-, |\n" - " -_______\\ \\_/\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "android") == 0) { // android at the end because it could be not considered as an actual distribution of gnu/linux - printf("\033[2E\033[3C%s\\ _------_ /\n" - " / \\\n" - " | %s~ %s> w < %s~ %s|\n" - " ------------\n\n\n\n", GREEN, RED, GREEN, RED, GREEN); + // linux + if (strcmp(version_name, "alpine") == 0) { + printf( "\033[2E\033[4C%s. .___.\n" + " / \\/ \\ /\n" + " /OwO\\ɛU\\/ __\n" + " / \\ \\__/ \\\n" + "/ \\ \\\n\n\n", BLUE); + } else if (strcmp(version_name, "arch") == 0) { + printf( "\033[1E\033[8C%s/\\\n" + " / \\\n" + " /\\ \\\n" + " / > w <\\\n" + " / __ \\\n" + " / __| |__-\\\n" " /_-'' ''-_\\\n\n", BLUE); + } else if (strcmp(version_name, "artix") == 0) { + printf( "\033[1E\033[8C%s/\\\n" + " / \\\n" + " /`'.,\\\n" + " /\u2022 w \u2022 \\\n" + " / ,`\\\n" + " / ,.'`. \\\n" + " /.,'` `'.\\\n\n", BLUE); + } else if (strcmp(version_name, "debian") == 0) { + printf( "\033[1E\033[6C%s______\n" + " / ___ \\\n" + " | / OwO |\n" + " | \\____-\n" " -_\n" + " --_\n\n\n", RED); + } else if (strcmp(version_name, "fedora") == 0) { + printf( "\033[1E\033[8C%s_____\n" + " / __)%s\\\n" + " %s> %s| / %s<%s\\ \\\n" + " __%s_| %sw%s|_%s_/ /\n" + " / %s(_ _)%s_/\n" + " / / %s| |\n" + " %s\\ \\%s__/ |\n" + " %s\\%s(_____/\n", + BLUE, CYAN, WHITE, BLUE, WHITE, CYAN,BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE); + } else if (strcmp(version_name, "gentoo") == 0) { + printf( "\033[1E\033[3C%s_-----_\n" + " ( \\\n" + " \\ OwO \\\n" + "%s \\ )\n" + " / _/\n" + " ( _-\n" " \\____-\n\n", MAGENTA, WHITE); + } else if (strcmp(version_name, "manjaro") == 0) { + printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } else if (strcmp(version_name, "\"manjaro-arm\"") == 0) { + printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } else if (strcmp(version_name, "linuxmint") == 0) { + printf( "\033[2E\033[4C%s__/\\____/\\.\n" + " |%s.--. %s|\n" + " %s, %s¯| %s| UwU| %s|\n" + " %s|| %s| %s| | %s|\n" + " %s | %s| %s---- %s|\n" + " %s --%s'--------'\n\n", GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { + printf( "\033[3E\033[3C%s|\\----/|\n" + " _ / %sO O%s\\\n" + " __. W /\n" + " '----'\n\n\n", GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "pop") == 0) { + printf( "\033[2E\033[6C%s|\\.-----./|\n" + " |/ \\|\n" + " | > < |\n" + " | %s~ %sP! %s~ %s|\n" + "_ ---\\ w /\n" + " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); + } else if (strcmp(version_name, "raspbian") == 0) { + printf( "\033[0E\033[6C%s__ __\n" + " (_\\)(/_)\n" + " %s(>(__)<)\n" + " (_(_)(_)_)\n" + " (_(__)_)\n" + " (__)\n\n\n", GREEN, RED); + } else if (strcmp(version_name, "ubuntu") == 0) { + printf( "\033[1E\033[9C%s_\n" + " %s\u25E3%s__(_)%s\u25E2%s\n" + " _/ --- \\\n" + " (_) |>w<| |\n" + " \\ --- _/\n" + " %sC__/%s---(_)\n\n\n", + LPINK, PINK, LPINK, PINK, LPINK, PINK, LPINK); + } else if (strcmp(version_name, "\"void\"") == 0) { + printf( "\033[2E\033[2C%s |\\_____/|\n" + " _\\____ |\n" + " | \\ \\ |\n" + " | | %s\u00d2w\u00d3 %s| | ,\n" + " | \\_____\\_|-, |\n" + " -_______\\ \\_/\n\n", GREEN, WHITE, GREEN); + } else if (strcmp(version_name, "android") == 0) { // android at the end because it could be not considered as an actual distribution of gnu/linux + printf( "\033[2E\033[3C%s\\ _------_ /\n" + " / \\\n" + " | %s~ %s> w < %s~ %s|\n" + " ------------\n\n\n\n", GREEN, RED, GREEN, RED, GREEN); - } + } - // BSD - else if (strcmp(version_name, "freebsd") == 0) { - printf("\033[2E\033[1C%s/\\,-'''''-,/\\\n" - " \\_) (_/\n" - " | \\ / |\n" - " | O w O |\n" - " ; ;\n" " '-_____-'\n\n", RED); + // BSD + else if (strcmp(version_name, "freebsd") == 0) { + printf( "\033[2E\033[1C%s/\\,-'''''-,/\\\n" + " \\_) (_/\n" + " | \\ / |\n" + " | O w O |\n" + " ; ;\n" " '-_____-'\n\n", RED); - } else if (strcmp(version_name, "openbsd") == 0) { - printf("\033[1E\033[3C%s ______ \n" - " \\- -/ %s\u2665 \n" - "%s\\_/ \\ \n" - "| %s> < %s| \n" - "|_ < %s// %sW %s// \n" - "%s/ \\ / \n" - " /-________-\\ \n\n", YELLOW, RED, YELLOW, WHITE, - YELLOW, LPINK, WHITE, LPINK, YELLOW); + } else if (strcmp(version_name, "openbsd") == 0) { + printf( "\033[1E\033[3C%s ______ \n" + " \\- -/ %s\u2665 \n" + "%s\\_/ \\ \n" + "| %s> < %s| \n" + "|_ < %s// %sW %s// \n" + "%s/ \\ / \n" + " /-________-\\ \n\n", + YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); - } + } - // everything else - else printf("\033[0E\033[2C%s._.--._.\n" - " \\|>%s_%s< |/\n" - " |%s:_/%s |\n" - " // \\ \\ ?\n" - " (| | ) /\n" - " %s/'\\_ _/`\\%s-\n" - " %s\\___)=(___/\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, - YELLOW, WHITE, YELLOW); + // everything else + else printf( "\033[0E\033[2C%s._.--._.\n" + " \\|>%s_%s< |/\n" + " |%s:_/%s |\n" + " // \\ \\ ?\n" + " (| | ) /\n" + " %s/'\\_ _/`\\%s-\n" + " %s\\___)=(___/\n\n", + WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); } -void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. - char command[256]; - if (strlen(image_name) > 1) { - sprintf(command, "viu -t -w 18 -h 8 %s 2> /dev/null", image_name); - } else { - if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); - else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); - } - printf("\n"); - if (system(command) != 0) { // if viu is not installed or the image is missing - printf("\033[0E\033[3C%s\n" - " There was an\n" - " error: viu\n" - " is not installed\n" - " or the image\n" - " is not fount\n" - " Read IMAGES.md\n" " for more info.\n\n", RED); - } +void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. + char command[256]; + if (strlen(image_name) > 1) + sprintf(command, "viu -t -w 18 -h 8 %s 2> /dev/null", image_name); + else { + if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + } + printf("\n"); + if (system(command) != 0) { // if viu is not installed or the image is missing + printf( "\033[0E\033[3C%s\n" + " There was an\n" + " error: viu\n" + " is not installed\n" + " or the image\n" + " is not fount\n" + " Read IMAGES.md\n" " for more info.\n\n", RED); + } } void usage(char *arg) { - printf("Usage: %s \n" - " -a, --ascii prints logo as ascii text (default)\n" - " -c, --custom choose a custom image\n" - " -d, --distro lets you choose the logo to print\n" - " -h, --help prints this help page\n" - " -i, --image prints logo as image\n" - " %sworks in most terminals\n" - " read README.md for more info%s\n" - " -l lists all supported distributions\n", - arg, BLUE, NORMAL); + printf( "Usage: %s \n" + " -a, --ascii prints logo as ascii text (default)\n" + " -c, --custom choose a custom image\n" + " -d, --distro lets you choose the logo to print\n" + " -h, --help prints this help page\n" + " -i, --image prints logo as image\n" + " %sworks in most terminals\n" + " read README.md for more info%s\n" + " -l lists all supported distributions\n", + arg, BLUE, NORMAL); } -void uwu_name() { // changes distro name to uwufied(?) name +void uwu_name() { // uwufies distro name #define STRING_TO_UWU(original, uwufied) if (strcmp(version_name, original) == 0) sprintf(version_name, "%s", uwufied) - // linux - STRING_TO_UWU("alpine", "Nyalpine"); - else STRING_TO_UWU("arch", "Nyarch Linuwu"); - else STRING_TO_UWU("artix", "Nyartix Linuwu"); - else STRING_TO_UWU("debian", "Debinyan"); - else STRING_TO_UWU("endeavour", "endeavOwO"); - else STRING_TO_UWU("fedora", "Fedowa"); - else STRING_TO_UWU("gentoo", "GentOwO"); - else STRING_TO_UWU("guix", "gnUwU gUwUix"); - else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); - else STRING_TO_UWU("manjaro", "Myanjawo"); - else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); - else STRING_TO_UWU("neon", "KDE NeOwOn"); - else STRING_TO_UWU("nixos", "nixOwOs"); - else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE Leap"); - else STRING_TO_UWU("\"opensuse-tumbleweed\"", "OwOpenSUSE Tumbleweed"); - else STRING_TO_UWU("pop", "PopOwOS"); - else STRING_TO_UWU("raspbian", "RaspNyan"); - else STRING_TO_UWU("slackware", "Swackwawe"); - else STRING_TO_UWU("solus", "sOwOlus"); - else STRING_TO_UWU("ubuntu", "Uwuntu"); - else STRING_TO_UWU("\"void\"", "OwOid"); - else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux + // linux + STRING_TO_UWU("alpine", "Nyalpine"); + else STRING_TO_UWU("arch", "Nyarch Linuwu"); + else STRING_TO_UWU("artix", "Nyartix Linuwu"); + else STRING_TO_UWU("debian", "Debinyan"); + else STRING_TO_UWU("endeavour", "endeavOwO"); + else STRING_TO_UWU("fedora", "Fedowa"); + else STRING_TO_UWU("gentoo", "GentOwO"); + else STRING_TO_UWU("guix", "gnUwU gUwUix"); + else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); + else STRING_TO_UWU("manjaro", "Myanjawo"); + else STRING_TO_UWU("\"manjaro-arm\"", "Myanjawo AWM"); + else STRING_TO_UWU("neon", "KDE NeOwOn"); + else STRING_TO_UWU("nixos", "nixOwOs"); + else STRING_TO_UWU("\"opensuse-leap\"", "OwOpenSUSE Leap"); + else STRING_TO_UWU("\"opensuse-tumbleweed\"", "OwOpenSUSE Tumbleweed"); + else STRING_TO_UWU("pop", "PopOwOS"); + else STRING_TO_UWU("raspbian", "RaspNyan"); + else STRING_TO_UWU("slackware", "Swackwawe"); + else STRING_TO_UWU("solus", "sOwOlus"); + else STRING_TO_UWU("ubuntu", "Uwuntu"); + else STRING_TO_UWU("\"void\"", "OwOid"); + else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux - // BSD - else STRING_TO_UWU - ("freebsd", "FweeBSD"); - else STRING_TO_UWU - ("openbsd", "OwOpenBSD"); + // BSD + else STRING_TO_UWU + ("freebsd", "FweeBSD"); + else STRING_TO_UWU + ("openbsd", "OwOpenBSD"); - - else { - sprintf(version_name, "%s", "unknown"); - if (a_i_flag == 1) { - print_image(); - printf("\n"); - } - } + else { + sprintf(version_name, "%s", "unknown"); + if (a_i_flag == 1) { + print_image(); + printf("\n"); + } + } #undef STRING_TO_UWU } void truncate_name(char *name) { - for (int i = target_width; i < 256; i++) { - name[i] = '\0'; - } + for (int i = target_width; i < 256; i++) + name[i] = '\0'; } // remove square brackets (for gpu names) void remove_brackets(char *str) { - int i = 0, j; - while (i < (int) strlen(str)) { - if (str[i] == '[' || str[i] == ']') { - for (j = i; j < (int) strlen(str); j++) { - str[j] = str[j + 1]; - } - } else { - i++; - } - } + int i = 0, j; + while (i < (int) strlen(str)) { + if (str[i] == '[' || str[i] == ']') { + for (j = i; j < (int) strlen(str); j++) + str[j] = str[j + 1]; + } else i++; + } } From 7ec08f3c822887a99fdfd5a20e275b81c28c7e75 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 7 Apr 2021 17:43:00 +0200 Subject: [PATCH 61/81] Added CONTRIBUTING.md, read it please. --- CONTRIBUTING.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 ++++ 2 files changed, 59 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..2fef80d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing to uwufetch + +## Code + +To contribute to this project, you should follow some rules to keep the code consistent: +- To indent I like to use tabs in size 4, so you should use them to commit. + +- When an the code in an `if` (or `else`) statement is only one line please do not use curly brackets: +```c +if (things) + something(will_happen); + +else if (things < 5) + something(NULL); + +else + something(!will_happen); +``` + +- When the the code in an `if` (or `else`) statement is too short, write it in one line (if it is readable): +```c +if (this) that(); + +else if (that) this(); + +else nothing(); +``` + +- Function and variable names should be written in snake_case and abbreviated if too long. +- Use shell commands only if necessary, just to improve `uwufetch` speed. +- Be sure to reset [debug](https://github.com/TheDarkBug/uwufetch/blob/8205a8cad7e728628a26441969911d5f384132d7/Makefile#L14) in [Makefile](https://github.com/TheDarkBug/uwufetch/blob/main/Makefile) if you edited it. +- Before pushing the commit, please delete double-new-lines. + +# +## Pull requests + +Before sending a pull request be sure that no one is already working on the same thing and to follow this guide-lines. + +With pull requests you can `[FIX]` a bug (reported or not), add `[OS-SUPPORT]`, add a `[NEW-FEATURE]` requested in an [issue](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#issues), fix a `[TYPO]` or `[OPTIMIZE]` the code. For everything else do not use tags. + +# +## Issues + +You can use the issues to report bugs with `[BUG]`, to request features `[FEATURE-REQUEST]`, to request support for an os `[OS-SUPPORT]`. For everything else do not use tags. + +If you are reporting a `[BUG]`, please include a screenshot and the output of the command (if a command is used in `uwufetch`). + +If you are requesting a feature, please specify if you are already working on it, then send a [pull request](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#pull-requests). + +# +## Conclusions + +I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a *professional* programmer, even though I am not. + +I woult take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. \ No newline at end of file diff --git a/README.md b/README.md index 3168f6f..20d1219 100644 --- a/README.md +++ b/README.md @@ -66,3 +66,7 @@ Images are working in almost every terminal, for a better experience i recommend ## License This program is provided under the [GPL-3.0 License](https://github.com/TheDarkBug/uwufetch/LICENSE). + +# Contributing + +All kind of contribution are welcome, but before contributing please read [CONTRIBUTING.md](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md). \ No newline at end of file From 2a90b9619d882324d7a0575d6aaffc62ac56a915 Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 7 Apr 2021 23:06:36 -0300 Subject: [PATCH 62/81] Fix variable name --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 867f168..8f5c9af 100644 --- a/Makefile +++ b/Makefile @@ -14,19 +14,19 @@ debug: ./uwufetch install: - cp $(NAME) $(DESTDIR)$(INSTALL_DIR)/$(NAME) + cp $(NAME) $(DESTDIR)$(PREFIX)/$(NAME) ls $(DESTDIR)/usr/lib/uwufetch/ 2> /dev/null || mkdir $(DESTDIR)/usr/lib/uwufetch/ cp res/* $(DESTDIR)/usr/lib/uwufetch/ uninstall: - rm -f $(DESTDIR)$(INSTALL_DIR)/$(NAME) + rm -f $(DESTDIR)$(PREFIX)/$(NAME) rm -rf $(DESTDIR)/usr/lib/uwufetch/ termux: build - cp $(NAME) $(DESTDIR)/data/data/com.termux/files$(INSTALL_DIR)/$(NAME) + cp $(NAME) $(DESTDIR)/data/data/com.termux/files$(PREFIX)/$(NAME) ls $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ > /dev/null || mkdir $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ cp res/* /data/data/com.termux/files/usr/lib/uwufetch/ termux_uninstall: - rm -rf $(DESTDIR)/data/data/com.termux/files$(INSTALL_DIR)/$(NAME) + rm -rf $(DESTDIR)/data/data/com.termux/files$(PREFIX)/$(NAME) rm -rf $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ From 8c031b98178731f3f1006c330bf71789b10854cc Mon Sep 17 00:00:00 2001 From: PK Date: Sat, 10 Apr 2021 10:47:33 -0500 Subject: [PATCH 63/81] Added ASCII support for GNU + GNU Guix. --- uwufetch.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/uwufetch.c b/uwufetch.c index e4083f0..03a4fa5 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -337,6 +337,12 @@ void print_ascii() { // prints logo (as ascii art) of the given system. distribu "%s \\ )\n" " / _/\n" " ( _-\n" " \\____-\n\n", MAGENTA, WHITE); + } else if (strcmp(version_name, "gnu") == 0 || strcmp(version_name, "guix") == 0) { + printf( "\033[3E\033[3C%s,= %s,-_-. %s=.\n" + " ((_/%s)%sU U%s(%s\\_))\n" + " `-'%s(. .)%s`-'\n" + " %s\\%sw%s/\n" + " \u00af\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); } else if (strcmp(version_name, "manjaro") == 0) { printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" " \e[0;42m \e[0m \e[0;42m \e[0m\n" @@ -482,6 +488,7 @@ void uwu_name() { // uwufies distro name else STRING_TO_UWU("endeavour", "endeavOwO"); else STRING_TO_UWU("fedora", "Fedowa"); else STRING_TO_UWU("gentoo", "GentOwO"); + else STRING_TO_UWU("gnu", "gnUwU"); else STRING_TO_UWU("guix", "gnUwU gUwUix"); else STRING_TO_UWU("linuxmint", "LinUWU Miwint"); else STRING_TO_UWU("manjaro", "Myanjawo"); From 9893b2fab96d2d3afe7e3702124f8b3a979d9a89 Mon Sep 17 00:00:00 2001 From: PK Date: Sat, 10 Apr 2021 10:51:05 -0500 Subject: [PATCH 64/81] Added GNU ahegao face and copyright details --- res/COPYRIGHT.md | 17 +++++++++++++++++ res/guix.png | Bin 0 -> 72403 bytes 2 files changed, 17 insertions(+) create mode 100644 res/guix.png diff --git a/res/COPYRIGHT.md b/res/COPYRIGHT.md index 80b49a9..18ea757 100644 --- a/res/COPYRIGHT.md +++ b/res/COPYRIGHT.md @@ -123,6 +123,23 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre # +## GNU + +image + +### Base artwork: + +- Copyright Holder: Aurelio A. Heckert (aurium@gmail.com) +- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) +- [Reference](https://www.gnu.org/graphics/heckert_gnu.svg) + +### Modifications + +- Description: Addition of ahegao facial expression, and colorization. +- Copyright Holder: [u/FOSSphorous](https://www.reddit.com/user/FOSSphorous/) +- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyi8ce/its_actually_gnuwulinux/) + ## Manjaro image diff --git a/res/guix.png b/res/guix.png new file mode 100644 index 0000000000000000000000000000000000000000..99df927e8e4f9af7a0212d7bd482d07a83f3ee04 GIT binary patch literal 72403 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�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 literal 0 HcmV?d00001 From ec133ebcdae20d6fec488208e225d920c298c087 Mon Sep 17 00:00:00 2001 From: "P.K" Date: Sat, 10 Apr 2021 10:57:50 -0500 Subject: [PATCH 65/81] README changes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 20d1219..3422c37 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A meme system info tool for (almost) all your Linux/Unix-based systems, based on ## Currently supported distros #### Full support (Both Ascii art + images are provided for the given distribution) -Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, Miwint, Myanjawo, OwOpenSUSE, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid. +Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, GnUwU gUwUix, Miwint, Myanjawo, OwOpenSUSE, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid. #### Partial support (Either no Ascii art, or no image is provided) endeavOwO, KDE NeOwOn, nixOwOs, Swackwawe, sOwOlus; Plus FweeBSD, and OwOpenBSD @@ -69,4 +69,4 @@ This program is provided under the [GPL-3.0 License](https://github.com/TheDarkB # Contributing -All kind of contribution are welcome, but before contributing please read [CONTRIBUTING.md](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md). \ No newline at end of file +All kind of contribution are welcome, but before contributing please read [CONTRIBUTING.md](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md). From 873c3f724608fbd3a6bcf24cec4a6b64ce8e6335 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Sat, 10 Apr 2021 18:31:36 +0200 Subject: [PATCH 66/81] Added guix to --list. --- uwufetch.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 03a4fa5..1462dbc 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -279,15 +279,15 @@ void list(char *arg) { // prints distribution list " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" " %sDebian/%sUbuntu %sbased:\n" " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" - " %sOther/spare distributions:\n" - " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sunknown\n\n" " %sBSD:\n" - " freebsd, %sopenbsd\n", + " freebsd, %sopenbsd\n\n" + " %sOther/spare distributions:\n" + " %salpine, %sfedora, %sgentoo, %s\"void\", android, %sgnu, guix, %sunknown\n", arg, BLUE, NORMAL, BLUE, GREEN, // Arch based colors RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors - NORMAL, BLUE, BLUE, PINK, GREEN, WHITE, // Other/spare distributions colors - RED, YELLOW); // BSD colors + RED, YELLOW, // BSD colors + NORMAL, BLUE, BLUE, PINK, GREEN, YELLOW, WHITE); // Other/spare distributions colors } void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. @@ -472,7 +472,7 @@ void usage(char *arg) { " -i, --image prints logo as image\n" " %sworks in most terminals\n" " read README.md for more info%s\n" - " -l lists all supported distributions\n", + " -l, --list lists all supported distributions\n", arg, BLUE, NORMAL); } From eb2471b86f912e6da89c0ae94596ba36280962a5 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Mon, 12 Apr 2021 13:16:45 +0200 Subject: [PATCH 67/81] Added man pages, close #68 --- .gitignore | 1 + Makefile | 9 ++++++ README.md | 6 ++++ uwufetch.1.gz | Bin 0 -> 1180 bytes uwufetch.c | 2 +- uwufetch_man.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 uwufetch.1.gz create mode 100644 uwufetch_man.md diff --git a/.gitignore b/.gitignore index 4119127..6d00c33 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ uwufetch *.zip *.vscode +*.1 \ No newline at end of file diff --git a/Makefile b/Makefile index 8f5c9af..e9ea402 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,12 @@ CFLAGS = -O3 CFLAGS_DEBUG = -Wall -Wextra PREFIX = /usr/bin CC = cc +MAN_COMPILER = pandoc build: $(FILES) $(CC) $(CFLAGS) -o $(NAME) $(FILES) + $(MAN_COMPILER) $(NAME)_man.md -st man -o $(NAME).1 + @gzip $(NAME).1 debug: @clear @@ -17,10 +20,12 @@ install: cp $(NAME) $(DESTDIR)$(PREFIX)/$(NAME) ls $(DESTDIR)/usr/lib/uwufetch/ 2> /dev/null || mkdir $(DESTDIR)/usr/lib/uwufetch/ cp res/* $(DESTDIR)/usr/lib/uwufetch/ + cp ./$(NAME).1.gz $(DESTDIR)/usr/share/man/man1/ uninstall: rm -f $(DESTDIR)$(PREFIX)/$(NAME) rm -rf $(DESTDIR)/usr/lib/uwufetch/ + rm -rf $(DESTDIR)/usr/share/man/man1/$(NAME).1.gz termux: build cp $(NAME) $(DESTDIR)/data/data/com.termux/files$(PREFIX)/$(NAME) @@ -30,3 +35,7 @@ termux: build termux_uninstall: rm -rf $(DESTDIR)/data/data/com.termux/files$(PREFIX)/$(NAME) rm -rf $(DESTDIR)/data/data/com.termux/files/usr/lib/uwufetch/ + +man_debug: build + @clear + @man -P cat ./uwufetch.1 \ No newline at end of file diff --git a/README.md b/README.md index 3422c37..a93ccb4 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,12 @@ Right now, the package is only available on the AUR: ##### Via source + +Building requisites: +- Make +- A c compiler +- Pandoc to compile man pages + To install UwUfetch from the source, type these commands in the terminal: ```shell diff --git a/uwufetch.1.gz b/uwufetch.1.gz new file mode 100644 index 0000000000000000000000000000000000000000..bdd5de8a7ad96ebd66ae910987a0777a4cad8e63 GIT binary patch literal 1180 zcmV;N1Y`RjiwFpSCUjr`19f+GW@U6^Xf81Tg;rZ{;y4t3=T{tcUpi6?)6Uzz(UK`> zTZjl~c2v;HBqs4Tu`|9j@bBl?4wR&jkl#&bNZ_*7#b}KqFGGxd=Dw*R1!@S z*z6%BJP|S6_wT;-`m3v6e=&xu<&Wj}VDUJ)+!m zGO~TIAB|x;dw=jf)78KN8X<7i|TLD^#9JWHjGvj7=0~?~y62XD*2_GOA zw4~gg^yDD7n1Uc%N)pq)QxyH2&cbLCIc2Nu>%;n>5ntwOc*Q@H^(KMs&mMwdk-eK?vbZ+IO0Wikwk# z`fL#-Nt5_Qxt>+CP9Am-yuvLWUsg*<@fX{jrKP6r+6${N=YO!#Uw_24xEPZENhLbC zg+;XQ%7F*NA1~*LuTrg7ulcWa&A%nGs1N0@R=>bNm6S)zD7fgwhdhB$WfZ;5DJd^W z3`GejRdx7Piq>tN6ID*TOGF~%bCF=OxIR~hr;phf1by=kEg17aX>RCsK5Y zs{t+B`5PA%hih$iuD^U~_+k8KKOc@gYv9|F;5Y&s9mPSK3UB~X^4@tBJVY4TWd1V> zU`mn6FNT&=(aHs9yFcU|S!^d%lNMDZeyd2;(Y;jeAhOlJ6spTjw?ZWl(P}Ier4P}l zleU$VZdCHAX7B=ZQtb_KJZ$fyAbOln+$?rUTpl(GW`{&6MJkD1CsfI#Ut=()9)a}& z9(;pyk7&^3jjDPB>DdiL+D*s}l2Z#U?_;c6;cjf=;(`5#tZj1@+226LwAW=% zPUal$HLlqFrV{)+d>uCmIL zHdJG1AuWyD3Y)6m*>R@&9mYvi7gviD>KoH~@0hg)@AEsOIBrsB#1Q>O2|BaIBx$`3 zklfY_#dl_dg9Q~+rHI5{L9sFu!sES9>ht6=m_`8%rz3crg+J$$r^UFLVHANy`py!J zufaYcT`fI@&);yQ#W)G*jaz|ZQSK#6GwoMniO%&htxNUyV31;knN2?y#bA-q5s_~X uCLJ793~))NgMu(VkW>w7JI0HCk$5YI%f)y$k9r^6e(yJY_ +# NAME +uwufetch - A meme system info tool for Linux, based on nyan/uwu trend on r/linuxmasterrace. + +# SYNOPSIS +**uwufetch** [*OPTIONS*] [*ARGUMENTS*]\ + +## OPTIONS +-a --ascii\ +prints the logo as ascii text (default) + +-c --custom\ +you can choose a custom image path + +-d --distro\ +you can choose the logo to print by the distro name + +-h --help\ +prints a help page + +-i --image\ +prints image instead of ascii logo + +-l --list\ +prints a list of all supported distributions + +# SUPPORTED DISTRIBUTIONS +Distribution name\ \ \ \ \ -d option + +Nyalpine\ \ \ \ \ \ \ \ \ alpine\ +Nyarch Linuwu\ \ \ \ \ \ \ arch\ +Nyartix Linuwu\ \ \ \ \ \ \ artix\ +Debinyan\ \ \ \ \ \ \ \ \ debian\ +Fedowa\ \ \ \ \ \ \ \ \ \ \ fedora\ +GentOwO\ \ \ \ \ \ \ \ \ \ gentoo\ +GnUwU gUwUix\ \ \ \ \ \ \ guix\ +Miwint\ \ \ \ \ \ \ \ \ \ \ linuxmint\ +Myanjawo\ \ \ \ \ \ \ \ \ manjaro\ +Myanjawo AWM\ \ \ \ \ \ \ \\"manjaro-arm\\"\ +OwOpenSUSE\ \ \ \ \ \ \ \ \ \\"opensuse-leap\\"\ +Pop OwOs\ \ \ \ \ \ \ \ \ pop\ +RaspNyan\ \ \ \ \ \ \ \ \ raspbian\ +UwUntu\ \ \ \ \ \ \ \ \ \ \ ubuntu\ +OwOid\ \ \ \ \ \ \ \ \ \ \ \\"void\\"\ +Nyandroid\ \ \ \ \ \ \ \ \ android\ +Unknown (tux logo)\ \ \ \ \ unknown + +--image/ascii only distributions--\ +endeavOwO\ \ \ \ \ \ \ \ \ endeavour\ +KDE NeOwOn\ \ \ \ \ \ \ \ \ neon\ +nixOwOs\ \ \ \ \ \ \ \ \ \ nixos\ +Swackwawe\ \ \ \ \ \ \ \ \ slackware\ +sOwOlus\ \ \ \ \ \ \ \ \ \ solus\ +FweeBSD\ \ \ \ \ \ \ \ \ \ freebsd\ +OwOpenBSD\ \ \ \ \ \ \ \ \ openbsd + +# DESCRIPTION +Uwufetch is a program inspired by neofetch and ufetch, that takes system informations\ +and prints them in the terminal in an UwU way, with and UwU ascii logo or image. + +# EXAMPLES +uwufetch -d arch\ \ \ \ \ \ \ \ \ \ # prints arch logo\ +uwufetch -\-custom some_image.png\ \ # prints custom image (does not need full path)\ +ueufetch -i -d artix\ \ \ \ \ \ \ \ # prints artix image + +# DEPENDANCES +lshw\ \ better gpu info\ +viu\ \ \ print images instead of ascii logo\ +kitty\ \ better image viewing + +All of this are optional, there is no necessary dependancy. + +# LICENSE AND COPYRIGTH +uwufetch is provided under the GPL3 license, for copyright info read https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md. From c403d0a597cfad8e0a92588b7f5f305e763bf663 Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Tue, 13 Apr 2021 19:21:29 -0300 Subject: [PATCH 68/81] add config file parser --- uwufetch.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/uwufetch.c b/uwufetch.c index 57412e4..a070ba6 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -54,6 +54,7 @@ char user[32], host[256], shell[64], version_name[64], cpu_model[256], // functions definitions, to use them in main() int pkgman(); +void parse_config(); void get_info(); void list(); void print_ascii(); @@ -76,6 +77,7 @@ int main(int argc, char *argv[]) { { NULL, 0, NULL, 0 } }; get_info(); + parse_config(); while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { switch (opt) { case 'a': @@ -107,6 +109,47 @@ int main(int argc, char *argv[]) { print_info(); } +void parse_config() { + char line[256]; + char *homedir = getenv("HOME"); + + //FILE *config = fopen(strcat(homedir, "/.config/uwufetch/config"), "r"); + FILE *config = fopen("./config", "r"); + if(config == NULL) { + return; + } + while(fgets(line, sizeof(line), config)) { + if(line[0] == '#') { + break; + } + char key[32]; + char value[64]; + int len = strlen(line); + int delim_position; + // parse key + for(int i = 0;i < len;i++) { + if(line[i] == '=') { + delim_position = i; + break; + } + key[i] = line[i]; + } + // parse value + for(int i = delim_position + 1;i < len;i++) { + if(line[i] == '#' || line[i] == '\n') { + break; + } + value[i - delim_position - 1] = line[i]; + } + if(strcmp("image", key) == 0) { + a_i_flag = 1; + snprintf(image_name, 32, "%s", value); + } else if(strcmp("distro", key) == 0) { + snprintf(version_name, 64, "%s", value); + } + } +} + int pkgman() { // this is just a function that returns the total of installed packages int total = 0; From 313a5a401361ecedc8935ccd644fad8e308f8735 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 14 Apr 2021 10:32:12 +0200 Subject: [PATCH 69/81] Improved parse_config(), added man page to .gitignore --- .gitignore | 2 +- uwufetch.1.gz | Bin 1180 -> 0 bytes uwufetch.c | 40 ++++++---------------------------------- 3 files changed, 7 insertions(+), 35 deletions(-) delete mode 100644 uwufetch.1.gz diff --git a/.gitignore b/.gitignore index 6d00c33..580a1f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ uwufetch *.zip *.vscode -*.1 \ No newline at end of file +*.gz \ No newline at end of file diff --git a/uwufetch.1.gz b/uwufetch.1.gz deleted file mode 100644 index bdd5de8a7ad96ebd66ae910987a0777a4cad8e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmV;N1Y`RjiwFpSCUjr`19f+GW@U6^Xf81Tg;rZ{;y4t3=T{tcUpi6?)6Uzz(UK`> zTZjl~c2v;HBqs4Tu`|9j@bBl?4wR&jkl#&bNZ_*7#b}KqFGGxd=Dw*R1!@S z*z6%BJP|S6_wT;-`m3v6e=&xu<&Wj}VDUJ)+!m zGO~TIAB|x;dw=jf)78KN8X<7i|TLD^#9JWHjGvj7=0~?~y62XD*2_GOA zw4~gg^yDD7n1Uc%N)pq)QxyH2&cbLCIc2Nu>%;n>5ntwOc*Q@H^(KMs&mMwdk-eK?vbZ+IO0Wikwk# z`fL#-Nt5_Qxt>+CP9Am-yuvLWUsg*<@fX{jrKP6r+6${N=YO!#Uw_24xEPZENhLbC zg+;XQ%7F*NA1~*LuTrg7ulcWa&A%nGs1N0@R=>bNm6S)zD7fgwhdhB$WfZ;5DJd^W z3`GejRdx7Piq>tN6ID*TOGF~%bCF=OxIR~hr;phf1by=kEg17aX>RCsK5Y zs{t+B`5PA%hih$iuD^U~_+k8KKOc@gYv9|F;5Y&s9mPSK3UB~X^4@tBJVY4TWd1V> zU`mn6FNT&=(aHs9yFcU|S!^d%lNMDZeyd2;(Y;jeAhOlJ6spTjw?ZWl(P}Ier4P}l zleU$VZdCHAX7B=ZQtb_KJZ$fyAbOln+$?rUTpl(GW`{&6MJkD1CsfI#Ut=()9)a}& z9(;pyk7&^3jjDPB>DdiL+D*s}l2Z#U?_;c6;cjf=;(`5#tZj1@+226LwAW=% zPUal$HLlqFrV{)+d>uCmIL zHdJG1AuWyD3Y)6m*>R@&9mYvi7gviD>KoH~@0hg)@AEsOIBrsB#1Q>O2|BaIBx$`3 zklfY_#dl_dg9Q~+rHI5{L9sFu!sES9>ht6=m_`8%rz3crg+J$$r^UFLVHANy`py!J zufaYcT`fI@&);yQ#W)G*jaz|ZQSK#6GwoMniO%&htxNUyV31;knN2?y#bA-q5s_~X uCLJ793~))NgMu(VkW>w7JI0HCk$5YI%f)y$k9r^6e(yJY_ Date: Wed, 14 Apr 2021 11:09:23 +0200 Subject: [PATCH 70/81] Added --config option to change config path --- Makefile | 2 +- uwufetch.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index e9ea402..721842c 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ build: $(FILES) debug: @clear $(CC) $(CFLAGS_DEBUG) -o $(NAME) $(FILES) - ./uwufetch + ./uwufetch --config ~/.config/uwufetch/config install: cp $(NAME) $(DESTDIR)$(PREFIX)/$(NAME) diff --git a/uwufetch.c b/uwufetch.c index e1d22f2..a6adb1a 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -70,6 +70,7 @@ int main(int argc, char *argv[]) { static struct option long_options[] = { { "ascii", no_argument, NULL, 'a' }, { "custom", required_argument, NULL, 'c' }, + { "config", required_argument, NULL, 0}, { "distro", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "image", no_argument, NULL, 'i' }, @@ -103,7 +104,7 @@ int main(int argc, char *argv[]) { break; } } - if (argc == 1 && a_i_flag == 0) print_ascii(); + if ((argc == 1 && a_i_flag == 0) || (argc > 1 && a_i_flag == 0)) print_ascii(); else if (a_i_flag) print_image(); uwu_name(); print_info(); @@ -117,7 +118,7 @@ void parse_config() { if(config == NULL) return; while(fgets(line, sizeof(line), config)) { if(line[0] == '#') continue; - if (sscanf(line, "image=%s", image_name)) a_i_flag = 1; + if (sscanf(line, "image%s", image_name)) a_i_flag = 1; sscanf(line, "distro=%s", version_name); } } @@ -481,10 +482,11 @@ void print_image() { // prints logo (as an image) of the given system. distribut void usage(char *arg) { printf( "Usage: %s \n" " -a, --ascii prints logo as ascii text (default)\n" - " -c, --custom choose a custom image\n" + " -c, --custom choose a custom image\n" // this options should be different, maybe merged with `-i` + " --config use custom config path\n" " -d, --distro lets you choose the logo to print\n" " -h, --help prints this help page\n" - " -i, --image prints logo as image\n" + " -i, --image prints logo as image\n" // someone should add an optional argument to change image without using `-c`, but I don't know how to do it. " %sworks in most terminals\n" " read README.md for more info%s\n" " -l, --list lists all supported distributions\n", From 3ce44faf6817bc0546f04a072f4de79eaa8b6849 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 14 Apr 2021 12:33:05 +0200 Subject: [PATCH 71/81] Added new config options, disabled optimization in makefile to prevent segmentation fault (i have no idea) --- .gitignore | 3 ++- Makefile | 6 ++--- uwufetch.c | 70 +++++++++++++++++++++++++++++++++---------------- uwufetch_man.md | 20 ++++++++++++++ 4 files changed, 73 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 580a1f9..c8614cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ uwufetch *.zip *.vscode -*.gz \ No newline at end of file +*.gz +*.1 \ No newline at end of file diff --git a/Makefile b/Makefile index 721842c..dc024d0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME = uwufetch FILES = uwufetch.c -CFLAGS = -O3 +CFLAGS = CFLAGS_DEBUG = -Wall -Wextra PREFIX = /usr/bin CC = cc @@ -9,12 +9,12 @@ MAN_COMPILER = pandoc build: $(FILES) $(CC) $(CFLAGS) -o $(NAME) $(FILES) $(MAN_COMPILER) $(NAME)_man.md -st man -o $(NAME).1 - @gzip $(NAME).1 + @#gzip $(NAME).1 debug: @clear $(CC) $(CFLAGS_DEBUG) -o $(NAME) $(FILES) - ./uwufetch --config ~/.config/uwufetch/config + ./uwufetch install: cp $(NAME) $(DESTDIR)$(PREFIX)/$(NAME) diff --git a/uwufetch.c b/uwufetch.c index a6adb1a..8bcd1ae 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -47,7 +47,19 @@ struct sysinfo sys; struct winsize win; int ram_total, ram_used = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus -int pkgs, a_i_flag = 0, target_width = 0; +int pkgs, target_width = 0; +// all flags available +int ascii_image_flag = 0, + show_user_info = 1, + show_os = 1, + show_kernel = 1, + show_cpu = 1, + show_gpu = 1, + show_ram = 1, + show_shell = 1, + show_pkgs = 1, + show_uptime = 1, + show_colors = 1; char user[32], host[256], shell[64], version_name[64], cpu_model[256], gpu_model[8][256] = { { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' } }, pkgman_name[64], image_name[32]; @@ -82,10 +94,10 @@ int main(int argc, char *argv[]) { while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { switch (opt) { case 'a': - a_i_flag = 0; + ascii_image_flag = 0; break; case 'c': - a_i_flag = 1; + ascii_image_flag = 1; sprintf(image_name, "%s", optarg); break; case 'd': @@ -95,7 +107,7 @@ int main(int argc, char *argv[]) { usage(argv[0]); return 0; case 'i': - a_i_flag = 1; + ascii_image_flag = 1; break; case 'l': list(argv[0]); @@ -104,8 +116,8 @@ int main(int argc, char *argv[]) { break; } } - if ((argc == 1 && a_i_flag == 0) || (argc > 1 && a_i_flag == 0)) print_ascii(); - else if (a_i_flag) print_image(); + if ((argc == 1 && ascii_image_flag == 0) || (argc > 1 && ascii_image_flag == 0)) print_ascii(); + else if (ascii_image_flag) print_image(); uwu_name(); print_info(); } @@ -113,13 +125,24 @@ int main(int argc, char *argv[]) { void parse_config() { char line[256]; char *homedir = getenv("HOME"); + char *temp_buffer = ""; FILE *config = fopen(strcat(homedir, "/.config/uwufetch/config"), "r"); if(config == NULL) return; while(fgets(line, sizeof(line), config)) { if(line[0] == '#') continue; - if (sscanf(line, "image%s", image_name)) a_i_flag = 1; + ascii_image_flag = sscanf(line, "image=%s", image_name); sscanf(line, "distro=%s", version_name); + if (sscanf(line, "nouser%s", temp_buffer)) show_user_info = 0; + if (sscanf(line, "noos%s", temp_buffer)) show_os = 0; + if (sscanf(line, "nokernel%s", temp_buffer)) show_kernel = 0; + if (sscanf(line, "nocpu%s", temp_buffer)) show_cpu = 0; + if (sscanf(line, "nogpu%s", temp_buffer)) show_gpu = 0; + if (sscanf(line, "noram%s", temp_buffer)) show_ram = 0; + if (sscanf(line, "noshell%s", temp_buffer)) show_shell = 0; + if (sscanf(line, "nopkgs%s", temp_buffer)) show_pkgs = 0; + if (sscanf(line, "nouptime%s", temp_buffer)) show_uptime = 0; + if (sscanf(line, "nocolors%s", temp_buffer)) show_colors = 0; } } @@ -161,29 +184,32 @@ void print_info() { // store sys info in the sys again sysinfo(&sys); // print collected info - from host to cpu info - printf("\033[9A\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); - printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); - printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); - printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); + printf("\033[9A"); // to align info text + if (show_user_info) printf("\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); + if (show_os) printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); + if (show_kernel) printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); + if (show_cpu) printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); // print the gpus - int gpu_iter = 0; - while(gpu_model[gpu_iter][0] != '0') { - printf( "\033[18C%s%sGPUWU %s%s\n", - NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); - gpu_iter++; + if (show_gpu) { + int gpu_iter = 0; + while(gpu_model[gpu_iter][0] != '0') { + printf( "\033[18C%s%sGPUWU %s%s\n", + NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); + gpu_iter++; + } } // print ram to uptime and colors - printf("\033[18C%s%sWAM %s%i MB/%i MB\n", + if (show_ram) printf("\033[18C%s%sWAM %s%i MB/%i MB\n", NORMAL, BOLD, NORMAL, (ram_used), ram_total); - printf("\033[18C%s%sSHELL %s%s\n", + if (show_shell) printf("\033[18C%s%sSHELL %s%s\n", NORMAL, BOLD, NORMAL, shell); - printf("\033[18C%s%sPKGS %s%s%d %s\n", + if (show_pkgs) printf("\033[18C%s%sPKGS %s%s%d %s\n", NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); - printf("\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n", + if (show_uptime) printf("\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n", NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime/60/60, sys.uptime/60%60); - printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", + if (show_colors) printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); } @@ -530,7 +556,7 @@ void uwu_name() { // uwufies distro name else { sprintf(version_name, "%s", "unknown"); - if (a_i_flag == 1) { + if (ascii_image_flag == 1) { print_image(); printf("\n"); } diff --git a/uwufetch_man.md b/uwufetch_man.md index 3ec42e0..36dba69 100644 --- a/uwufetch_man.md +++ b/uwufetch_man.md @@ -19,6 +19,9 @@ prints the logo as ascii text (default) -c --custom\ you can choose a custom image path +--config\ +you can change config path + -d --distro\ you can choose the logo to print by the distro name @@ -31,6 +34,23 @@ prints image instead of ascii logo -l --list\ prints a list of all supported distributions +# CONFIG FILE +The config file is located in $HOME/.config/uwufetch/config (you need to create it), but you can change the path by using the `--config` option. + +## OPTIONS +distribution=name\ \ \ \ \ # use it to change displayed distribution\ +image=/path/to/image\ \ \ # enable images (leave blank), or use custom image path\ +nouser\ \ \ \ \ \ \ \ \ \ \ # disable username and hostname\ +noos\ \ \ \ \ \ \ \ \ \ \ # disable os\ +nokernel\ \ \ \ \ \ \ \ \ # disable kernel\ +nocpu\ \ \ \ \ \ \ \ \ \ \ # disable cpu\ +nogpu\ \ \ \ \ \ \ \ \ \ \ # disable gpu\ +noram\ \ \ \ \ \ \ \ \ \ \ # disable ram\ +noshell\ \ \ \ \ \ \ \ \ \ # disable shell\ +nopkgs\ \ \ \ \ \ \ \ \ \ \ # disable pkgs\ +nouptime\ \ \ \ \ \ \ \ \ # disable uptime\ +nocolors\ \ \ \ \ \ \ \ \ # disable colors + # SUPPORTED DISTRIBUTIONS Distribution name\ \ \ \ \ -d option From 78212a41da1941683d911cddf0e6f86675a0af18 Mon Sep 17 00:00:00 2001 From: HurricanePootis Date: Wed, 14 Apr 2021 08:00:28 -0500 Subject: [PATCH 72/81] Remove # in makefile that prevented gzip from working. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index dc024d0..4cb3888 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ MAN_COMPILER = pandoc build: $(FILES) $(CC) $(CFLAGS) -o $(NAME) $(FILES) $(MAN_COMPILER) $(NAME)_man.md -st man -o $(NAME).1 - @#gzip $(NAME).1 + @gzip $(NAME).1 debug: @clear @@ -38,4 +38,4 @@ termux_uninstall: man_debug: build @clear - @man -P cat ./uwufetch.1 \ No newline at end of file + @man -P cat ./uwufetch.1 From 119504feb4fd809727763d550fb449dce73607c8 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Wed, 14 Apr 2021 18:19:17 +0200 Subject: [PATCH 73/81] Fixed #71, added prettier kernel info. --- Makefile | 2 +- uwufetch.c | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 4cb3888..7fd13db 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME = uwufetch FILES = uwufetch.c -CFLAGS = +CFLAGS = -O3 CFLAGS_DEBUG = -Wall -Wextra PREFIX = /usr/bin CC = cc diff --git a/uwufetch.c b/uwufetch.c index 8bcd1ae..fbc8c38 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -60,8 +60,8 @@ int ascii_image_flag = 0, show_pkgs = 1, show_uptime = 1, show_colors = 1; -char user[32], host[256], shell[64], version_name[64], cpu_model[256], - gpu_model[8][256] = { { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' }, { '0' } }, +char user[32], host[256], shell[64], kernel[256], version_name[64], cpu_model[256], + gpu_model[8][256] = {{'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}}, pkgman_name[64], image_name[32]; // functions definitions, to use them in main() @@ -181,13 +181,12 @@ int pkgman() { // this is just a function that returns the total of installed pa } void print_info() { - // store sys info in the sys again - sysinfo(&sys); + // store sys info in the sys again // print collected info - from host to cpu info printf("\033[9A"); // to align info text if (show_user_info) printf("\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); if (show_os) printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); - if (show_kernel) printf("\033[18C%s%sKEWNEL %s%s %s\n", NORMAL, BOLD, NORMAL, sys_var.release, sys_var.machine); + if (show_kernel) printf("\033[18C%s%sKEWNEL %s%s\n", NORMAL, BOLD, NORMAL, kernel); if (show_cpu) printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); // print the gpus @@ -256,10 +255,11 @@ void get_info() { // get all necessary info // system resources uname(&sys_var); - sysinfo(&sys); // somehow this function has to be called again in print_info() + //sysinfo(&sys); // somehow this function has to be called again in print_info() truncate_name(sys_var.release); - truncate_name(sys_var.machine); + sprintf(kernel, "%s %s %s", sys_var.sysname, sys_var.release, sys_var.machine); + truncate_name(kernel); // ram FILE *meminfo; From 673501a2d7929a9420fe6c2c3d9d35e0b67110f5 Mon Sep 17 00:00:00 2001 From: dqnk Date: Wed, 14 Apr 2021 21:27:14 +0200 Subject: [PATCH 74/81] [TYPO] fixed typos in CONTRIBUTING.md. --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2fef80d..7c5fa11 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ To contribute to this project, you should follow some rules to keep the code consistent: - To indent I like to use tabs in size 4, so you should use them to commit. -- When an the code in an `if` (or `else`) statement is only one line please do not use curly brackets: +- When the code in an `if` (or `else`) statement is only one line please do not use curly brackets: ```c if (things) something(will_happen); @@ -17,7 +17,7 @@ else something(!will_happen); ``` -- When the the code in an `if` (or `else`) statement is too short, write it in one line (if it is readable): +- When the code in an `if` (or `else`) statement is too short, write it in one line (if it is readable): ```c if (this) that(); @@ -52,4 +52,4 @@ If you are requesting a feature, please specify if you are already working on it I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a *professional* programmer, even though I am not. -I woult take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. \ No newline at end of file +I would take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. \ No newline at end of file From ffaa5a01944a4cb2f9b8e33a215348ded42acee1 Mon Sep 17 00:00:00 2001 From: dqnk <64268180+dqnk@users.noreply.github.com> Date: Wed, 14 Apr 2021 21:36:00 +0200 Subject: [PATCH 75/81] Added new lines where "Prettier" would add them you can remove this commit if you don't like the formatting from "Prettier" extension --- CONTRIBUTING.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c5fa11..c229a1a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,6 +32,7 @@ else nothing(); - Before pushing the commit, please delete double-new-lines. # + ## Pull requests Before sending a pull request be sure that no one is already working on the same thing and to follow this guide-lines. @@ -39,6 +40,7 @@ Before sending a pull request be sure that no one is already working on the same With pull requests you can `[FIX]` a bug (reported or not), add `[OS-SUPPORT]`, add a `[NEW-FEATURE]` requested in an [issue](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#issues), fix a `[TYPO]` or `[OPTIMIZE]` the code. For everything else do not use tags. # + ## Issues You can use the issues to report bugs with `[BUG]`, to request features `[FEATURE-REQUEST]`, to request support for an os `[OS-SUPPORT]`. For everything else do not use tags. @@ -48,8 +50,9 @@ If you are reporting a `[BUG]`, please include a screenshot and the output of th If you are requesting a feature, please specify if you are already working on it, then send a [pull request](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#pull-requests). # + ## Conclusions I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a *professional* programmer, even though I am not. -I would take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. \ No newline at end of file +I would take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. From e4acabada7ccef152cdfaef74efb2f72fe54778d Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 14 Apr 2021 17:25:11 -0300 Subject: [PATCH 76/81] merge --custom and --image --- uwufetch.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index fbc8c38..08a264f 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -81,25 +81,20 @@ int main(int argc, char *argv[]) { int opt = 0; static struct option long_options[] = { { "ascii", no_argument, NULL, 'a' }, - { "custom", required_argument, NULL, 'c' }, { "config", required_argument, NULL, 0}, { "distro", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, - { "image", no_argument, NULL, 'i' }, + { "image", optional_argument, NULL, 'i' }, { "list", no_argument, NULL, 'l' }, { NULL, 0, NULL, 0 } }; get_info(); parse_config(); - while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "ad:hi::l", long_options, NULL)) != -1) { switch (opt) { case 'a': ascii_image_flag = 0; break; - case 'c': - ascii_image_flag = 1; - sprintf(image_name, "%s", optarg); - break; case 'd': if (optarg) sprintf(version_name, "%s", optarg); break; @@ -108,6 +103,10 @@ int main(int argc, char *argv[]) { return 0; case 'i': ascii_image_flag = 1; + char *image_dir = NULL; + if(!optarg && argv[optind] != NULL && argv[optind][0] != '-') image_dir = argv[optind++]; + else image_dir = optarg; + if(image_dir != NULL) sprintf(image_name, "%s", image_dir); break; case 'l': list(argv[0]); From 028a269b2438dfe54fd948b57abb9440dd47191e Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 14 Apr 2021 18:38:49 -0300 Subject: [PATCH 77/81] add --config --- uwufetch.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 08a264f..97236da 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -62,7 +62,7 @@ int ascii_image_flag = 0, show_colors = 1; char user[32], host[256], shell[64], kernel[256], version_name[64], cpu_model[256], gpu_model[8][256] = {{'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}}, - pkgman_name[64], image_name[32]; + pkgman_name[64], image_name[128], *config_directory = NULL; // functions definitions, to use them in main() int pkgman(); @@ -81,7 +81,7 @@ int main(int argc, char *argv[]) { int opt = 0; static struct option long_options[] = { { "ascii", no_argument, NULL, 'a' }, - { "config", required_argument, NULL, 0}, + { "config", required_argument, NULL, 'c'}, { "distro", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "image", optional_argument, NULL, 'i' }, @@ -89,12 +89,14 @@ int main(int argc, char *argv[]) { { NULL, 0, NULL, 0 } }; get_info(); - parse_config(); - while ((opt = getopt_long(argc, argv, "ad:hi::l", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "ac:d:hi::l", long_options, NULL)) != -1) { switch (opt) { case 'a': ascii_image_flag = 0; break; + case 'c': + config_directory = optarg; + break; case 'd': if (optarg) sprintf(version_name, "%s", optarg); break; @@ -103,10 +105,8 @@ int main(int argc, char *argv[]) { return 0; case 'i': ascii_image_flag = 1; - char *image_dir = NULL; - if(!optarg && argv[optind] != NULL && argv[optind][0] != '-') image_dir = argv[optind++]; - else image_dir = optarg; - if(image_dir != NULL) sprintf(image_name, "%s", image_dir); + if(!optarg && argv[optind] != NULL && argv[optind][0] != '-') sprintf(image_name, "%s", argv[optind++]); + else if(optarg) sprintf(image_name, "%s", optarg); break; case 'l': list(argv[0]); @@ -115,6 +115,7 @@ int main(int argc, char *argv[]) { break; } } + parse_config(); if ((argc == 1 && ascii_image_flag == 0) || (argc > 1 && ascii_image_flag == 0)) print_ascii(); else if (ascii_image_flag) print_image(); uwu_name(); @@ -125,12 +126,14 @@ void parse_config() { char line[256]; char *homedir = getenv("HOME"); char *temp_buffer = ""; - - FILE *config = fopen(strcat(homedir, "/.config/uwufetch/config"), "r"); + FILE *config; + + if(config_directory == NULL) config = fopen(strcat(homedir, "/.config/uwufetch/config"), "r"); + else config = fopen(config_directory, "r"); if(config == NULL) return; while(fgets(line, sizeof(line), config)) { if(line[0] == '#') continue; - ascii_image_flag = sscanf(line, "image=%s", image_name); + if(strlen(image_name) < 1 && ascii_image_flag == 0) ascii_image_flag = sscanf(line, "image=%s", image_name); sscanf(line, "distro=%s", version_name); if (sscanf(line, "nouser%s", temp_buffer)) show_user_info = 0; if (sscanf(line, "noos%s", temp_buffer)) show_os = 0; From d0c8e5c1d778abb3d2079fd26e1b0dfede152ebd Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 14 Apr 2021 18:46:48 -0300 Subject: [PATCH 78/81] Update usage --- uwufetch.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/uwufetch.c b/uwufetch.c index 97236da..0cff649 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -510,11 +510,10 @@ void print_image() { // prints logo (as an image) of the given system. distribut void usage(char *arg) { printf( "Usage: %s \n" " -a, --ascii prints logo as ascii text (default)\n" - " -c, --custom choose a custom image\n" // this options should be different, maybe merged with `-i` - " --config use custom config path\n" + " -c --config use custom config path\n" " -d, --distro lets you choose the logo to print\n" " -h, --help prints this help page\n" - " -i, --image prints logo as image\n" // someone should add an optional argument to change image without using `-c`, but I don't know how to do it. + " -i, --image prints logo as image and use a custom image if provided\n" " %sworks in most terminals\n" " read README.md for more info%s\n" " -l, --list lists all supported distributions\n", From 066ba03c3efc8d661c125960328b35b747b17359 Mon Sep 17 00:00:00 2001 From: Guaxinim5573 Date: Wed, 14 Apr 2021 18:49:02 -0300 Subject: [PATCH 79/81] Update man page --- uwufetch_man.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/uwufetch_man.md b/uwufetch_man.md index 36dba69..9098afa 100644 --- a/uwufetch_man.md +++ b/uwufetch_man.md @@ -16,10 +16,7 @@ uwufetch - A meme system info tool for Linux, based on nyan/uwu trend on r/linux -a --ascii\ prints the logo as ascii text (default) --c --custom\ -you can choose a custom image path - ---config\ +-c --config\ you can change config path -d --distro\ @@ -29,7 +26,8 @@ you can choose the logo to print by the distro name prints a help page -i --image\ -prints image instead of ascii logo +prints image instead of ascii logo\ +uses a custom image if one is provided -l --list\ prints a list of all supported distributions From 63427834e35d327559e97d4fa587371dbb2fbee4 Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Thu, 15 Apr 2021 09:28:57 +0200 Subject: [PATCH 80/81] Formatted every file with , as suggested in #73 --- .gitignore | 3 +- CONTRIBUTING.md | 53 ++-- README.md | 13 +- res/COPYRIGHT.md | 290 +++++++++--------- uwufetch.c | 764 +++++++++++++++++++++++++++-------------------- uwufetch_man.md | 110 ++++--- 6 files changed, 688 insertions(+), 545 deletions(-) diff --git a/.gitignore b/.gitignore index c8614cf..e708858 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ uwufetch *.zip *.vscode *.gz -*.1 \ No newline at end of file +*.1 +.prettierrc \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2fef80d..c256dab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,35 +3,36 @@ ## Code To contribute to this project, you should follow some rules to keep the code consistent: -- To indent I like to use tabs in size 4, so you should use them to commit. -- When an the code in an `if` (or `else`) statement is only one line please do not use curly brackets: -```c -if (things) - something(will_happen); +- Please try to be consistent in code formatting, if you use `Prettier`, this are the rules used in all the files: -else if (things < 5) - something(NULL); - -else - something(!will_happen); +```json +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": false, + "tabWidth": 4, + "trailingComma": "es5", + "useTabs": true, + "vueIndentScriptAndStyle": false +} ``` -- When the the code in an `if` (or `else`) statement is too short, write it in one line (if it is readable): -```c -if (this) that(); - -else if (that) this(); - -else nothing(); -``` - -- Function and variable names should be written in snake_case and abbreviated if too long. -- Use shell commands only if necessary, just to improve `uwufetch` speed. -- Be sure to reset [debug](https://github.com/TheDarkBug/uwufetch/blob/8205a8cad7e728628a26441969911d5f384132d7/Makefile#L14) in [Makefile](https://github.com/TheDarkBug/uwufetch/blob/main/Makefile) if you edited it. -- Before pushing the commit, please delete double-new-lines. +- Function and variable names should be written in snake_case and abbreviated if too long. +- Use shell commands only if necessary, just to improve `uwufetch` speed. # + ## Pull requests Before sending a pull request be sure that no one is already working on the same thing and to follow this guide-lines. @@ -39,6 +40,7 @@ Before sending a pull request be sure that no one is already working on the same With pull requests you can `[FIX]` a bug (reported or not), add `[OS-SUPPORT]`, add a `[NEW-FEATURE]` requested in an [issue](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#issues), fix a `[TYPO]` or `[OPTIMIZE]` the code. For everything else do not use tags. # + ## Issues You can use the issues to report bugs with `[BUG]`, to request features `[FEATURE-REQUEST]`, to request support for an os `[OS-SUPPORT]`. For everything else do not use tags. @@ -48,8 +50,9 @@ If you are reporting a `[BUG]`, please include a screenshot and the output of th If you are requesting a feature, please specify if you are already working on it, then send a [pull request](https://github.com/TheDarkBug/uwufetch/blob/main/CONTRIBUTING.md#pull-requests). # + ## Conclusions -I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a *professional* programmer, even though I am not. +I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a _professional_ programmer, even though I am not. -I woult take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. \ No newline at end of file +I woult take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. diff --git a/README.md b/README.md index a93ccb4..40a5cc2 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,13 @@ A meme system info tool for (almost) all your Linux/Unix-based systems, based on nyan/UwU trend on r/linuxmasterrace. ## Currently supported distros + #### Full support (Both Ascii art + images are provided for the given distribution) + Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, GnUwU gUwUix, Miwint, Myanjawo, OwOpenSUSE, Pop OwOs, RaspNyan, UwUntu, and OwOid; Plus Nyandroid. #### Partial support (Either no Ascii art, or no image is provided) + endeavOwO, KDE NeOwOn, nixOwOs, Swackwawe, sOwOlus; Plus FweeBSD, and OwOpenBSD ## Building and installation @@ -27,11 +30,11 @@ Right now, the package is only available on the AUR: ##### Via source - Building requisites: -- Make -- A c compiler -- Pandoc to compile man pages + +- Make +- A c compiler +- Pandoc to compile man pages To install UwUfetch from the source, type these commands in the terminal: @@ -63,10 +66,12 @@ make termux_uninstall # uninstall for termux ## Images and copyright info ### How to use images + First at all you need `viu`, to install it follow the [guide](https://github.com/atanunq/viu#installation). Images are working in almost every terminal, for a better experience i recommend [kitty](https://github.com/kovidgoyal/kitty) ### For copyright and logos info + [COPYRIGHT.md](https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md) ## License diff --git a/res/COPYRIGHT.md b/res/COPYRIGHT.md index 18ea757..e9617af 100644 --- a/res/COPYRIGHT.md +++ b/res/COPYRIGHT.md @@ -2,7 +2,7 @@ Int this directory, all the logo images, are stored. -This file contains all copyright info for every image that `uwufetch` uses. If you want to remove *your* image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). +This file contains all copyright info for every image that `uwufetch` uses. If you want to remove _your_ image from this repository contact me on [reddit](https://www.reddit.com/user/TheDarkBug). I am not a copyright expert, and maybe I am doing all wrong things, please correct this file if you notice something wrong. # Copyrights @@ -13,16 +13,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Arch Linux Devs -- License: [Arch Linux TrademarkPolicy](https://archlinux.org/art/) -- [Reference](https://wiki.archlinux.org/index.php/DeveloperWiki:TrademarkPolicy) +- Copyright Holder: Arch Linux Devs +- License: [Arch Linux TrademarkPolicy](https://archlinux.org/art/) +- [Reference](https://wiki.archlinux.org/index.php/DeveloperWiki:TrademarkPolicy) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) -- License: No license, just a reddit post -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/) +- Description: uwu style +- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxfg9j/someone_posted_uwuntu_so_i_made_nyarch/) # @@ -32,16 +32,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Artix Linux Devs -- License: [Artix Brand Book](https://gitea.artixlinux.org/artix/artwork/src/branch/master/README.md) -- [Reference](https://gitea.artixlinux.org/artix/artwork) +- Copyright Holder: Artix Linux Devs +- License: [Artix Brand Book](https://gitea.artixlinux.org/artix/artwork/src/branch/master/README.md) +- [Reference](https://gitea.artixlinux.org/artix/artwork) ### Modifications -- Description: uwu style -- Copyright Holder: [u/akzcake](https://www.reddit.com/user/akzcake) -- License: No license, just a reddit post -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/) +- Description: uwu style +- Copyright Holder: [u/akzcake](https://www.reddit.com/user/akzcake) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly6wd1/nyartix/) # @@ -51,17 +51,17 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Debian Devs -- License: LGPL3 -- [License URL](https://www.gnu.org/licenses/lgpl-3.0.html) -- [Reference](https://www.debian.org/logos/) +- Copyright Holder: Debian Devs +- License: LGPL3 +- [License URL](https://www.gnu.org/licenses/lgpl-3.0.html) +- [Reference](https://www.debian.org/logos/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) -- License: [LGPL3](https://www.gnu.org/licenses/lgpl-3.0.html) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/) +- Description: uwu style +- Copyright Holder: [u/Ishaan_P](https://www.reddit.com/user/Ishaan_P) +- License: [LGPL3](https://www.gnu.org/licenses/lgpl-3.0.html) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxqip4/debinyan/) # @@ -71,16 +71,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Endeavour OS Devs -- License: [No license was mentioned on the website](https://endeavouros.com/endeavouros-logo/) -- [Reference](https://endeavouros.com/endeavouros-logo/) +- Copyright Holder: Endeavour OS Devs +- License: [No license was mentioned on the website](https://endeavouros.com/endeavouros-logo/) +- [Reference](https://endeavouros.com/endeavouros-logo/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/zuru2003](https://www.reddit.com/user/zuru2003) -- License: No license, just a reddit post -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/) +- Description: uwu style +- Copyright Holder: [u/zuru2003](https://www.reddit.com/user/zuru2003) +- License: No license, just a reddit post +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9zed/endowo_os/) # @@ -90,16 +90,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: -- License: [Fedora logo usage guide-lines](https://fedoraproject.org/wiki/Logo/UsageGuidelines) -- [Reference](https://fedoraproject.org/wiki/Logo) +- Copyright Holder: +- License: [Fedora logo usage guide-lines](https://fedoraproject.org/wiki/Logo/UsageGuidelines) +- [Reference](https://fedoraproject.org/wiki/Logo) ### Modifications -- Description: uwu style -- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) -- License: [Fedora logo usage guide-lines (I guess)](https://fedoraproject.org/wiki/Logo/UsageGuidelines) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/) +- Description: uwu style +- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) +- License: [Fedora logo usage guide-lines (I guess)](https://fedoraproject.org/wiki/Logo/UsageGuidelines) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxjp3s/saw_nyarch_and_had_to_do_fedowa/) # @@ -109,17 +109,17 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Gentoo Devs -- License: [Gentoo name and logo guide-lines](https://www.gentoo.org/inside-gentoo/foundation/name-logo-guidelines.html) -- [Reference](https://www.gentoo.org/inside-gentoo/artwork/gentoo-logo.html) +- Copyright Holder: Gentoo Devs +- License: [Gentoo name and logo guide-lines](https://www.gentoo.org/inside-gentoo/foundation/name-logo-guidelines.html) +- [Reference](https://www.gentoo.org/inside-gentoo/artwork/gentoo-logo.html) ### Modifications -- Description: uwu style -- Copyright Holder: [u/TheSatisfiedPig](https://www.reddit.com/user/TheSatisfiedPig) -- License: [CC-BY-SA/2.5](https://creativecommons.org/licenses/by-sa/2.5/) -- [Reference (reddit)](https://www.reddit.com/r/linuxmasterrace/comments/m11aml/genchu/) -- [Reference (gentoo artwork)](https://wiki.gentoo.org/wiki/Project:Artwork/Artwork#Genchu) +- Description: uwu style +- Copyright Holder: [u/TheSatisfiedPig](https://www.reddit.com/user/TheSatisfiedPig) +- License: [CC-BY-SA/2.5](https://creativecommons.org/licenses/by-sa/2.5/) +- [Reference (reddit)](https://www.reddit.com/r/linuxmasterrace/comments/m11aml/genchu/) +- [Reference (gentoo artwork)](https://wiki.gentoo.org/wiki/Project:Artwork/Artwork#Genchu) # @@ -129,16 +129,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Aurelio A. Heckert (aurium@gmail.com) -- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) -- [Reference](https://www.gnu.org/graphics/heckert_gnu.svg) +- Copyright Holder: Aurelio A. Heckert (aurium@gmail.com) +- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) +- [Reference](https://www.gnu.org/graphics/heckert_gnu.svg) ### Modifications -- Description: Addition of ahegao facial expression, and colorization. -- Copyright Holder: [u/FOSSphorous](https://www.reddit.com/user/FOSSphorous/) -- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyi8ce/its_actually_gnuwulinux/) +- Description: Addition of ahegao facial expression, and colorization. +- Copyright Holder: [u/FOSSphorous](https://www.reddit.com/user/FOSSphorous/) +- License: [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyi8ce/its_actually_gnuwulinux/) ## Manjaro @@ -146,16 +146,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Manjaro GmbH & Co. KG. -- License: [Manjaro terms of use](https://manjaro.org/terms-of-use/) -- [Reference](https://gitlab.manjaro.org/artwork) +- Copyright Holder: Manjaro GmbH & Co. KG. +- License: [Manjaro terms of use](https://manjaro.org/terms-of-use/) +- [Reference](https://gitlab.manjaro.org/artwork) ### Modifications -- Description: uwu style -- Copyright Holder: [u/matrixrunner](https://www.reddit.com/user/matrixrunner) -- License: [Manjaro terms of use (I guess, again)](https://manjaro.org/terms-of-use/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxx9h7/myanjawo_also_in_wallpaper/) +- Description: uwu style +- Copyright Holder: [u/matrixrunner](https://www.reddit.com/user/matrixrunner) +- License: [Manjaro terms of use (I guess, again)](https://manjaro.org/terms-of-use/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxx9h7/myanjawo_also_in_wallpaper/) # @@ -165,16 +165,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Linux mint Devs -- License: [None (I think)](https://linuxmint.com/faq.php) -- [Reference](https://linuxmint.com/) +- Copyright Holder: Linux mint Devs +- License: [None (I think)](https://linuxmint.com/faq.php) +- [Reference](https://linuxmint.com/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) -- License: None -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly8oy0/seen_a_lot_of_people_asking_for_mint_so_here_it_is/) +- Description: uwu style +- Copyright Holder: [u/iD3nis124](https://www.reddit.com/user/iD3nis124) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly8oy0/seen_a_lot_of_people_asking_for_mint_so_here_it_is/) # @@ -184,16 +184,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Jens (kde team) -- License: None -- [Reference](https://community.kde.org/Neon#Logo) +- Copyright Holder: Jens (kde team) +- License: None +- [Reference](https://community.kde.org/Neon#Logo) ### Modifications -- Description: uwu style -- Copyright Holder: [u/muff2](https://www.reddit.com/user/muff2) -- License: None -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxt82v/kde_uwon/) +- Description: uwu style +- Copyright Holder: [u/muff2](https://www.reddit.com/user/muff2) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxt82v/kde_uwon/) # @@ -203,16 +203,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Tim Cuthbertson (@timbertson) -- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) -- [Reference](https://github.com/NixOS/nixos-artwork/tree/master/logo#nixos-logo) +- Copyright Holder: Tim Cuthbertson (@timbertson) +- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) +- [Reference](https://github.com/NixOS/nixos-artwork/tree/master/logo#nixos-logo) ### Modifications -- Description: uwu style -- Copyright Holder: [u/ant-artica](https://www.reddit.com/user/ant-artica) -- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lzdwl4/nixowos/) +- Description: uwu style +- Copyright Holder: [u/ant-artica](https://www.reddit.com/user/ant-artica) +- License: [CC-BY license](https://creativecommons.org/licenses/by/4.0/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lzdwl4/nixowos/) # @@ -222,16 +222,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: OpenSuse Devs -- License: [Opensuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) -- [Reference](https://en.opensuse.org/openSUSE:Artwork_brand#Buttons) +- Copyright Holder: OpenSuse Devs +- License: [Opensuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) +- [Reference](https://en.opensuse.org/openSUSE:Artwork_brand#Buttons) ### Modifications -- Description: uwu style -- Copyright Holder: [u/VortexAcherontic](https://www.reddit.com/user/VortexAcherontic) -- License: [OpenSuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/) +- Description: uwu style +- Copyright Holder: [u/VortexAcherontic](https://www.reddit.com/user/VortexAcherontic) +- License: [OpenSuse Trademark guide-lines](https://news.opensuse.org/2009/03/02/opensuse-trademark-guidelines-released/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyhgxp/my_better_attempt_on_owosuse/) # @@ -241,16 +241,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: System76 -- License: [System76 Terms](https://system76.com/terms) -- [Reference](https://pop.system76.com/) +- Copyright Holder: System76 +- License: [System76 Terms](https://system76.com/terms) +- [Reference](https://pop.system76.com/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Mochimo786](https://www.reddit.com/user/Mochimo786) -- License: [System76 Terms](https://system76.com/terms) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/) +- Description: uwu style +- Copyright Holder: [u/Mochimo786](https://www.reddit.com/user/Mochimo786) +- License: [System76 Terms](https://system76.com/terms) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxz3xu/pop_uwus/) # @@ -260,16 +260,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Slackware Devs -- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) -- [Reference](http://www.slackware.com/~msimons/slackware/grfx/) +- Copyright Holder: Slackware Devs +- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) +- [Reference](http://www.slackware.com/~msimons/slackware/grfx/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/theldus](https://www.reddit.com/user/theldus) -- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyt6xi/slawckyware/) +- Description: uwu style +- Copyright Holder: [u/theldus](https://www.reddit.com/user/theldus) +- License: [Slackware Propaganda Graphics FAQ](http://www.slackware.com/~msimons/slackware/grfx/grfxfaq.txt) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lyt6xi/slawckyware/) # @@ -279,16 +279,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Solus Devs -- License: [Solus brand copyright](https://getsol.us/branding/) -- [Reference](https://getsol.us/home/) +- Copyright Holder: Solus Devs +- License: [Solus brand copyright](https://getsol.us/branding/) +- [Reference](https://getsol.us/home/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/welpelp](https://www.reddit.com/user/welpelp) -- License: [Solus brand copyright](https://getsol.us/branding/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9il3/continuing_the_trend_i_made_sowus_my_first/) +- Description: uwu style +- Copyright Holder: [u/welpelp](https://www.reddit.com/user/welpelp) +- License: [Solus brand copyright](https://getsol.us/branding/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/ly9il3/continuing_the_trend_i_made_sowus_my_first/) # @@ -298,16 +298,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Linux foundation -- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) -- [Reference](https://www.linux.org/) +- Copyright Holder: Linux foundation +- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) +- [Reference](https://www.linux.org/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Annual-Examination96](https://www.reddit.com/user/Annual-Examination96) -- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/) +- Description: uwu style +- Copyright Holder: [u/Annual-Examination96](https://www.reddit.com/user/Annual-Examination96) +- License: [Who knows](https://web.archive.org/web/20040401161253/http://www.linux.org/info/logos.html) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lz2i32/tuwu/) # @@ -317,16 +317,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Canonical Ltd -- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) -- [Reference](https://design.ubuntu.com/brand/ubuntu-logo/#:~:text=The%20Ubuntu%20logo%20is%20made,a%20flat%20orange%2Dcoloured%20background.) +- Copyright Holder: Canonical Ltd +- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) +- [Reference](https://design.ubuntu.com/brand/ubuntu-logo/#:~:text=The%20Ubuntu%20logo%20is%20made,a%20flat%20orange%2Dcoloured%20background.) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Chicki2D](https://www.reddit.com/user/Chicki2D) -- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lwsnul/uwuntu/) +- Description: uwu style +- Copyright Holder: [u/Chicki2D](https://www.reddit.com/user/Chicki2D) +- License: [Canonical Ltd Trademarks](https://ubuntu.com/legal/trademarks) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lwsnul/uwuntu/) # @@ -336,16 +336,16 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: VoidLinux Contributors -- License: None -- [Reference](https://voidlinux.org/) +- Copyright Holder: VoidLinux Contributors +- License: None +- [Reference](https://voidlinux.org/) ### Modifications -- Description: uwu style -- Copyright Holder: [u/Satoqz](https://www.reddit.com/user/Satoqz) -- License: None -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/) +- Description: uwu style +- Copyright Holder: [u/Satoqz](https://www.reddit.com/user/Satoqz) +- License: None +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lxnjwd/my_boyfriend_decided_to_create_owoid/) # @@ -357,34 +357,34 @@ I am not a copyright expert, and maybe I am doing all wrong things, please corre ### Base artwork: -- Copyright Holder: Google Inc. -- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) -- [Reference](https://developer.android.com/distribute/marketing-tools/brand-guidelines#android_robot) +- Copyright Holder: Google Inc. +- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) +- [Reference](https://developer.android.com/distribute/marketing-tools/brand-guidelines#android_robot) ### Modifications -- Description: uwu style -- Copyright Holder: [u/6b86b3ac03c167320d93](https://www.reddit.com/user/6b86b3ac03c167320d93) -- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) -- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) +- Description: uwu style +- Copyright Holder: [u/6b86b3ac03c167320d93](https://www.reddit.com/user/6b86b3ac03c167320d93) +- License: [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) +- [Reference](https://www.reddit.com/r/linuxmasterrace/comments/lye15q/im_not_an_artist_but_heres_my_attempt_at_making/) - +- Description: uwu style +- Copyright Holder: [name](https://www.reddit.com/user) +- License: +- [Reference]() +--> diff --git a/uwufetch.c b/uwufetch.c index fbc8c38..ffe8a80 100644 --- a/uwufetch.c +++ b/uwufetch.c @@ -24,24 +24,24 @@ #include // COLORS -#define NORMAL "\x1b[0m" -#define BOLD "\x1b[1m" -#define BLACK "\x1b[30m" -#define RED "\x1b[31m" -#define GREEN "\x1b[32m" -#define YELLOW "\x1b[33m" -#define BLUE "\x1b[34m" -#define MAGENTA "\x1b[0;35m" -#define CYAN "\x1b[36m" -#define WHITE "\x1b[37m" -#define PINK "\x1b[38;5;201m" -#define LPINK "\x1b[38;5;213m" +#define NORMAL "\x1b[0m" +#define BOLD "\x1b[1m" +#define BLACK "\x1b[30m" +#define RED "\x1b[31m" +#define GREEN "\x1b[32m" +#define YELLOW "\x1b[33m" +#define BLUE "\x1b[34m" +#define MAGENTA "\x1b[0;35m" +#define CYAN "\x1b[36m" +#define WHITE "\x1b[37m" +#define PINK "\x1b[38;5;201m" +#define LPINK "\x1b[38;5;213m" -struct package_manager { - char command_string[128]; // command to get number of packages installed - char pkgman_name[16]; // name of the package manager +struct package_manager +{ + char command_string[128]; // command to get number of packages installed + char pkgman_name[16]; // name of the package manager }; - struct utsname sys_var; struct sysinfo sys; struct winsize win; @@ -49,7 +49,7 @@ int ram_total, ram_used = 0; // initialise the variables to store data, gpu array can hold up to 8 gpus int pkgs, target_width = 0; // all flags available -int ascii_image_flag = 0, +int ascii_image_flag = 0, show_user_info = 1, show_os = 1, show_kernel = 1, @@ -60,9 +60,9 @@ int ascii_image_flag = 0, show_pkgs = 1, show_uptime = 1, show_colors = 1; -char user[32], host[256], shell[64], kernel[256], version_name[64], cpu_model[256], - gpu_model[8][256] = {{'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}}, - pkgman_name[64], image_name[32]; +char user[32], host[256], shell[64], kernel[256], version_name[64], cpu_model[256], + gpu_model[8][256] = {{'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}, {'0'}}, + pkgman_name[64], image_name[32]; // functions definitions, to use them in main() int pkgman(); @@ -77,143 +77,178 @@ void uwu_name(); void truncate_name(char *); void remove_brackets(char *); -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ int opt = 0; static struct option long_options[] = { - { "ascii", no_argument, NULL, 'a' }, - { "custom", required_argument, NULL, 'c' }, - { "config", required_argument, NULL, 0}, - { "distro", required_argument, NULL, 'd' }, - { "help", no_argument, NULL, 'h' }, - { "image", no_argument, NULL, 'i' }, - { "list", no_argument, NULL, 'l' }, - { NULL, 0, NULL, 0 } - }; + {"ascii", no_argument, NULL, 'a'}, + {"custom", required_argument, NULL, 'c'}, + {"config", required_argument, NULL, 0}, + {"distro", required_argument, NULL, 'd'}, + {"help", no_argument, NULL, 'h'}, + {"image", no_argument, NULL, 'i'}, + {"list", no_argument, NULL, 'l'}, + {NULL, 0, NULL, 0}}; get_info(); parse_config(); - while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) { - switch (opt) { - case 'a': - ascii_image_flag = 0; - break; - case 'c': - ascii_image_flag = 1; - sprintf(image_name, "%s", optarg); - break; - case 'd': - if (optarg) sprintf(version_name, "%s", optarg); - break; - case 'h': - usage(argv[0]); - return 0; - case 'i': - ascii_image_flag = 1; - break; - case 'l': - list(argv[0]); - return 0; - default: - break; + while ((opt = getopt_long(argc, argv, "ad:hilc:", long_options, NULL)) != -1) + { + switch (opt) + { + case 'a': + ascii_image_flag = 0; + break; + case 'c': + ascii_image_flag = 1; + sprintf(image_name, "%s", optarg); + break; + case 'd': + if (optarg) + sprintf(version_name, "%s", optarg); + break; + case 'h': + usage(argv[0]); + return 0; + case 'i': + ascii_image_flag = 1; + break; + case 'l': + list(argv[0]); + return 0; + default: + break; } } - if ((argc == 1 && ascii_image_flag == 0) || (argc > 1 && ascii_image_flag == 0)) print_ascii(); - else if (ascii_image_flag) print_image(); + if ((argc == 1 && ascii_image_flag == 0) || (argc > 1 && ascii_image_flag == 0)) + print_ascii(); + else if (ascii_image_flag) + print_image(); uwu_name(); print_info(); } -void parse_config() { +void parse_config() +{ char line[256]; char *homedir = getenv("HOME"); char *temp_buffer = ""; - + FILE *config = fopen(strcat(homedir, "/.config/uwufetch/config"), "r"); - if(config == NULL) return; - while(fgets(line, sizeof(line), config)) { - if(line[0] == '#') continue; + if (config == NULL) + return; + while (fgets(line, sizeof(line), config)) + { + if (line[0] == '#') + continue; ascii_image_flag = sscanf(line, "image=%s", image_name); sscanf(line, "distro=%s", version_name); - if (sscanf(line, "nouser%s", temp_buffer)) show_user_info = 0; - if (sscanf(line, "noos%s", temp_buffer)) show_os = 0; - if (sscanf(line, "nokernel%s", temp_buffer)) show_kernel = 0; - if (sscanf(line, "nocpu%s", temp_buffer)) show_cpu = 0; - if (sscanf(line, "nogpu%s", temp_buffer)) show_gpu = 0; - if (sscanf(line, "noram%s", temp_buffer)) show_ram = 0; - if (sscanf(line, "noshell%s", temp_buffer)) show_shell = 0; - if (sscanf(line, "nopkgs%s", temp_buffer)) show_pkgs = 0; - if (sscanf(line, "nouptime%s", temp_buffer)) show_uptime = 0; - if (sscanf(line, "nocolors%s", temp_buffer)) show_colors = 0; + if (sscanf(line, "nouser%s", temp_buffer)) + show_user_info = 0; + if (sscanf(line, "noos%s", temp_buffer)) + show_os = 0; + if (sscanf(line, "nokernel%s", temp_buffer)) + show_kernel = 0; + if (sscanf(line, "nocpu%s", temp_buffer)) + show_cpu = 0; + if (sscanf(line, "nogpu%s", temp_buffer)) + show_gpu = 0; + if (sscanf(line, "noram%s", temp_buffer)) + show_ram = 0; + if (sscanf(line, "noshell%s", temp_buffer)) + show_shell = 0; + if (sscanf(line, "nopkgs%s", temp_buffer)) + show_pkgs = 0; + if (sscanf(line, "nouptime%s", temp_buffer)) + show_uptime = 0; + if (sscanf(line, "nocolors%s", temp_buffer)) + show_colors = 0; } } -int pkgman() { // this is just a function that returns the total of installed packages +int pkgman() +{ // this is just a function that returns the total of installed packages int total = 0; struct package_manager pkgmans[] = { - { "apt list --installed 2> /dev/null | wc -l", "(apt)" }, - { "apk info 2> /dev/null | wc -l", "(apk)" }, - { "dnf list installed 2> /dev/null | wc -l", "(dnf)" }, - { "qlist -I 2> /dev/null | wc -l", "(emerge)" }, - { "flatpak list 2> /dev/null | wc -l", "(flatpack)" }, - { "guix package --list-installed 2> /dev/null | wc -l", "(guix)" }, - { "nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)" }, - { "pacman -Qq 2> /dev/null | wc -l", "(pacman)" }, - { "rpm -qa --last 2> /dev/null | wc -l", "(rpm)" }, - { "xbps-query -l 2> /dev/null | wc -l", "(xbps)" }, - { "zypper se --installed-only 2> /dev/null | wc -l", "(zypper)" } - }; + {"apt list --installed 2> /dev/null | wc -l", "(apt)"}, + {"apk info 2> /dev/null | wc -l", "(apk)"}, + {"dnf list installed 2> /dev/null | wc -l", "(dnf)"}, + {"qlist -I 2> /dev/null | wc -l", "(emerge)"}, + {"flatpak list 2> /dev/null | wc -l", "(flatpack)"}, + {"guix package --list-installed 2> /dev/null | wc -l", "(guix)"}, + {"nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)"}, + {"pacman -Qq 2> /dev/null | wc -l", "(pacman)"}, + {"rpm -qa --last 2> /dev/null | wc -l", "(rpm)"}, + {"xbps-query -l 2> /dev/null | wc -l", "(xbps)"}, + {"zypper se --installed-only 2> /dev/null | wc -l", "(zypper)"}}; const unsigned long pkgman_count = sizeof(pkgmans) / sizeof(pkgmans[0]); - for (long unsigned int i = 0; i < pkgman_count; i++) { // long unsigned int instead of int because of -Wsign-compare + for (long unsigned int i = 0; i < pkgman_count; i++) + { // long unsigned int instead of int because of -Wsign-compare struct package_manager *current = &pkgmans[i]; FILE *fp = popen(current->command_string, "r"); unsigned int pkg_count; - if (fscanf(fp, "%u", &pkg_count) == 3) continue; + if (fscanf(fp, "%u", &pkg_count) == 3) + continue; fclose(fp); total += pkg_count; - if (pkg_count > 0) strcat(pkgman_name, current->pkgman_name); + if (pkg_count > 0) + strcat(pkgman_name, current->pkgman_name); } return total; } -void print_info() { +void print_info() +{ // store sys info in the sys again // print collected info - from host to cpu info printf("\033[9A"); // to align info text - if (show_user_info) printf("\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); - if (show_os) printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); - if (show_kernel) printf("\033[18C%s%sKEWNEL %s%s\n", NORMAL, BOLD, NORMAL, kernel); - if (show_cpu) printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); + if (show_user_info) + printf("\033[18C%s%s%s@%s\n", NORMAL, BOLD, user, host); + if (show_os) + printf("\033[18C%s%sOWOS %s%s\n", NORMAL, BOLD, NORMAL, version_name); + if (show_kernel) + printf("\033[18C%s%sKEWNEL %s%s\n", NORMAL, BOLD, NORMAL, kernel); + if (show_cpu) + printf("\033[18C%s%sCPUWU %s%s\n", NORMAL, BOLD, NORMAL, cpu_model); // print the gpus - if (show_gpu) { + if (show_gpu) + { int gpu_iter = 0; - while(gpu_model[gpu_iter][0] != '0') { - printf( "\033[18C%s%sGPUWU %s%s\n", - NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); + while (gpu_model[gpu_iter][0] != '0') + { + printf("\033[18C%s%sGPUWU %s%s\n", + NORMAL, BOLD, NORMAL, gpu_model[gpu_iter]); gpu_iter++; } } // print ram to uptime and colors - if (show_ram) printf("\033[18C%s%sWAM %s%i MB/%i MB\n", - NORMAL, BOLD, NORMAL, (ram_used), ram_total); - if (show_shell) printf("\033[18C%s%sSHELL %s%s\n", - NORMAL, BOLD, NORMAL, shell); - if (show_pkgs) printf("\033[18C%s%sPKGS %s%s%d %s\n", - NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); - if (show_uptime) printf("\033[18C%s%sUWUPTIME %s"/*"%lid, "*/"%lih, %lim\n", - NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime/60/60, sys.uptime/60%60); - if (show_colors) printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", - BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); + if (show_ram) + printf("\033[18C%s%sWAM %s%i MB/%i MB\n", + NORMAL, BOLD, NORMAL, (ram_used), ram_total); + if (show_shell) + printf("\033[18C%s%sSHELL %s%s\n", + NORMAL, BOLD, NORMAL, shell); + if (show_pkgs) + printf("\033[18C%s%sPKGS %s%s%d %s\n", + NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); + if (show_uptime) + printf("\033[18C%s%sUWUPTIME %s" /*"%lid, "*/ "%lih, %lim\n", + NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime / 60 / 60, sys.uptime / 60 % 60); + if (show_colors) + printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", + BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); } -void get_info() { // get all necessary info - char line[256]; // var to scan file lines +void get_info() +{ // get all necessary info + char line[256]; // var to scan file lines // terminal width used to truncate long names ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); @@ -222,33 +257,43 @@ void get_info() { // get all necessary info // os version FILE *os_release = fopen("/etc/os-release", "r"); FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); - if (os_release) { // get normal vars + if (os_release) + { // get normal vars while (fgets(line, sizeof(line), os_release)) - if (sscanf(line, "\nID=%s", version_name)) break; + if (sscanf(line, "\nID=%s", version_name)) + break; while (fgets(line, sizeof(line), cpuinfo)) - if (sscanf(line, "model name : %[^\n]", cpu_model)) break; + if (sscanf(line, "model name : %[^\n]", cpu_model)) + break; sprintf(user, "%s", getenv("USER")); fclose(os_release); - } else { // try for android vars, or unknown system + } + else + { // try for android vars, or unknown system DIR *system_app = opendir("/system/app/"); DIR *system_priv_app = opendir("/system/priv-app/"); - if (system_app && system_priv_app) { // android + if (system_app && system_priv_app) + { // android closedir(system_app); closedir(system_priv_app); sprintf(version_name, "android"); // android vars FILE *whoami = popen("whoami", "r"); - if (fscanf(whoami, "%s", user) == 3) sprintf(user, "unknown"); + if (fscanf(whoami, "%s", user) == 3) + sprintf(user, "unknown"); fclose(whoami); while (fgets(line, sizeof(line), cpuinfo)) - if (sscanf(line, "Hardware : %[^\n]", cpu_model)) break; - } else + if (sscanf(line, "Hardware : %[^\n]", cpu_model)) + break; + } + else sprintf(version_name, "unknown"); } fclose(cpuinfo); gethostname(host, 256); sscanf(getenv("SHELL"), "%s", shell); - if (strlen(shell) > 16) memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux + if (strlen(shell) > 16) + memmove(&shell, &shell[27], strlen(shell)); // android shell was too long, this works only for termux // truncate CPU name truncate_name(cpu_model); @@ -265,11 +310,14 @@ void get_info() { // get all necessary info FILE *meminfo; meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); - while (fgets(line, sizeof(line), meminfo)) { + while (fgets(line, sizeof(line), meminfo)) + { // free command prints like this: "Mem:" total used free shared buff/cache available - if (sscanf(line, "Mem: %d %d", &ram_total, &ram_used)) { + if (sscanf(line, "Mem: %d %d", &ram_total, &ram_used)) + { // convert to megabytes - if (ram_total > 0 && ram_used > 0) { + if (ram_total > 0 && ram_used > 0) + { // data is in bytes ram_total /= 1024; ram_used /= 1024; @@ -280,16 +328,18 @@ void get_info() { // get all necessary info fclose(meminfo); /* ---------- gpu ---------- */ - int gpun = 0; // number of the gpu that the program is searching for to put in the array + int gpun = 0; // number of the gpu that the program is searching for to put in the array setenv("LANG", "en_US", 1); // force language to english FILE *gpu; gpu = popen("lshw -class display 2> /dev/null", "r"); // add all gpus to the array gpu_model (up to 8 gpus) while (fgets(line, sizeof(line), gpu)) - if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) gpun++; + if (sscanf(line, " product: %[^\n]", gpu_model[gpun])) + gpun++; - if (strlen(gpu_model[0]) < 2) { + if (strlen(gpu_model[0]) < 2) + { // get gpus with lspci command if (strcmp(version_name, "android") != 0) gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); @@ -298,13 +348,16 @@ void get_info() { // get all necessary info } // get all the gpus - while (fgets(line, sizeof(line), gpu)) { - if (sscanf(line, "%[^\n]", gpu_model[gpun])) gpun++; + while (fgets(line, sizeof(line), gpu)) + { + if (sscanf(line, "%[^\n]", gpu_model[gpun])) + gpun++; } fclose(gpu); // truncate GPU name and remove square brackets - for (int i = 0; i < gpun; i++) { + for (int i = 0; i < gpun; i++) + { remove_brackets(gpu_model[i]); truncate_name(gpu_model[i]); } @@ -313,215 +366,278 @@ void get_info() { // get all necessary info pkgs = pkgman(); } -void list(char *arg) { // prints distribution list +void list(char *arg) +{ // prints distribution list // distributions are listed by distribution branch // to make the output easier to understand by the user. - printf( "%s -d \n" " Available distributions:\n" - " %sArch linux %sbased:\n" - " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" - " %sDebian/%sUbuntu %sbased:\n" - " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" - " %sBSD:\n" - " freebsd, %sopenbsd\n\n" - " %sOther/spare distributions:\n" - " %salpine, %sfedora, %sgentoo, %s\"void\", \"opensuse-leap\", android, %sgnu, guix, %sunknown\n", - arg, - BLUE, NORMAL, BLUE, GREEN, // Arch based colors - RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors - RED, YELLOW, // BSD colors - NORMAL, BLUE, BLUE, PINK, GREEN, YELLOW, WHITE); // Other/spare distributions colors + printf("%s -d \n" + " Available distributions:\n" + " %sArch linux %sbased:\n" + " %sarch, artix, %smanjaro, \"manjaro-arm\"\n\n" + " %sDebian/%sUbuntu %sbased:\n" + " %sdebian, %slinuxmint, %spop, %sraspbian\n\n" + " %sBSD:\n" + " freebsd, %sopenbsd\n\n" + " %sOther/spare distributions:\n" + " %salpine, %sfedora, %sgentoo, %s\"void\", \"opensuse-leap\", android, %sgnu, guix, %sunknown\n", + arg, + BLUE, NORMAL, BLUE, GREEN, // Arch based colors + RED, YELLOW, NORMAL, RED, GREEN, BLUE, RED, // Debian based colors + RED, YELLOW, // BSD colors + NORMAL, BLUE, BLUE, PINK, GREEN, YELLOW, WHITE); // Other/spare distributions colors } -void print_ascii() { // prints logo (as ascii art) of the given system. distributions listed alphabetically. +void print_ascii() +{ // prints logo (as ascii art) of the given system. distributions listed alphabetically. // linux - if (strcmp(version_name, "alpine") == 0) { - printf( "\033[2E\033[4C%s. .___.\n" - " / \\/ \\ /\n" - " /OwO\\ɛU\\/ __\n" - " / \\ \\__/ \\\n" - "/ \\ \\\n\n\n", BLUE); - } else if (strcmp(version_name, "arch") == 0) { - printf( "\033[1E\033[8C%s/\\\n" - " / \\\n" - " /\\ \\\n" - " / > w <\\\n" - " / __ \\\n" - " / __| |__-\\\n" " /_-'' ''-_\\\n\n", BLUE); - } else if (strcmp(version_name, "artix") == 0) { - printf( "\033[1E\033[8C%s/\\\n" - " / \\\n" - " /`'.,\\\n" - " /\u2022 w \u2022 \\\n" - " / ,`\\\n" - " / ,.'`. \\\n" - " /.,'` `'.\\\n\n", BLUE); - } else if (strcmp(version_name, "debian") == 0) { - printf( "\033[1E\033[6C%s______\n" - " / ___ \\\n" - " | / OwO |\n" - " | \\____-\n" " -_\n" - " --_\n\n\n", RED); - } else if (strcmp(version_name, "fedora") == 0) { - printf( "\033[1E\033[8C%s_____\n" - " / __)%s\\\n" - " %s> %s| / %s<%s\\ \\\n" - " __%s_| %sw%s|_%s_/ /\n" - " / %s(_ _)%s_/\n" - " / / %s| |\n" - " %s\\ \\%s__/ |\n" - " %s\\%s(_____/\n", - BLUE, CYAN, WHITE, BLUE, WHITE, CYAN,BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE); - } else if (strcmp(version_name, "gentoo") == 0) { - printf( "\033[1E\033[3C%s_-----_\n" - " ( \\\n" - " \\ OwO \\\n" - "%s \\ )\n" - " / _/\n" - " ( _-\n" " \\____-\n\n", MAGENTA, WHITE); - } else if (strcmp(version_name, "gnu") == 0 || strcmp(version_name, "guix") == 0) { - printf( "\033[3E\033[3C%s,= %s,-_-. %s=.\n" - " ((_/%s)%sU U%s(%s\\_))\n" - " `-'%s(. .)%s`-'\n" - " %s\\%sw%s/\n" - " \u00af\n\n", WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); - } else if (strcmp(version_name, "manjaro") == 0) { - printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "\"manjaro-arm\"") == 0) { - printf( "\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" - " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); - } else if (strcmp(version_name, "linuxmint") == 0) { - printf( "\033[2E\033[4C%s__/\\____/\\.\n" - " |%s.--. %s|\n" - " %s, %s¯| %s| UwU| %s|\n" - " %s|| %s| %s| | %s|\n" - " %s | %s| %s---- %s|\n" - " %s --%s'--------'\n\n", GREEN, WHITE, GREEN, WHITE, - GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, - GREEN, WHITE, GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "\"opensuse-leap\"") == 0 || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) { - printf( "\033[3E\033[3C%s|\\----/|\n" - " _ / %sO O%s\\\n" - " __. W /\n" - " '----'\n\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "pop") == 0) { - printf( "\033[2E\033[6C%s|\\.-----./|\n" - " |/ \\|\n" - " | > < |\n" - " | %s~ %sP! %s~ %s|\n" - "_ ---\\ w /\n" - " \\_/ '-----'\n\n", BLUE, LPINK, WHITE, LPINK, BLUE); - } else if (strcmp(version_name, "raspbian") == 0) { - printf( "\033[0E\033[6C%s__ __\n" - " (_\\)(/_)\n" - " %s(>(__)<)\n" - " (_(_)(_)_)\n" - " (_(__)_)\n" - " (__)\n\n\n", GREEN, RED); - } else if (strcmp(version_name, "ubuntu") == 0) { - printf( "\033[1E\033[9C%s_\n" - " %s\u25E3%s__(_)%s\u25E2%s\n" - " _/ --- \\\n" - " (_) |>w<| |\n" - " \\ --- _/\n" - " %sC__/%s---(_)\n\n\n", - LPINK, PINK, LPINK, PINK, LPINK, PINK, LPINK); - } else if (strcmp(version_name, "\"void\"") == 0) { - printf( "\033[2E\033[2C%s |\\_____/|\n" - " _\\____ |\n" - " | \\ \\ |\n" - " | | %s\u00d2w\u00d3 %s| | ,\n" - " | \\_____\\_|-, |\n" - " -_______\\ \\_/\n\n", GREEN, WHITE, GREEN); - } else if (strcmp(version_name, "android") == 0) { // android at the end because it could be not considered as an actual distribution of gnu/linux - printf( "\033[2E\033[3C%s\\ _------_ /\n" - " / \\\n" - " | %s~ %s> w < %s~ %s|\n" - " ------------\n\n\n\n", GREEN, RED, GREEN, RED, GREEN); - + if (strcmp(version_name, "alpine") == 0) + { + printf("\033[2E\033[4C%s. .___.\n" + " / \\/ \\ /\n" + " /OwO\\ɛU\\/ __\n" + " / \\ \\__/ \\\n" + "/ \\ \\\n\n\n", + BLUE); + } + else if (strcmp(version_name, "arch") == 0) + { + printf("\033[1E\033[8C%s/\\\n" + " / \\\n" + " /\\ \\\n" + " / > w <\\\n" + " / __ \\\n" + " / __| |__-\\\n" + " /_-'' ''-_\\\n\n", + BLUE); + } + else if (strcmp(version_name, "artix") == 0) + { + printf("\033[1E\033[8C%s/\\\n" + " / \\\n" + " /`'.,\\\n" + " /\u2022 w \u2022 \\\n" + " / ,`\\\n" + " / ,.'`. \\\n" + " /.,'` `'.\\\n\n", + BLUE); + } + else if (strcmp(version_name, "debian") == 0) + { + printf("\033[1E\033[6C%s______\n" + " / ___ \\\n" + " | / OwO |\n" + " | \\____-\n" + " -_\n" + " --_\n\n\n", + RED); + } + else if (strcmp(version_name, "fedora") == 0) + { + printf("\033[1E\033[8C%s_____\n" + " / __)%s\\\n" + " %s> %s| / %s<%s\\ \\\n" + " __%s_| %sw%s|_%s_/ /\n" + " / %s(_ _)%s_/\n" + " / / %s| |\n" + " %s\\ \\%s__/ |\n" + " %s\\%s(_____/\n", + BLUE, CYAN, WHITE, BLUE, WHITE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE, CYAN, BLUE); + } + else if (strcmp(version_name, "gentoo") == 0) + { + printf("\033[1E\033[3C%s_-----_\n" + " ( \\\n" + " \\ OwO \\\n" + "%s \\ )\n" + " / _/\n" + " ( _-\n" + " \\____-\n\n", + MAGENTA, WHITE); + } + else if (strcmp(version_name, "gnu") == 0 || strcmp(version_name, "guix") == 0) + { + printf("\033[3E\033[3C%s,= %s,-_-. %s=.\n" + " ((_/%s)%sU U%s(%s\\_))\n" + " `-'%s(. .)%s`-'\n" + " %s\\%sw%s/\n" + " \u00af\n\n", + WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); + } + else if (strcmp(version_name, "manjaro") == 0) + { + printf("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } + else if (strcmp(version_name, "\"manjaro-arm\"") == 0) + { + printf("\033[0E\033[1C\u25b3 \u25b3 \u25e0\u25e0\u25e0\u25e0\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m\e[0;42m\e[1;30m > w < \e[0m\e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n" + " \e[0;42m \e[0m \e[0;42m \e[0m \e[0;42m \e[0m\n"); + } + else if (strcmp(version_name, "linuxmint") == 0) + { + printf("\033[2E\033[4C%s__/\\____/\\.\n" + " |%s.--. %s|\n" + " %s, %s¯| %s| UwU| %s|\n" + " %s|| %s| %s| | %s|\n" + " %s | %s| %s---- %s|\n" + " %s --%s'--------'\n\n", + GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, GREEN, WHITE, + GREEN, WHITE, GREEN, WHITE, GREEN); + } + else if (strcmp(version_name, "\"opensuse-leap\"") == 0 || strcmp(version_name, "\"opensuse-tumbleweed\"") == 0) + { + printf("\033[3E\033[3C%s|\\----/|\n" + " _ / %sO O%s\\\n" + " __. W /\n" + " '----'\n\n\n", + GREEN, WHITE, GREEN); + } + else if (strcmp(version_name, "pop") == 0) + { + printf("\033[2E\033[6C%s|\\.-----./|\n" + " |/ \\|\n" + " | > < |\n" + " | %s~ %sP! %s~ %s|\n" + "_ ---\\ w /\n" + " \\_/ '-----'\n\n", + BLUE, LPINK, WHITE, LPINK, BLUE); + } + else if (strcmp(version_name, "raspbian") == 0) + { + printf("\033[0E\033[6C%s__ __\n" + " (_\\)(/_)\n" + " %s(>(__)<)\n" + " (_(_)(_)_)\n" + " (_(__)_)\n" + " (__)\n\n\n", + GREEN, RED); + } + else if (strcmp(version_name, "ubuntu") == 0) + { + printf("\033[1E\033[9C%s_\n" + " %s\u25E3%s__(_)%s\u25E2%s\n" + " _/ --- \\\n" + " (_) |>w<| |\n" + " \\ --- _/\n" + " %sC__/%s---(_)\n\n\n", + LPINK, PINK, LPINK, PINK, LPINK, PINK, LPINK); + } + else if (strcmp(version_name, "\"void\"") == 0) + { + printf("\033[2E\033[2C%s |\\_____/|\n" + " _\\____ |\n" + " | \\ \\ |\n" + " | | %s\u00d2w\u00d3 %s| | ,\n" + " | \\_____\\_|-, |\n" + " -_______\\ \\_/\n\n", + GREEN, WHITE, GREEN); + } + else if (strcmp(version_name, "android") == 0) + { // android at the end because it could be not considered as an actual distribution of gnu/linux + printf("\033[2E\033[3C%s\\ _------_ /\n" + " / \\\n" + " | %s~ %s> w < %s~ %s|\n" + " ------------\n\n\n\n", + GREEN, RED, GREEN, RED, GREEN); } // BSD - else if (strcmp(version_name, "freebsd") == 0) { - printf( "\033[2E\033[1C%s/\\,-'''''-,/\\\n" - " \\_) (_/\n" - " | \\ / |\n" - " | O w O |\n" - " ; ;\n" " '-_____-'\n\n", RED); - - } else if (strcmp(version_name, "openbsd") == 0) { - printf( "\033[1E\033[3C%s ______ \n" - " \\- -/ %s\u2665 \n" - "%s\\_/ \\ \n" - "| %s> < %s| \n" - "|_ < %s// %sW %s// \n" - "%s/ \\ / \n" - " /-________-\\ \n\n", - YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); - + else if (strcmp(version_name, "freebsd") == 0) + { + printf("\033[2E\033[1C%s/\\,-'''''-,/\\\n" + " \\_) (_/\n" + " | \\ / |\n" + " | O w O |\n" + " ; ;\n" + " '-_____-'\n\n", + RED); + } + else if (strcmp(version_name, "openbsd") == 0) + { + printf("\033[1E\033[3C%s ______ \n" + " \\- -/ %s\u2665 \n" + "%s\\_/ \\ \n" + "| %s> < %s| \n" + "|_ < %s// %sW %s// \n" + "%s/ \\ / \n" + " /-________-\\ \n\n", + YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); } // everything else - else printf( "\033[0E\033[2C%s._.--._.\n" - " \\|>%s_%s< |/\n" - " |%s:_/%s |\n" - " // \\ \\ ?\n" - " (| | ) /\n" - " %s/'\\_ _/`\\%s-\n" - " %s\\___)=(___/\n\n", - WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); + else + printf("\033[0E\033[2C%s._.--._.\n" + " \\|>%s_%s< |/\n" + " |%s:_/%s |\n" + " // \\ \\ ?\n" + " (| | ) /\n" + " %s/'\\_ _/`\\%s-\n" + " %s\\___)=(___/\n\n", + WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW, WHITE, YELLOW); } -void print_image() { // prints logo (as an image) of the given system. distributions listed alphabetically. +void print_image() +{ // prints logo (as an image) of the given system. distributions listed alphabetically. char command[256]; if (strlen(image_name) > 1) sprintf(command, "viu -t -w 18 -h 8 %s 2> /dev/null", image_name); - else { - if (strcmp(version_name, "android") == 0) sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); - else sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + else + { + if (strcmp(version_name, "android") == 0) + sprintf(command, "viu -t -w 18 -h 8 /data/data/com.termux/files/usr/lib/uwufetch/%s.png 2> /dev/null", version_name); + else + sprintf(command, "viu -t -w 18 -h 8 /usr/lib/uwufetch/%s.png 2> /dev/null", version_name); } printf("\n"); - if (system(command) != 0) { // if viu is not installed or the image is missing - printf( "\033[0E\033[3C%s\n" - " There was an\n" - " error: viu\n" - " is not installed\n" - " or the image\n" - " is not fount\n" - " Read IMAGES.md\n" " for more info.\n\n", RED); + if (system(command) != 0) + { // if viu is not installed or the image is missing + printf("\033[0E\033[3C%s\n" + " There was an\n" + " error: viu\n" + " is not installed\n" + " or the image\n" + " is not fount\n" + " Read IMAGES.md\n" + " for more info.\n\n", + RED); } } -void usage(char *arg) { - printf( "Usage: %s \n" - " -a, --ascii prints logo as ascii text (default)\n" - " -c, --custom choose a custom image\n" // this options should be different, maybe merged with `-i` - " --config use custom config path\n" - " -d, --distro lets you choose the logo to print\n" - " -h, --help prints this help page\n" - " -i, --image prints logo as image\n" // someone should add an optional argument to change image without using `-c`, but I don't know how to do it. - " %sworks in most terminals\n" - " read README.md for more info%s\n" - " -l, --list lists all supported distributions\n", - arg, BLUE, NORMAL); +void usage(char *arg) +{ + printf("Usage: %s \n" + " -a, --ascii prints logo as ascii text (default)\n" + " -c, --custom choose a custom image\n" // this options should be different, maybe merged with `-i` + " --config use custom config path\n" + " -d, --distro lets you choose the logo to print\n" + " -h, --help prints this help page\n" + " -i, --image prints logo as image\n" // someone should add an optional argument to change image without using `-c`, but I don't know how to do it. + " %sworks in most terminals\n" + " read README.md for more info%s\n" + " -l, --list lists all supported distributions\n", + arg, BLUE, NORMAL); } -void uwu_name() { // uwufies distro name +void uwu_name() +{ // uwufies distro name -#define STRING_TO_UWU(original, uwufied) if (strcmp(version_name, original) == 0) sprintf(version_name, "%s", uwufied) +#define STRING_TO_UWU(original, uwufied) \ + if (strcmp(version_name, original) == 0) \ + sprintf(version_name, "%s", uwufied) // linux STRING_TO_UWU("alpine", "Nyalpine"); @@ -549,14 +665,14 @@ void uwu_name() { // uwufies distro name else STRING_TO_UWU("android", "Nyandroid"); // android at the end because it could be not considered as an actual distribution of gnu/linux // BSD - else STRING_TO_UWU - ("freebsd", "FweeBSD"); - else STRING_TO_UWU - ("openbsd", "OwOpenBSD"); + else STRING_TO_UWU("freebsd", "FweeBSD"); + else STRING_TO_UWU("openbsd", "OwOpenBSD"); - else { + else + { sprintf(version_name, "%s", "unknown"); - if (ascii_image_flag == 1) { + if (ascii_image_flag == 1) + { print_image(); printf("\n"); } @@ -564,18 +680,24 @@ void uwu_name() { // uwufies distro name #undef STRING_TO_UWU } -void truncate_name(char *name) { +void truncate_name(char *name) +{ for (int i = target_width; i < 256; i++) name[i] = '\0'; } // remove square brackets (for gpu names) -void remove_brackets(char *str) { +void remove_brackets(char *str) +{ int i = 0, j; - while (i < (int) strlen(str)) { - if (str[i] == '[' || str[i] == ']') { - for (j = i; j < (int) strlen(str); j++) + while (i < (int)strlen(str)) + { + if (str[i] == '[' || str[i] == ']') + { + for (j = i; j < (int)strlen(str); j++) str[j] = str[j + 1]; - } else i++; + } + else + i++; } } diff --git a/uwufetch_man.md b/uwufetch_man.md index 36dba69..a029236 100644 --- a/uwufetch_man.md +++ b/uwufetch_man.md @@ -1,101 +1,113 @@ % UWUFETCH(1) uwufetch 1.2 % TheDarkBug % April 2021 + + # NAME + uwufetch - A meme system info tool for Linux, based on nyan/uwu trend on r/linuxmasterrace. # SYNOPSIS + **uwufetch** [*OPTIONS*] [*ARGUMENTS*]\ ## OPTIONS --a --ascii\ + +-a --ascii\ prints the logo as ascii text (default) --c --custom\ +-c --custom\ you can choose a custom image path --config\ you can change config path --d --distro\ +-d --distro\ you can choose the logo to print by the distro name --h --help\ +-h --help\ prints a help page --i --image\ +-i --image\ prints image instead of ascii logo --l --list\ +-l --list\ prints a list of all supported distributions # CONFIG FILE + The config file is located in $HOME/.config/uwufetch/config (you need to create it), but you can change the path by using the `--config` option. ## OPTIONS -distribution=name\ \ \ \ \ # use it to change displayed distribution\ -image=/path/to/image\ \ \ # enable images (leave blank), or use custom image path\ -nouser\ \ \ \ \ \ \ \ \ \ \ # disable username and hostname\ -noos\ \ \ \ \ \ \ \ \ \ \ # disable os\ -nokernel\ \ \ \ \ \ \ \ \ # disable kernel\ -nocpu\ \ \ \ \ \ \ \ \ \ \ # disable cpu\ -nogpu\ \ \ \ \ \ \ \ \ \ \ # disable gpu\ -noram\ \ \ \ \ \ \ \ \ \ \ # disable ram\ -noshell\ \ \ \ \ \ \ \ \ \ # disable shell\ -nopkgs\ \ \ \ \ \ \ \ \ \ \ # disable pkgs\ -nouptime\ \ \ \ \ \ \ \ \ # disable uptime\ -nocolors\ \ \ \ \ \ \ \ \ # disable colors + +distribution=name\ \ \ \ \ # use it to change displayed distribution\ +image=/path/to/image\ \ \ # enable images (leave blank), or use custom image path\ +nouser\ \ \ \ \ \ \ \ \ \ \ # disable username and hostname\ +noos\ \ \ \ \ \ \ \ \ \ \ # disable os\ +nokernel\ \ \ \ \ \ \ \ \ # disable kernel\ +nocpu\ \ \ \ \ \ \ \ \ \ \ # disable cpu\ +nogpu\ \ \ \ \ \ \ \ \ \ \ # disable gpu\ +noram\ \ \ \ \ \ \ \ \ \ \ # disable ram\ +noshell\ \ \ \ \ \ \ \ \ \ # disable shell\ +nopkgs\ \ \ \ \ \ \ \ \ \ \ # disable pkgs\ +nouptime\ \ \ \ \ \ \ \ \ # disable uptime\ +nocolors\ \ \ \ \ \ \ \ \ # disable colors # SUPPORTED DISTRIBUTIONS -Distribution name\ \ \ \ \ -d option -Nyalpine\ \ \ \ \ \ \ \ \ alpine\ -Nyarch Linuwu\ \ \ \ \ \ \ arch\ -Nyartix Linuwu\ \ \ \ \ \ \ artix\ -Debinyan\ \ \ \ \ \ \ \ \ debian\ -Fedowa\ \ \ \ \ \ \ \ \ \ \ fedora\ -GentOwO\ \ \ \ \ \ \ \ \ \ gentoo\ -GnUwU gUwUix\ \ \ \ \ \ \ guix\ -Miwint\ \ \ \ \ \ \ \ \ \ \ linuxmint\ -Myanjawo\ \ \ \ \ \ \ \ \ manjaro\ -Myanjawo AWM\ \ \ \ \ \ \ \\"manjaro-arm\\"\ -OwOpenSUSE\ \ \ \ \ \ \ \ \ \\"opensuse-leap\\"\ -Pop OwOs\ \ \ \ \ \ \ \ \ pop\ -RaspNyan\ \ \ \ \ \ \ \ \ raspbian\ -UwUntu\ \ \ \ \ \ \ \ \ \ \ ubuntu\ -OwOid\ \ \ \ \ \ \ \ \ \ \ \\"void\\"\ -Nyandroid\ \ \ \ \ \ \ \ \ android\ -Unknown (tux logo)\ \ \ \ \ unknown +Distribution name\ \ \ \ \ -d option + +Nyalpine\ \ \ \ \ \ \ \ \ alpine\ +Nyarch Linuwu\ \ \ \ \ \ \ arch\ +Nyartix Linuwu\ \ \ \ \ \ \ artix\ +Debinyan\ \ \ \ \ \ \ \ \ debian\ +Fedowa\ \ \ \ \ \ \ \ \ \ \ fedora\ +GentOwO\ \ \ \ \ \ \ \ \ \ gentoo\ +GnUwU gUwUix\ \ \ \ \ \ \ guix\ +Miwint\ \ \ \ \ \ \ \ \ \ \ linuxmint\ +Myanjawo\ \ \ \ \ \ \ \ \ manjaro\ +Myanjawo AWM\ \ \ \ \ \ \ \\"manjaro-arm\\"\ +OwOpenSUSE\ \ \ \ \ \ \ \ \ \\"opensuse-leap\\"\ +Pop OwOs\ \ \ \ \ \ \ \ \ pop\ +RaspNyan\ \ \ \ \ \ \ \ \ raspbian\ +UwUntu\ \ \ \ \ \ \ \ \ \ \ ubuntu\ +OwOid\ \ \ \ \ \ \ \ \ \ \ \\"void\\"\ +Nyandroid\ \ \ \ \ \ \ \ \ android\ +Unknown (tux logo)\ \ \ \ \ unknown --image/ascii only distributions--\ -endeavOwO\ \ \ \ \ \ \ \ \ endeavour\ -KDE NeOwOn\ \ \ \ \ \ \ \ \ neon\ -nixOwOs\ \ \ \ \ \ \ \ \ \ nixos\ -Swackwawe\ \ \ \ \ \ \ \ \ slackware\ -sOwOlus\ \ \ \ \ \ \ \ \ \ solus\ -FweeBSD\ \ \ \ \ \ \ \ \ \ freebsd\ -OwOpenBSD\ \ \ \ \ \ \ \ \ openbsd +endeavOwO\ \ \ \ \ \ \ \ \ endeavour\ +KDE NeOwOn\ \ \ \ \ \ \ \ \ neon\ +nixOwOs\ \ \ \ \ \ \ \ \ \ nixos\ +Swackwawe\ \ \ \ \ \ \ \ \ slackware\ +sOwOlus\ \ \ \ \ \ \ \ \ \ solus\ +FweeBSD\ \ \ \ \ \ \ \ \ \ freebsd\ +OwOpenBSD\ \ \ \ \ \ \ \ \ openbsd # DESCRIPTION + Uwufetch is a program inspired by neofetch and ufetch, that takes system informations\ and prints them in the terminal in an UwU way, with and UwU ascii logo or image. # EXAMPLES -uwufetch -d arch\ \ \ \ \ \ \ \ \ \ # prints arch logo\ -uwufetch -\-custom some_image.png\ \ # prints custom image (does not need full path)\ -ueufetch -i -d artix\ \ \ \ \ \ \ \ # prints artix image + +uwufetch -d arch\ \ \ \ \ \ \ \ \ \ # prints arch logo\ +uwufetch -\-custom some_image.png\ \ # prints custom image (does not need full path)\ +ueufetch -i -d artix\ \ \ \ \ \ \ \ # prints artix image # DEPENDANCES -lshw\ \ better gpu info\ -viu\ \ \ print images instead of ascii logo\ -kitty\ \ better image viewing + +lshw\ \ better gpu info\ +viu\ \ \ print images instead of ascii logo\ +kitty\ \ better image viewing All of this are optional, there is no necessary dependancy. # LICENSE AND COPYRIGTH + uwufetch is provided under the GPL3 license, for copyright info read https://github.com/TheDarkBug/uwufetch/tree/main/res/COPYRIGHT.md. From 95b9645d906c1ea688f32c46cfb81793273a8d4c Mon Sep 17 00:00:00 2001 From: TheDarkBug Date: Thu, 15 Apr 2021 09:35:49 +0200 Subject: [PATCH 81/81] Fixed git merge info --- CONTRIBUTING.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6cdcd3a..c256dab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,9 +55,4 @@ If you are requesting a feature, please specify if you are already working on it I know that adding this file now is a bit late, but I am writing this anyway, just to appear as a _professional_ programmer, even though I am not. -<<<<<<< HEAD I woult take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. -======= -I would take some space to thank all the [contributors](https://github.com/TheDarkBug/uwufetch/graphs/contributors) that made this project better every day. - -> > > > > > > f87068f6f8746dbabd4f8936766b4389c07591ca