From 2524999fd1e109b5eb4717c3d91afb77423354d0 Mon Sep 17 00:00:00 2001 From: Berserk2046 Date: Thu, 23 Feb 2023 11:59:23 -0500 Subject: [PATCH] dwmblocks --- dwmblocks/Makefile | 36 +++++++ dwmblocks/blocks.h | 12 +++ dwmblocks/dwmblocks | Bin 0 -> 17160 bytes dwmblocks/dwmblocks.c | 213 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 261 insertions(+) create mode 100644 dwmblocks/Makefile create mode 100644 dwmblocks/blocks.h create mode 100755 dwmblocks/dwmblocks create mode 100644 dwmblocks/dwmblocks.c diff --git a/dwmblocks/Makefile b/dwmblocks/Makefile new file mode 100644 index 0000000..75109ac --- /dev/null +++ b/dwmblocks/Makefile @@ -0,0 +1,36 @@ +PREFIX := /usr/local +CC := cc +CFLAGS := -pedantic -Wall -Wno-deprecated-declarations -Os +LDFLAGS := -lX11 + +# FreeBSD (uncomment) +#LDFLAGS += -L/usr/local/lib -I/usr/local/include +# # OpenBSD (uncomment) +#LDFLAGS += -L/usr/X11R6/lib -I/usr/X11R6/include + +all: options dwmblocks + +options: + @echo dwmblocks build options: + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +dwmblocks: dwmblocks.c blocks.def.h blocks.h + ${CC} -o dwmblocks dwmblocks.c ${CFLAGS} ${LDFLAGS} + +blocks.h: + cp blocks.def.h $@ + +clean: + rm -f *.o *.gch dwmblocks + +install: dwmblocks + mkdir -p ${DESTDIR}${PREFIX}/bin + cp -f dwmblocks ${DESTDIR}${PREFIX}/bin + chmod 755 ${DESTDIR}${PREFIX}/bin/dwmblocks + +uninstall: + rm -f ${DESTDIR}${PREFIX}/bin/dwmblocks + +.PHONY: all options clean install uninstall diff --git a/dwmblocks/blocks.h b/dwmblocks/blocks.h new file mode 100644 index 0000000..6642b4a --- /dev/null +++ b/dwmblocks/blocks.h @@ -0,0 +1,12 @@ +//Modify this file to change what commands output to your statusbar, and recompile using the make command. +static const Block blocks[] = { + /*Icon*/ /*Command*/ /*Update Interval*/ /*Update Signal*/ + + {"^d^ ^b#ffffff^^c#000000^  ^d^ ", " free -h | grep Mem | awk '{print $3}'", 10, 0}, + {"^d^ ^b#ffffff^^c#000000^  ^d^ ", " battery", 60, 0}, + {"^d^ ^b#ffffff^^c#000000^  ^d^ ", " date +%H:%M", 60, 0}, +}; + +//sets delimeter between status commands. NULL character ('\0') means no delimeter. +static char delim[] = ""; +static unsigned int delimLen = 0; diff --git a/dwmblocks/dwmblocks b/dwmblocks/dwmblocks new file mode 100755 index 0000000000000000000000000000000000000000..60b9175443bf4156ca782d957886032723a9504f GIT binary patch literal 17160 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 AJ^%m! literal 0 HcmV?d00001 diff --git a/dwmblocks/dwmblocks.c b/dwmblocks/dwmblocks.c new file mode 100644 index 0000000..befd252 --- /dev/null +++ b/dwmblocks/dwmblocks.c @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include +#ifndef NO_X +#include +#endif +#ifdef __OpenBSD__ +#define SIGPLUS SIGUSR1+1 +#define SIGMINUS SIGUSR1-1 +#else +#define SIGPLUS SIGRTMIN +#define SIGMINUS SIGRTMIN +#endif +#define LENGTH(X) (sizeof(X) / sizeof (X[0])) +#define CMDLENGTH 50 +#define MIN( a, b ) ( ( a < b) ? a : b ) +#define STATUSLENGTH (LENGTH(blocks) * CMDLENGTH + 1) + +typedef struct { + char* icon; + char* command; + unsigned int interval; + unsigned int signal; +} Block; +#ifndef __OpenBSD__ +void dummysighandler(int num); +#endif +void sighandler(int num); +void getcmds(int time); +void getsigcmds(unsigned int signal); +void setupsignals(); +void sighandler(int signum); +int getstatus(char *str, char *last); +void statusloop(); +void termhandler(); +void pstdout(); +#ifndef NO_X +void setroot(); +static void (*writestatus) () = setroot; +static int setupX(); +static Display *dpy; +static int screen; +static Window root; +#else +static void (*writestatus) () = pstdout; +#endif + + +#include "blocks.h" + +static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; +static char statusstr[2][STATUSLENGTH]; +static int statusContinue = 1; +static int returnStatus = 0; + +//opens process *cmd and stores output in *output +void getcmd(const Block *block, char *output) +{ + strcpy(output, block->icon); + FILE *cmdf = popen(block->command, "r"); + if (!cmdf) + return; + int i = strlen(block->icon); + fgets(output+i, CMDLENGTH-i-delimLen, cmdf); + i = strlen(output); + if (i == 0) { + //return if block and command output are both empty + pclose(cmdf); + return; + } + //only chop off newline if one is present at the end + i = output[i-1] == '\n' ? i-1 : i; + if (delim[0] != '\0') { + strncpy(output+i, delim, delimLen); + } + else + output[i++] = '\0'; + pclose(cmdf); +} + +void getcmds(int time) +{ + const Block* current; + for (unsigned int i = 0; i < LENGTH(blocks); i++) { + current = blocks + i; + if ((current->interval != 0 && time % current->interval == 0) || time == -1) + getcmd(current,statusbar[i]); + } +} + +void getsigcmds(unsigned int signal) +{ + const Block *current; + for (unsigned int i = 0; i < LENGTH(blocks); i++) { + current = blocks + i; + if (current->signal == signal) + getcmd(current,statusbar[i]); + } +} + +void setupsignals() +{ +#ifndef __OpenBSD__ + /* initialize all real time signals with dummy handler */ + for (int i = SIGRTMIN; i <= SIGRTMAX; i++) + signal(i, dummysighandler); +#endif + + for (unsigned int i = 0; i < LENGTH(blocks); i++) { + if (blocks[i].signal > 0) + signal(SIGMINUS+blocks[i].signal, sighandler); + } + +} + +int getstatus(char *str, char *last) +{ + strcpy(last, str); + str[0] = '\0'; + for (unsigned int i = 0; i < LENGTH(blocks); i++) + strcat(str, statusbar[i]); + str[strlen(str)-strlen(delim)] = '\0'; + return strcmp(str, last);//0 if they are the same +} + +#ifndef NO_X +void setroot() +{ + if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed. + return; + XStoreName(dpy, root, statusstr[0]); + XFlush(dpy); +} + +int setupX() +{ + dpy = XOpenDisplay(NULL); + if (!dpy) { + fprintf(stderr, "dwmblocks: Failed to open display\n"); + return 0; + } + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + return 1; +} +#endif + +void pstdout() +{ + if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. + return; + printf("%s\n",statusstr[0]); + fflush(stdout); +} + + +void statusloop() +{ + setupsignals(); + int i = 0; + getcmds(-1); + while (1) { + getcmds(i++); + writestatus(); + if (!statusContinue) + break; + sleep(1.0); + } +} + +#ifndef __OpenBSD__ +/* this signal handler should do nothing */ +void dummysighandler(int signum) +{ + return; +} +#endif + +void sighandler(int signum) +{ + getsigcmds(signum-SIGPLUS); + writestatus(); +} + +void termhandler() +{ + statusContinue = 0; +} + +int main(int argc, char** argv) +{ + for (int i = 0; i < argc; i++) {//Handle command line arguments + if (!strcmp("-d",argv[i])) + strncpy(delim, argv[++i], delimLen); + else if (!strcmp("-p",argv[i])) + writestatus = pstdout; + } +#ifndef NO_X + if (!setupX()) + return 1; +#endif + delimLen = MIN(delimLen, strlen(delim)); + delim[delimLen++] = '\0'; + signal(SIGTERM, termhandler); + signal(SIGINT, termhandler); + statusloop(); +#ifndef NO_X + XCloseDisplay(dpy); +#endif + return 0; +}