Compare commits

...

13 Commits

Author SHA1 Message Date
Luke Smith 66f31c307a
Merge branch 'dfuehrer-fastscroll_fix' 2021-07-16 17:44:46 -04:00
dfuehrer c306fea426 fixed a bug in interval time updating 2021-07-05 19:17:34 -07:00
dfuehrer 681b8998c2 Merge branch 'master' into fastscroll_fix
using pulled version of fix to remove_all bug (with an improvement)
2021-06-01 20:54:26 -07:00
Luke Smith ea5afdccbd
Merge pull request #75 from Murtaught/master
Replace buggy implementation of function 'remove_all()'.
2021-05-23 13:03:52 -04:00
Ivan Mikhnovich 0c268f5fc9 Replace bughy implementation of function 'remove_all()'.
Counterexample for old implementation:
    char str[] = "aaa";
    remove_all(str, 'a');
    printf("%s\n", str); // displays "a" if we're lucky,
                         //or crashes if we're not.
2021-05-23 19:24:42 +03:00
dfuehrer fc80bd975c reset errno so previous error doesn't cause next check to fail 2021-03-23 18:31:57 -07:00
dfuehrer d474ad1d67 Merge branch 'mychanges' into fastscroll_fix 2021-03-17 00:54:34 -07:00
dfuehrer da9a2f7286 Added greatest common denominator interval from
"Improve performance by sleeping as much as possible #69"
since the sleeping has been changed.
2021-03-17 00:38:37 -07:00
dfuehrer d68479db24 copied over the master config since it is unrelated to the fix 2021-03-14 04:52:41 -07:00
dfuehrer d45328c444 finally actually fixed the blocks dissappearing problem completely 2021-03-14 04:16:28 -07:00
dfuehrer 1697346729 merged with master 2021-03-13 23:34:15 -07:00
dfuehrer 73fd031a1d sorta fixed bug with sleep and timing where interrupting
dwmblocks by clicking on the bar would interrupt the sleep causing it to
reload everything sooner than it should, which would cause slower things
to not update and disappear untill they were reloaded. This was
especially a problem with using scrolling on blocks.  Still occasionally
breaks but is much less horrible.
2021-03-13 22:49:34 -07:00
dfuehrer d747fa7bc1 changed to my status bar things that i want 2021-03-13 22:48:50 -07:00
1 changed files with 82 additions and 29 deletions

View File

@ -1,10 +1,12 @@
#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]))
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <errno.h>
#include <X11/Xlib.h>
#define LENGTH(X) (sizeof(X) / sizeof (X[0]))
#define CMDLENGTH 50
typedef struct {
@ -41,25 +43,38 @@ 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;
if (*read != to_remove) {
*write++ = *read;
}
read++;
write++;
++read;
}
*write = '\0';
}
int gcd(int a, int b)
{
int temp;
while (b > 0){
temp = a % b;
a = b;
b = temp;
}
return a;
}
//opens process *cmd and stores output in *output
void getcmd(const Block *block, char *output)
{
@ -68,21 +83,37 @@ 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 an 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 {
errno = 0;
s = fgets(tmpstr, CMDLENGTH-(strlen(delim)+1), cmdf);
e = errno;
} while (!s && e == 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)
@ -91,8 +122,9 @@ void getcmds(int time)
for(int i = 0; i < LENGTH(blocks); i++)
{
current = blocks + i;
if ((current->interval != 0 && time % current->interval == 0) || time == -1)
if ((current->interval != 0 && time % current->interval == 0) || time == -1){
getcmd(current,statusbar[i]);
}
}
}
@ -103,8 +135,9 @@ void getsigcmds(int signal)
for (int i = 0; i < LENGTH(blocks); i++)
{
current = blocks + i;
if (current->signal == signal)
if (current->signal == signal){
getcmd(current,statusbar[i]);
}
}
}
@ -176,14 +209,34 @@ void statusloop()
#ifndef __OpenBSD__
setupsignals();
#endif
int i = 0;
// first figure out the default wait interval by finding the
// greatest common denominator of the intervals
unsigned int interval = -1;
for(int i = 0; i < LENGTH(blocks); i++){
if(blocks[i].interval){
interval = gcd(blocks[i].interval, interval);
}
}
unsigned int i = 0;
int interrupted = 0;
const struct timespec sleeptime = {interval, 0};
struct timespec tosleep = sleeptime;
getcmds(-1);
while(statusContinue)
{
getcmds(i);
writestatus();
sleep(1.0);
i++;
// sleep for tosleep (should be a sleeptime of interval seconds) and put what was left if interrupted back into tosleep
interrupted = nanosleep(&tosleep, &tosleep);
// if interrupted then just go sleep again for the remaining time
if(interrupted == -1){
continue;
}
// 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 += interval;
// set the time to sleep back to the sleeptime of 1s
tosleep = sleeptime;
}
}