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 }
92 020c8058 2005-01-04 devnull
93 020c8058 2005-01-04 devnull static char *
94 020c8058 2005-01-04 devnull getkbdstr(int c0)
95 020c8058 2005-01-04 devnull {
96 020c8058 2005-01-04 devnull static char buf[100];
97 020c8058 2005-01-04 devnull char *p;
98 020c8058 2005-01-04 devnull int c;
99 020c8058 2005-01-04 devnull
100 020c8058 2005-01-04 devnull if (c0 == '\n')
101 020c8058 2005-01-04 devnull return "";
102 020c8058 2005-01-04 devnull buf[0] = c0;
103 020c8058 2005-01-04 devnull buf[1] = 0;
104 020c8058 2005-01-04 devnull screenprint("%s", buf);
105 020c8058 2005-01-04 devnull for (p = buf+1; (c = ekbd()) != '\n' && c != '\r' && c != -1 && c != Viewkey; ) {
106 020c8058 2005-01-04 devnull if (c == '\b' && p > buf) {
107 020c8058 2005-01-04 devnull *--p = ' ';
108 020c8058 2005-01-04 devnull } else {
109 020c8058 2005-01-04 devnull *p++ = c;
110 020c8058 2005-01-04 devnull *p = 0;
111 020c8058 2005-01-04 devnull }
112 020c8058 2005-01-04 devnull screenprint("%s", buf);
113 020c8058 2005-01-04 devnull }
114 020c8058 2005-01-04 devnull *p = 0;
115 020c8058 2005-01-04 devnull return buf;
116 020c8058 2005-01-04 devnull }
117 020c8058 2005-01-04 devnull
118 020c8058 2005-01-04 devnull
119 020c8058 2005-01-04 devnull #define button3(b) ((b) & 4)
120 020c8058 2005-01-04 devnull #define button2(b) ((b) & 2)
121 020c8058 2005-01-04 devnull #define button1(b) ((b) & 1)
122 020c8058 2005-01-04 devnull #define button23(b) ((b) & 6)
123 020c8058 2005-01-04 devnull #define button123(b) ((b) & 7)
124 020c8058 2005-01-04 devnull
125 020c8058 2005-01-04 devnull #define butcvt(b) (1 << ((b) - 1))
126 020c8058 2005-01-04 devnull
127 020c8058 2005-01-04 devnull #if 0
128 020c8058 2005-01-04 devnull static int buttondown(void) /* report state of buttons, if any */
129 020c8058 2005-01-04 devnull {
130 020c8058 2005-01-04 devnull if (!ecanmouse()) /* no event pending */
131 020c8058 2005-01-04 devnull return 0;
132 020c8058 2005-01-04 devnull mouse = emouse(); /* something, but it could be motion */
133 020c8058 2005-01-04 devnull return mouse.buttons & 7;
134 020c8058 2005-01-04 devnull }
135 020c8058 2005-01-04 devnull #endif
136 020c8058 2005-01-04 devnull
137 020c8058 2005-01-04 devnull int waitdown(void) /* wait until some button is down */
138 020c8058 2005-01-04 devnull {
139 020c8058 2005-01-04 devnull while (!(mouse.buttons & 7))
140 020c8058 2005-01-04 devnull mouse = emouse();
141 020c8058 2005-01-04 devnull return mouse.buttons & 7;
142 020c8058 2005-01-04 devnull }
143 020c8058 2005-01-04 devnull
144 020c8058 2005-01-04 devnull int waitup(void)
145 020c8058 2005-01-04 devnull {
146 020c8058 2005-01-04 devnull while (mouse.buttons & 7)
147 020c8058 2005-01-04 devnull mouse = emouse();
148 020c8058 2005-01-04 devnull return mouse.buttons & 7;
149 020c8058 2005-01-04 devnull }
150 020c8058 2005-01-04 devnull
151 020c8058 2005-01-04 devnull char *m3[] = { "next", "prev", "page n", "again", "bigger", "smaller", "pan", "quit?", 0 };
152 020c8058 2005-01-04 devnull char *m2[] = { 0 };
153 020c8058 2005-01-04 devnull
154 020c8058 2005-01-04 devnull enum { Next = 0, Prev, Page, Again, Bigger, Smaller, Pan, Quit };
155 020c8058 2005-01-04 devnull
156 020c8058 2005-01-04 devnull Menu mbut3 = { m3, 0, 0 };
157 020c8058 2005-01-04 devnull Menu mbut2 = { m2, 0, 0 };
158 020c8058 2005-01-04 devnull
159 020c8058 2005-01-04 devnull int last_hit;
160 020c8058 2005-01-04 devnull int last_but;
161 020c8058 2005-01-04 devnull
162 020c8058 2005-01-04 devnull char *pan(void)
163 020c8058 2005-01-04 devnull {
164 020c8058 2005-01-04 devnull Point dd, xy, lastxy, min, max;
165 020c8058 2005-01-04 devnull
166 020c8058 2005-01-04 devnull esetcursor(&blot);
167 020c8058 2005-01-04 devnull waitdown();
168 020c8058 2005-01-04 devnull xy = mouse.xy;
169 020c8058 2005-01-04 devnull do{
170 020c8058 2005-01-04 devnull lastxy = mouse.xy;
171 020c8058 2005-01-04 devnull mouse = emouse();
172 020c8058 2005-01-04 devnull dd = subpt(mouse.xy, lastxy);
173 020c8058 2005-01-04 devnull min = addpt(screen->clipr.min, dd);
174 020c8058 2005-01-04 devnull max = addpt(screen->clipr.max, dd);
175 020c8058 2005-01-04 devnull draw(screen, rectaddpt(screen->r, subpt(mouse.xy, lastxy)),
176 020c8058 2005-01-04 devnull screen, nil, screen->r.min);
177 020c8058 2005-01-04 devnull if(mouse.xy.x < lastxy.x) /* moved left, clear right */
178 020c8058 2005-01-04 devnull draw(screen, Rect(max.x, screen->r.min.y, screen->r.max.x, screen->r.max.y),
179 020c8058 2005-01-04 devnull display->white, nil, ZP);
180 020c8058 2005-01-04 devnull else /* moved right, clear left*/
181 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, screen->r.min.y, min.x, screen->r.max.y),
182 020c8058 2005-01-04 devnull display->white, nil, ZP);
183 020c8058 2005-01-04 devnull if(mouse.xy.y < lastxy.y) /* moved up, clear down */
184 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, max.y, screen->r.max.x, screen->r.max.y),
185 020c8058 2005-01-04 devnull display->white, nil, ZP);
186 020c8058 2005-01-04 devnull else /* moved down, clear up */
187 020c8058 2005-01-04 devnull draw(screen, Rect(screen->r.min.x, screen->r.min.y, screen->r.max.x, min.y),
188 020c8058 2005-01-04 devnull display->white, nil, ZP);
189 020c8058 2005-01-04 devnull flushimage(display, 1);
190 020c8058 2005-01-04 devnull }while(mouse.buttons);
191 020c8058 2005-01-04 devnull
192 020c8058 2005-01-04 devnull xyoffset = addpt(xyoffset, subpt(mouse.xy, xy));
193 020c8058 2005-01-04 devnull
194 020c8058 2005-01-04 devnull esetcursor(0);
195 020c8058 2005-01-04 devnull return "p";
196 020c8058 2005-01-04 devnull }
197 020c8058 2005-01-04 devnull
198 020c8058 2005-01-04 devnull static char *getmousestr(void)
199 020c8058 2005-01-04 devnull {
200 020c8058 2005-01-04 devnull static char buf[20];
201 020c8058 2005-01-04 devnull
202 020c8058 2005-01-04 devnull checkmouse();
203 020c8058 2005-01-04 devnull if (last_but == 1)
204 020c8058 2005-01-04 devnull return "p"; /* repaint after panning */
205 020c8058 2005-01-04 devnull if (last_but == 2) {
206 020c8058 2005-01-04 devnull return "c";
207 020c8058 2005-01-04 devnull } else if (last_but == 3) {
208 020c8058 2005-01-04 devnull switch (last_hit) {
209 020c8058 2005-01-04 devnull case Next:
210 020c8058 2005-01-04 devnull return "";
211 020c8058 2005-01-04 devnull case Prev:
212 020c8058 2005-01-04 devnull return "-1";
213 020c8058 2005-01-04 devnull case Page:
214 020c8058 2005-01-04 devnull screenprint("page? ");
215 020c8058 2005-01-04 devnull return "c";
216 020c8058 2005-01-04 devnull case Again:
217 020c8058 2005-01-04 devnull return "p";
218 020c8058 2005-01-04 devnull case Bigger:
219 020c8058 2005-01-04 devnull sprint(buf, "m%g", mag * 1.1);
220 020c8058 2005-01-04 devnull return buf;
221 020c8058 2005-01-04 devnull case Smaller:
222 020c8058 2005-01-04 devnull sprint(buf, "m%g", mag / 1.1);
223 020c8058 2005-01-04 devnull return buf;
224 020c8058 2005-01-04 devnull case Pan:
225 020c8058 2005-01-04 devnull return pan();
226 020c8058 2005-01-04 devnull case Quit:
227 020c8058 2005-01-04 devnull return "q";
228 020c8058 2005-01-04 devnull default:
229 020c8058 2005-01-04 devnull return "c";
230 020c8058 2005-01-04 devnull }
231 020c8058 2005-01-04 devnull } else { /* button 1 or bail out */
232 020c8058 2005-01-04 devnull return "c";
233 020c8058 2005-01-04 devnull }
234 020c8058 2005-01-04 devnull }
235 020c8058 2005-01-04 devnull
236 020c8058 2005-01-04 devnull static int
237 020c8058 2005-01-04 devnull checkmouse(void) /* return button touched if any */
238 020c8058 2005-01-04 devnull {
239 020c8058 2005-01-04 devnull int c, b;
240 020c8058 2005-01-04 devnull char *p;
241 020c8058 2005-01-04 devnull extern int confirm(int);
242 020c8058 2005-01-04 devnull
243 020c8058 2005-01-04 devnull b = waitdown();
244 020c8058 2005-01-04 devnull last_but = 0;
245 020c8058 2005-01-04 devnull last_hit = -1;
246 020c8058 2005-01-04 devnull c = 0;
247 020c8058 2005-01-04 devnull if (button3(b)) {
248 020c8058 2005-01-04 devnull last_hit = emenuhit(3, &mouse, &mbut3);
249 020c8058 2005-01-04 devnull last_but = 3;
250 020c8058 2005-01-04 devnull } else if (button2(b)) {
251 020c8058 2005-01-04 devnull last_hit = emenuhit(2, &mouse, &mbut2);
252 020c8058 2005-01-04 devnull last_but = 2;
253 020c8058 2005-01-04 devnull } else { /* button1() */
254 020c8058 2005-01-04 devnull pan();
255 020c8058 2005-01-04 devnull last_but = 1;
256 020c8058 2005-01-04 devnull }
257 020c8058 2005-01-04 devnull waitup();
258 020c8058 2005-01-04 devnull if (last_but == 3 && last_hit >= 0) {
259 020c8058 2005-01-04 devnull p = m3[last_hit];
260 020c8058 2005-01-04 devnull c = p[strlen(p) - 1];
261 020c8058 2005-01-04 devnull }
262 020c8058 2005-01-04 devnull if (c == '?' && !confirm(last_but))
263 020c8058 2005-01-04 devnull last_hit = -1;
264 020c8058 2005-01-04 devnull return last_but;
265 020c8058 2005-01-04 devnull }
266 020c8058 2005-01-04 devnull
267 020c8058 2005-01-04 devnull Cursor deadmouse = {
268 020c8058 2005-01-04 devnull { 0, 0}, /* offset */
269 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 020c8058 2005-01-04 devnull 0x00, 0x00, 0x00, 0x0C, 0x00, 0x82, 0x04, 0x41,
271 020c8058 2005-01-04 devnull 0xFF, 0xE1, 0x5F, 0xF1, 0x3F, 0xFE, 0x17, 0xF0,
272 020c8058 2005-01-04 devnull 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
273 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 020c8058 2005-01-04 devnull 0x00, 0x00, 0x00, 0x0C, 0x00, 0x82, 0x04, 0x41,
275 020c8058 2005-01-04 devnull 0xFF, 0xE1, 0x5F, 0xF1, 0x3F, 0xFE, 0x17, 0xF0,
276 020c8058 2005-01-04 devnull 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }
277 020c8058 2005-01-04 devnull };
278 020c8058 2005-01-04 devnull
279 020c8058 2005-01-04 devnull Cursor blot ={
280 020c8058 2005-01-04 devnull { 0, 0 },
281 020c8058 2005-01-04 devnull { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
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 };
290 020c8058 2005-01-04 devnull
291 020c8058 2005-01-04 devnull Cursor skull ={
292 020c8058 2005-01-04 devnull { 0, 0 },
293 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03,
294 020c8058 2005-01-04 devnull 0xE7, 0xE7, 0x3F, 0xFC, 0x0F, 0xF0, 0x0D, 0xB0,
295 020c8058 2005-01-04 devnull 0x07, 0xE0, 0x06, 0x60, 0x37, 0xEC, 0xE4, 0x27,
296 020c8058 2005-01-04 devnull 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
297 020c8058 2005-01-04 devnull { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03,
298 020c8058 2005-01-04 devnull 0xE7, 0xE7, 0x3F, 0xFC, 0x0F, 0xF0, 0x0D, 0xB0,
299 020c8058 2005-01-04 devnull 0x07, 0xE0, 0x06, 0x60, 0x37, 0xEC, 0xE4, 0x27,
300 020c8058 2005-01-04 devnull 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }
301 020c8058 2005-01-04 devnull };
302 020c8058 2005-01-04 devnull
303 020c8058 2005-01-04 devnull int
304 020c8058 2005-01-04 devnull confirm(int but) /* ask for confirmation if menu item ends with '?' */
305 020c8058 2005-01-04 devnull {
306 020c8058 2005-01-04 devnull int c;
307 020c8058 2005-01-04 devnull static int but_cvt[8] = { 0, 1, 2, 0, 3, 0, 0, 0 };
308 020c8058 2005-01-04 devnull
309 020c8058 2005-01-04 devnull esetcursor(&skull);
310 020c8058 2005-01-04 devnull c = waitdown();
311 020c8058 2005-01-04 devnull waitup();
312 020c8058 2005-01-04 devnull esetcursor(0);
313 020c8058 2005-01-04 devnull return but == but_cvt[c];
314 020c8058 2005-01-04 devnull }