From d432a2a0fec7f1c28f01e93fdae9135bfec67d89 Mon Sep 17 00:00:00 2001 From: Raphael Robatsch Date: Thu, 28 Oct 2021 17:27:05 +0200 Subject: change dwm backend to somebar --- .gitignore | 2 +- LICENSE | 1 + Makefile | 11 ++- README.md | 15 +++-- dwmblocks.c | 213 ----------------------------------------------------------- someblocks.c | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 222 insertions(+), 227 deletions(-) delete mode 100644 dwmblocks.c create mode 100644 someblocks.c diff --git a/.gitignore b/.gitignore index b6605b4..a7f1a30 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,7 @@ blocks.h *.i*86 *.x86_64 *.hex -dwmblocks +someblocks # Debug files *.dSYM/ diff --git a/LICENSE b/LICENSE index 3ec2656..603a997 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ ISC License (ISC) Copyright 2020 torrinfail +Copyright 2021 Raphael Robatsch Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. diff --git a/Makefile b/Makefile index ef43ef4..1be71aa 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,16 @@ PREFIX ?= /usr/local CC ?= cc -LDFLAGS = -lX11 -output: dwmblocks.c blocks.def.h blocks.h - ${CC} dwmblocks.c $(LDFLAGS) -o dwmblocks +output: someblocks.c blocks.def.h blocks.h + ${CC} someblocks.c $(LDFLAGS) -o someblocks blocks.h: cp blocks.def.h $@ clean: - rm -f *.o *.gch dwmblocks + rm -f *.o *.gch someblocks install: output mkdir -p $(DESTDIR)$(PREFIX)/bin - install -m 0755 dwmblocks $(DESTDIR)$(PREFIX)/bin/dwmblocks + install -m 0755 someblocks $(DESTDIR)$(PREFIX)/bin/someblocks uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dwmblocks + rm -f $(DESTDIR)$(PREFIX)/bin/someblocks diff --git a/README.md b/README.md index dda2259..88e1a1d 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ -# dwmblocks -Modular status bar for dwm written in c. +# someblocks +Modular status bar for [somebar](https://gitlab.com/raphaelr/somebar) written in c. + +This is a fork of [dwmblocks](https://github.com/torrinfail/dwmblocks), modified +to connect to somebar instead of dwm. # usage -To use dwmblocks first run 'make' and then install it with 'sudo make install'. -After that you can put dwmblocks in your xinitrc or other startup script to have it start with dwm. +To use someblocks first run 'make' and then install it with 'sudo make install'. +After that you can put someblocks in your startup script to have it start with dwl/somebar. # modifying blocks The statusbar is made from text output from commandline programs. Blocks are added and removed by editing the blocks.h header file. By default the blocks.h header file is created the first time you run make which copies the default config from blocks.def.h. This is so you can edit your status bar commands and they will not get overwritten in a future update. # patches -Here are some patches to dwmblocks that add features that I either don't want to merge in, or that require a dwm patch to work. +Here are some patches to someblocks that add features that I either don't want to merge in, or that require a dwl/somebar patch to work. I do not maintain these but I will take pull requests to update them. -
-dwmblocks-statuscmd-b6b0be4.diff diff --git a/dwmblocks.c b/dwmblocks.c deleted file mode 100644 index ded717c..0000000 --- a/dwmblocks.c +++ /dev/null @@ -1,213 +0,0 @@ -#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; - } - if (delim[0] != '\0') { - //only chop off newline if one is present at the end - i = output[i-1] == '\n' ? i-1 : i; - 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; -} diff --git a/someblocks.c b/someblocks.c new file mode 100644 index 0000000..217043a --- /dev/null +++ b/someblocks.c @@ -0,0 +1,207 @@ +#include +#include +#include +#include +#include +#include +#include +#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(); +void psomebar(); +static void (*writestatus) () = psomebar; + +#include "blocks.h" + +static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; +static char statusstr[2][STATUSLENGTH]; +static int statusContinue = 1; +static int returnStatus = 0; +static char somebarPath[128]; +static int somebarFd = -1; + +//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; + } + if (delim[0] != '\0') { + //only chop off newline if one is present at the end + i = output[i-1] == '\n' ? i-1 : i; + 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 +} + +void pstdout() +{ + if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. + return; + printf("%s\n",statusstr[0]); + fflush(stdout); +} + + +void psomebar() +{ + if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. + return; + if (somebarFd < 0) { + somebarFd = open(somebarPath, O_WRONLY|O_CLOEXEC); + if (somebarFd < 0 && errno == ENOENT) { + // assume somebar is not ready yet + sleep(1); + somebarFd = open(somebarPath, O_WRONLY|O_CLOEXEC); + } + if (somebarFd < 0) { + perror("open"); + return; + } + } + write(somebarFd, "status ", 7); + write(somebarFd, statusstr[0], strlen(statusstr[0])); + write(somebarFd, "\n", 1); +} + + +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; +} + +void sigpipehandler() +{ + close(somebarFd); + somebarFd = -1; +} + +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; + } + strcpy(somebarPath, getenv("XDG_RUNTIME_DIR")); + strcat(somebarPath, "/somebar-0"); + delimLen = MIN(delimLen, strlen(delim)); + delim[delimLen++] = '\0'; + signal(SIGTERM, termhandler); + signal(SIGINT, termhandler); + signal(SIGPIPE, sigpipehandler); + statusloop(); + return 0; +} -- cgit v1.2.3