Blame


1 020c8058 2005-01-04 devnull #include <u.h>
2 020c8058 2005-01-04 devnull #include <libc.h>
3 020c8058 2005-01-04 devnull #include <draw.h>
4 020c8058 2005-01-04 devnull #include <cursor.h>
5 020c8058 2005-01-04 devnull #include <event.h>
6 020c8058 2005-01-04 devnull #include <bio.h>
7 020c8058 2005-01-04 devnull #include "proof.h"
8 020c8058 2005-01-04 devnull
9 020c8058 2005-01-04 devnull static int checkmouse(void);
10 020c8058 2005-01-04 devnull /* static int buttondown(void); */
11 020c8058 2005-01-04 devnull static char *getmousestr(void);
12 020c8058 2005-01-04 devnull static char *getkbdstr(int);
13 020c8058 2005-01-04 devnull
14 020c8058 2005-01-04 devnull extern Cursor blot;
15 020c8058 2005-01-04 devnull extern char *track;
16 020c8058 2005-01-04 devnull
17 020c8058 2005-01-04 devnull Mouse mouse;
18 020c8058 2005-01-04 devnull
19 020c8058 2005-01-04 devnull void
20 020c8058 2005-01-04 devnull mapscreen(void)
21 020c8058 2005-01-04 devnull {
22 020c8058 2005-01-04 devnull if(initdraw(0, 0, "proof") < 0){
23 020c8058 2005-01-04 devnull fprint(2, "proof: initdraw failed: %r\n");
24 020c8058 2005-01-04 devnull exits("initdraw");
25 020c8058 2005-01-04 devnull }
26 020c8058 2005-01-04 devnull einit(Ekeyboard|Emouse);
27 020c8058 2005-01-04 devnull }
28 020c8058 2005-01-04 devnull
29 020c8058 2005-01-04 devnull void
30 020c8058 2005-01-04 devnull clearscreen(void)
31 020c8058 2005-01-04 devnull {
32 020c8058 2005-01-04 devnull draw(screen, screen->r, display->black, nil, ZP);
33 020c8058 2005-01-04 devnull }
34 020c8058 2005-01-04 devnull
35 020c8058 2005-01-04 devnull void
36 020c8058 2005-01-04 devnull screenprint(char *fmt, ...)
37 020c8058 2005-01-04 devnull {
38 020c8058 2005-01-04 devnull char buf[100];
39 020c8058 2005-01-04 devnull Point p;
40 020c8058 2005-01-04 devnull va_list args;
41 020c8058 2005-01-04 devnull
42 020c8058 2005-01-04 devnull va_start(args, fmt);
43 020c8058 2005-01-04 devnull vseprint(buf, &buf[sizeof buf], fmt, args);
44 020c8058 2005-01-04 devnull va_end(args);
45 020c8058 2005-01-04 devnull p = Pt(screen->clipr.min.x+40, screen->clipr.max.y-40);
46 020c8058 2005-01-04 devnull string(screen, p, display->black, ZP, font, buf);
47 020c8058 2005-01-04 devnull }
48 020c8058 2005-01-04 devnull
49 020c8058 2005-01-04 devnull #define Viewkey 0xb2
50 020c8058 2005-01-04 devnull #define etimer(x, y) 0
51 020c8058 2005-01-04 devnull
52 020c8058 2005-01-04 devnull char *
53 020c8058 2005-01-04 devnull getcmdstr(void)
54 020c8058 2005-01-04 devnull {
55 020c8058 2005-01-04 devnull Event ev;
56 020c8058 2005-01-04 devnull int e;
57 020c8058 2005-01-04 devnull static ulong timekey = 0;
58 020c8058 2005-01-04 devnull ulong tracktm = 0;
59 020c8058 2005-01-04 devnull Dir *dir;
60 020c8058 2005-01-04 devnull
61 020c8058 2005-01-04 devnull if(track){
62 020c8058 2005-01-04 devnull if(timekey == 0)
63 020c8058 2005-01-04 devnull timekey = etimer(0, 5000);
64 020c8058 2005-01-04 devnull dir = dirstat(track);
65 020c8058 2005-01-04 devnull if(dir != nil){
66 020c8058 2005-01-04 devnull tracktm = dir->mtime;
67 020c8058 2005-01-04 devnull free(dir);
68 020c8058 2005-01-04 devnull }
69 020c8058 2005-01-04 devnull }
70 020c8058 2005-01-04 devnull for (;;) {
71 020c8058 2005-01-04 devnull e = event(&ev);
72 020c8058 2005-01-04 devnull if(resized){
73 020c8058 2005-01-04 devnull resized = 0;
74 020c8058 2005-01-04 devnull return "p";
75 020c8058 2005-01-04 devnull }
76 020c8058 2005-01-04 devnull if ((e & Emouse) && ev.mouse.buttons) {
77 020c8058 2005-01-04 devnull mouse = ev.mouse;
78 020c8058 2005-01-04 devnull return getmousestr();
79 020c8058 2005-01-04 devnull } else if (e & Ekeyboard)
80 020c8058 2005-01-04 devnull return getkbdstr(ev.kbdc); /* sadly, no way to unget */
81 020c8058 2005-01-04 devnull else if (e & timekey) {
82 020c8058 2005-01-04 devnull if((dir = dirstat(track)) != nil){
83 020c8058 2005-01-04 devnull if(tracktm < dir->mtime){
84 020c8058 2005-01-04 devnull free(dir);
85 020c8058 2005-01-04 devnull return "q";
86 020c8058 2005-01-04 devnull }
87 020c8058 2005-01-04 devnull free(dir);
88 020c8058 2005-01-04 devnull }
89 020c8058 2005-01-04 devnull }
90 020c8058 2005-01-04 devnull }
91 020c8058 2005-01-04 devnull return nil;
92 020c8058 2005-01-04 devnull }
93 020c8058 2005-01-04 devnull
94 020c8058 2005-01-04 devnull static char *
95 020c8058 2005-01-04 devnull getkbdstr(int c0)
96 020c8058 2005-01-04 devnull {
97 020c8058 2005-01-04 devnull static char buf[100];
98 020c8058 2005-01-04 devnull char *p;
99 020c8058 2005-01-04 devnull int c;
100 020c8058 2005-01-04 devnull
101 020c8058 2005-01-04 devnull if (c0 == '\n')
102 020c8058 2005-01-04 devnull return "";
103 020c8058 2005-01-04 devnull buf[0] = c0;
104 020c8058 2005-01-04 devnull buf[1] = 0;
105 020c8058 2005-01-04 devnull screenprint("%s", buf);
106 020c8058 2005-01-04 devnull for (p = buf+1; (c = ekbd()) != '\n' && c != '\r' && c != -1 && c != Viewkey; ) {
107 020c8058 2005-01-04 devnull if (c == '\b' && p > buf) {
108 020c8058 2005-01-04 devnull *--p = ' ';
109 020c8058 2005-01-04 devnull } else {
110 020c8058 2005-01-04 devnull *p++ = c;
111 020c8058 2005-01-04 devnull *p = 0;
112 020c8058 2005-01-04 devnull }
113 020c8058 2005-01-04 devnull screenprint("%s", buf);
114 020c8058 2005-01-04 devnull }
115 020c8058 2005-01-04 devnull *p = 0;
116 020c8058 2005-01-04 devnull return buf;
117 020c8058 2005-01-04 devnull }
118 020c8058 2005-01-04 devnull
119 020c8058 2005-01-04 devnull
120 020c8058 2005-01-04 devnull #define button3(b) ((b) & 4)
121 020c8058 2005-01-04 devnull #define button2(b) ((b) & 2)
122 020c8058 2005-01-04 devnull #define button1(b) ((b) & 1)
123 020c8058 2005-01-04 devnull #define button23(b) ((b) & 6)
124 020c8058 2005-01-04 devnull #define button123(b) ((b) & 7)
125 020c8058 2005-01-04 devnull
126 020c8058 2005-01-04 devnull #define butcvt(b) (1 << ((b) - 1))
127 020c8058 2005-01-04 devnull
128 020c8058 2005-01-04 devnull #if 0
129 020c8058 2005-01-04 devnull static int buttondown(void) /* report state of buttons, if any */
130 020c8058 2005-01-04 devnull {
131 020c8058 2005-01-04 devnull if (!ecanmouse()) /* no event pending */
132 020c8058 2005-01-04 devnull return 0;
133 020c8058 2005-01-04 devnull mouse = emouse(); /* something, but it could be motion */
134 020c8058 2005-01-04 devnull return mouse.buttons & 7;
135 020c8058 2005-01-04 devnull }
136 020c8058 2005-01-04 devnull #endif
137 020c8058 2005-01-04 devnull
138 020c8058 2005-01-04 devnull int waitdown(void) /* wait until some button is down */
139 020c8058 2005-01-04 devnull {
140 020c8058 2005-01-04 devnull while (!(mouse.buttons & 7))
141 020c8058 2005-01-04 devnull mouse = emouse();
142 020c8058 2005-01-04 devnull return mouse.buttons & 7;
143 020c8058 2005-01-04 devnull }
144 020c8058 2005-01-04 devnull
145 020c8058 2005-01-04 devnull int waitup(void)
146 020c8058 2005-01-04 devnull {
147 020c8058 2005-01-04 devnull while (mouse.buttons & 7)
148 020c8058 2005-01-04 devnull mouse = emouse();
149 020c8058 2005-01-04 devnull return mouse.buttons & 7;
150 020c8058 2005-01-04 devnull }
151 020c8058 2005-01-04 devnull
152 020c8058 2005-01-04 devnull char *m3[] = { "next", "prev", "page n", "again", "bigger", "smaller", "pan", "quit?", 0 };
153 020c8058 2005-01-04 devnull char *m2[] = { 0 };
154 020c8058 2005-01-04 devnull
155 020c8058 2005-01-04 devnull enum { Next = 0, Prev, Page, Again, Bigger, Smaller, Pan, Quit };
156 020c8058 2005-01-04 devnull
157 020c8058 2005-01-04 devnull Menu mbut3 = { m3, 0, 0 };
158 020c8058 2005-01-04 devnull Menu mbut2 = { m2, 0, 0 };
159 020c8058 2005-01-04 devnull
160 020c8058 2005-01-04 devnull int last_hit;
161 020c8058 2005-01-04 devnull int last_but;
162 020c8058 2005-01-04 devnull
163 020c8058 2005-01-04 devnull char *pan(void)
164 020c8058 2005-01-04 devnull {
165 020c8058 2005-01-04 devnull Point dd, xy, lastxy, min, max;
166 020c8058 2005-01-04 devnull
167 020c8058 2005-01-04 devnull esetcursor(&blot);
168 020c8058 2005-01-04 devnull waitdown();
169 020c8058 2005-01-04 devnull xy = mouse.xy;
170 020c8058 2005-01-04 devnull do{
171 020c8058 2005-01-04 devnull lastxy = mouse.xy;
172 020c8058 2005-01-04 devnull mouse = emouse();
173 020c8058 2005-01-04 devnull dd = subpt(mouse.xy, lastxy);
174 020c8058 2005-01-04 devnull min = addpt(screen->clipr.min, dd);
175 020c8058 2005-01-04 devnull max = addpt(screen->clipr.max, dd);
176 020c8058 2005-01-04 devnull draw(screen, rectaddpt(screen->r, subpt(mouse.xy, lastxy)),
177 020c8058 2005-01-04 devnull screen, nil, screen->r.min);
178 020c8058 2005-01-04 devnull if(mouse.xy.x < lastxy.x) /* moved left, clear right */
179 020c8058 2005-01-04 devnull draw(screen, Rect(max.x, screen->r.min.y, screen->r.max.x, screen->r.max.y),
180 020c8058 2005-01-04 devnull display->white, nil, ZP);
181 020c8058 2005-01-04 devnull else /* moved right, clear left*/
182 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, screen->r.min.y, min.x, screen->r.max.y),
183 020c8058 2005-01-04 devnull display->white, nil, ZP);
184 020c8058 2005-01-04 devnull if(mouse.xy.y < lastxy.y) /* moved up, clear down */
185 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, max.y, screen->r.max.x, screen->r.max.y),
186 020c8058 2005-01-04 devnull display->white, nil, ZP);
187 020c8058 2005-01-04 devnull else /* moved down, clear up */
188 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, screen->r.min.y, screen->r.max.x, min.y),
189 020c8058 2005-01-04 devnull display->white, nil, ZP);
190 020c8058 2005-01-04 devnull flushimage(display, 1);
191 020c8058 2005-01-04 devnull }while(mouse.buttons);
192 020c8058 2005-01-04 devnull
193 020c8058 2005-01-04 devnull xyoffset = addpt(xyoffset, subpt(mouse.xy, xy));
194 020c8058 2005-01-04 devnull
195 020c8058 2005-01-04 devnull esetcursor(0);
196 020c8058 2005-01-04 devnull return "p";
197 020c8058 2005-01-04 devnull }
198 020c8058 2005-01-04 devnull
199 020c8058 2005-01-04 devnull static char *getmousestr(void)
200 020c8058 2005-01-04 devnull {
201 020c8058 2005-01-04 devnull static char buf[20];
202 020c8058 2005-01-04 devnull
203 020c8058 2005-01-04 devnull checkmouse();
204 020c8058 2005-01-04 devnull if (last_but == 1)
205 020c8058 2005-01-04 devnull return "p"; /* repaint after panning */
206 020c8058 2005-01-04 devnull if (last_but == 2) {
207 020c8058 2005-01-04 devnull return "c";
208 020c8058 2005-01-04 devnull } else if (last_but == 3) {
209 020c8058 2005-01-04 devnull switch (last_hit) {
210 020c8058 2005-01-04 devnull case Next:
211 020c8058 2005-01-04 devnull return "";
212 020c8058 2005-01-04 devnull case Prev:
213 020c8058 2005-01-04 devnull return "-1";
214 020c8058 2005-01-04 devnull case Page:
215 020c8058 2005-01-04 devnull screenprint("page? ");
216 020c8058 2005-01-04 devnull return "c";
217 020c8058 2005-01-04 devnull case Again:
218 020c8058 2005-01-04 devnull return "p";
219 020c8058 2005-01-04 devnull case Bigger:
220 020c8058 2005-01-04 devnull sprint(buf, "m%g", mag * 1.1);
221 020c8058 2005-01-04 devnull return buf;
222 020c8058 2005-01-04 devnull case Smaller:
223 020c8058 2005-01-04 devnull sprint(buf, "m%g", mag / 1.1);
224 020c8058 2005-01-04 devnull return buf;
225 020c8058 2005-01-04 devnull case Pan:
226 020c8058 2005-01-04 devnull return pan();
227 020c8058 2005-01-04 devnull case Quit:
228 020c8058 2005-01-04 devnull return "q";
229 020c8058 2005-01-04 devnull default:
230 020c8058 2005-01-04 devnull return "c";
231 020c8058 2005-01-04 devnull }
232 020c8058 2005-01-04 devnull } else { /* button 1 or bail out */
233 020c8058 2005-01-04 devnull return "c";
234 020c8058 2005-01-04 devnull }
235 020c8058 2005-01-04 devnull }
236 020c8058 2005-01-04 devnull
237 020c8058 2005-01-04 devnull static int
238 020c8058 2005-01-04 devnull checkmouse(void) /* return button touched if any */
239 020c8058 2005-01-04 devnull {
240 020c8058 2005-01-04 devnull int c, b;
241 020c8058 2005-01-04 devnull char *p;
242 020c8058 2005-01-04 devnull extern int confirm(int);
243 020c8058 2005-01-04 devnull
244 020c8058 2005-01-04 devnull b = waitdown();
245 020c8058 2005-01-04 devnull last_but = 0;
246 020c8058 2005-01-04 devnull last_hit = -1;
247 020c8058 2005-01-04 devnull c = 0;
248 020c8058 2005-01-04 devnull if (button3(b)) {
249 020c8058 2005-01-04 devnull last_hit = emenuhit(3, &mouse, &mbut3);
250 020c8058 2005-01-04 devnull last_but = 3;
251 020c8058 2005-01-04 devnull } else if (button2(b)) {
252 020c8058 2005-01-04 devnull last_hit = emenuhit(2, &mouse, &mbut2);
253 020c8058 2005-01-04 devnull last_but = 2;
254 020c8058 2005-01-04 devnull } else { /* button1() */
255 020c8058 2005-01-04 devnull pan();
256 020c8058 2005-01-04 devnull last_but = 1;
257 020c8058 2005-01-04 devnull }
258 020c8058 2005-01-04 devnull waitup();
259 020c8058 2005-01-04 devnull if (last_but == 3 && last_hit >= 0) {
260 020c8058 2005-01-04 devnull p = m3[last_hit];
261 020c8058 2005-01-04 devnull c = p[strlen(p) - 1];
262 020c8058 2005-01-04 devnull }
263 020c8058 2005-01-04 devnull if (c == '?' && !confirm(last_but))
264 020c8058 2005-01-04 devnull last_hit = -1;
265 020c8058 2005-01-04 devnull return last_but;
266 020c8058 2005-01-04 devnull }
267 020c8058 2005-01-04 devnull
268 020c8058 2005-01-04 devnull Cursor deadmouse = {
269 020c8058 2005-01-04 devnull { 0, 0}, /* offset */
270 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 020c8058 2005-01-04 devnull 0x00, 0x00, 0x00, 0x0C, 0x00, 0x82, 0x04, 0x41,
272 020c8058 2005-01-04 devnull 0xFF, 0xE1, 0x5F, 0xF1, 0x3F, 0xFE, 0x17, 0xF0,
273 020c8058 2005-01-04 devnull 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
274 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 020c8058 2005-01-04 devnull 0x00, 0x00, 0x00, 0x0C, 0x00, 0x82, 0x04, 0x41,
276 020c8058 2005-01-04 devnull 0xFF, 0xE1, 0x5F, 0xF1, 0x3F, 0xFE, 0x17, 0xF0,
277 020c8058 2005-01-04 devnull 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }
278 020c8058 2005-01-04 devnull };
279 020c8058 2005-01-04 devnull
280 020c8058 2005-01-04 devnull Cursor blot ={
281 020c8058 2005-01-04 devnull { 0, 0 },
282 020c8058 2005-01-04 devnull { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
283 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
284 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
285 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, },
286 020c8058 2005-01-04 devnull { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
287 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
288 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
289 020c8058 2005-01-04 devnull 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }
290 020c8058 2005-01-04 devnull };
291 020c8058 2005-01-04 devnull
292 020c8058 2005-01-04 devnull Cursor skull ={
293 020c8058 2005-01-04 devnull { 0, 0 },
294 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03,
295 020c8058 2005-01-04 devnull 0xE7, 0xE7, 0x3F, 0xFC, 0x0F, 0xF0, 0x0D, 0xB0,
296 020c8058 2005-01-04 devnull 0x07, 0xE0, 0x06, 0x60, 0x37, 0xEC, 0xE4, 0x27,
297 020c8058 2005-01-04 devnull 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
298 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03,
299 020c8058 2005-01-04 devnull 0xE7, 0xE7, 0x3F, 0xFC, 0x0F, 0xF0, 0x0D, 0xB0,
300 020c8058 2005-01-04 devnull 0x07, 0xE0, 0x06, 0x60, 0x37, 0xEC, 0xE4, 0x27,
301 020c8058 2005-01-04 devnull 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }
302 020c8058 2005-01-04 devnull };
303 020c8058 2005-01-04 devnull
304 020c8058 2005-01-04 devnull int
305 020c8058 2005-01-04 devnull confirm(int but) /* ask for confirmation if menu item ends with '?' */
306 020c8058 2005-01-04 devnull {
307 020c8058 2005-01-04 devnull int c;
308 020c8058 2005-01-04 devnull static int but_cvt[8] = { 0, 1, 2, 0, 3, 0, 0, 0 };
309 020c8058 2005-01-04 devnull
310 020c8058 2005-01-04 devnull esetcursor(&skull);
311 020c8058 2005-01-04 devnull c = waitdown();
312 020c8058 2005-01-04 devnull waitup();
313 020c8058 2005-01-04 devnull esetcursor(0);
314 020c8058 2005-01-04 devnull return but == but_cvt[c];
315 020c8058 2005-01-04 devnull }