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