First testing draft of the program. Displays the up and download speed

This commit is contained in:
_N0x 2021-10-19 17:29:12 +02:00
parent 2937d03396
commit 65e8f879ef
4 changed files with 208 additions and 0 deletions

32
Makefile Normal file
View File

@ -0,0 +1,32 @@
# cStatBar Makefile
SRC = cstatbar.c
OBJ = ${SRC:.c=.o}
CC = cc
CFLAGS = -std=c99 -g
LDFLAGS = -lX11
all: options cstatbar
options:
@echo cstatusbar build options are as follow:
@echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}"
.c.o:
${CC} -c ${CFLAGS} $<
${OBJ}: config.h
config.h:
cp config.def.h $@
cstatbar: ${OBJ}
${CC} -o $@ ${OBJ} ${LDFLAGS}
clean:
rm -f cstatbar ${OBJ}
.PHONY: all options clean

14
config.def.h Normal file
View File

@ -0,0 +1,14 @@
static const int cycletime = 2; /* time between updates in second */
static const char interface[] = "enp4s0"; /* The name of the inteface to display information for */
static const char * icons[] = { /* Array of icons to be used for the status bar segments */
"", // Icon for date
"", // Icon for battery
"", // Icon for CPU usage
"", // Icon for RAM usage
"", // Icon for disk
"", // Icon for network speed
"", // Icon for upload speed
"", // Icon for download speed
"", // Icon for network information
"" // Icon for music infos
};

14
config.h Normal file
View File

@ -0,0 +1,14 @@
static const int cycletime = 2; /* time between updates in second */
static const char interface[] = "enp4s0"; /* The name of the inteface to display information for */
static const char * icons[] = { /* Array of icons to be used for the status bar segments */
"", // Icon for date
"", // Icon for battery
"", // Icon for CPU usage
"", // Icon for RAM usage
"", // Icon for disk
"", // Icon for network speed
"", // Icon for upload speed
"", // Icon for download speed
"", // Icon for network information
"" // Icon for music infos
};

148
cstatbar.c Normal file
View File

@ -0,0 +1,148 @@
/* cStatBar
*
* A simple statusbar to be used with DWM
* Gathers different kinds of system info and displays it as the windows title
*
* Requires dwm to have the status2d patch applied and a font that supports icons e.g. Nerdfonts
*
* author: _N0x
* version: 0.1
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include "config.h"
/* enums */
enum { IconDateTime, IconBattery, IconCPU, IconRAM, IconDisk,
IconNetSpeed, IconNetSpeedUp, IconNetSpeedDown, IconNetwork, IconMusic };
/* function declaration */
void setup();
void setxroot(char *title);
char *readinfile(char *filename);
char *getnetworkspeed();
char *cs(int count, ...);
/* variables */
static const char *iface;
static const char kbs[] = "kb/s";
/* Uses functionality from Xlib to set the window root name to a specified string */
void setxroot(char *title)
{
Display * dpy = XOpenDisplay(NULL);
int screen = DefaultScreen(dpy);
Window root = RootWindow(dpy, screen);
XStoreName(dpy, root, title);
XFlush(dpy);
XCloseDisplay(dpy);
}
/* Takes in a filename and returns the content of the file */
char * readinfile(char *fileName)
{
FILE * fd;
char * c;
int len;
fd = fopen(fileName, "r");
if (fd==NULL)
{
perror("Could not read in File.\n");
exit(EXIT_FAILURE);
}
fseek(fd, 0, SEEK_END);
len = ftell(fd);
fseek(fd, 0, SEEK_SET);
c = malloc(len);
fread(c, 1, len, fd);
return c;
}
char * getnetworkspeed()
{
char *tmp,*result,*R1,*R2,*T1,*T2;
char TT[12], RR[12];
tmp = cs(3, "/sys/class/net/", iface, "/statistics/rx_bytes");
R1 = readinfile(tmp);
free(tmp);
tmp = cs(3, "/sys/class/net/", iface, "/statistics/tx_bytes");
T1 = readinfile(tmp);
free(tmp);
sleep(1);
tmp = cs(3, "/sys/class/net/", iface, "/statistics/rx_bytes");
R2 = readinfile(tmp);
free(tmp);
tmp = cs(3, "/sys/class/net/", iface, "/statistics/tx_bytes");
T2 = readinfile(tmp);
free(tmp);
sprintf(RR, "%d", (atoi(R2) - atoi(R1)) / 1024);
sprintf(TT, "%d", (atoi(T2) - atoi(T1)) / 1024);
result = cs(11, icons[IconNetSpeed], " ",
icons[IconNetSpeedUp], " ", TT, kbs, " ",
icons[IconNetSpeedDown], " ", RR, kbs);
return result;
}
/* a variadic function to take in count number of strings and concatenate them into one single string */
char * cs(int count, ...)
{
va_list ap;
va_start(ap, count);
int len = 1;
for(int i=0; i<count; i++) { len += strlen(va_arg(ap, char*)); }
va_end(ap);
char * result = malloc(len * sizeof(char));
int pos = 0;
va_start(ap, count);
for(int i=0; i<count; i++){
char * tmp = va_arg(ap, char *);
strcpy(result + pos, tmp);
pos += strlen(tmp);
}
return result;
}
void setup(){
iface = interface;
}
int main(int argc, char *argv[])
{
setup();
while(1) {
//setxroot(name);
printf("%s\n", getnetworkspeed());
sleep(cycletime);
}
}