diff --git a/data/desktop/.meson.build.swp b/data/desktop/.meson.build.swp new file mode 100644 index 0000000..c0d8057 Binary files /dev/null and b/data/desktop/.meson.build.swp differ diff --git a/data/evisum.desktop b/data/desktop/evisum.desktop similarity index 100% rename from data/evisum.desktop rename to data/desktop/evisum.desktop diff --git a/data/desktop/meson.build b/data/desktop/meson.build new file mode 100644 index 0000000..a52291c --- /dev/null +++ b/data/desktop/meson.build @@ -0,0 +1,2 @@ +install_data('evisum.desktop', + install_dir: join_paths(dir_data, 'applications')) diff --git a/data/evisum.png b/data/icons/evisum.png similarity index 100% rename from data/evisum.png rename to data/icons/evisum.png diff --git a/data/icons/meson.build b/data/icons/meson.build new file mode 100644 index 0000000..8829ea1 --- /dev/null +++ b/data/icons/meson.build @@ -0,0 +1,2 @@ +install_data('evisum.png', + install_dir: join_paths(dir_data, 'icons/hicolor/128x128/apps')) diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..8a19d38 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,2 @@ +subdir('desktop') +subdir('icons') diff --git a/makefile b/makefile deleted file mode 100644 index 6112f7f..0000000 --- a/makefile +++ /dev/null @@ -1,39 +0,0 @@ -LIBS= - -PREFIX= /usr/local - -OSNAME := $(shell uname -s) - -ifeq ($(OSNAME), OpenBSD) - LIBS += -lkvm - LDFLAGS += -I/usr/local/include -L/usr/local/lib -L/usr/X11R6/lib -endif - -ifeq ($(OSNAME), FreeBSD) - LDFLAGS += -L/usr/local/lib -endif - -export PKGS = elementary - -export LIBS - -export LDFLAGS - -default: - $(MAKE) -C src - $(MAKE) -C src/tingle - -clean: - $(MAKE) -C src clean - $(MAKE) -C src/tingle clean - -install: - $(MAKE) default - -mkdir -p $(PREFIX)/share/ - -mkdir -p $(PREFIX)/share/applications - -mkdir -p $(PREFIX)/bin - -mkdir -p $(PREFIX)/share/icons/hicolor/512x512/apps - install -m 0644 data/evisum.png $(PREFIX)/share/icons/hicolor/512x512/apps - install -m 0644 data/evisum.desktop $(PREFIX)/share/applications - install -m 0755 evisum $(PREFIX)/bin - install -m 0755 src/tingle/tingle $(PREFIX)/bin diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..b049ddb --- /dev/null +++ b/meson.build @@ -0,0 +1,17 @@ +project('evisum', 'c', + version: '0.3.0', + meson_version : '>= 0.40.0') + +efl_version = '>= 1.22.0' + +deps = dependency('elementary', version: efl_version) + +##### dir locations +dir_prefix = get_option('prefix') +dir_bin = join_paths(dir_prefix, get_option('bindir')) +dir_lib = join_paths(dir_prefix, get_option('libdir')) +dir_data = join_paths(dir_prefix, get_option('datadir')) +dir_locale = join_paths(dir_prefix, get_option('localedir')) + +subdir('src') +subdir('data') diff --git a/src/makefile b/src/makefile deleted file mode 100644 index 0836034..0000000 --- a/src/makefile +++ /dev/null @@ -1,27 +0,0 @@ -TARGET = ../evisum - -OBJECTS = system.o disks.o process.o ui.o main.o - -default: $(TARGET) - -$(TARGET) : $(OBJECTS) - $(CC) $(OBJECTS) $(shell pkg-config --libs $(PKGS)) $(LIBS) $(LDFLAGS) -o $@ - -main.o: main.c - $(CC) -c $(CFLAGS) $(shell pkg-config --cflags $(PKGS)) main.c -o $@ - -system.o: system.c - $(CC) -c $(CFLAGS) system.c -o $@ - -disks.o: disks.c - $(CC) -c $(CFLAGS) $(shell pkg-config --cflags $(PKGS)) disks.c -o $@ - -process.o: process.c - $(CC) -c $(CFLAGS) $(shell pkg-config --cflags $(PKGS)) process.c -o $@ - -ui.o: ui.c - $(CC) -c $(CFLAGS) $(shell pkg-config --cflags $(PKGS)) ui.c -o $@ - -clean: - -rm $(OBJECTS) - -rm $(TARGET) diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..80f5ef4 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,11 @@ +executable('evisum', [ + 'disks.c', 'disks.h', + 'process.c', 'process.h', + 'system.c', 'system.h', + 'ui.c', 'ui.h', + 'main.c'], + dependencies : deps, + gui_app : true, + install : true) + +subdir('tingle') diff --git a/src/tingle/README b/src/tingle/README deleted file mode 100644 index 1903ff5..0000000 --- a/src/tingle/README +++ /dev/null @@ -1,44 +0,0 @@ -# UNIX sensors (tingle) - -# Query CPU, memory, network, power, audio and - temperature sensors. - -Supporting Linux, FreeBSD, OpenBSD, Mac OS and DragonFlyBSD. - -It's also probably a useful reference for querying common -system information on the most-common Unix-like operating -systems. - -This can be used with pipes by other processes to -query the hardware. Or just to display a status -line in screen or tmux or some Xorg program. - -Install: - make (or gmake) - -Usage: tingle [OPTIONS] - Where OPTIONS can be a combination of - -c - Show average CPU usage. - -C - Show all CPU cores and usage. - -k (KB) -m (MB) -g (GB) - Show memory usage (unit). - -n - Show network usage. - -p - Show power status (ac and battery percentage). - -t - Show temperature sensors (temperature in celcius). - -a - Display mixer values (system values). - -s - Show all in a nicely formatted status bar format. - This is the default behaviour with no arguments. - With other flags specify (in any order) which - components to display in the status bar. - -h | -help | --help - This help. - -Alastair Poole - diff --git a/src/tingle/makefile b/src/tingle/makefile deleted file mode 100644 index f308cf8..0000000 --- a/src/tingle/makefile +++ /dev/null @@ -1,23 +0,0 @@ -PROGRAM=tingle -SOURCES=tingle.c -CFLAGS=-O2 -Wall -pedantic -std=c99 -lpthread -LDFLAGS=-lm -pthread -HAVE_ALSA := 0 - -ALSA_TEST := $(shell pkg-config --exists alsa 1>&2 2>/dev/null; echo $$?) -HAVE_ALSA := $(shell if [ $(ALSA_TEST) -eq 0 ]; then echo "true"; else echo "false"; fi) - -UNAME := $(shell uname -s) - -ifeq ($(UNAME),Darwin) - CFLAGS += -framework CoreAudio -else ifeq ($(UNAME),Linux) - ifeq ($(HAVE_ALSA),true) - CFLAGS += -lasound -DHAVE_ALSA=1 - endif -endif - -default: - $(CC) $(SOURCES) $(CFLAGS) $(LDFLAGS) -o tingle -clean: - -rm $(PROGRAM) diff --git a/src/tingle/tingle.c b/src/tingle/tingle.c deleted file mode 100644 index 9e88761..0000000 --- a/src/tingle/tingle.c +++ /dev/null @@ -1,1734 +0,0 @@ -/* - Copyright (c) 2017, 2019. Alastair Poole - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#define VERSION "0.9.2" -#define _DEFAULT_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(__APPLE__) && defined(__MACH__) -#define __MacOS__ -# include -# include -# include -# include -# include -# include -# include -#endif - -#if defined(__OpenBSD__) || defined(__NetBSD__) -# include -# include -# include -# include -# include -# include -# include -#endif - -#if defined(__FreeBSD__) || defined(__DragonFly__) -# include -# include -# include -# include -#endif - -#if defined(__linux__) -# include -#endif - -#if defined(__linux__) && defined(HAVE_ALSA) -# include -#endif - -#if defined(__OpenBSD__) -# define CPU_STATES 6 -#else -#define CPU_STATES 5 -#endif - -#define MAX_BATTERIES 10 -#define INVALID_TEMP -999 - -/* Filter requests and results */ -#define RESULTS_CPU 0x01 -#define RESULTS_MEM 0x02 -#define RESULTS_PWR 0x04 -#define RESULTS_TMP 0x08 -#define RESULTS_AUD 0x10 -#define RESULTS_NET 0x20 -#define RESULTS_DEFAULT 0x3f -#define RESULTS_MEM_MB 0x40 -#define RESULTS_MEM_GB 0x80 -#define RESULTS_CPU_CORES 0x100 - -typedef struct -{ - float percent; - unsigned long total; - unsigned long idle; -} cpu_core_t; - -typedef struct -{ - unsigned long total; - unsigned long used; - unsigned long cached; - unsigned long buffered; - unsigned long shared; - unsigned long swap_total; - unsigned long swap_used; -} meminfo_t; - -typedef struct -{ - double charge_full; - double charge_current; - uint8_t percent; -} bat_t; - -typedef struct -{ - bool have_ac; - int battery_count; - - bat_t **batteries; - - char *battery_names[MAX_BATTERIES]; - int *bat_mibs[MAX_BATTERIES]; - int ac_mibs[5]; -} power_t; - -typedef struct -{ - bool enabled; - uint8_t volume_left; - uint8_t volume_right; -} mixer_t; - -typedef struct results_t results_t; -struct results_t -{ - int cpu_count; - cpu_core_t **cores; - - meminfo_t memory; - - power_t power; - - mixer_t mixer; - - unsigned long incoming; - unsigned long outgoing; - - int temperature; -}; - -static void -_memsize_bytes_to_kb(unsigned long *bytes) -{ - *bytes = (unsigned int)*bytes >> 10; -} - -#define _memsize_kb_to_mb _memsize_bytes_to_kb - -static void -_memsize_kb_to_gb(unsigned long *bytes) -{ - *bytes = (unsigned int)*bytes >> 20; -} - -#if defined(__linux__) -static char * -file_contents(const char *path) -{ - char *buf; - char byte[1]; - size_t count, bytes = 0; - FILE *f = fopen(path, "r"); - if (!f) return NULL; - - int n = 1024; - - buf = malloc(n * sizeof(byte) + 1); - if (!buf) return NULL; - - while ((count = (fread(byte, sizeof(byte), 1, f))) > 0) - { - bytes += sizeof(byte); - if (bytes == (n * sizeof(byte))) - { - n *= 2; - char *tmp = realloc(buf, n * sizeof(byte) + 1); - if (!tmp) return NULL; - buf = tmp; - } - memcpy(&buf[bytes - sizeof(byte)], byte, sizeof(byte)); - } - - if (!feof(f)) return NULL; - fclose(f); - - buf[bytes] = 0; - - return buf; -} - -#endif - -#if defined(__FreeBSD__) || defined(__DragonFly__) -static long int -_sysctlfromname(const char *name, void *mib, int depth, size_t *len) -{ - long int result; - - if (sysctlnametomib(name, mib, len) < 0) - return -1; - - *len = sizeof(result); - if (sysctl(mib, depth, &result, len, NULL, 0) < 0) - return -1; - - return result; -} - -#endif - -static int -cpu_count(void) -{ - int cores = 0; -#if defined(__linux__) - char buf[4096]; - FILE *f; - int line = 0; - - f = fopen("/proc/stat", "r"); - if (!f) return 0; - - while (fgets(buf, sizeof(buf), f)) - { - if (line) - { - if (!strncmp(buf, "cpu", 3)) - cores++; - else - break; - } - line++; - } - - fclose(f); -#elif defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) - size_t len; - int mib[2] = { CTL_HW, HW_NCPU }; - - len = sizeof(cores); - if (sysctl(mib, 2, &cores, &len, NULL, 0) < 0) - return 0; -#endif - return cores; -} - -static void -_cpu_state_get(cpu_core_t **cores, int ncpu) -{ - int diff_total, diff_idle; - double ratio, percent; - unsigned long total, idle, used; - cpu_core_t *core; -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) - size_t size; - int i, j; -#endif -#if defined(__FreeBSD__) || defined(__DragonFly__) - if (!ncpu) - return; - size = sizeof(unsigned long) * (CPU_STATES * ncpu); - unsigned long cpu_times[ncpu][CPU_STATES]; - - if (sysctlbyname("kern.cp_times", cpu_times, &size, NULL, 0) < 0) - return; - - for (i = 0; i < ncpu; i++) { - core = cores[i]; - unsigned long *cpu = cpu_times[i]; - - total = 0; - for (j = 0; j < CPU_STATES; j++) - total += cpu[j]; - - idle = cpu[4]; - - diff_total = total - core->total; - diff_idle = idle - core->idle; - if (diff_total == 0) diff_total = 1; - - ratio = diff_total / 100.0; - used = diff_total - diff_idle; - percent = used / ratio; - - if (percent > 100) percent = 100; - else if (percent < 0) - percent = 0; - - core->percent = percent; - core->total = total; - core->idle = idle; - } -#elif defined(__OpenBSD__) - static struct cpustats cpu_times[CPU_STATES]; - static int cpu_time_mib[] = { CTL_KERN, KERN_CPUSTATS, 0 }; - - memset(&cpu_times, 0, CPU_STATES * sizeof(struct cpustats)); - if (!ncpu) - return; - - for (i = 0; i < ncpu; i++) - { - core = cores[i]; - size = sizeof(struct cpustats); - cpu_time_mib[2] = i; - if (sysctl(cpu_time_mib, 3, &cpu_times[i], &size, NULL, 0) < 0) - return; - - total = 0; - for (j = 0; j < CPU_STATES; j++) - total += cpu_times[i].cs_time[j]; - - idle = cpu_times[i].cs_time[CP_IDLE]; - - diff_total = total - core->total; - if (diff_total == 0) diff_total = 1; - - diff_idle = idle - core->idle; - ratio = diff_total / 100.0; - used = diff_total - diff_idle; - percent = used / ratio; - - if (percent > 100) percent = 100; - else if (percent < 0) - percent = 0; - - core->percent = percent; - core->total = total; - core->idle = idle; - } -#elif defined(__linux__) - char *buf, name[128]; - int i; - - buf = file_contents("/proc/stat"); - if (!buf) return; - - for (i = 0; i < ncpu; i++) { - core = cores[i]; - snprintf(name, sizeof(name), "cpu%d", i); - char *line = strstr(buf, name); - if (line) - { - line = strchr(line, ' ') + 1; - unsigned long cpu_times[4] = { 0 }; - - if (4 != sscanf(line, "%lu %lu %lu %lu", &cpu_times[0], &cpu_times[1], &cpu_times[2], &cpu_times[3])) - return; - - total = cpu_times[0] + cpu_times[1] + cpu_times[2] + cpu_times[3]; - idle = cpu_times[3]; - diff_total = total - core->total; - if (diff_total == 0) diff_total = 1; - - diff_idle = idle - core->idle; - ratio = diff_total / 100.0; - used = diff_total - diff_idle; - percent = used / ratio; - - if (percent > 100) percent = 100; - else if (percent < 0) - percent = 0; - - core->percent = percent; - core->total = total; - core->idle = idle; - } - } - free(buf); -#elif defined(__MacOS__) - mach_msg_type_number_t count; - processor_cpu_load_info_t load; - mach_port_t mach_port; - unsigned int cpu_count; - int i; - - cpu_count = ncpu; - - count = HOST_CPU_LOAD_INFO_COUNT; - mach_port = mach_host_self(); - if (host_processor_info(mach_port, PROCESSOR_CPU_LOAD_INFO, &cpu_count, (processor_info_array_t *)&load, &count) != KERN_SUCCESS) - exit(4 << 1); - - for (i = 0; i < ncpu; i++) { - core = cores[i]; - - total = load[i].cpu_ticks[CPU_STATE_USER] + load[i].cpu_ticks[CPU_STATE_SYSTEM] + load[i].cpu_ticks[CPU_STATE_IDLE] + load[i].cpu_ticks[CPU_STATE_NICE]; - idle = load[i].cpu_ticks[CPU_STATE_IDLE]; - - diff_total = total - core->total; - if (diff_total == 0) diff_total = 1; - diff_idle = idle - core->idle; - ratio = diff_total / 100.0; - used = diff_total - diff_idle; - percent = used / ratio; - - if (percent > 100) percent = 100; - else if (percent < 0) - percent = 0; - - core->percent = percent; - core->total = total; - core->idle = idle; - } -#endif -} - -static cpu_core_t ** -_cpu_cores_state_get(int *ncpu) -{ - cpu_core_t **cores; - int i; - - *ncpu = cpu_count(); - - cores = malloc((*ncpu) * sizeof(cpu_core_t *)); - - for (i = 0; i < *ncpu; i++) - cores[i] = calloc(1, sizeof(cpu_core_t)); - - _cpu_state_get(cores, *ncpu); - usleep(1000000); - _cpu_state_get(cores, *ncpu); - - return cores; -} - -#if defined(__linux__) -static unsigned long -_meminfo_parse_line(const char *line) -{ - char *p, *tok; - - p = strchr(line, ':') + 1; - while (isspace(*p)) - p++; - tok = strtok(p, " "); - - return atol(tok); -} - -#endif - -static void -_memory_usage_get(meminfo_t *memory) -{ -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) - size_t len = 0; - int i = 0; -#endif - memset(memory, 0, sizeof(meminfo_t)); -#if defined(__linux__) - FILE *f; - unsigned long swap_free = 0, tmp_free = 0, tmp_slab = 0; - char line[256]; - int fields = 0; - - f = fopen("/proc/meminfo", "r"); - if (!f) return; - - while (fgets(line, sizeof(line), f) != NULL) - { - if (!strncmp("MemTotal:", line, 9)) - { - memory->total = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("MemFree:", line, 8)) - { - tmp_free = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("Cached:", line, 7)) - { - memory->cached = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("Slab:", line, 5)) - { - tmp_slab = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("Buffers:", line, 8)) - { - memory->buffered = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("Shmem:", line, 6)) - { - memory->shared = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("SwapTotal:", line, 10)) - { - memory->swap_total = _meminfo_parse_line(line); - fields++; - } - else if (!strncmp("SwapFree:", line, 9)) - { - swap_free = _meminfo_parse_line(line); - fields++; - } - - if (fields >= 8) - break; - } - - memory->cached += tmp_slab; - memory->used = memory->total - tmp_free - memory->cached - memory->buffered; - memory->swap_used = memory->swap_total - swap_free; - - fclose(f); -#elif defined(__FreeBSD__) || defined(__DragonFly__) - int total_pages = 0, free_pages = 0, inactive_pages = 0; - long int result = 0; - int page_size = getpagesize(); - int mib[4] = { CTL_HW, HW_PHYSMEM, 0, 0 }; - - len = sizeof(memory->total); - if (sysctl(mib, 2, &memory->total, &len, NULL, 0) == -1) - return; - memory->total /= 1024; - - total_pages = - _sysctlfromname("vm.stats.vm.v_page_count", mib, 4, &len); - if (total_pages < 0) - return; - - free_pages = _sysctlfromname("vm.stats.vm.v_free_count", mib, 4, &len); - if (free_pages < 0) - return; - - inactive_pages = - _sysctlfromname("vm.stats.vm.v_inactive_count", mib, 4, &len); - if (inactive_pages < 0) - return; - - memory->used = (total_pages - free_pages - inactive_pages) * page_size; - _memsize_bytes_to_kb(&memory->used); - - result = _sysctlfromname("vfs.bufspace", mib, 2, &len); - if (result < 0) - return; - memory->buffered = (result); - _memsize_bytes_to_kb(&memory->buffered); - - result = _sysctlfromname("vm.stats.vm.v_active_count", mib, 4, &len); - if (result < 0) - return; - memory->cached = (result * page_size); - _memsize_bytes_to_kb(&memory->cached); - - result = _sysctlfromname("vm.stats.vm.v_cache_count", mib, 4, &len); - if (result < 0) - return; - memory->shared = (result * page_size); - _memsize_bytes_to_kb(&memory->shared); - - result = _sysctlfromname("vm.swap_total", mib, 2, &len); - if (result < 0) - return; - memory->swap_total = (result / 1024); - - struct xswdev xsw; - /* previous mib is important for this one... */ - - while (i++) - { - mib[2] = i; - len = sizeof(xsw); - if (sysctl(mib, 3, &xsw, &len, NULL, 0) == -1) - break; - - memory->swap_used += xsw.xsw_used * page_size; - } - - memory->swap_used >>= 10; - -#elif defined(__OpenBSD__) - static int mib[] = { CTL_HW, HW_PHYSMEM64 }; - static int bcstats_mib[] = { CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT }; - struct bcachestats bcstats; - static int uvmexp_mib[] = { CTL_VM, VM_UVMEXP }; - struct uvmexp uvmexp; - int nswap, rnswap; - struct swapent *swdev = NULL; - - len = sizeof(memory->total); - if (sysctl(mib, 2, &memory->total, &len, NULL, 0) == -1) - return; - - len = sizeof(uvmexp); - if (sysctl(uvmexp_mib, 2, &uvmexp, &len, NULL, 0) == -1) - return; - - len = sizeof(bcstats); - if (sysctl(bcstats_mib, 3, &bcstats, &len, NULL, 0) == -1) - return; - - /* Don't fail if there's not swap! */ - nswap = swapctl(SWAP_NSWAP, 0, 0); - if (nswap == 0) - goto swap_out; - - swdev = calloc(nswap, sizeof(*swdev)); - if (swdev == NULL) - goto swap_out; - - rnswap = swapctl(SWAP_STATS, swdev, nswap); - if (rnswap == -1) - goto swap_out; - - for (i = 0; i < nswap; i++) { - if (swdev[i].se_flags & SWF_ENABLE) - { - memory->swap_used += (swdev[i].se_inuse / (1024 / DEV_BSIZE)); - memory->swap_total += (swdev[i].se_nblks / (1024 / DEV_BSIZE)); - } - } -swap_out: - if (swdev) - free(swdev); - - memory->total /= 1024; - - memory->cached = (uvmexp.pagesize * bcstats.numbufpages); - _memsize_bytes_to_kb(&memory->cached); - - memory->used = (uvmexp.active * uvmexp.pagesize); - _memsize_bytes_to_kb(&memory->used); - - memory->buffered = (uvmexp.pagesize * (uvmexp.npages - uvmexp.free)); - _memsize_bytes_to_kb(&memory->buffered); - - memory->shared = (uvmexp.pagesize * uvmexp.wired); - _memsize_bytes_to_kb(&memory->shared); -#elif defined(__MacOS__) - int mib[2] = { CTL_HW, HW_MEMSIZE }; - size_t total; - vm_size_t page_size; - mach_port_t mach_port; - mach_msg_type_number_t count; - vm_statistics64_data_t vm_stats; - struct xsw_usage xsu; - - size_t len = sizeof(size_t); - if (sysctl(mib, 2, &total, &len, NULL, 0) == -1) - return; - mach_port = mach_host_self(); - count = sizeof(vm_stats) / sizeof(natural_t); - - total >>= 10; - memory->total = total; - - if (host_page_size(mach_port, &page_size) == KERN_SUCCESS && - host_statistics64(mach_port, HOST_VM_INFO, (host_info64_t)&vm_stats, &count) == KERN_SUCCESS) - { - memory->used = vm_stats.active_count + vm_stats.inactive_count + vm_stats.wire_count * page_size; - memory->used >>= 10; - memory->cached = vm_stats.active_count * page_size; - memory->cached >>= 10; - memory->shared = vm_stats.wire_count * page_size; - memory->shared >>= 10; - memory->buffered = vm_stats.inactive_count * page_size; - memory->buffered >>= 10; - } - - total = sizeof(xsu); - if (sysctlbyname("vm.swapusage", &xsu, &total, NULL, 0) != -1) - { - memory->swap_total = xsu.xsu_total; - memory->swap_used = xsu.xsu_used; - } -#endif -} - -static int -_mixer_master_volume_get(mixer_t *mixer) -{ -#if defined(__OpenBSD__) || defined(__NetBSD__) - int i, fd, devn; - char name[64]; - mixer_devinfo_t dinfo; - mixer_ctrl_t *values = NULL; - mixer_devinfo_t *info = NULL; - - fd = open("/dev/mixer", O_RDONLY); - if (fd < 0) - return 0; - - for (devn = 0;; devn++) { - dinfo.index = devn; - if (ioctl(fd, AUDIO_MIXER_DEVINFO, &dinfo)) - break; - } - - info = calloc(devn, sizeof(*info)); - if (!info) - return 0; - - for (i = 0; i < devn; i++) { - info[i].index = i; - if (ioctl(fd, AUDIO_MIXER_DEVINFO, &info[i]) == -1) - { - --devn; - --i; - mixer->enabled = true; - continue; - } - } - - values = calloc(devn, sizeof(*values)); - if (!values) - return 0; - - for (i = 0; i < devn; i++) { - values[i].dev = i; - values[i].type = info[i].type; - if (info[i].type != AUDIO_MIXER_CLASS) - { - values[i].un.value.num_channels = 2; - if (ioctl(fd, AUDIO_MIXER_READ, &values[i]) == -1) - { - values[i].un.value.num_channels = 1; - if (ioctl(fd, AUDIO_MIXER_READ, &values[i]) - == -1) - return 0; - } - } - } - - for (i = 0; i < devn; i++) { - strlcpy(name, info[i].label.name, sizeof(name)); - if (!strcmp("master", name)) - { - mixer->volume_left = values[i].un.value.level[0]; - mixer->volume_right = values[i].un.value.level[1]; - mixer->enabled = true; - break; - } - } - - close(fd); - - if (values) - free(values); - if (info) - free(info); - -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__linux__) && !defined(HAVE_ALSA) - int bar; - int fd = open("/dev/mixer", O_RDONLY); - if (fd == -1) - return 0; - - if ((ioctl(fd, MIXER_READ(0), &bar)) == -1) - { - return 0; - } - - mixer->enabled = true; - mixer->volume_left = bar & 0x7f; - mixer->volume_right = (bar >> 8) & 0x7f; - close(fd); -#elif defined(__linux__) && defined(HAVE_ALSA) - snd_mixer_t *h; - snd_mixer_elem_t *elem; - snd_mixer_selem_id_t *id; - long int value; - double volume; - - snd_mixer_selem_id_alloca(&id); - snd_mixer_selem_id_set_index(id, 0); - snd_mixer_selem_id_set_name(id, "Master"); - - if ((snd_mixer_open(&h, 0)) == -1) return (0); - if ((snd_mixer_attach(h, "default")) == -1) return(0); - if ((snd_mixer_selem_register(h, NULL, NULL)) == -1) goto out; - if ((snd_mixer_load(h)) == -1) goto out; - - if (!(elem = snd_mixer_find_selem(h, id))) goto out; - - long int max, min; - - snd_mixer_selem_get_playback_volume_range(elem, &min, &max); - snd_mixer_selem_get_playback_volume(elem, 0, &value); - double ratio = max - min / 100; - volume = value / ratio; - - mixer->enabled = true; - mixer->volume_left = mixer->volume_right = volume * 100; -out: - snd_mixer_close(h); -#elif defined(__MacOS__) - AudioDeviceID id; - AudioObjectPropertyAddress prop; - float volume; - unsigned int id_size = sizeof(id); - unsigned int vol_size = sizeof(volume); - - prop.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - prop.mScope = kAudioObjectPropertyScopeGlobal; - prop.mElement = kAudioObjectPropertyElementMaster; - - if (AudioObjectGetPropertyData(kAudioObjectSystemObject, &prop, 0, NULL, &id_size, &id)) - return (0); - - prop.mSelector = kAudioDevicePropertyVolumeScalar; - prop.mScope = kAudioDevicePropertyScopeOutput; - prop.mElement = 0; - - if (AudioObjectGetPropertyData(id, &prop, 0, NULL, &vol_size, &volume)) - return (0); - - mixer->volume_left = mixer->volume_right = volume * 100; - - mixer->enabled = true; -#endif - return mixer->enabled; -} - -static void -_temperature_cpu_get(int *temperature) -{ -#if defined(__OpenBSD__) || defined(__NetBSD__) - int mibs[5] = { CTL_HW, HW_SENSORS, 0, 0, 0 }; - int devn, numt; - struct sensor snsr; - size_t slen = sizeof(struct sensor); - struct sensordev snsrdev; - size_t sdlen = sizeof(struct sensordev); - - for (devn = 0;; devn++) { - mibs[2] = devn; - - if (sysctl(mibs, 3, &snsrdev, &sdlen, NULL, 0) == -1) - { - if (errno == ENOENT) - break; - else - continue; - } - if (!strcmp("cpu0", snsrdev.xname)) - break; - else if (!strcmp("km0", snsrdev.xname)) - break; - } - - for (numt = 0; numt < snsrdev.maxnumt[SENSOR_TEMP]; numt++) { - mibs[4] = numt; - - if (sysctl(mibs, 5, &snsr, &slen, NULL, 0) == -1) - continue; - - if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0) - break; - } - - if (sysctl(mibs, 5, &snsr, &slen, NULL, 0) - != -1) - { - *temperature = (snsr.value - 273150000) / 1000000.0; - } - else - *temperature = INVALID_TEMP; -#elif defined(__FreeBSD__) || defined(__DragonFly__) - unsigned int value; - size_t len = sizeof(value); - if ((sysctlbyname - ("hw.acpi.thermal.tz0.temperature", &value, &len, NULL, - 0)) != -1) - { - *temperature = (value - 2732) / 10; - } - else - *temperature = INVALID_TEMP; -#elif defined(__linux__) - struct dirent *dh; - DIR *dir; - char path[PATH_MAX]; - - *temperature = INVALID_TEMP; - - dir = opendir("/sys/class/thermal"); - if (!dir) return; - - while ((dh = readdir(dir)) != NULL) - { - if (!strncmp(dh->d_name, "thermal_zone", 12)) - { - snprintf(path, sizeof(path), "/sys/class/thermal/%s/type", dh->d_name); - char *type = file_contents(path); - if (type) - { - /* This should ensure we get the highest available core temperature */ - if (strstr(type, "_pkg_temp")) - { - snprintf(path, sizeof(path), "/sys/class/thermal/%s/temp", dh->d_name); - char *value = file_contents(path); - if (value) - { - *temperature = atoi(value) / 1000; - free(value); - free(type); - break; - } - } - free(type); - } - } - } - - closedir(dir); -#elif defined(__MacOS__) - *temperature = INVALID_TEMP; -#endif -} - -static int -_power_battery_count_get(power_t *power) -{ -#if defined(__OpenBSD__) || defined(__NetBSD__) - struct sensordev snsrdev; - size_t sdlen = sizeof(struct sensordev); - int mib[5] = { CTL_HW, HW_SENSORS, 0, 0, 0 }; - int i, devn; - for (devn = 0;; devn++) { - mib[2] = devn; - if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1) - { - if (errno == ENXIO) - continue; - if (errno == ENOENT) - break; - } - - for (i = 0; i < MAX_BATTERIES; i++) { - char buf[64]; - snprintf(buf, sizeof(buf), "acpibat%d", i); - if (!strcmp(buf, snsrdev.xname)) - { - power->bat_mibs[power->battery_count] = - malloc(sizeof(int) * 5); - int *tmp = power->bat_mibs[power->battery_count++]; - tmp[0] = mib[0]; - tmp[1] = mib[1]; - tmp[2] = mib[2]; - } - } - - if (!strcmp("acpiac0", snsrdev.xname)) - { - power->ac_mibs[0] = mib[0]; - power->ac_mibs[1] = mib[1]; - power->ac_mibs[2] = mib[2]; - } - } -#elif defined(__FreeBSD__) || defined(__DragonFly__) - size_t len; - - if ((sysctlbyname("hw.acpi.battery.units", &power->battery_count, &len, NULL, 0)) < 0) - { - power->battery_count = 0; - } - - if ((sysctlbyname("hw.acpi.acline", NULL, &len, NULL, 0)) != -1) - { - sysctlnametomib("hw.acpi.acline", power->ac_mibs, &len); - } -#elif defined(__linux__) - struct dirent *dh; - DIR *dir; - char path[PATH_MAX]; - - dir = opendir("/sys/class/power_supply"); - if (!dir) return 0; - - while ((dh = readdir(dir)) != NULL) - { - if (dh->d_name[0] == '.') continue; - - snprintf(path, sizeof(path), "/sys/class/power_supply/%s/type", dh->d_name); - - char *type = file_contents(path); - if (type) - { - if (!strncmp(type, "Battery", 7)) - power->battery_names[power->battery_count++] = strdup(dh->d_name); - free(type); - } - } - - closedir(dir); -#endif - - power->batteries = malloc(power->battery_count * sizeof(bat_t **)); - - for (int i = 0; i < power->battery_count; i++) - { - power->batteries[i] = calloc(1, sizeof(bat_t)); - } - - return power->battery_count; -} - -static void -_battery_state_get(power_t *power) -{ -#if defined(__OpenBSD__) || defined(__NetBSD__) - int *mib; - double charge_full, charge_current; - size_t slen = sizeof(struct sensor); - struct sensor snsr; - - for (int i = 0; i < power->battery_count; i++) - { - charge_full = charge_current = 0; - - mib = power->bat_mibs[i]; - mib[3] = 7; - mib[4] = 0; - - if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1) - charge_full = (double)snsr.value; - - mib[3] = 7; - mib[4] = 3; - - if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1) - charge_current = (double)snsr.value; - - /* ACPI bug workaround... */ - if (charge_current == 0 || charge_full == 0) - { - mib[3] = 8; - mib[4] = 0; - - if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1) - charge_full = (double)snsr.value; - - mib[3] = 8; - mib[4] = 3; - - if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1) - charge_current = (double)snsr.value; - } - - power->batteries[i]->charge_full = charge_full; - power->batteries[i]->charge_current = charge_current; - } -#elif defined(__FreeBSD__) || defined(__DragonFly__) - int fd, i; - union acpi_battery_ioctl_arg battio; - - if ((fd = open("/dev/acpi", O_RDONLY)) == -1) return; - - for (i = 0; i < power->battery_count; i++) - { - battio.unit = i; - if (ioctl(fd, ACPIIO_BATT_GET_BIF, &battio) != -1) - { - power->batteries[i]->charge_full = battio.bif.lfcap; - } - battio.unit = i; - if (ioctl(fd, ACPIIO_BATT_GET_BST, &battio) != -1) - { - power->batteries[i]->charge_current = battio.bst.cap; - } - } - close(fd); - -#elif defined(__linux__) - char path[PATH_MAX]; - struct dirent *dh; - struct stat st; - DIR *dir; - char *buf, *naming; - int i; - unsigned long charge_full = 0; - unsigned long charge_current = 0; - - for (i = 0; i < power->battery_count; i++) - { - naming = NULL; - snprintf(path, sizeof(path), "/sys/class/power_supply/%s", power->battery_names[i]); - - if (stat(path, &st) < 0) continue; - if (S_ISLNK(st.st_mode)) continue; - if (!S_ISDIR(st.st_mode)) continue; - - dir = opendir(path); - if (!dir) return; - while ((dh = readdir(dir)) != NULL) - { - char *e; - if (dh->d_name[0] == '.') continue; - if ((e = strstr(dh->d_name, "_full\0"))) - { - naming = strndup(dh->d_name, e - dh->d_name); - break; - } - } - closedir(dir); - - if (!naming) - { - continue; - } - - snprintf(path, sizeof(path), "/sys/class/power_supply/%s/%s_full", power->battery_names[i], naming); - buf = file_contents(path); - if (buf) - { - charge_full = atol(buf); - free(buf); - } - snprintf(path, sizeof(path), "/sys/class/power_supply/%s/%s_now", power->battery_names[i], naming); - buf = file_contents(path); - if (buf) - { - charge_current = atol(buf); - free(buf); - } - power->batteries[i]->charge_full = charge_full; - power->batteries[i]->charge_current = charge_current; - - free(naming); - } -#endif -} - -static void -_power_state_get(power_t *power) -{ - int i; -#if defined(__OpenBSD__) || defined(__NetBSD__) - struct sensor snsr; - size_t slen = sizeof(struct sensor); -#elif defined(__FreeBSD__) || defined(__DragonFly__) - unsigned int value; - size_t len; -#elif defined(__linux__) - char *buf; -#endif - -#if defined(__OpenBSD__) || defined(__NetBSD__) - power->ac_mibs[3] = 9; - power->ac_mibs[4] = 0; - - if (sysctl(power->ac_mibs, 5, &snsr, &slen, NULL, 0) != -1) - power->have_ac = (int)snsr.value; -#elif defined(__FreeBSD__) || defined(__DragonFly__) - len = sizeof(value); - if ((sysctl(power->ac_mibs, 3, &value, &len, NULL, 0)) == -1) - { - return; - } - power->have_ac = value; -#elif defined(__linux__) - buf = file_contents("/sys/class/power_supply/AC/online"); - if (buf) - { - power->have_ac = atoi(buf); - free(buf); - } -#endif - - _battery_state_get(power); - - for (i = 0; i < power->battery_count; i++) - { - double percent = - 100 * (power->batteries[i]->charge_current / power->batteries[i]->charge_full); - power->batteries[i]->percent = percent; - - if (power->bat_mibs[i]) - free(power->bat_mibs[i]); - if (power->battery_names[i]) - free(power->battery_names[i]); - } -} - -#if defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) -static void -_freebsd_generic_network_status(unsigned long int *in, - unsigned long int *out) -{ - struct ifmibdata *ifmd; - size_t len; - int i, count; - len = sizeof(count); - - if (sysctlbyname - ("net.link.generic.system.ifcount", &count, &len, NULL, 0) < 0) - return; - - ifmd = malloc(sizeof(struct ifmibdata)); - if (!ifmd) - return; - - for (i = 1; i <= count; i++) { - int mib[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, i, IFDATA_GENERAL }; - len = sizeof(*ifmd); - if (sysctl(mib, 6, ifmd, &len, NULL, 0) < 0) continue; - if (!strcmp(ifmd->ifmd_name, "lo0")) - continue; - *in += ifmd->ifmd_data.ifi_ibytes; - *out += ifmd->ifmd_data.ifi_obytes; - } - free(ifmd); -} - -#endif - -#if defined(__OpenBSD__) -static void -_openbsd_generic_network_status(unsigned long int *in, - unsigned long int *out) -{ - struct ifaddrs *interfaces, *ifa; - - if (getifaddrs(&interfaces) < 0) - return; - - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock < 0) - return; - - for (ifa = interfaces; ifa; ifa = ifa->ifa_next) { - struct ifreq ifreq; - struct if_data if_data; - - ifreq.ifr_data = (void *)&if_data; - strncpy(ifreq.ifr_name, ifa->ifa_name, IFNAMSIZ - 1); - if (ioctl(sock, SIOCGIFDATA, &ifreq) < 0) - return; - - struct if_data *const ifi = &if_data; - if (ifi->ifi_type == IFT_ETHER || - ifi->ifi_type == IFT_FASTETHER || - ifi->ifi_type == IFT_GIGABITETHERNET || - ifi->ifi_type == IFT_IEEE80211) - { - if (ifi->ifi_ibytes) - *in += ifi->ifi_ibytes; - - if (ifi->ifi_obytes) - *out += ifi->ifi_obytes; - } - } - close(sock); -} - -#endif - -#if defined(__linux__) -static void -_linux_generic_network_status(unsigned long int *in, - unsigned long int *out) -{ - FILE *f; - char buf[4096], dummy_s[256]; - unsigned long int tmp_in, tmp_out, dummy; - - f = fopen("/proc/net/dev", "r"); - if (!f) return; - - while (fgets(buf, sizeof(buf), f)) - { - if (17 == sscanf(buf, "%s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu " - "%lu %lu %lu %lu\n", dummy_s, &tmp_in, &dummy, &dummy, - &dummy, &dummy, &dummy, &dummy, &dummy, &tmp_out, &dummy, - &dummy, &dummy, &dummy, &dummy, &dummy, &dummy)) - { - *in += tmp_in; - *out += tmp_out; - } - } - - fclose(f); -} - -#endif - -static void -_network_transfer_get(results_t *results) -{ - unsigned long first_in = 0, first_out = 0; - unsigned long last_in = 0, last_out = 0; -#if defined(__linux__) - _linux_generic_network_status(&first_in, &first_out); - usleep(1000000); - _linux_generic_network_status(&last_in, &last_out); -#elif defined(__OpenBSD__) - _openbsd_generic_network_status(&first_in, &first_out); - usleep(1000000); - _openbsd_generic_network_status(&last_in, &last_out); -#elif defined(__MacOS__) || defined(__FreeBSD__) || defined(__DragonFly__) - _freebsd_generic_network_status(&first_in, &first_out); - usleep(1000000); - _freebsd_generic_network_status(&last_in, &last_out); -#endif - results->incoming = last_in - first_in; - results->outgoing = last_out - first_out; -} - -static int -percentage(int value, int max) -{ - double avg = (max / 100.0); - double tmp = value / avg; - - return round(tmp); -} - -static void -results_pretty(results_t *results, int *order, int count) -{ - int i, j, flags; - - for (i = 0; i < count; i++) { - flags = order[i]; - if (flags & RESULTS_CPU_CORES) - { - if (results->cpu_count > 1) - printf(" [CPUs]: "); - else - printf(" [CPU]: "); - for (j = 0; j < results->cpu_count; j++) { - printf("%.2f%%", results->cores[j]->percent); - if (j < (results->cpu_count - 1)) - printf(" "); - } - } - else if (flags & RESULTS_CPU) - { - double cpu_percent = 0; - for (j = 0; j < results->cpu_count; j++) - cpu_percent += results->cores[j]->percent; - - printf(" [CPU]: %.2f%%", cpu_percent / results->cpu_count); - } - - if (flags & RESULTS_MEM) - { - unsigned long used = results->memory.used; - unsigned long total = results->memory.total; - char unit; - - if (flags & RESULTS_MEM_GB) - { - unit = 'G'; - _memsize_kb_to_gb(&used); - _memsize_kb_to_gb(&total); - } - else if (flags & RESULTS_MEM_MB) - { - unit = 'M'; - _memsize_kb_to_mb(&used); - _memsize_kb_to_mb(&total); - } - else - unit = 'K'; - - printf(" [MEM]: %lu/%lu%c", used, total, unit); - } - - if (flags & RESULTS_NET) - { - const char *unit = "B/s"; - double incoming = results->incoming; - double outgoing = results->outgoing; - - if ((incoming > 1048576) || (outgoing > 1048576)) - { - incoming = incoming / 1048576; - outgoing = outgoing / 1048576; - unit = "MB/s"; - } - else if (((incoming > 1024) && (incoming < 1048576)) || - ((outgoing > 1024) && (outgoing < 1048576))) - { - incoming /= 1024; - outgoing /= 1024; - unit = "KB/s"; - } - printf(" [NET]: %.2f/%.2f %s", incoming, outgoing, unit); - } - - if (flags & RESULTS_TMP) - { - if (results->temperature != INVALID_TEMP) - printf(" [T]: %dC", results->temperature); - } - - if (flags & RESULTS_AUD) - { - if (results->mixer.enabled) - { - uint8_t level = - results->mixer.volume_right > - results->mixer.volume_left ? results->mixer. - volume_right : results->mixer.volume_left; -#if defined(__MacOS__) || defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__) - uint8_t perc = percentage(level, 100); - printf(" [VOL]: %d%%", perc); -#elif defined(__OpenBSD__) || defined(__NetBSD__) - uint8_t perc = percentage(level, 255); - printf(" [VOL]: %d%%", perc); -#endif - } - } - - if (flags & RESULTS_PWR) - { - if (results->power.have_ac) - printf(" [AC]"); - else - printf(" [DC]"); - - if (results->power.battery_count != 0) - printf(":"); - - for (int i = 0; i < results->power.battery_count; i++) - { - printf(" %d%%", results->power.batteries[i]->percent); - } - } - - } - printf("\n"); -} - -static void -results_cpu(cpu_core_t **cores, int cpu_count, int flags) -{ - int i; - - if (flags & RESULTS_CPU_CORES) - { - for (i = 0; i < cpu_count; i++) - printf("%.2f ", cores[i]->percent); - } - else - { - double total = 0; - for (i = 0; i < cpu_count; i++) - total += cores[i]->percent; - printf("%.2f", total / cpu_count); - } - - printf("\n"); -} - -static void -results_mem(meminfo_t *mem, int flags) -{ - unsigned long total, used, cached, buffered; - unsigned long shared, swap_total, swap_used; - - total = mem->total; - used = mem->used; - cached = mem->cached; - buffered = mem->buffered; - shared = mem->shared; - swap_total = mem->swap_total; - swap_used = mem->swap_used; - - if (flags & RESULTS_MEM_MB) - { - _memsize_kb_to_mb(&total); - _memsize_kb_to_mb(&used); - _memsize_kb_to_mb(&cached); - _memsize_kb_to_mb(&buffered); - _memsize_kb_to_mb(&shared); - _memsize_kb_to_mb(&swap_total); - _memsize_kb_to_mb(&swap_used); - } - else if (flags & RESULTS_MEM_GB) - { - _memsize_kb_to_gb(&total); - _memsize_kb_to_gb(&used); - _memsize_kb_to_gb(&cached); - _memsize_kb_to_gb(&buffered); - _memsize_kb_to_gb(&shared); - _memsize_kb_to_gb(&swap_total); - _memsize_kb_to_gb(&swap_used); - } - - printf("%lu %lu %lu %lu %lu %lu %lu\n", - total, used, cached, buffered, shared, swap_total, swap_used); -} - -static void -results_power(power_t *power) -{ - printf("%d", power->have_ac); - for (int i = 0; i < power->battery_count; i++) - { - printf(" %d", power->batteries[i]->percent); - } - - printf("\n"); -} - -static void -results_temperature(int temp) -{ - printf("%d\n", temp); -} - -static void -results_network(results_t *results) -{ - printf("%lu %lu\n", results->incoming, results->outgoing); -} - -static void -results_mixer(mixer_t *mixer) -{ - if (!mixer->enabled) - return; - - printf("%d %d\n", mixer->volume_left, mixer->volume_right); -} - -static void -results_verbose(results_t *results, int *order, int count) -{ - int i, flags; - for (i = 0; i < count; i++) { - flags = order[i]; - if (flags & RESULTS_CPU) - results_cpu(results->cores, results->cpu_count, flags); - else if (flags & RESULTS_MEM) - results_mem(&results->memory, flags); - else if (flags & RESULTS_PWR) - results_power(&results->power); - else if (flags & RESULTS_TMP) - results_temperature(results->temperature); - else if (flags & RESULTS_NET) - results_network(results); - else if (flags & RESULTS_AUD) - results_mixer(&results->mixer); - } -} - -static void *_network_transfer_get_thread_cb(void *arg) -{ - results_t *results = arg; - - _network_transfer_get(results); - - return ((void *) 0); -} - -int -main(int argc, char **argv) -{ - void *ret = NULL; - results_t results; - bool have_battery, status_line = false; - int i, j = 0, flags = 0, error = 0; - int order[argc]; - pthread_t tid; - - memset(&order, 0, sizeof(int) * (argc)); - - for (i = 1; i < argc; i++) { - if ((!strcmp(argv[i], "-h")) || - (!strcmp(argv[i], "-help")) || (!strcmp(argv[i], "--help"))) - { - printf("Usage: tingle [OPTIONS]\n" - " Where OPTIONS can be a combination of\n" - " -c\n" - " Show average CPU usage.\n" - " -C\n" - " Show all CPU cores and usage.\n" - " -k (KB) -m (MB) -g (GB)\n" - " Show memory usage (unit).\n" - " -n\n" - " Show network usage.\n" - " -p\n" - " Show power status (ac and battery percentage).\n" - " -t\n" - " Show temperature sensors (temperature in celcius).\n" - " -a\n" - " Display mixer values (system values).\n" - " -s\n" - " Show all in a nicely formatted status bar format.\n" - " This is the default behaviour with no arguments.\n" - " With other flags specify (in any order) which\n" - " components to display in the status bar.\n" - " -v | -version | --version\n" - " Version information.\n" - " -h | -help | --help\n" " This help.\n"); - exit(0); - } - - if ((!strcmp(argv[i], "-v")) || - (!strcmp(argv[i], "-version")) || (!strcmp(argv[i], "--version"))) - { - printf("(c) Copyright 2017-2019. Alastair Poole (see COPYING for details)\n"); - printf("Tingle version %s\n", VERSION); - exit(0); - } - - if (!strcmp(argv[i], "-c")) - order[j] |= RESULTS_CPU; - else if (!strcmp(argv[i], "-C")) - order[j] |= RESULTS_CPU | RESULTS_CPU_CORES; - else if (!strcasecmp(argv[i], "-k")) - order[j] |= RESULTS_MEM; - else if (!strcasecmp(argv[i], "-m")) - order[j] |= RESULTS_MEM | RESULTS_MEM_MB; - else if (!strcasecmp(argv[i], "-g")) - order[j] |= RESULTS_MEM | RESULTS_MEM_GB; - else if (!strcasecmp(argv[i], "-p")) - order[j] |= RESULTS_PWR; - else if (!strcasecmp(argv[i], "-t")) - order[j] |= RESULTS_TMP; - else if (!strcasecmp(argv[i], "-a")) - order[j] |= RESULTS_AUD; - else if (!strcasecmp(argv[i], "-n")) - order[j] |= RESULTS_NET; - else if (!strcasecmp(argv[i], "-s")) - { - status_line = true; - continue; - } - flags |= order[j++]; - } - - if (flags == 0) - { - flags |= RESULTS_DEFAULT; - order[0] |= RESULTS_DEFAULT | RESULTS_MEM_MB; - status_line = true; - } - - memset(&results, 0, sizeof(results_t)); - - if (flags & RESULTS_NET) - { - error = pthread_create(&tid, NULL, _network_transfer_get_thread_cb, &results); - if (error) - _network_transfer_get(&results); - } - - if (flags & RESULTS_CPU) - { - results.cores = _cpu_cores_state_get(&results.cpu_count); - } - - if (flags & RESULTS_MEM) - { - _memory_usage_get(&results.memory); - } - - if (flags & RESULTS_PWR) - { - have_battery = _power_battery_count_get(&results.power); - if (have_battery) - _power_state_get(&results.power); - } - - if (flags & RESULTS_TMP) - { - _temperature_cpu_get(&results.temperature); - } - - if (flags & RESULTS_AUD) - { - _mixer_master_volume_get(&results.mixer); - } - - if (flags & RESULTS_NET && !error) - { - pthread_join(tid, ret); - } - - if (status_line) - { - results_pretty(&results, order, j ? j : 1); - } - else - { - results_verbose(&results, order, j); - } - - if (flags & RESULTS_PWR) - { - for (i = 0; i < results.power.battery_count; i++) - free(results.power.batteries[i]); - if (results.power.batteries) - free(results.power.batteries); - } - - if (flags & RESULTS_CPU) - { - for (i = 0; i < results.cpu_count; i++) - { - free(results.cores[i]); - } - free(results.cores); - } - - return EXIT_SUCCESS; -} diff --git a/src/tingle/tmux.conf b/src/tingle/tmux.conf deleted file mode 100644 index 01a8a23..0000000 --- a/src/tingle/tmux.conf +++ /dev/null @@ -1,124 +0,0 @@ -set-option -g prefix C-j -unbind-key C-b -bind-key b send-prefix -# this is mainly taken from Richo Healey's dotfiles. -# thanks mate. -# TODO -# Finish mapping up all keys -# Learn how splits work -# WISHLIST -# Ideally, update the terminal title/hit the wm for activity on alert - - -# Statusline - -set-window-option -g mode-keys vi # vi key -set-option -g status-keys vi -set -g default-terminal "screen-256color" -# What's the point of vi keys without pane movement? -bind l select-pane -R -bind k select-pane -U -bind j select-pane -D -bind h select-pane -L - -bind < resize-pane -L 2 -bind > resize-pane -R 2 -bind - resize-pane -D 2 -bind + resize-pane -U 2 - -bind ` next-layout -#Ctrl-j-u volume up -bind C-u run-shell -b 'volctl +10' -#Ctrl-j-j volume down -bind C-j run-shell -b 'volctl -10' - -# copy mode to escape key -bind y copy-mode -bind ] paste-buffer -bind-key ^] send-keys Escape ":set paste\ri" \; paste-buffer\; send-keys Escape ":set nopaste\r" -#20:03 < micahcowan> rich0_, just in case, something like ^^ [that] - -# move tmux copy buffer into x clipboard -bind-key C-y save-buffer /tmp/tmux-buffer \; run-shell "cat /tmp/tmux-buffer | xclip" - -# splitting and cycling -unbind % -bind | split-window -h # horizontal split -unbind '"' -bind S split-window -v # vertical split - -set-window-option -g automatic-rename off # auto name - -# messages -set-window-option -g mode-bg black -set-window-option -g mode-fg white -#set-option -g message-bg nta -#set-option -g message-fg black - -# No visual activity -set -g visual-activity off -set -g visual-bell on -set -g status-interval 120 - -# Less obnoxious colors - -set -g pane-active-border-fg black -set -g pane-active-border-bg white -set -g pane-border-fg black -set -g pane-border-bg white - -# Richo's screenlike bindings -bind C-n next -bind C-space next -bind space next -bind C-p prev -bind C-d detach -#unbind C-c -bind C-c new-window -bind K confirm-before kill-pane -bind A command-prompt "rename-window '%%'" - -# bind M set-window-option monitor-activity (toggle) -# bind _ set-window-option monitor-silence 15 (Toggle) - -bind-key C-a last-window -bind-key / command-prompt "split-window -h 'exec man %%'" -bind M set-window-option monitor-activity -bind _ command-prompt "setw monitor-silence '%%'" - -bind I set-window-option synchronize-panes - -# Create an environment that zsh can make sense of -# set-environment -g tmuxTERM $TERM -set-environment -g INSCREEN yes - -# New shells should not inherit pwd -# set -g default-path "." - -# status bar -set-option -g status-bg black -set-option -g status-fg white -set-option -g message-attr none -set-option -g message-bg black -set-option -g message-fg white -set-window-option -g window-status-bell-bg black -set-window-option -g window-status-bell-attr bright -set-window-option -g window-status-activity-bg red -set-window-option -g window-status-activity-attr bright -set-option -g status-interval 5 -set-option -g status-right-length 90 -set-option -g status-right "#[fg=colour255]#(tingle -s -c -m -a -p) #(date +'%H:%M %d-%m-%Y')" -# Cheers Nei on freenode -set-window-option -g window-status-current-format "[#[fg=white]#I:#W#F#[fg=red]]" -set-option -g visual-activity on -set-window-option -g monitor-activity off -set-window-option -g window-status-current-fg red -set-window-option -g window-status-current-attr bright - -# DEBUG -# bind r source ~/.tmux.conf - -# clock -set-window-option -g clock-mode-colour black -set-window-option -g clock-mode-style 24 -# vim: ft=tmux diff --git a/src/tingle/volctl b/src/tingle/volctl deleted file mode 100755 index 02a2f8d..0000000 --- a/src/tingle/volctl +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -my $OS = $^O; - -sub Error { - my ($str) = @_; - - print STDERR "Error: $str\n"; - - exit (0 << 1); -} - -sub mixer_levels_get { - my ($left, $right) = @_; - my $pipe_cmd = ""; - - if ($OS eq "openbsd" || $OS eq "netbsd") - { - $pipe_cmd = "mixerctl outputs.master|"; - } - elsif ($OS eq "freebsd" || $OS eq "dragonfly") - { - $pipe_cmd = "mixer vol|"; - } - elsif ($OS eq "darwin") - { - $pipe_cmd = "osascript -e 'get volume settings'|"; - } - elsif ($OS eq "linux") - { - $pipe_cmd = "amixer get Master|"; - } - - open P, "$pipe_cmd" || die "Unable to determine mixer!\n"; - my @lines =

; - close P; - - my $have_mixer = 0; - - foreach my $line (@lines) - { - if ($line =~ m/Left:.*\[(\d+)%\]/) - { - $$left = $1; - $have_mixer = 1; - } - - if ($line =~ m/Right:.*\[(\d+)%\]/) - { - $$right = $1; - $have_mixer = 1; - } - - if ($line =~ m/\Aoutput\svolume:(\d+),/) - { - $$left = $$right = $1; - return 1; - } - elsif ($line =~ m/(\d+),(\d+)/ || $line =~ m/(\d+):(\d+)/) - { - $$left = $1; - $$right = $2; - return 1; - } - } - - return $have_mixer; -} - -sub mixer_levels_set { - my ($new_left, $new_right) = @_; - my $cmd = ""; - - close (STDOUT); - - if ($OS eq "openbsd" || $OS eq "netbsd") - { - $cmd = "mixerctl outputs.master=$new_left,$new_right"; - } - elsif ($OS eq "freebsd" || $OS eq "dragonfly") - { - $cmd = "mixer $new_left:$new_right" - } - elsif ($OS eq "darwin") - { - my $greatest = $new_left > $new_right ? $new_left : $new_right; - my $ratio = 7 / 100; - my $volume = $greatest * $ratio; - $cmd = "osascript -e 'set volume $volume'"; - } - elsif ($OS eq "linux") - { - my $greatest = $new_left > $new_right ? $new_left : $new_right; - $cmd = "amixer set \"Master\" $greatest%"; - } - - return system($cmd); -} - -sub main { - my (@args) = @_; - my $argc = scalar(@args); - my ($inc, $dec) = (0, 0); - my ($left, $right) = (0, 0); - - for (my $i = 0; $i < $argc; $i++) - { - if ($args[$i] =~ /\+(\d+)/) - { - $inc = $1; - } - - if ($args[$i] =~ /\-(\d+)/) - { - $dec = $1 - } - } - - if (!mixer_levels_get(\$left, \$right)) - { - Error("couldn't get current volumes"); - } - - $left -= $dec; $right -= $dec; - $left += $inc; $right += $inc; - - if ($OS eq "linux" || $OS eq "darwin" || $OS eq "freebsd" || $OS eq "dragonfly") - { - if ($left < 0) { $left = 0; }; - if ($left > 100) { $left = 100; }; - if ($right < 0) { $right = 0; }; - if ($right > 100) { $right = 100 }; - } - - return mixer_levels_set($left, $right); -} - -exit(main(@ARGV)); -