1 1e987f65 2007-03-25 devnull #include <u.h>
2 1e987f65 2007-03-25 devnull #include <libc.h>
3 1e987f65 2007-03-25 devnull #include <draw.h>
4 1e987f65 2007-03-25 devnull #include <thread.h>
5 1e987f65 2007-03-25 devnull #include <bio.h>
6 1e987f65 2007-03-25 devnull #include <mouse.h>
7 1e987f65 2007-03-25 devnull #include <keyboard.h>
9 1e987f65 2007-03-25 devnull void keyboardthread(void *v);
10 1e987f65 2007-03-25 devnull void mousethread(void *v);
11 1e987f65 2007-03-25 devnull void resizethread(void *v);
12 1e987f65 2007-03-25 devnull void updateproc(void *v);
15 1e987f65 2007-03-25 devnull STACK = 8196,
18 1e987f65 2007-03-25 devnull int nokill;
19 1e987f65 2007-03-25 devnull int textmode;
20 1e987f65 2007-03-25 devnull char *title;
22 1e987f65 2007-03-25 devnull Biobuf b;
23 1e987f65 2007-03-25 devnull Image *light;
24 1e987f65 2007-03-25 devnull Image *dark;
25 1e987f65 2007-03-25 devnull Image *text;
26 1e987f65 2007-03-25 devnull Keyboardctl *kc;
27 1e987f65 2007-03-25 devnull Mousectl *mc;
30 1e987f65 2007-03-25 devnull initcolor(void)
32 1e987f65 2007-03-25 devnull text = display->black;
33 1e987f65 2007-03-25 devnull light = allocimagemix(display, DPalegreen, DWhite);
34 1e987f65 2007-03-25 devnull dark = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkgreen);
37 1e987f65 2007-03-25 devnull Rectangle rbar;
38 1e987f65 2007-03-25 devnull vlong n, d;
39 1e987f65 2007-03-25 devnull int last;
40 1e987f65 2007-03-25 devnull int lastp = -1;
42 1e987f65 2007-03-25 devnull char backup[80];
45 1e987f65 2007-03-25 devnull drawbar(void)
47 1e987f65 2007-03-25 devnull int i, j;
49 1e987f65 2007-03-25 devnull char buf[400], bar[200];
50 1e987f65 2007-03-25 devnull static char lastbar[200];
52 1e987f65 2007-03-25 devnull if(n > d || n < 0 || d <= 0)
55 1e987f65 2007-03-25 devnull i = (Dx(rbar)*n)/d;
56 1e987f65 2007-03-25 devnull p = (n*100LL)/d;
57 1e987f65 2007-03-25 devnull if(textmode){
58 1e987f65 2007-03-25 devnull if(Dx(rbar) > 150){
59 1e987f65 2007-03-25 devnull rbar.min.x = 0;
60 1e987f65 2007-03-25 devnull rbar.max.x = 150;
63 1e987f65 2007-03-25 devnull bar[0] = '|';
64 1e987f65 2007-03-25 devnull for(j=0; j<i; j++)
65 1e987f65 2007-03-25 devnull bar[j+1] = '#';
66 1e987f65 2007-03-25 devnull for(; j<Dx(rbar); j++)
67 1e987f65 2007-03-25 devnull bar[j+1] = '-';
68 1e987f65 2007-03-25 devnull bar[j++] = '|';
69 1e987f65 2007-03-25 devnull bar[j++] = ' ';
70 1e987f65 2007-03-25 devnull sprint(bar+j, "%3d%% ", p);
71 1e987f65 2007-03-25 devnull for(i=0; bar[i]==lastbar[i] && bar[i]; i++)
73 1e987f65 2007-03-25 devnull memset(buf, '\b', strlen(lastbar)-i);
74 1e987f65 2007-03-25 devnull strcpy(buf+strlen(lastbar)-i, bar+i);
75 1e987f65 2007-03-25 devnull if(buf[0])
76 1e987f65 2007-03-25 devnull write(1, buf, strlen(buf));
77 1e987f65 2007-03-25 devnull strcpy(lastbar, bar);
81 1e987f65 2007-03-25 devnull if(lastp == p && last == i)
84 1e987f65 2007-03-25 devnull if(lastp != p){
85 1e987f65 2007-03-25 devnull sprint(buf, "%d%%", p);
86 1e987f65 2007-03-25 devnull stringbg(screen, addpt(screen->r.min, Pt(Dx(rbar)-30, 4)), text, ZP, display->defaultfont, buf, light, ZP);
87 1e987f65 2007-03-25 devnull lastp = p;
90 1e987f65 2007-03-25 devnull if(last != i){
91 1e987f65 2007-03-25 devnull draw(screen, Rect(rbar.min.x+last, rbar.min.y, rbar.min.x+i, rbar.max.y),
92 1e987f65 2007-03-25 devnull dark, nil, ZP);
93 1e987f65 2007-03-25 devnull last = i;
95 1e987f65 2007-03-25 devnull flushimage(display, 1);
101 1e987f65 2007-03-25 devnull Point p, q;
102 1e987f65 2007-03-25 devnull Rectangle r;
104 1e987f65 2007-03-25 devnull r = screen->r;
105 1e987f65 2007-03-25 devnull draw(screen, r, light, nil, ZP);
106 1e987f65 2007-03-25 devnull p = string(screen, addpt(r.min, Pt(4,4)), text, ZP,
107 1e987f65 2007-03-25 devnull display->defaultfont, title);
109 1e987f65 2007-03-25 devnull p.x = r.min.x+4;
110 1e987f65 2007-03-25 devnull p.y += display->defaultfont->height+4;
112 1e987f65 2007-03-25 devnull q = subpt(r.max, Pt(4,4));
113 1e987f65 2007-03-25 devnull rbar = Rpt(p, q);
114 1e987f65 2007-03-25 devnull border(screen, rbar, -2, dark, ZP);
115 1e987f65 2007-03-25 devnull last = 0;
116 1e987f65 2007-03-25 devnull lastp = -1;
118 1e987f65 2007-03-25 devnull flushimage(display, 1);
119 1e987f65 2007-03-25 devnull drawbar();
123 1e987f65 2007-03-25 devnull keyboardthread(void *v)
127 1e987f65 2007-03-25 devnull while(recv(kc->c , &r) == 1){
128 1e987f65 2007-03-25 devnull if ((r == 0x7F || r == 0x03 || r == 'q') && !nokill)
129 1e987f65 2007-03-25 devnull threadexitsall("interrupt");
134 1e987f65 2007-03-25 devnull mousethread(void *v)
136 1e987f65 2007-03-25 devnull USED(v);
138 1e987f65 2007-03-25 devnull while(recv(mc->c, 0) == 1); /* to unblock mc->c */
142 1e987f65 2007-03-25 devnull resizethread(void *v)
144 1e987f65 2007-03-25 devnull USED(v);
146 1e987f65 2007-03-25 devnull while(recv(mc->resizec, 0) == 1){
147 1e987f65 2007-03-25 devnull lockdisplay(display);
148 1e987f65 2007-03-25 devnull if(getwindow(display, Refnone) < 0)
149 1e987f65 2007-03-25 devnull sysfatal("attach to window: %r");
150 1e987f65 2007-03-25 devnull resize();
151 1e987f65 2007-03-25 devnull unlockdisplay(display);
156 1e987f65 2007-03-25 devnull updateproc(void *v)
158 1e987f65 2007-03-25 devnull char *p, *f[2];
160 1e987f65 2007-03-25 devnull sleep(1000);
161 1e987f65 2007-03-25 devnull while((p = Brdline(&b, '\n'))){
162 1e987f65 2007-03-25 devnull p[Blinelen(&b)-1] = '\0';
163 1e987f65 2007-03-25 devnull if(tokenize(p, f, 2) != 2)
164 1e987f65 2007-03-25 devnull continue;
165 1e987f65 2007-03-25 devnull n = strtoll(f[0], 0, 0);
166 1e987f65 2007-03-25 devnull d = strtoll(f[1], 0, 0);
167 1e987f65 2007-03-25 devnull if(!textmode){
168 1e987f65 2007-03-25 devnull lockdisplay(display);
169 1e987f65 2007-03-25 devnull drawbar();
170 1e987f65 2007-03-25 devnull unlockdisplay(display);
172 1e987f65 2007-03-25 devnull drawbar();
174 1e987f65 2007-03-25 devnull threadexitsall("success");
178 1e987f65 2007-03-25 devnull usage(void)
180 1e987f65 2007-03-25 devnull fprint(2, "usage: statusbar [-kt] [-W winsize] 'title'\n");
181 1e987f65 2007-03-25 devnull threadexitsall("usage");
185 1e987f65 2007-03-25 devnull threadmain(int argc, char **argv)
187 1e987f65 2007-03-25 devnull char *p;
188 1e987f65 2007-03-25 devnull int lfd;
190 1e987f65 2007-03-25 devnull p = "300x40@100,100";
192 1e987f65 2007-03-25 devnull ARGBEGIN{
193 1e987f65 2007-03-25 devnull case 'W':
194 1e987f65 2007-03-25 devnull p = ARGF();
196 1e987f65 2007-03-25 devnull case 't':
197 1e987f65 2007-03-25 devnull textmode = 1;
199 1e987f65 2007-03-25 devnull case 'k':
200 1e987f65 2007-03-25 devnull nokill = 1;
202 1e987f65 2007-03-25 devnull default:
203 1e987f65 2007-03-25 devnull usage();
204 1e987f65 2007-03-25 devnull }ARGEND;
206 1e987f65 2007-03-25 devnull if(argc != 1)
207 1e987f65 2007-03-25 devnull usage();
209 1e987f65 2007-03-25 devnull winsize = p;
211 1e987f65 2007-03-25 devnull title = argv[0];
213 1e987f65 2007-03-25 devnull lfd = dup(0, -1);
214 1e987f65 2007-03-25 devnull Binit(&b, lfd, OREAD);
216 1e987f65 2007-03-25 devnull rbar = Rect(0, 0, 60, 1);
217 1e987f65 2007-03-25 devnull if (!textmode){
218 1e987f65 2007-03-25 devnull if(initdraw(0, nil, "bar") < 0)
219 1e987f65 2007-03-25 devnull sysfatal("initdraw: %r");
220 1e987f65 2007-03-25 devnull initcolor();
221 1e987f65 2007-03-25 devnull if((mc = initmouse(nil, screen)) == nil)
222 1e987f65 2007-03-25 devnull sysfatal("initmouse: %r");
223 1e987f65 2007-03-25 devnull if((kc = initkeyboard(nil)) == nil)
224 1e987f65 2007-03-25 devnull sysfatal("initkeyboard: %r");
225 1e987f65 2007-03-25 devnull display->locking = 1;
226 1e987f65 2007-03-25 devnull threadcreate(resizethread, nil, STACK);
227 1e987f65 2007-03-25 devnull threadcreate(keyboardthread, nil, STACK);
228 1e987f65 2007-03-25 devnull threadcreate(mousethread, nil, STACK);
229 1e987f65 2007-03-25 devnull resize();
230 1e987f65 2007-03-25 devnull unlockdisplay(display);
232 1e987f65 2007-03-25 devnull proccreate(updateproc, nil, STACK);