Blame


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>
8 1e987f65 2007-03-25 devnull
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);
13 1e987f65 2007-03-25 devnull
14 1e987f65 2007-03-25 devnull enum {
15 1e987f65 2007-03-25 devnull STACK = 8196,
16 1e987f65 2007-03-25 devnull };
17 1e987f65 2007-03-25 devnull
18 1e987f65 2007-03-25 devnull int nokill;
19 1e987f65 2007-03-25 devnull int textmode;
20 1e987f65 2007-03-25 devnull char *title;
21 1e987f65 2007-03-25 devnull
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;
28 1e987f65 2007-03-25 devnull
29 1e987f65 2007-03-25 devnull void
30 1e987f65 2007-03-25 devnull initcolor(void)
31 1e987f65 2007-03-25 devnull {
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);
35 1e987f65 2007-03-25 devnull }
36 1e987f65 2007-03-25 devnull
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;
41 1e987f65 2007-03-25 devnull
42 1e987f65 2007-03-25 devnull char backup[80];
43 1e987f65 2007-03-25 devnull
44 1e987f65 2007-03-25 devnull void
45 1e987f65 2007-03-25 devnull drawbar(void)
46 1e987f65 2007-03-25 devnull {
47 1e987f65 2007-03-25 devnull int i, j;
48 1e987f65 2007-03-25 devnull int p;
49 1e987f65 2007-03-25 devnull char buf[400], bar[200];
50 1e987f65 2007-03-25 devnull static char lastbar[200];
51 1e987f65 2007-03-25 devnull
52 1e987f65 2007-03-25 devnull if(n > d || n < 0 || d <= 0)
53 1e987f65 2007-03-25 devnull return;
54 1e987f65 2007-03-25 devnull
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;
61 1e987f65 2007-03-25 devnull return;
62 1e987f65 2007-03-25 devnull }
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++)
72 1e987f65 2007-03-25 devnull ;
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);
78 1e987f65 2007-03-25 devnull return;
79 1e987f65 2007-03-25 devnull }
80 1e987f65 2007-03-25 devnull
81 1e987f65 2007-03-25 devnull if(lastp == p && last == i)
82 1e987f65 2007-03-25 devnull return;
83 1e987f65 2007-03-25 devnull
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;
88 1e987f65 2007-03-25 devnull }
89 1e987f65 2007-03-25 devnull
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;
94 1e987f65 2007-03-25 devnull }
95 1e987f65 2007-03-25 devnull flushimage(display, 1);
96 1e987f65 2007-03-25 devnull }
97 1e987f65 2007-03-25 devnull
98 1e987f65 2007-03-25 devnull void
99 1e987f65 2007-03-25 devnull resize()
100 1e987f65 2007-03-25 devnull {
101 1e987f65 2007-03-25 devnull Point p, q;
102 1e987f65 2007-03-25 devnull Rectangle r;
103 1e987f65 2007-03-25 devnull
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);
108 1e987f65 2007-03-25 devnull
109 1e987f65 2007-03-25 devnull p.x = r.min.x+4;
110 1e987f65 2007-03-25 devnull p.y += display->defaultfont->height+4;
111 1e987f65 2007-03-25 devnull
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;
117 1e987f65 2007-03-25 devnull
118 1e987f65 2007-03-25 devnull flushimage(display, 1);
119 1e987f65 2007-03-25 devnull drawbar();
120 1e987f65 2007-03-25 devnull }
121 1e987f65 2007-03-25 devnull
122 1e987f65 2007-03-25 devnull void
123 1e987f65 2007-03-25 devnull keyboardthread(void *v)
124 1e987f65 2007-03-25 devnull {
125 1e987f65 2007-03-25 devnull Rune r;
126 1e987f65 2007-03-25 devnull
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");
130 1e987f65 2007-03-25 devnull }
131 1e987f65 2007-03-25 devnull }
132 1e987f65 2007-03-25 devnull
133 1e987f65 2007-03-25 devnull void
134 1e987f65 2007-03-25 devnull mousethread(void *v)
135 1e987f65 2007-03-25 devnull {
136 1e987f65 2007-03-25 devnull USED(v);
137 1e987f65 2007-03-25 devnull
138 1e987f65 2007-03-25 devnull while(recv(mc->c, 0) == 1); /* to unblock mc->c */
139 1e987f65 2007-03-25 devnull }
140 1e987f65 2007-03-25 devnull
141 1e987f65 2007-03-25 devnull void
142 1e987f65 2007-03-25 devnull resizethread(void *v)
143 1e987f65 2007-03-25 devnull {
144 1e987f65 2007-03-25 devnull USED(v);
145 1e987f65 2007-03-25 devnull
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);
152 1e987f65 2007-03-25 devnull }
153 1e987f65 2007-03-25 devnull }
154 1e987f65 2007-03-25 devnull
155 1e987f65 2007-03-25 devnull void
156 1e987f65 2007-03-25 devnull updateproc(void *v)
157 1e987f65 2007-03-25 devnull {
158 1e987f65 2007-03-25 devnull char *p, *f[2];
159 1e987f65 2007-03-25 devnull
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);
171 1e987f65 2007-03-25 devnull } else
172 1e987f65 2007-03-25 devnull drawbar();
173 1e987f65 2007-03-25 devnull }
174 1e987f65 2007-03-25 devnull threadexitsall("success");
175 1e987f65 2007-03-25 devnull }
176 1e987f65 2007-03-25 devnull
177 1e987f65 2007-03-25 devnull void
178 1e987f65 2007-03-25 devnull usage(void)
179 1e987f65 2007-03-25 devnull {
180 1e987f65 2007-03-25 devnull fprint(2, "usage: statusbar [-kt] [-W winsize] 'title'\n");
181 1e987f65 2007-03-25 devnull threadexitsall("usage");
182 1e987f65 2007-03-25 devnull }
183 1e987f65 2007-03-25 devnull
184 1e987f65 2007-03-25 devnull void
185 1e987f65 2007-03-25 devnull threadmain(int argc, char **argv)
186 1e987f65 2007-03-25 devnull {
187 1e987f65 2007-03-25 devnull char *p;
188 1e987f65 2007-03-25 devnull int lfd;
189 1e987f65 2007-03-25 devnull
190 1e987f65 2007-03-25 devnull p = "300x40@100,100";
191 1e987f65 2007-03-25 devnull
192 1e987f65 2007-03-25 devnull ARGBEGIN{
193 1e987f65 2007-03-25 devnull case 'W':
194 1e987f65 2007-03-25 devnull p = ARGF();
195 1e987f65 2007-03-25 devnull break;
196 1e987f65 2007-03-25 devnull case 't':
197 1e987f65 2007-03-25 devnull textmode = 1;
198 1e987f65 2007-03-25 devnull break;
199 1e987f65 2007-03-25 devnull case 'k':
200 1e987f65 2007-03-25 devnull nokill = 1;
201 1e987f65 2007-03-25 devnull break;
202 1e987f65 2007-03-25 devnull default:
203 1e987f65 2007-03-25 devnull usage();
204 1e987f65 2007-03-25 devnull }ARGEND;
205 1e987f65 2007-03-25 devnull
206 1e987f65 2007-03-25 devnull if(argc != 1)
207 1e987f65 2007-03-25 devnull usage();
208 1e987f65 2007-03-25 devnull
209 1e987f65 2007-03-25 devnull winsize = p;
210 1e987f65 2007-03-25 devnull
211 1e987f65 2007-03-25 devnull title = argv[0];
212 1e987f65 2007-03-25 devnull
213 1e987f65 2007-03-25 devnull lfd = dup(0, -1);
214 1e987f65 2007-03-25 devnull Binit(&b, lfd, OREAD);
215 1e987f65 2007-03-25 devnull
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);
231 1e987f65 2007-03-25 devnull }
232 1e987f65 2007-03-25 devnull proccreate(updateproc, nil, STACK);
233 1e987f65 2007-03-25 devnull }
234 1e987f65 2007-03-25 devnull