]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/statusbar.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / aux / statusbar.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <bio.h>
5 #include <event.h>
6 #include <keyboard.h>
7
8 int newwin(char*);
9
10 int nokill;
11 int textmode;
12 char *title;
13
14 Image *light;
15 Image *dark;
16 Image *text;
17
18 void
19 initcolor(void)
20 {
21         text = display->black;
22         light = allocimagemix(display, DPalegreen, DWhite);
23         dark = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkgreen);
24         if(light == nil || dark == nil) sysfatal("initcolor: %r");
25 }
26
27 Rectangle rbar;
28 vlong n, d;
29 int last;
30 int lastp = -1;
31
32 char backup[80];
33
34 void
35 drawbar(void)
36 {
37         int i, j;
38         int p;
39         char buf[400], bar[200];
40         static char lastbar[200];
41
42         if(n > d || n < 0 || d <= 0)
43                 return;
44
45         i = (Dx(rbar)*n)/d;
46         p = (n*100LL)/d;
47
48         if(textmode){
49                 if(Dx(rbar) > 150){
50                         rbar.min.x = 0;
51                         rbar.max.x = 150;
52                         return;
53                 }
54                 bar[0] = '|';
55                 for(j=0; j<i; j++)
56                         bar[j+1] = '#';
57                 for(; j<Dx(rbar); j++)
58                         bar[j+1] = '-';
59                 bar[j++] = '|';
60                 bar[j++] = ' ';
61                 sprint(bar+j, "%3d%% ", p);
62                 for(i=0; bar[i]==lastbar[i] && bar[i]; i++)
63                         ;
64                 memset(buf, '\b', strlen(lastbar)-i);
65                 strcpy(buf+strlen(lastbar)-i, bar+i);
66                 if(buf[0])
67                         write(1, buf, strlen(buf));
68                 strcpy(lastbar, bar);
69                 return;
70         }
71
72         if(lastp == p && last == i)
73                 return;
74
75         if(lastp != p){
76                 sprint(buf, "%3d%%", p);
77                 
78                 stringbg(screen, Pt(screen->r.max.x-4-stringwidth(display->defaultfont, buf), screen->r.min.y+4), text, ZP, display->defaultfont, buf, light, ZP);
79                 lastp = p;
80         }
81
82         if(last != i){
83                 if(i > last)
84                         draw(screen, Rect(rbar.min.x+last, rbar.min.y, rbar.min.x+i, rbar.max.y),
85                                 dark, nil, ZP);
86                 else
87                         draw(screen, Rect(rbar.min.x+i, rbar.min.y, rbar.min.x+last, rbar.max.y),
88                                 light, nil, ZP);
89                 last = i;
90         }
91         flushimage(display, 1);
92 }
93
94 void
95 eresized(int new)
96 {
97         if(new && getwindow(display, Refnone) < 0)
98                 fprint(2,"can't reattach to window");
99
100         draw(screen, screen->r, light, nil, ZP);
101         if(title) string(screen, addpt(screen->r.min, Pt(4,4)), text, ZP, font, title);
102         rbar = insetrect(screen->r, 4);
103         rbar.min.y += font->height + 4;
104         border(screen, rbar, -2, dark, ZP);
105         last = 0;
106         lastp = -1;
107
108         drawbar();
109 }
110
111 void
112 bar(Biobuf *b)
113 {
114         char *p, *f[2];
115         Event e;
116         int k, die, parent, child;
117
118         parent = getpid();
119
120         die = 0;
121         if(textmode)
122                 child = -1;
123         else
124         switch(child = rfork(RFMEM|RFPROC)) {
125         case 0:
126                 sleep(1000);
127                 while(!die && (k = eread(Ekeyboard|Emouse, &e))) {
128                         if(nokill==0 && k == Ekeyboard && (e.kbdc == Kdel || e.kbdc == Ketx)) {
129                                 die = 1;
130                                 postnote(PNPROC, parent, "interrupt");
131                                 _exits("interrupt");
132                         }
133                 }
134                 _exits(0);
135         }
136
137         while(!die && (p = Brdline(b, '\n'))) {
138                 p[Blinelen(b)-1] = '\0';
139                 if(tokenize(p, f, 2) != 2)
140                         continue;
141                 n = strtoll(f[0], 0, 0);
142                 d = strtoll(f[1], 0, 0);
143                 drawbar();
144         }
145         if(textmode)
146                 write(1, "\n", 1);
147         else
148                 postnote(PNPROC, child, "kill");
149 }
150
151
152 void
153 usage(void)
154 {
155         fprint(2, "usage: %s [-kt] [-w minx,miny,maxx,maxy] [title]\n", argv0);
156         exits("usage");
157 }
158
159 void
160 main(int argc, char **argv)
161 {
162         Biobuf b;
163         char *p, *q;
164         int lfd;
165
166         p = "0,0,200,60";
167         
168         ARGBEGIN{
169         case 'w':
170                 p = ARGF();
171                 break;
172         case 't':
173                 textmode = 1;
174                 break;
175         case 'k':
176                 nokill = 1;
177                 break;
178         default:
179                 usage();
180         }ARGEND;
181
182         switch(argc){
183         default:
184                 usage();
185         case 1:
186                 title = argv[0];
187         case 0:
188                 break;
189         }
190         lfd = dup(0, -1);
191
192         while(q = strchr(p, ','))
193                 *q = ' ';
194         Binit(&b, lfd, OREAD);
195         if(textmode || newwin(p) < 0){
196                 textmode = 1;
197                 rbar = Rect(0, 0, 60, 1);
198         }else{
199                 if(initdraw(0, 0, title ? title : argv0) < 0)
200                         exits("initdraw");
201                 initcolor();
202                 einit(Emouse|Ekeyboard);
203                 eresized(0);
204         }
205         bar(&b);
206
207         exits(0);
208 }
209
210 int
211 newwin(char *win)
212 {
213         char spec[100];
214         int cons;
215
216         if(win != nil){
217                 snprint(spec, sizeof(spec), "-r %s", win);
218                 win = spec;
219         }
220         if(newwindow(win) < 0){
221                 fprint(2, "%s: newwindow: %r", argv0);
222                 return -1;
223         }
224         if((cons = open("/dev/cons", OREAD)) < 0){
225         NoCons:
226                 fprint(2, "%s: can't open /dev/cons: %r", argv0);
227                 return -1;
228         }
229         dup(cons, 0);
230         close(cons);
231         if((cons = open("/dev/cons", OWRITE)) < 0)
232                 goto NoCons;
233         dup(cons, 1);
234         dup(cons, 2);
235         close(cons);
236         return 0;
237 }