first commit

This commit is contained in:
Noah Swerhun 2020-07-15 00:06:07 -05:00
commit e8bb7fac4a
6 changed files with 276 additions and 0 deletions

53
.gitignore vendored Normal file
View file

@ -0,0 +1,53 @@
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
dwmblocks
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf

7
LICENSE Normal file
View file

@ -0,0 +1,7 @@
ISC License (ISC)
Copyright 2020 torrinfail
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.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

12
Makefile Normal file
View file

@ -0,0 +1,12 @@
PREFIX ?= /usr/local
CC ?= cc
output: dwmblocks.c blocks.h
${CC} `pkg-config --cflags x11` `pkg-config --libs x11` dwmblocks.c -o dwmblocks
clean:
rm -f *.o *.gch dwmblocks
install: output
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f dwmblocks $(DESTDIR)$(PREFIX)/bin
chmod 755 $(DESTDIR)$(PREFIX)/bin/dwmblocks
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/dwmblocks

5
README.md Normal file
View file

@ -0,0 +1,5 @@
# dwmblocks
Modular status bar for dwm written in c.
# modifying blocks
The statusbar is made from text output from commandline programs.
Blocks are added and removed by editing the blocks.h header file.

20
blocks.h Normal file
View file

@ -0,0 +1,20 @@
//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*/
{"", "cat ~/.pacupdate | sed /📦0/d", 0, 9},
{"🧠", "free -h | awk '/^Mem/ { print $3\"/\"$2 }' | sed s/i//g", 30, 0},
{"", "~/bin/statusbar/volume", 0, 10},
{"", "xbacklight | sed 's/\\..*//'", 0, 11},
{"", "~/bin/statusbar/battery", 5, 0},
{"🌡", "sensors | awk '/^temp1:/{print $2}'", 5, 0},
{"", "~/bin/statusbar/clock", 5, 0},
};
//sets delimeter between status commands. NULL character ('\0') means no delimeter.
static char delim = '|';

179
dwmblocks.c Normal file
View file

@ -0,0 +1,179 @@
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<signal.h>
#include<X11/Xlib.h>
#define LENGTH(X) (sizeof(X) / sizeof (X[0]))
#define CMDLENGTH 50
typedef struct {
char* icon;
char* command;
unsigned int interval;
unsigned int signal;
} Block;
void dummysighandler(int num);
void sighandler(int num);
void getcmds(int time);
#ifndef __OpenBSD__
void getsigcmds(int signal);
void setupsignals();
void sighandler(int signum);
#endif
int getstatus(char *str, char *last);
void setroot();
void statusloop();
void termhandler(int signum);
#include "blocks.h"
static Display *dpy;
static int screen;
static Window root;
static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0};
static char statusstr[2][256];
static int statusContinue = 1;
static void (*writestatus) () = setroot;
//opens process *cmd and stores output in *output
void getcmd(const Block *block, char *output)
{
strcpy(output, block->icon);
char *cmd = block->command;
FILE *cmdf = popen(cmd,"r");
if (!cmdf)
return;
char c;
int i = strlen(block->icon);
fgets(output+i, CMDLENGTH-i, cmdf);
i = strlen(output);
if (delim != '\0' && --i)
output[i++] = delim;
output[i++] = '\0';
pclose(cmdf);
}
void getcmds(int time)
{
const Block* current;
for(int i = 0; i < LENGTH(blocks); i++)
{
current = blocks + i;
if ((current->interval != 0 && time % current->interval == 0) || time == -1)
getcmd(current,statusbar[i]);
}
}
#ifndef __OpenBSD__
void getsigcmds(int signal)
{
const Block *current;
for (int i = 0; i < LENGTH(blocks); i++)
{
current = blocks + i;
if (current->signal == signal)
getcmd(current,statusbar[i]);
}
}
void setupsignals()
{
/* initialize all real time signals with dummy handler */
for(int i = SIGRTMIN; i <= SIGRTMAX; i++)
signal(i, dummysighandler);
for(int i = 0; i < LENGTH(blocks); i++)
{
if (blocks[i].signal > 0)
signal(SIGRTMIN+blocks[i].signal, sighandler);
}
}
#endif
int getstatus(char *str, char *last)
{
strcpy(last, str);
str[0] = '\0';
for(int i = 0; i < LENGTH(blocks); i++)
strcat(str, statusbar[i]);
str[strlen(str)-1] = '\0';
return strcmp(str, last);//0 if they are the same
}
void setroot()
{
if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed.
return;
Display *d = XOpenDisplay(NULL);
if (d) {
dpy = d;
}
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
XStoreName(dpy, root, statusstr[0]);
XCloseDisplay(dpy);
}
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()
{
#ifndef __OpenBSD__
setupsignals();
#endif
int i = 0;
getcmds(-1);
while(statusContinue)
{
getcmds(i);
writestatus();
sleep(1.0);
i++;
}
}
#ifndef __OpenBSD__
/* this signal handler should do nothing */
void dummysighandler(int signum)
{
return;
}
#endif
#ifndef __OpenBSD__
void sighandler(int signum)
{
getsigcmds(signum-SIGRTMIN);
writestatus();
}
#endif
void termhandler(int signum)
{
statusContinue = 0;
exit(0);
}
int main(int argc, char** argv)
{
for(int i = 0; i < argc; i++)
{
if (!strcmp("-d",argv[i]))
delim = argv[++i][0];
else if(!strcmp("-p",argv[i]))
writestatus = pstdout;
}
signal(SIGTERM, termhandler);
signal(SIGINT, termhandler);
statusloop();
}