9 static char* rdenv(char*);
11 Rectangle screenrect(void);
24 text = display->black;
25 light = allocimagemix(display, DPalegreen, DWhite);
26 dark = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkgreen);
42 char buf[400], bar[200];
43 static char lastbar[200];
45 if(n > d || n < 0 || d <= 0)
60 for(; j<Dx(rbar); j++)
64 sprint(bar+j, "%3d%% ", p);
65 for(i=0; bar[i]==lastbar[i] && bar[i]; i++)
67 memset(buf, '\b', strlen(lastbar)-i);
68 strcpy(buf+strlen(lastbar)-i, bar+i);
70 write(1, buf, strlen(buf));
75 if(lastp == p && last == i)
79 sprint(buf, "%3d%%", p);
81 stringbg(screen, addpt(screen->r.min, Pt(Dx(rbar)-30, 4)), text, ZP, display->defaultfont, buf, light, ZP);
87 draw(screen, Rect(rbar.min.x+last, rbar.min.y, rbar.min.x+i, rbar.max.y),
90 draw(screen, Rect(rbar.min.x+i, rbar.min.y, rbar.min.x+last, rbar.max.y),
94 flushimage(display, 1);
103 if(new && getwindow(display, Refnone) < 0)
104 fprint(2,"can't reattach to window");
107 draw(screen, r, light, nil, ZP);
108 p = string(screen, addpt(r.min, Pt(4,4)), text, ZP,
109 display->defaultfont, title);
112 p.y += display->defaultfont->height+4;
114 q = subpt(r.max, Pt(4,4));
117 ptext = Pt(r.max.x-4-stringwidth(display->defaultfont, "100%"), r.min.x+4);
118 border(screen, rbar, -2, dark, ZP);
130 int k, die, parent, child;
138 switch(child = rfork(RFMEM|RFPROC)) {
141 while(!die && (k = eread(Ekeyboard|Emouse, &e))) {
142 if(nokill==0 && k == Ekeyboard && (e.kbdc == 0x7F || e.kbdc == 0x03)) { /* del, ctl-c */
144 postnote(PNPROC, parent, "interrupt");
151 while(!die && (p = Brdline(b, '\n'))) {
152 p[Blinelen(b)-1] = '\0';
153 if(tokenize(p, f, 2) != 2)
155 n = strtoll(f[0], 0, 0);
156 d = strtoll(f[1], 0, 0);
159 postnote(PNCTL, child, "kill");
166 fprint(2, "usage: aux/statusbar [-kt] [-w minx,miny,maxx,maxy] 'title'\n");
171 main(int argc, char **argv)
200 while(q = strchr(p, ','))
202 Binit(&b, lfd, OREAD);
203 if(textmode || newwin(p) < 0){
205 rbar = Rect(0, 0, 60, 1);
207 if(initdraw(0, 0, "bar") < 0)
210 einit(Emouse|Ekeyboard);
219 /* all code below this line should be in the library, but is stolen from colors instead */
226 fd = open(name, OREAD);
229 size = seek(fd, 0, 2);
232 fprint(2, "%s: can't malloc: %r\n", argv0);
247 int srvfd, cons, pid;
249 switch(rfork(RFFDG|RFPROC|RFNAMEG|RFENVG|RFNOTEG|RFNOWAIT)){
251 fprint(2, "statusbar: can't fork: %r\n");
259 srv = rdenv("/env/wsys");
261 mntsrv = rdenv("/mnt/term/env/wsys");
263 fprint(2, "statusbar: can't find $wsys\n");
266 srv = malloc(strlen(mntsrv)+10);
267 sprint(srv, "/mnt/term%s", mntsrv);
269 pid = 0; /* can't send notes to remote processes! */
273 srvfd = open(srv, ORDWR);
276 fprint(2, "statusbar: can't open %s: %r\n", srv);
279 sprint(spec, "new -r %s", win);
280 if(mount(srvfd, -1, "/mnt/wsys", 0, spec) == -1){
281 fprint(2, "statusbar: can't mount /mnt/wsys: %r (spec=%s)\n", spec);
285 unmount("/mnt/acme", "/dev");
286 bind("/mnt/wsys", "/dev", MBEFORE);
287 cons = open("/dev/cons", OREAD);
290 fprint(2, "statusbar: can't open /dev/cons: %r");
295 cons = open("/dev/cons", OWRITE);
301 // wctlfd = open("/dev/wctl", OWRITE);
311 fd = open("/dev/screen", OREAD);
313 fd=open("/mnt/term/dev/screen", OREAD);
315 fprint(2, "%s: can't open /dev/screen: %r\n", argv0);
316 exits("window read");
318 if(read(fd, buf, sizeof buf) != sizeof buf){
319 fprint(2, "%s: can't read /dev/screen: %r\n", argv0);
320 exits("screen read");
323 return Rect(atoi(buf+12), atoi(buf+24), atoi(buf+36), atoi(buf+48));
327 postnote(int group, int pid, char *note)
334 sprint(file, "/proc/%d/note", pid);
337 sprint(file, "/proc/%d/notepg", pid);
340 sprint(file, "/proc/%d/ctl", pid);
346 f = open(file, OWRITE);
351 if(write(f, note, r) != r) {