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