7 #define LENGTH(X) (sizeof(X) / sizeof (X[0]))
9 #define STATUSLENGTH (LENGTH(blocks) * CMDLENGTH + 1)
14 unsigned int interval;
17 void dummysighandler(int num);
18 void sighandler(int num);
19 void getcmds(int time);
21 void getsigcmds(int signal);
23 void sighandler(int signum);
25 int getstatus(char *str, char *last);
28 void termhandler(int signum);
36 static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0};
37 static char statusstr[2][STATUSLENGTH];
38 static int statusContinue = 1;
39 static void (*writestatus) () = setroot;
41 //opens process *cmd and stores output in *output
42 void getcmd(const Block *block, char *output)
44 strcpy(output, block->icon);
45 char *cmd = block->command;
46 FILE *cmdf = popen(cmd,"r");
50 int i = strlen(block->icon);
51 fgets(output+i, CMDLENGTH-i, cmdf);
53 if (delim != '\0' && --i)
59 void getcmds(int time)
62 for(int i = 0; i < LENGTH(blocks); i++)
65 if ((current->interval != 0 && time % current->interval == 0) || time == -1)
66 getcmd(current,statusbar[i]);
71 void getsigcmds(int signal)
74 for (int i = 0; i < LENGTH(blocks); i++)
77 if (current->signal == signal)
78 getcmd(current,statusbar[i]);
84 /* initialize all real time signals with dummy handler */
85 for(int i = SIGRTMIN; i <= SIGRTMAX; i++)
86 signal(i, dummysighandler);
88 for(int i = 0; i < LENGTH(blocks); i++)
90 if (blocks[i].signal > 0)
91 signal(SIGRTMIN+blocks[i].signal, sighandler);
97 int getstatus(char *str, char *last)
101 for(int i = 0; i < LENGTH(blocks); i++)
102 strcat(str, statusbar[i]);
103 str[strlen(str)-1] = '\0';
104 return strcmp(str, last);//0 if they are the same
109 if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed.
111 Display *d = XOpenDisplay(NULL);
115 screen = DefaultScreen(dpy);
116 root = RootWindow(dpy, screen);
117 XStoreName(dpy, root, statusstr[0]);
123 if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed.
125 printf("%s\n",statusstr[0]);
137 while(statusContinue)
147 /* this signal handler should do nothing */
148 void dummysighandler(int signum)
155 void sighandler(int signum)
157 getsigcmds(signum-SIGRTMIN);
162 void termhandler(int signum)
168 int main(int argc, char** argv)
170 for(int i = 0; i < argc; i++)
172 if (!strcmp("-d",argv[i]))
173 delim = argv[++i][0];
174 else if(!strcmp("-p",argv[i]))
175 writestatus = pstdout;
177 signal(SIGTERM, termhandler);
178 signal(SIGINT, termhandler);