]> git.armaanb.net Git - dwmblocks.git/blob - dwmblocks.c
added icons and delimeter
[dwmblocks.git] / dwmblocks.c
1 #include<stdlib.h>
2 #include<stdio.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<signal.h>
6 #include<X11/Xlib.h>
7 #define LENGTH(X)               (sizeof(X) / sizeof (X[0]))
8
9 typedef struct {
10         char* icon;
11         char* command;
12         unsigned int interval;
13         unsigned int signal;
14 } Block;
15 void sighandler(int num);
16 void replace(char *str, char old, char new);
17 void getcmds(int time);
18 void getsigcmds(int signal);
19 void setupsignals();
20 void getstatus(char *str);
21 void setroot();
22 void statusloop();
23 void statusinit();
24 void sighandler(int signum);
25 void termhandler(int signum);
26
27
28 #include "blocks.h"
29
30 static Display *dpy;
31 static int screen;
32 static Window root;
33 static char statusbar[LENGTH(blocks)][50] = {0};
34 static char statusstr[256];
35 static char *statuscat;
36 static const char *volupcmd[]  = { "volup", NULL };
37 static const char *voldowncmd[]  = { "voldown", NULL };
38 static const char *volmutecmd[]  = { "volmute", NULL };
39 static int statusContinue = 1,volmuted = 0;
40
41 void replace(char *str, char old, char new)
42 {
43         int N = strlen(str);
44         for(int i = 0; i < N; i++)
45                 if(str[i] == old)
46                         str[i] = new;
47 }
48
49 //opens process *cmd and stores output in *output
50 void getcmd(const Block *block, char *output)
51 {
52         strcpy(output, block->icon);
53         char *cmd = block->command;
54         FILE *cmdf = popen(cmd,"r");
55         if (!cmdf)
56                 return;
57         //int N = strlen(output);
58         char c;
59         int i = strlen(block->icon);
60         while((c = fgetc(cmdf)) != EOF)
61                 output[i++] = c;
62         if (delim != '\0' && --i)
63                 output[i++] = delim;
64         output[i++] = '\0';
65         pclose(cmdf);
66 }
67
68 void getcmds(int time)
69 {
70         const Block* current;
71         for(int i = 0; i < LENGTH(blocks); i++)
72         {       
73                 current = blocks + i;
74                 if ((current->interval != 0 && time % current->interval == 0) || time == -1)
75                         getcmd(current,statusbar[i]);
76         }
77 }
78
79 void getsigcmds(int signal)
80 {
81         const Block *current;
82         for (int i = 0; i < LENGTH(blocks); i++)
83         {
84                 current = blocks + i;
85                 if (current->signal == signal)
86                         getcmd(current,statusbar[i]);
87         }
88 }
89
90 void setupsignals()
91 {
92         for(int i = 0; i < LENGTH(blocks); i++)
93         {         
94                 if (blocks[i].signal > 0)
95                         signal(SIGRTMIN+blocks[i].signal, sighandler);
96         }
97
98 }
99
100 void getstatus(char *str)
101 {
102         int j = 0;
103         for(int i = 0; i < LENGTH(blocks); j+=strlen(statusbar[i++]))
104         {       
105                 strcpy(str + j, statusbar[i]);
106         }
107         str[--j] = '\0';
108
109 }
110
111 void setroot()
112 {
113         Display *d = XOpenDisplay(NULL);
114         if (d) {
115                 dpy = d;
116         }
117         screen = DefaultScreen(dpy);
118         root = RootWindow(dpy, screen);
119         getstatus(statusstr);
120         XStoreName(dpy, root, statusstr);
121         XCloseDisplay(dpy);
122 }
123
124
125 void statusloop()
126 {
127         setupsignals();
128         int i = 0;
129         getcmds(-1);
130         while(statusContinue)
131         {
132                 getcmds(i);
133                 setroot();
134                 sleep(1.0);
135                 i++;
136         }
137 }
138
139 void statusinit()
140 {
141         statusloop();
142 }
143
144
145 void sighandler(int signum)
146 {
147         getsigcmds(signum-SIGRTMIN);
148         setroot();
149 }
150
151 void termhandler(int signum)
152 {
153         statusContinue = 0;
154         exit(0);
155 }
156
157 int main(int argc, char** argv)
158 {
159         for(int i = 0; i < argc; i++)
160         {       
161                 if (!strcmp("-d",argv[i]))
162                         delim = argv[++i][0];
163         }
164         signal(SIGTERM, termhandler);
165         signal(SIGINT, termhandler);
166         statusinit();
167 }