From dd5f710107c7923941003f5611255dbd56a6dd78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=88=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=82=D0=BE=D0=BA=D0=B8?= =?UTF-8?q?=D1=9B-=D0=A8=D1=83=D0=BC=D0=B0=D1=80=D0=B0=D1=86?= Date: Thu, 19 May 2022 18:19:00 +0200 Subject: [PATCH] Revert "Initial commit" This reverts commit b0da4b5d229db48074ee2927c01d3b79e7ae76e6. --- LICENSE | 19 +++ Makefile | 14 +- PKGBUILD | 35 ++++ README.org | 39 +++++ arch.png | Bin 0 -> 57428 bytes fetchy.c | 464 +++++++++++++++++++++++++++++++++++++++++++++++++++++ logos.h | 78 +++++++++ minchy.c | 296 ---------------------------------- 8 files changed, 642 insertions(+), 303 deletions(-) create mode 100644 LICENSE create mode 100644 PKGBUILD create mode 100644 README.org create mode 100644 arch.png create mode 100644 fetchy.c create mode 100644 logos.h delete mode 100644 minchy.c diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6371659 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright 2020 vojjvoda + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile index 2e68544..c169566 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,20 @@ PREFIX = /usr/local CC = gcc -CFLAGS = -lX11 +CFLAGS = -lpci -all: minchy +all: fetchy -minchy: minchy.c - $(CC) minchy.c -o $@ $(CFLAGS) +fetchy: fetchy.c + $(CC) fetchy.c -o $@ $(CFLAGS) clean: - -rm -f minchy + -rm -f fetchy install: all - install -Dm755 minchy $(DESTDIR)$(PREFIX)/bin/minchy + install -Dm755 fetchy $(DESTDIR)$(PREFIX)/bin/fetchy uninstall: - -rm -f $(DESTDIR)$(PREFIX)/bin/minchy + -rm -f $(DESTDIR)$(PREFIX)/bin/fetchy .PHONY: all install uninstall clean diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..d5f6681 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,35 @@ +# Maintainer: Јован Ђокић-Шумарац +pkgname=fetchy-git +pkgver=2.2 +pkgrel=1 +epoch= +pkgdesc="Cli system info tool written in C. " +arch=(x86_64) +url="https://gitlab.com/vojjvoda/fetchy.git" +license=('MIT') +groups=() +depends=() +makedepends=(make) +checkdepends=() +optdepends=() +provides=(fetchy) +conflicts=(fetchy) +replaces=() +backup=() +options=() +install= +changelog= +source=("git+$url") +noextract=() +md5sums=('SKIP') +validpgpkeys=() + +build() { + cd fetchy + make +} + +package() { + cd fetchy + make DESTDIR="$pkgdir" PREFIX="/usr" install +} diff --git a/README.org b/README.org new file mode 100644 index 0000000..f9ef4b9 --- /dev/null +++ b/README.org @@ -0,0 +1,39 @@ +#+TITLE: Fetchy + +Currently supported : Arch, Artix, Arco, Manjaro, Debian and Ubuntu. (more to come) + +**** TESTERS NEEDED + +* What is fetchy? + +#+CAPTION: fetchy Screenshot +#+ATTR_HTML: :alt fetchy Screenshot :title fetchy Screenshot :align left +[[https://gitlab.com/vojjvoda/fetchy/-/raw/master/arch.png]] + + +**** fetchy - simple cli system information tool written in C. +The whole purpose of fetchy is to give you information on some system aspects, while remaining concise. It is minimal and soon will have a config.h file, similar to suckless programs, where you will be able to disable or enable info. The biggest motivation for this project, besides of being concise, is speed. Neofetch is a 10K line bash script which executes rather slowly. Fetchy runs fo about 20ms on first run and about 2ms on subsequent runs, due to caching of cpu and gpu info, as it is the slowest part of the program. Cache file is located in ~/.local/share/fetchy.cache + +* Installation + +** AUR + +#+begin_src +yay -S fetchy-git +#+end_src + +** Source + +#+begin_src +git clone https://gitlab.com/vojjvoda/fetchy +cd fetchy +sudo make install +#+end_src + +* Running + +#+begin_src +fetchy -{x,a,r,m,u,d} +#+end_src + +Arguments are purely for testing purposes for now, all they do is change ascii art. Enjoy ! diff --git a/arch.png b/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..b3bde6a72a6abfed0d6efeca033d41f7a322533d GIT binary patch literal 57428 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 literal 0 HcmV?d00001 diff --git a/fetchy.c b/fetchy.c new file mode 100644 index 0000000..c7e6d6a --- /dev/null +++ b/fetchy.c @@ -0,0 +1,464 @@ +#pragma GCC diagnostic ignored "-Wunused-function" +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZE 50 +#define COLS 8 +#define ROWS 100 + +//for easier checks +#define SUPPORTED_OS "xadurm" +#define ARCH_BASED "axmr" +#define DEBIAN_BASED "du" +#define OS_TABLE "a:Arch|x:Artix|r:Arco|m:Manjaro|u:Ubuntu|d:Debian" + +//ascii art header file +#include "logos.h" + + +// standardish functions +void read_line(char x); +void cache_info(char **cpu_name, char **gpu); +static int count_files(DIR *package_dir); + +// 'get info' functions +static char *get_sys(char *s_os, char *os_name); +static char *get_kernel(char *kern_name); +static char *get_uptime(char *uptime); +static char *get_RAM(char *ram_info); +static char *get_cpu(char *cpuname); +static char *get_gpu(char *gpu); +static char *get_packages(char *package_count); + +// final function +void concatenate_print(char *os, char *cpu_name, char *gpu); + +// easier if global, don't hate me +char sys; +int logo_number = 0; + + + + + +int main(int argc, char *argv[]){ + + + char *os_name = NULL, + *cpu_name = NULL, + *gpu = NULL, + *s_os = SUPPORTED_OS, + *os = malloc(BUF_SIZE); + + + + // if cache file exits, read it, otherwise cache info + cache_info(&cpu_name, &gpu); + os = get_sys(s_os, os_name); + + + // check if custom ascii art argument is passed + if ( argv[1] != NULL ) { + + if ( strchr(SUPPORTED_OS, *(argv[1] + 1)) ) + logo_number = (int) (strchr(s_os, *(argv[1] + 1) ) - s_os); + + else { + fprintf(stderr, "\n\nArgument not supported\n\n"); + exit(EXIT_FAILURE); + } + } + + + + concatenate_print( os, cpu_name, gpu); + + + free(os_name); + free(cpu_name); + free(gpu); + free(os); + + return EXIT_SUCCESS; +} + + + + + + + + +void read_line(char x) { + int c; + while (( c = getchar()) != x && c != EOF) {} +} + + + + +void truncate_spaces(char *str) { + int src = 0, dst = 0, index, i = -1; + + while(*(str + dst) == ' ') dst++; + + while(*(str + dst) != '\0') { + *(str + src) = *(str + dst); + if(*(str + (dst++)) == ' ') + while(*(str + dst) == ' ') dst++; + + src++; + } + + *(str + src) = '\0'; + + i = 0; + while(str[i] != '\0'){ + if(str[i] != ' ' && str[i] != '\t' && str[i] != '\n'){ + index= i; + } + i++; + } + + + str[index + 1] = '\0'; +} + + + +void cache_info(char **cpu_name, char **gpu) { + + char *cache_path = malloc(BUF_SIZE * 2); + FILE *f_cache = NULL; + + // construct path to file + snprintf(cache_path, BUF_SIZE * 2, "%s/.local/share/fetchy.cache", getenv("HOME")); + + if( (f_cache = fopen(cache_path, "r")) ){ + + char *line = malloc(BUF_SIZE * 4); + *cpu_name = malloc(BUF_SIZE * 4); + *gpu = malloc(BUF_SIZE * 4); + + //get CPU + fgets(line, BUF_SIZE * 4, f_cache); + truncate_spaces(line); + snprintf(*cpu_name, BUF_SIZE * 4, "\x1b[36mCPU\x1b[0m -> %s", strchr(line, ':') +2); + + //get GPU + fgets(line, BUF_SIZE * 4, f_cache); + truncate_spaces(line); + snprintf(*gpu, BUF_SIZE * 4, "\x1b[36mGPU\x1b[0m -> %s", strchr(line, ':') +2); + + + fclose(f_cache); + free(line); + + } + + else { + + f_cache = fopen(cache_path, "w"); + + if( f_cache == NULL ){ + printf("\nCan't open cache file.\n"); + exit(EXIT_FAILURE); + } + + // Write info to file + fprintf(f_cache, "CPU : %s\n", get_cpu(*cpu_name)); + fprintf(f_cache, "GPU : %s\n", get_gpu(*gpu)); + + fclose(f_cache); + + + + printf("\n FILE CACHING DONE!!\n"); + printf("Caching occurs only once,\n"); + printf("every subsequent execution will\n"); + printf("run program normally. Enjoy!\n\n"); + + + cache_info(cpu_name, gpu); + } + free(cache_path); +} + + + +static int count_files(DIR *package_dir) { + + struct dirent * entry; + int file_count = 0; + + while ((entry = readdir(package_dir)) != NULL) { + if (entry->d_type == DT_DIR) { + file_count++; + } + } + closedir(package_dir); + + return file_count; +} + + + + +static char *get_sys(char *s_os, char *os_name) { + + char *name = malloc(BUF_SIZE); + FILE *f_sys_name = fopen("/etc/issue", "rt"); + os_name = malloc(BUF_SIZE); + + if( f_sys_name == NULL ){ + fprintf(stderr, "\nCan't get os name\n"); + exit(EXIT_FAILURE); + } + + + fscanf(f_sys_name, "%s %*s", name); + fclose(f_sys_name); + truncate_spaces(name); + + + sys = *(strstr(OS_TABLE, name) - 2); + logo_number = (int) (strchr(s_os, sys) - s_os); + + + if( sys == 'r' ) + snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s", name); // Arco has a retarded name to be honest, without a space + else + snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s Linux", name); + + + free(name); + return os_name; +} + + + +static char *get_cpu(char *cpu_name){ + + char *line = malloc(BUF_SIZE * 4); + cpu_name = malloc(BUF_SIZE * 4); + + FILE *cpu = fopen("/proc/cpuinfo", "rt"); + + + if( cpu == NULL ){ + printf("\nCan't get cpu info\n"); + exit(EXIT_FAILURE); + } + + // Skip first four lines, cpu info is on fifth + for(int i = 0; i < 5; i++) + fgets(line, BUF_SIZE * 4, cpu); + + + snprintf(cpu_name, BUF_SIZE * 4, "%s", strchr(line, ':') +2); + truncate_spaces(cpu_name); + + + fclose(cpu); + free(line); + + return cpu_name; +} + + + + +static char *get_gpu(char *gpu){ + + gpu = malloc(BUF_SIZE); + + // https://github.com/pciutils/pciutils/blob/master/example.c + char buffer[BUF_SIZE]; + struct pci_access * pacc = pci_alloc(); + + pci_init(pacc); + pci_scan_bus(pacc); + struct pci_dev * dev = pacc -> devices; + + while (dev) { + pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_CLASS); + if (dev -> device_class == 768) { + break; + } + dev = dev -> next; + } + + char * model = pci_lookup_name(pacc, buffer, sizeof(buffer), PCI_LOOKUP_DEVICE, dev -> vendor_id, dev -> device_id); + + pci_cleanup(pacc); + + char * vendor = "unknown vendor"; + + switch(dev -> vendor_id){ + case 4098: + vendor = "AMD"; + break; + case 4318: + vendor = "NVIDIA"; + break; + case 32902: + vendor = "Intel"; + break; + } + + snprintf(gpu, BUF_SIZE, "%s %s", vendor, model); + + return gpu; +} + + + + +static char *get_kernel(char *kern_name){ + + kern_name = malloc(BUF_SIZE); + + struct utsname u_info; + uname(&u_info); + + snprintf(kern_name, BUF_SIZE, "\x1b[36mKERN\x1b[0m -> Linux %s", u_info.release); + + return kern_name; +} + + + + +static char *get_uptime(char *uptime){ + + uptime = malloc(BUF_SIZE); + unsigned int sec; + short hr, min; + struct sysinfo sys_info; + + sysinfo(&sys_info); + + sec = sys_info.uptime; + hr = (sec/60/60%24); + min = (sec/60%60); + + snprintf(uptime, BUF_SIZE, "\x1b[36mUPT\x1b[0m -> %hd h, %hd min", hr, min); + return uptime; +} + + + + +static char *get_packages(char *package_count){ + + int pkg_count = 0; + package_count = malloc(BUF_SIZE); + + + if( strchr(ARCH_BASED, sys) ) + pkg_count = count_files(opendir("/var/lib/pacman/local")); + + else if( strchr(DEBIAN_BASED, sys) ) + pkg_count = count_files(opendir("/usr/bin")) + count_files(opendir("/sbin")); // still not sure where to look + + + + else{ + printf("\n\n\aUnable to find package list\n\n"); + exit(EXIT_FAILURE); + } + + snprintf(package_count, BUF_SIZE, "\x1b[36mPKGS\x1b[0m -> %d", pkg_count); + + + return package_count; +} + + + + +static char *get_RAM(char *ram_info){ + + int bar_percent; + + float total, + free_mem, + used, + real_percent; + + ram_info = malloc(BUF_SIZE * 3); + + char *line = malloc(BUF_SIZE * 3), + bar[] = "[----------]"; + + FILE *RAM = fopen("/proc/meminfo", "rt"); + + + // Get total amount of RAM + fgets(line, BUF_SIZE * 3, RAM); + truncate_spaces(line); + sscanf(line, " MemTotal: %f", &total); + + // throw away second line of file + fgets(line, BUF_SIZE * 3, RAM); + + // Get free memory + fgets(line, BUF_SIZE * 3, RAM); + truncate_spaces(line); + sscanf(line, " MemAvailable: %f", &free_mem); + + fclose(RAM); + + + used = total - free_mem; + real_percent = (used / total) * 100; + bar_percent = (real_percent / 10 + 0.25); + + + for(int i = 1; i <= bar_percent; i++){ + bar[i] = '*'; + } + + + snprintf(ram_info, BUF_SIZE * 3, "\x1b[36mRAM\x1b[0m -> %.2f GB of %.2f GB, %s -> %.2f %%", used / 1000000, + total / 1000000, + bar, real_percent); + + free(line); + return ram_info; +} + + + +void concatenate_print(char *os, char *cpu_name, char *gpu){ + + + char *uptime = NULL, + *kern_name = NULL, + *ram_info = NULL, + *package_count = NULL; + + + strcat( (logo + logo_number)->logo[0], os); + strcat( (logo + logo_number)->logo[1], get_kernel(kern_name)); + strcat( (logo + logo_number)->logo[2], get_uptime(uptime)); + strcat( (logo + logo_number)->logo[3], get_packages(package_count)); + strcat( (logo + logo_number)->logo[4], cpu_name); + strcat( (logo + logo_number)->logo[5], gpu); + strcat( (logo + logo_number)->logo[6], get_RAM(ram_info)); + + printf("\n"); + for(int i = 0; i < COLS ; i++) + printf("%s\n", (logo + logo_number)->logo[i]); + + + free(uptime); + free(ram_info); + free(package_count); + free(kern_name); +} diff --git a/logos.h b/logos.h new file mode 100644 index 0000000..7a45de4 --- /dev/null +++ b/logos.h @@ -0,0 +1,78 @@ + +typedef struct s_logos { + + char logo[COLS][ROWS]; + +} t_logos; + + +t_logos logo[6] = { + + { "\x1b[1m /\\ ", + "\x1b[1m / \\ ", + "\x1b[1m /`'.,\\ ", + "\x1b[1m / ', ", + "\x1b[1m / ,`\\ ", + "\x1b[1m / ,.'`. \\ ", + "\x1b[1m /.,'` `'.\\ " + }, + + + + + { "\x1b[1m . ", + "\x1b[1m / \\ ", + "\x1b[1m / \\ ", + "\x1b[1m /^. \\ ", + "\x1b[1m / .-. \\ ", + "\x1b[1m / ( ) _\\ ", + "\x1b[1m / _.~ ~._^\\ ", + "\x1b[1m /.^ ^.\\ " + }, + + + + + { "\x1b[1m _____ ", + "\x1b[1m / __ \\ ", + "\x1b[1m | / | ", + "\x1b[1m | \\___- ", + "\x1b[1m -_ ", + "\x1b[1m --_ ", + "\x1b[1m " + }, + + + { "\x1b[1m _ ", + "\x1b[1m ---(_) ", + "\x1b[1m _/ --- \\ ", + "\x1b[1m (_) | | ", + "\x1b[1m \\ --- / ", + "\x1b[1m ---(_) ", + "\x1b[1m " + }, + + + { "\x1b[1m /\\ ", + "\x1b[1m / \\ ", + "\x1b[1m / /\\ \\ ", + "\x1b[1m / / \\ \\ ", + "\x1b[1m / / \\ \\ ", + "\x1b[1m / / _____\\ \\ ", + "\x1b[1m /_/ \\`----.\\_\\ " + }, + + { "\x1b[1m ||||||||| |||| ", + "\x1b[1m ||||||||| |||| ", + "\x1b[1m |||| |||| ", + "\x1b[1m |||| |||| |||| ", + "\x1b[1m |||| |||| |||| ", + "\x1b[1m |||| |||| |||| ", + "\x1b[1m |||| |||| |||| " + } + + +}; + + + diff --git a/minchy.c b/minchy.c deleted file mode 100644 index ed103d6..0000000 --- a/minchy.c +++ /dev/null @@ -1,296 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - - -#define BUF_SIZE 50 -#define SUPPORTED_OS "xadurm" -#define ARCH_BASED "axmr" -#define DEBIAN_BASED "du" -#define OS_TABLE "a:Arch|x:Artix|r:Arco|m:Manjaro|u:Ubuntu|d:Debian" - - -void read_line(char x); -static int count_files(DIR *package_dir); - -static char *get_sys(void); -static char *get_kernel(void); -static char *get_uptime(void); -static char *get_RAM(void); -static char *get_packages(void); -static char *get_term(void); - - - -char sys; -Display *display; - - - - - - - -int main(){ - - printf("\n"); - printf(" %s\n", get_sys()); - printf(" %s\n", get_kernel()); - printf(" %s\n", get_uptime()); - printf(" %s\n", get_packages()); - printf(" \x1b[37m \x1b[0m %s\n", get_term()); - printf(" %s\n", get_RAM()); - printf("\n"); - - return EXIT_SUCCESS; -} - - - - - - - - -void read_line(char x) { - int c; - while (( c = getchar()) != x && c != EOF) {} -} - - - - -void truncate_spaces(char *str) { - int src = 0, dst = 0, index, i = -1; - - while(*(str + dst) == ' ') dst++; - - while(*(str + dst) != '\0') { - *(str + src) = *(str + dst); - if(*(str + (dst++)) == ' ') - while(*(str + dst) == ' ') dst++; - - src++; - } - - *(str + src) = '\0'; - - i = 0; - while(str[i] != '\0'){ - if(str[i] != ' ' && str[i] != '\t' && str[i] != '\n'){ - index= i; - } - i++; - } - - - str[index + 1] = '\0'; -} - - - - -static int count_files(DIR *package_dir) { - - struct dirent * entry; - int file_count = 0; - - while ((entry = readdir(package_dir)) != NULL) { - if (entry->d_type == DT_DIR) { - file_count++; - } - } - closedir(package_dir); - - return file_count; -} - - - - -static char *get_sys(void) { - - char *name = malloc(BUF_SIZE); - FILE *f_sys_name = fopen("/etc/issue", "rt"); - char *os_name = malloc(BUF_SIZE); - - if( f_sys_name == NULL ){ - fprintf(stderr, "\nCan't get os name\n"); - exit(EXIT_FAILURE); - } - - - fscanf(f_sys_name, "%s %*s", name); - fclose(f_sys_name); - truncate_spaces(name); - - - if( !(sys = *(strstr(OS_TABLE, name) - 2)) ){ - fprintf(stderr, "\nUnsupported OS\n"); - exit(EXIT_FAILURE); - } - - snprintf(os_name, BUF_SIZE, "\x1b[37m \x1b[0m %s", name); - - - free(name); - return os_name; -} - - - - - - -static char *get_kernel(void){ - - char *kern_name = malloc(BUF_SIZE); - - struct utsname u_info; - uname(&u_info); - - snprintf(kern_name, BUF_SIZE, "\x1b[37m \x1b[0m %s", u_info.release); - - return kern_name; -} - - - - -static char *get_uptime(void){ - - char *uptime = malloc(BUF_SIZE); - unsigned int sec; - short hr, min; - struct sysinfo sys_info; - - sysinfo(&sys_info); - - sec = sys_info.uptime; - hr = (sec/60/60%24); - min = (sec/60%60); - - snprintf(uptime, BUF_SIZE, "\x1b[37m \x1b[0m %hd h, %hd min", hr, min); - return uptime; -} - - - - -static char *get_packages(void){ - - int pkg_count = 0; - char *package_count = malloc(BUF_SIZE); - - - if( strchr(ARCH_BASED, sys) ) - pkg_count = count_files(opendir("/var/lib/pacman/local")); - - else if( strchr(DEBIAN_BASED, sys) ) - pkg_count = count_files(opendir("/usr/bin")) + count_files(opendir("/sbin")); // still not sure where to look - - - - else{ - printf("\n\n\aUnable to find package list\n\n"); - exit(EXIT_FAILURE); - } - - snprintf(package_count, BUF_SIZE, "\x1b[37m \x1b[0m %d", pkg_count); - - - return package_count; -} - - - - -static char *get_RAM(void){ - - float used_m, total_m; - - int total, shared, memfree, buffers, cached, reclaimable; - - char *ram_info = malloc(BUF_SIZE * 3); - FILE *RAM = fopen("/proc/meminfo", "rt"); - - - char *line = NULL; - size_t len; - - - while (getline(&line, &len, RAM) != -1) { - sscanf(line, "MemTotal: %d", &total); - sscanf(line, "Shmem: %d", &shared); - sscanf(line, "MemFree: %d", &memfree); - sscanf(line, "Buffers: %d", &buffers); - sscanf(line, "Cached: %d", &cached); - sscanf(line, "SReclaimable: %d", &reclaimable); - } - - fclose(RAM); - free(line); - - - used_m = (float)(total + shared - memfree - buffers - cached - reclaimable) / (1024*1024); - total_m = (float)total / (1024*1024); - - - snprintf(ram_info, BUF_SIZE * 3, "\x1b[37m \x1b[0m %.2f / %.2f GB", used_m, total_m); - - - return ram_info; -} - - - - -static char *get_term(void) { - unsigned char *prop; - char *terminal = malloc(BUF_SIZE); - - if (display != NULL) { - - unsigned long _, - window = RootWindow(display, XDefaultScreen(display)); - Atom a, - active = XInternAtom(display, "_NET_ACTIVE_WINDOW", True), - class = XInternAtom(display, "WM_CLASS", True); - -#define GetProp(property) \ - XGetWindowProperty(display, window, property, 0, 64, 0, 0, &a, (int *)&_, &_, &_, &prop); - - GetProp(active); - window = (prop[3] << 24) + (prop[2] << 16) + (prop[1] << 8) + prop[0]; - free(prop); - if(!window) goto terminal_fallback; - GetProp(class); - -#undef GetProp - - snprintf(terminal, BUF_SIZE, "%s", prop); - free(prop); - } - - else { -terminal_fallback: - strncpy(terminal, getenv("TERM"), BUF_SIZE); - - if (strcmp(terminal, "linux") == 0) { - strncpy(terminal, ttyname(STDIN_FILENO), BUF_SIZE); - } - } - - return terminal; -} - - -