alsa-visual/spark_ncurses.c
2024-06-22 10:24:24 +00:00

101 lines
1.3 KiB
C

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <ncurses.h>
#include <sys/ioctl.h>
#include <ctype.h>
#define ARG_SIZE 50
struct winsize ws;
int max;
int min;
int args;
size_t middle;
int add_value(const char *str) {
if (args > (int)ws.ws_col)
return 1;
int val1 = atoi(str);
int val2 = val1;
if (val2 < 0)
val2 *= -1;
if (val2 > max)
max = val2;
else if (val2 < min)
min = val2;
int k = (val2 - min) * (middle - 5) / ((max - min) + 1);
if (val1 > 0)
mvprintw(middle - k, args, "@");
else
mvprintw(middle + k, args, "@");
args++;
return 0;
}
void stdin_read(void) {
char arg[ARG_SIZE + 1];
char *p = arg;
while (1) {
int c = getchar();
if (c == EOF)
return;
else if (c == ' ' && p != arg) {
*p = '\0';
p = arg;
if (add_value(arg))
break;
}
else {
*p = c;
if (p + 1 == arg + sizeof(arg))
break;
p++;
}
}
}
void sig_handler(int sig) {
(void)sig;
endwin();
exit(0);
}
int main(void) {
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0)
return 1;
initscr();
noecho();
curs_set(0);
timeout(0);
middle = ws.ws_row / 2;
while (1) {
args = 0;
clear();
stdin_read();
refresh();
}
}