]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/statusmsg.c
aux/wpa: go to background when not prompting, handle open networks
[plan9front.git] / sys / src / cmd / aux / statusmsg.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 = nil;
13 char message[1024];
14
15 Image *light;
16 Image *text;
17 Rectangle rtext;
18
19 void
20 initcolor(void)
21 {
22         text = display->black;
23         light = allocimagemix(display, DPalegreen, DWhite);
24 }
25
26 void
27 drawmsg(void)
28 {
29         if(textmode){
30                 static int last = 0;
31
32                 while(last-- > 0)
33                         write(1, "\b", 1);
34                 write(1, message, strlen(message));
35                 last = utflen(message);
36                 return;
37         }
38         draw(screen, rtext, light, nil, ZP);
39         string(screen, rtext.min, text, ZP, display->defaultfont, message);
40         flushimage(display, 1);
41 }
42
43 void
44 eresized(int new)
45 {
46         if(new && getwindow(display, Refnone) < 0)
47                 fprint(2,"can't reattach to window");
48         rtext = screen->r;
49         draw(screen, rtext, light, nil, ZP);
50         rtext.min.x += 4;
51         rtext.min.y += 4;
52         if(title){
53                 string(screen, rtext.min, text, ZP, display->defaultfont, title);
54                 rtext.min.y += 8+display->defaultfont->height;
55         }
56         rtext.max.y = rtext.min.y + display->defaultfont->height;
57         drawmsg();
58 }
59
60 void
61 msg(Biobuf *b)
62 {
63         char *p;
64         Event e;
65         int k, die, parent, child;
66
67         parent = getpid();
68
69         die = 0;
70         if(textmode){
71                 child = -1;
72                 if(title){
73                         write(1, title, strlen(title));
74                         write(1, ": ", 2);
75                 }
76         } else
77         switch(child = rfork(RFMEM|RFPROC)) {
78         case 0:
79                 sleep(1000);
80                 while(!die && (k = eread(Ekeyboard|Emouse, &e))) {
81                         if(nokill==0 && k == Ekeyboard && (e.kbdc == Kdel || e.kbdc == Ketx)) {
82                                 die = 1;
83                                 postnote(PNPROC, parent, "interrupt");
84                                 _exits("interrupt");
85                         }
86                 }
87                 _exits(0);
88         }
89         while(!die && (p = Brdline(b, '\n'))) {
90                 snprint(message, sizeof(message), "%.*s", Blinelen(b)-1, p);
91                 drawmsg();
92         }
93         if(textmode)
94                 write(1, "\n", 1);
95         postnote(PNPROC, child, "kill");
96 }
97
98
99 void
100 usage(void)
101 {
102         fprint(2, "usage: %s [-kt] [-w minx,miny,maxx,maxy] [title]\n", argv0);
103         exits("usage");
104 }
105
106 void
107 main(int argc, char **argv)
108 {
109         Biobuf b;
110         char *p, *q;
111         int lfd;
112
113         p = "0,0,200,60";
114         
115         ARGBEGIN{
116         case 'w':
117                 p = ARGF();
118                 break;
119         case 't':
120                 textmode = 1;
121                 break;
122         case 'k':
123                 nokill = 1;
124                 break;
125         default:
126                 usage();
127         }ARGEND;
128
129         switch(argc){
130         default:
131                 usage();
132         case 1:
133                 title = argv[0];
134                 break;
135         case 0:
136                 break;
137         }
138         lfd = dup(0, -1);
139
140         while(q = strchr(p, ','))
141                 *q = ' ';
142         Binit(&b, lfd, OREAD);
143         if(textmode || newwin(p) < 0){
144                 textmode = 1;
145         }else{
146                 if(initdraw(0, 0, title) < 0)
147                         exits("initdraw");
148                 initcolor();
149                 einit(Emouse|Ekeyboard);
150                 eresized(0);
151         }
152         msg(&b);
153
154         exits(0);
155 }
156
157 int
158 newwin(char *win)
159 {
160         char spec[100];
161         int cons;
162
163         if(win != nil){
164                 snprint(spec, sizeof(spec), "-r %s", win);
165                 win = spec;
166         }
167         if(newwindow(win) < 0){
168                 fprint(2, "%s: newwindow: %r", argv0);
169                 return -1;
170         }
171         if((cons = open("/dev/cons", OREAD)) < 0){
172         NoCons:
173                 fprint(2, "%s: can't open /dev/cons: %r", argv0);
174                 return -1;
175         }
176         dup(cons, 0);
177         close(cons);
178         if((cons = open("/dev/cons", OWRITE)) < 0)
179                 goto NoCons;
180         dup(cons, 1);
181         dup(cons, 2);
182         close(cons);
183         return 0;
184 }