diff options
| author | dfuehrer <dfuehrer@email.arizona.edu> | 2021-03-14 04:16:28 -0700 | 
|---|---|---|
| committer | dfuehrer <dfuehrer@email.arizona.edu> | 2021-03-14 04:16:28 -0700 | 
| commit | d45328c4442d0bc02550670e9ec401040b0f0938 (patch) | |
| tree | bd0bd6dfc0a986d655ea6238c048e22517977afb | |
| parent | merged with master (diff) | |
| download | dwmblocks-d45328c4442d0bc02550670e9ec401040b0f0938.tar.gz dwmblocks-d45328c4442d0bc02550670e9ec401040b0f0938.tar.bz2 dwmblocks-d45328c4442d0bc02550670e9ec401040b0f0938.tar.xz dwmblocks-d45328c4442d0bc02550670e9ec401040b0f0938.tar.zst dwmblocks-d45328c4442d0bc02550670e9ec401040b0f0938.zip | |
finally actually fixed the blocks dissappearing problem completely
| -rw-r--r-- | config.h | 9 | ||||
| -rw-r--r-- | dwmblocks.c | 96 | 
2 files changed, 64 insertions, 41 deletions
| @@ -10,7 +10,16 @@ static const Block blocks[] = {  	/* {"",	"volume",	0,	10}, */      /* {"",	"internet",	5,	4}, */      {"",    "stalonetray.sh", 0, 27}, +    /* {"?",   "sleep 2s && date", 1, 8}, */      {"",	"cpupercent.sh",	1,	19},  	{"",	"battery",	5,	3},  	{"",	"clock",	1,	1},  }; + +//Sets delimiter between status commands. NULL character ('\0') means no delimiter. +static char *delim = "|"; + +// Have dwmblocks automatically recompile and run when you edit this file in +// vim with the following line in your vimrc/init.vim: + +// autocmd BufWritePost ~/.local/src/dwmblocks/config.h !cd ~/.local/src/dwmblocks/; sudo make install && { killall -q dwmblocks;setsid dwmblocks & } diff --git a/dwmblocks.c b/dwmblocks.c index 26ca6b0..ad5f379 100644 --- a/dwmblocks.c +++ b/dwmblocks.c @@ -1,11 +1,12 @@ -#include<stdlib.h> -#include<stdio.h> -#include<string.h> -#include<unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h>  #include <time.h> -#include<signal.h> -#include<X11/Xlib.h> -#define LENGTH(X)               (sizeof(X) / sizeof (X[0])) +#include <signal.h> +#include <errno.h> +#include <X11/Xlib.h> +#define LENGTH(X) (sizeof(X) / sizeof (X[0]))  #define CMDLENGTH		50  typedef struct { @@ -42,23 +43,21 @@ static void (*writestatus) () = setroot;  void replace(char *str, char old, char new)  { -	int N = strlen(str); -	for(int i = 0; i < N; i++) -		if(str[i] == old) -			str[i] = new; +	for(char * c = str; *c; c++) +		if(*c == old) +			*c = new;  } +// the previous function looked nice but unfortunately it didnt work if to_remove was in any position other than the last character +// theres probably still a better way of doing this  void remove_all(char *str, char to_remove) {  	char *read = str;  	char *write = str; -	while (*read) { -		if (*read == to_remove) { -			read++; -			*write = *read; -		} -		read++; -		write++; -	} +    do { +        while (*read == to_remove) read++; +        *write++ = *read; +        read++; +    } while (*(read-1));  }  //opens process *cmd and stores output in *output @@ -69,21 +68,38 @@ void getcmd(const Block *block, char *output)  		output[0] = block->signal;  		output++;  	} -	strcpy(output, block->icon);  	char *cmd = block->command;  	FILE *cmdf = popen(cmd,"r"); -	if (!cmdf) +	if (!cmdf){ +        //printf("failed to run: %s, %d\n", block->command, errno);  		return; -	char c; +    } +    char tmpstr[CMDLENGTH] = ""; +    // TODO decide whether its better to use the last value till next time or just keep trying while the error was the interrupt +    // this keeps trying to read if it got nothing and the error was and interrupt +    // could also just read to a separate buffer and not move the data over if interrupted +    // this way will take longer trying to complete 1 thing but will get it done +    // the other way will move on to keep going with everything and the part that failed to read will be wrong till its updated again +    // either way you have to save the data to a temp buffer because when it fails it writes nothing and then then it gets displayed before this finishes +	char * s; +    int e; +    do { +        s = fgets(tmpstr, CMDLENGTH-(strlen(delim)+1), cmdf); +        e = errno; +    } while (!s && e == EINTR); +    // this is equivalent but less readable and stuff +    //while(!fgets(tmpstr, CMDLENGTH-(strlen(delim)+1), cmdf) && errno == EINTR); +	pclose(cmdf);  	int i = strlen(block->icon); -	fgets(output+i, CMDLENGTH-(strlen(delim)+1), cmdf); +	strcpy(output, block->icon); +    strcpy(output+i, tmpstr);  	remove_all(output, '\n');  	i = strlen(output); -    if ((i > 0 && block != &blocks[LENGTH(blocks) - 1])) +    if ((i > 0 && block != &blocks[LENGTH(blocks) - 1])){          strcat(output, delim); +    }      i+=strlen(delim);  	output[i++] = '\0'; -	pclose(cmdf);  }  void getcmds(int time) @@ -179,28 +195,26 @@ void statusloop()  #ifndef __OpenBSD__  	setupsignals();  #endif -	int i = 0; -	int previ = -1; +	unsigned int i = 0;      int gotscrewed = 0;      struct timespec sleeptime = {1, 0}; -    struct timespec left; +    struct timespec tosleep = sleeptime;  	getcmds(-1);  	while(statusContinue)  	{ -        if(i != previ){ -            getcmds(i); -            writestatus(); +        // sleep for tosleep (should be a sleeptime of 1s) and put what was left if interrupted back into tosleep +        gotscrewed = nanosleep(&tosleep, &tosleep); +        // if interrupted then just go sleep again for the remaining time +        if(gotscrewed == -1){ +            continue;          } -        gotscrewed = nanosleep(&sleeptime, &left); -        previ = i; -        /* long diff = (left.tv_sec + (left.tv_nsec + 500000000l) / 1000000000l); */ -        /* i += 1 - diff; */ -        if(gotscrewed != -1){ -            i++; -        /* }else{ */ -        /*     printf("sec and nanosec left: %d, %d", left.tv_sec, left.tv_nsec); */ -        } - +        // if not interrupted then do the calling and writing +        getcmds(i); +        writestatus(); +        // then increment since its actually been a second (plus the time it took the commands to run) +        i++; +        // set the time to sleep back to the sleeptime of 1s +        tosleep = sleeptime;  	}  } | 
