9 void keyboardthread(void *v);
10 void mousethread(void *v);
11 void resizethread(void *v);
12 void updateproc(void *v);
32 text = display->black;
33 light = allocimagemix(display, DPalegreen, DWhite);
34 dark = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkgreen);
49 char buf[400], bar[200];
50 static char lastbar[200];
52 if(n > d || n < 0 || d <= 0)
66 for(; j<Dx(rbar); j++)
70 sprint(bar+j, "%3d%% ", p);
71 for(i=0; bar[i]==lastbar[i] && bar[i]; i++)
73 memset(buf, '\b', strlen(lastbar)-i);
74 strcpy(buf+strlen(lastbar)-i, bar+i);
76 write(1, buf, strlen(buf));
81 if(lastp == p && last == i)
85 sprint(buf, "%d%%", p);
86 stringbg(screen, addpt(screen->r.min, Pt(Dx(rbar)-30, 4)), text, ZP, display->defaultfont, buf, light, ZP);
91 draw(screen, Rect(rbar.min.x+last, rbar.min.y, rbar.min.x+i, rbar.max.y),
95 flushimage(display, 1);
105 draw(screen, r, light, nil, ZP);
106 p = string(screen, addpt(r.min, Pt(4,4)), text, ZP,
107 display->defaultfont, title);
110 p.y += display->defaultfont->height+4;
112 q = subpt(r.max, Pt(4,4));
114 border(screen, rbar, -2, dark, ZP);
118 flushimage(display, 1);
123 keyboardthread(void *v)
127 while(recv(kc->c , &r) == 1){
128 if ((r == 0x7F || r == 0x03 || r == 'q') && !nokill)
129 threadexitsall("interrupt");
138 while(recv(mc->c, 0) == 1); /* to unblock mc->c */
142 resizethread(void *v)
146 while(recv(mc->resizec, 0) == 1){
147 lockdisplay(display);
148 if(getwindow(display, Refnone) < 0)
149 sysfatal("attach to window: %r");
151 unlockdisplay(display);
161 while((p = Brdline(&b, '\n'))){
162 p[Blinelen(&b)-1] = '\0';
163 if(tokenize(p, f, 2) != 2)
165 n = strtoll(f[0], 0, 0);
166 d = strtoll(f[1], 0, 0);
168 lockdisplay(display);
170 unlockdisplay(display);
174 threadexitsall("success");
180 fprint(2, "usage: statusbar [-kt] [-W winsize] 'title'\n");
181 threadexitsall("usage");
185 threadmain(int argc, char **argv)
190 p = "300x40@100,100";
214 Binit(&b, lfd, OREAD);
216 rbar = Rect(0, 0, 60, 1);
218 if(initdraw(0, nil, "bar") < 0)
219 sysfatal("initdraw: %r");
221 if((mc = initmouse(nil, screen)) == nil)
222 sysfatal("initmouse: %r");
223 if((kc = initkeyboard(nil)) == nil)
224 sysfatal("initkeyboard: %r");
225 display->locking = 1;
226 threadcreate(resizethread, nil, STACK);
227 threadcreate(keyboardthread, nil, STACK);
228 threadcreate(mousethread, nil, STACK);
230 unlockdisplay(display);
232 proccreate(updateproc, nil, STACK);