first commit
This commit is contained in:
		
						commit
						e8bb7fac4a
					
				
					 6 changed files with 276 additions and 0 deletions
				
			
		
							
								
								
									
										53
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										7
									
								
								LICENSE
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										5
									
								
								README.md
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										20
									
								
								blocks.h
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										179
									
								
								dwmblocks.c
									
									
									
									
									
										Normal 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();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue