evisum: add tingle command-line helper.

This commit is contained in:
Alastair Poole 2018-10-17 10:39:58 +01:00
parent 8076a4b96a
commit 93d48c1403
8 changed files with 2042 additions and 7 deletions

3
NEWS
View File

@ -2,6 +2,9 @@
Evisum 0.2.0 Evisum 0.2.0
============ ============
* Add command-line utility (tingle) to complement
evisum.
* Fix object destruction befor exitting main loop.
* Add variable unit display (K, M and G). * Add variable unit display (K, M and G).
* Minor refactoring. * Minor refactoring.

View File

@ -2,13 +2,10 @@
System Information (EFL) System Information (EFL)
This is a process monitor and system monitor. This is a process monitor and system monitor for Linux, macOS,
FreeBSD, DragonFlyBSD and OpenBSD.
Currently have full engines for Linux, FreeBSD, OpenBSD and MacOS. Includes 'tingle' a command-line utility for displaying sensor information.
The plan is to rewrite the whole program to log system information
over time to disk so we can do nice things with E and displaying
system information (not duplicating loads of code).
REQUIREMENTS: REQUIREMENTS:
@ -32,3 +29,11 @@ $ make PREFIX=/usr install
or even: or even:
$ make PREFIX=/opt install $ make PREFIX=/opt install
NOTES
The plan is to rewrite the whole program to log system information
over time to disk so we can do nice things with E and displaying
system information (not duplicating loads of code).
For information on tingle, see src/tingle/README.

View File

@ -21,9 +21,10 @@ export LDFLAGS
default: default:
$(MAKE) -C src $(MAKE) -C src
$(MAKE) -C src/tingle
clean: clean:
$(MAKE) -C src clean $(MAKE) -C src/tingle clean
install: install:
-mkdir -p $(PREFIX)/share/pixmaps -mkdir -p $(PREFIX)/share/pixmaps
@ -32,3 +33,4 @@ install:
install -m 0644 data/evisum.png $(PREFIX)/share/pixmaps install -m 0644 data/evisum.png $(PREFIX)/share/pixmaps
install -m 0644 data/evisum.desktop $(PREFIX)/share/applications install -m 0644 data/evisum.desktop $(PREFIX)/share/applications
install -m 0755 evisum $(PREFIX)/bin install -m 0755 evisum $(PREFIX)/bin
install -m 0755 src/tingle/tingle $(PREFIX)/bin

47
src/tingle/README Normal file
View File

@ -0,0 +1,47 @@
# 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.
If I'd thought more about it I'd have made it modular, so
apologies for the crust!
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.
Al Poole <netstar@gmail.com>

23
src/tingle/makefile Normal file
View File

@ -0,0 +1,23 @@
PROGRAM=tingle
SOURCES=tingle.c
CFLAGS=-O2 -Wall -pedantic -std=c99 -lpthread
LDFLAGS=-lm
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 AudioToolBox
else ifeq ($(UNAME),Linux)
ifeq ($(HAVE_ALSA),true)
CFLAGS += -lasound -DHAVE_ALSA=1
endif
endif
default:
$(CC) $(CFLAGS) $(LDFLAGS) $(SOURCES) -o tingle
clean:
-rm $(PROGRAM)

1689
src/tingle/tingle.c Normal file

File diff suppressed because it is too large Load Diff

124
src/tingle/tmux.conf Normal file
View File

@ -0,0 +1,124 @@
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

142
src/tingle/volctl Executable file
View File

@ -0,0 +1,142 @@
#!/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 = <P>;
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));