Blame


1 a287dbab 2011-09-06 rsc /*
2 a287dbab 2011-09-06 rsc * Window system protocol server.
3 a287dbab 2011-09-06 rsc */
4 a287dbab 2011-09-06 rsc
5 a287dbab 2011-09-06 rsc #include <u.h>
6 a287dbab 2011-09-06 rsc #include <libc.h>
7 a287dbab 2011-09-06 rsc #include "cocoa-thread.h"
8 a287dbab 2011-09-06 rsc #include <draw.h>
9 a287dbab 2011-09-06 rsc #include <memdraw.h>
10 a287dbab 2011-09-06 rsc #include <keyboard.h>
11 a287dbab 2011-09-06 rsc #include <mouse.h>
12 a287dbab 2011-09-06 rsc #include <cursor.h>
13 a287dbab 2011-09-06 rsc #include <drawfcall.h>
14 a287dbab 2011-09-06 rsc #include "cocoa-screen.h"
15 a287dbab 2011-09-06 rsc #include "devdraw.h"
16 a287dbab 2011-09-06 rsc
17 a287dbab 2011-09-06 rsc typedef struct Kbdbuf Kbdbuf;
18 a287dbab 2011-09-06 rsc typedef struct Mousebuf Mousebuf;
19 a287dbab 2011-09-06 rsc typedef struct Fdbuf Fdbuf;
20 a287dbab 2011-09-06 rsc typedef struct Tagbuf Tagbuf;
21 a287dbab 2011-09-06 rsc
22 a287dbab 2011-09-06 rsc struct Kbdbuf
23 a287dbab 2011-09-06 rsc {
24 a287dbab 2011-09-06 rsc Rune r[32];
25 a287dbab 2011-09-06 rsc int ri;
26 a287dbab 2011-09-06 rsc int wi;
27 a287dbab 2011-09-06 rsc int stall;
28 a287dbab 2011-09-06 rsc };
29 a287dbab 2011-09-06 rsc
30 a287dbab 2011-09-06 rsc struct Mousebuf
31 a287dbab 2011-09-06 rsc {
32 a287dbab 2011-09-06 rsc Mouse m[32];
33 a287dbab 2011-09-06 rsc Mouse last;
34 a287dbab 2011-09-06 rsc int ri;
35 a287dbab 2011-09-06 rsc int wi;
36 a287dbab 2011-09-06 rsc int stall;
37 a287dbab 2011-09-06 rsc };
38 a287dbab 2011-09-06 rsc
39 a287dbab 2011-09-06 rsc struct Tagbuf
40 a287dbab 2011-09-06 rsc {
41 a287dbab 2011-09-06 rsc int t[32];
42 a287dbab 2011-09-06 rsc int ri;
43 a287dbab 2011-09-06 rsc int wi;
44 a287dbab 2011-09-06 rsc };
45 a287dbab 2011-09-06 rsc
46 a287dbab 2011-09-06 rsc Kbdbuf kbd;
47 a287dbab 2011-09-06 rsc Mousebuf mouse;
48 a287dbab 2011-09-06 rsc Tagbuf kbdtags;
49 a287dbab 2011-09-06 rsc Tagbuf mousetags;
50 a287dbab 2011-09-06 rsc
51 a287dbab 2011-09-06 rsc void runmsg(Wsysmsg*);
52 a287dbab 2011-09-06 rsc void replymsg(Wsysmsg*);
53 a287dbab 2011-09-06 rsc void matchkbd(void);
54 a287dbab 2011-09-06 rsc void matchmouse(void);
55 a287dbab 2011-09-06 rsc
56 a287dbab 2011-09-06 rsc
57 a287dbab 2011-09-06 rsc QLock lk;
58 a287dbab 2011-09-06 rsc void
59 a287dbab 2011-09-06 rsc zlock(void)
60 a287dbab 2011-09-06 rsc {
61 a287dbab 2011-09-06 rsc qlock(&lk);
62 a287dbab 2011-09-06 rsc }
63 a287dbab 2011-09-06 rsc
64 a287dbab 2011-09-06 rsc void
65 a287dbab 2011-09-06 rsc zunlock(void)
66 a287dbab 2011-09-06 rsc {
67 a287dbab 2011-09-06 rsc qunlock(&lk);
68 a287dbab 2011-09-06 rsc }
69 a287dbab 2011-09-06 rsc
70 a287dbab 2011-09-06 rsc int trace = 0;
71 a287dbab 2011-09-06 rsc
72 a287dbab 2011-09-06 rsc void
73 a287dbab 2011-09-06 rsc servep9p(void)
74 a287dbab 2011-09-06 rsc {
75 a287dbab 2011-09-06 rsc uchar buf[4], *mbuf;
76 a287dbab 2011-09-06 rsc int nmbuf, n, nn;
77 a287dbab 2011-09-06 rsc Wsysmsg m;
78 a287dbab 2011-09-06 rsc
79 a287dbab 2011-09-06 rsc fmtinstall('W', drawfcallfmt);
80 a287dbab 2011-09-06 rsc
81 a287dbab 2011-09-06 rsc mbuf = nil;
82 a287dbab 2011-09-06 rsc nmbuf = 0;
83 a287dbab 2011-09-06 rsc while((n = read(3, buf, 4)) == 4){
84 a287dbab 2011-09-06 rsc GET(buf, n);
85 a287dbab 2011-09-06 rsc if(n > nmbuf){
86 a287dbab 2011-09-06 rsc free(mbuf);
87 a287dbab 2011-09-06 rsc mbuf = malloc(4+n);
88 a287dbab 2011-09-06 rsc if(mbuf == nil)
89 a287dbab 2011-09-06 rsc sysfatal("malloc: %r");
90 a287dbab 2011-09-06 rsc nmbuf = n;
91 a287dbab 2011-09-06 rsc }
92 a287dbab 2011-09-06 rsc memmove(mbuf, buf, 4);
93 a287dbab 2011-09-06 rsc nn = readn(3, mbuf+4, n-4);
94 a287dbab 2011-09-06 rsc if(nn != n-4)
95 a287dbab 2011-09-06 rsc sysfatal("eof during message");
96 a287dbab 2011-09-06 rsc
97 a287dbab 2011-09-06 rsc /* pick off messages one by one */
98 a287dbab 2011-09-06 rsc if(convM2W(mbuf, nn+4, &m) <= 0)
99 a287dbab 2011-09-06 rsc sysfatal("cannot convert message");
100 a287dbab 2011-09-06 rsc if(trace) fprint(2, "<- %W\n", &m);
101 a287dbab 2011-09-06 rsc runmsg(&m);
102 a287dbab 2011-09-06 rsc }
103 a287dbab 2011-09-06 rsc }
104 a287dbab 2011-09-06 rsc
105 a287dbab 2011-09-06 rsc void
106 a287dbab 2011-09-06 rsc replyerror(Wsysmsg *m)
107 a287dbab 2011-09-06 rsc {
108 a287dbab 2011-09-06 rsc char err[256];
109 a287dbab 2011-09-06 rsc
110 a287dbab 2011-09-06 rsc rerrstr(err, sizeof err);
111 a287dbab 2011-09-06 rsc m->type = Rerror;
112 a287dbab 2011-09-06 rsc m->error = err;
113 a287dbab 2011-09-06 rsc replymsg(m);
114 a287dbab 2011-09-06 rsc }
115 a287dbab 2011-09-06 rsc
116 a287dbab 2011-09-06 rsc /*
117 a287dbab 2011-09-06 rsc * Handle a single wsysmsg.
118 a287dbab 2011-09-06 rsc * Might queue for later (kbd, mouse read)
119 a287dbab 2011-09-06 rsc */
120 a287dbab 2011-09-06 rsc void
121 a287dbab 2011-09-06 rsc runmsg(Wsysmsg *m)
122 a287dbab 2011-09-06 rsc {
123 a287dbab 2011-09-06 rsc static uchar buf[65536];
124 a287dbab 2011-09-06 rsc int n;
125 a287dbab 2011-09-06 rsc Memimage *i;
126 a287dbab 2011-09-06 rsc
127 a287dbab 2011-09-06 rsc switch(m->type){
128 a287dbab 2011-09-06 rsc case Tinit:
129 a287dbab 2011-09-06 rsc memimageinit();
130 a287dbab 2011-09-06 rsc i = attachscreen(m->label, m->winsize);
131 a287dbab 2011-09-06 rsc _initdisplaymemimage(i);
132 a287dbab 2011-09-06 rsc replymsg(m);
133 a287dbab 2011-09-06 rsc break;
134 a287dbab 2011-09-06 rsc
135 a287dbab 2011-09-06 rsc case Trdmouse:
136 a287dbab 2011-09-06 rsc zlock();
137 a287dbab 2011-09-06 rsc mousetags.t[mousetags.wi++] = m->tag;
138 a287dbab 2011-09-06 rsc if(mousetags.wi == nelem(mousetags.t))
139 a287dbab 2011-09-06 rsc mousetags.wi = 0;
140 a287dbab 2011-09-06 rsc if(mousetags.wi == mousetags.ri)
141 a287dbab 2011-09-06 rsc sysfatal("too many queued mouse reads");
142 a287dbab 2011-09-06 rsc mouse.stall = 0;
143 a287dbab 2011-09-06 rsc matchmouse();
144 a287dbab 2011-09-06 rsc zunlock();
145 a287dbab 2011-09-06 rsc break;
146 a287dbab 2011-09-06 rsc
147 a287dbab 2011-09-06 rsc case Trdkbd:
148 a287dbab 2011-09-06 rsc zlock();
149 a287dbab 2011-09-06 rsc kbdtags.t[kbdtags.wi++] = m->tag;
150 a287dbab 2011-09-06 rsc if(kbdtags.wi == nelem(kbdtags.t))
151 a287dbab 2011-09-06 rsc kbdtags.wi = 0;
152 a287dbab 2011-09-06 rsc if(kbdtags.wi == kbdtags.ri)
153 a287dbab 2011-09-06 rsc sysfatal("too many queued keyboard reads");
154 a287dbab 2011-09-06 rsc kbd.stall = 0;
155 a287dbab 2011-09-06 rsc matchkbd();
156 a287dbab 2011-09-06 rsc zunlock();
157 a287dbab 2011-09-06 rsc break;
158 a287dbab 2011-09-06 rsc
159 a287dbab 2011-09-06 rsc case Tmoveto:
160 a287dbab 2011-09-06 rsc setmouse(m->mouse.xy);
161 a287dbab 2011-09-06 rsc replymsg(m);
162 a287dbab 2011-09-06 rsc break;
163 a287dbab 2011-09-06 rsc
164 a287dbab 2011-09-06 rsc case Tcursor:
165 a287dbab 2011-09-06 rsc if(m->arrowcursor)
166 a287dbab 2011-09-06 rsc setcursor(nil);
167 a287dbab 2011-09-06 rsc else
168 a287dbab 2011-09-06 rsc setcursor(&m->cursor);
169 a287dbab 2011-09-06 rsc replymsg(m);
170 a287dbab 2011-09-06 rsc break;
171 a287dbab 2011-09-06 rsc
172 a287dbab 2011-09-06 rsc case Tbouncemouse:
173 a287dbab 2011-09-06 rsc // _xbouncemouse(&m->mouse);
174 a287dbab 2011-09-06 rsc replymsg(m);
175 a287dbab 2011-09-06 rsc break;
176 a287dbab 2011-09-06 rsc
177 a287dbab 2011-09-06 rsc case Tlabel:
178 a287dbab 2011-09-06 rsc kicklabel(m->label);
179 a287dbab 2011-09-06 rsc replymsg(m);
180 a287dbab 2011-09-06 rsc break;
181 a287dbab 2011-09-06 rsc
182 a287dbab 2011-09-06 rsc case Trdsnarf:
183 a287dbab 2011-09-06 rsc m->snarf = getsnarf();
184 a287dbab 2011-09-06 rsc replymsg(m);
185 a287dbab 2011-09-06 rsc free(m->snarf);
186 a287dbab 2011-09-06 rsc break;
187 a287dbab 2011-09-06 rsc
188 a287dbab 2011-09-06 rsc case Twrsnarf:
189 a287dbab 2011-09-06 rsc putsnarf(m->snarf);
190 a287dbab 2011-09-06 rsc replymsg(m);
191 a287dbab 2011-09-06 rsc break;
192 a287dbab 2011-09-06 rsc
193 a287dbab 2011-09-06 rsc case Trddraw:
194 a287dbab 2011-09-06 rsc n = m->count;
195 a287dbab 2011-09-06 rsc if(n > sizeof buf)
196 a287dbab 2011-09-06 rsc n = sizeof buf;
197 a287dbab 2011-09-06 rsc n = _drawmsgread(buf, n);
198 a287dbab 2011-09-06 rsc if(n < 0)
199 a287dbab 2011-09-06 rsc replyerror(m);
200 a287dbab 2011-09-06 rsc else{
201 a287dbab 2011-09-06 rsc m->count = n;
202 a287dbab 2011-09-06 rsc m->data = buf;
203 a287dbab 2011-09-06 rsc replymsg(m);
204 a287dbab 2011-09-06 rsc }
205 a287dbab 2011-09-06 rsc break;
206 a287dbab 2011-09-06 rsc
207 a287dbab 2011-09-06 rsc case Twrdraw:
208 a287dbab 2011-09-06 rsc if(_drawmsgwrite(m->data, m->count) < 0)
209 a287dbab 2011-09-06 rsc replyerror(m);
210 a287dbab 2011-09-06 rsc else
211 a287dbab 2011-09-06 rsc replymsg(m);
212 a287dbab 2011-09-06 rsc break;
213 a287dbab 2011-09-06 rsc
214 a287dbab 2011-09-06 rsc case Ttop:
215 e89a71ff 2012-01-16 rsc topwin();
216 a287dbab 2011-09-06 rsc replymsg(m);
217 a287dbab 2011-09-06 rsc break;
218 a287dbab 2011-09-06 rsc
219 a287dbab 2011-09-06 rsc case Tresize:
220 a287dbab 2011-09-06 rsc // _xresizewindow(m->rect);
221 a287dbab 2011-09-06 rsc replymsg(m);
222 a287dbab 2011-09-06 rsc break;
223 a287dbab 2011-09-06 rsc }
224 a287dbab 2011-09-06 rsc }
225 a287dbab 2011-09-06 rsc
226 a287dbab 2011-09-06 rsc /*
227 a287dbab 2011-09-06 rsc * Reply to m.
228 a287dbab 2011-09-06 rsc */
229 a287dbab 2011-09-06 rsc QLock replylock;
230 a287dbab 2011-09-06 rsc void
231 a287dbab 2011-09-06 rsc replymsg(Wsysmsg *m)
232 a287dbab 2011-09-06 rsc {
233 a287dbab 2011-09-06 rsc int n;
234 a287dbab 2011-09-06 rsc static uchar *mbuf;
235 a287dbab 2011-09-06 rsc static int nmbuf;
236 a287dbab 2011-09-06 rsc
237 a287dbab 2011-09-06 rsc /* T -> R msg */
238 a287dbab 2011-09-06 rsc if(m->type%2 == 0)
239 a287dbab 2011-09-06 rsc m->type++;
240 a287dbab 2011-09-06 rsc
241 a287dbab 2011-09-06 rsc if(trace) fprint(2, "-> %W\n", m);
242 a287dbab 2011-09-06 rsc /* copy to output buffer */
243 a287dbab 2011-09-06 rsc n = sizeW2M(m);
244 a287dbab 2011-09-06 rsc
245 a287dbab 2011-09-06 rsc qlock(&replylock);
246 a287dbab 2011-09-06 rsc if(n > nmbuf){
247 a287dbab 2011-09-06 rsc free(mbuf);
248 a287dbab 2011-09-06 rsc mbuf = malloc(n);
249 a287dbab 2011-09-06 rsc if(mbuf == nil)
250 a287dbab 2011-09-06 rsc sysfatal("out of memory");
251 a287dbab 2011-09-06 rsc nmbuf = n;
252 a287dbab 2011-09-06 rsc }
253 a287dbab 2011-09-06 rsc convW2M(m, mbuf, n);
254 a287dbab 2011-09-06 rsc if(write(4, mbuf, n) != n)
255 a287dbab 2011-09-06 rsc sysfatal("write: %r");
256 a287dbab 2011-09-06 rsc qunlock(&replylock);
257 a287dbab 2011-09-06 rsc }
258 a287dbab 2011-09-06 rsc
259 a287dbab 2011-09-06 rsc /*
260 a287dbab 2011-09-06 rsc * Match queued kbd reads with queued kbd characters.
261 a287dbab 2011-09-06 rsc */
262 a287dbab 2011-09-06 rsc void
263 a287dbab 2011-09-06 rsc matchkbd(void)
264 a287dbab 2011-09-06 rsc {
265 a287dbab 2011-09-06 rsc Wsysmsg m;
266 a287dbab 2011-09-06 rsc
267 a287dbab 2011-09-06 rsc if(kbd.stall)
268 a287dbab 2011-09-06 rsc return;
269 a287dbab 2011-09-06 rsc while(kbd.ri != kbd.wi && kbdtags.ri != kbdtags.wi){
270 a287dbab 2011-09-06 rsc m.type = Rrdkbd;
271 a287dbab 2011-09-06 rsc m.tag = kbdtags.t[kbdtags.ri++];
272 a287dbab 2011-09-06 rsc if(kbdtags.ri == nelem(kbdtags.t))
273 a287dbab 2011-09-06 rsc kbdtags.ri = 0;
274 a287dbab 2011-09-06 rsc m.rune = kbd.r[kbd.ri++];
275 a287dbab 2011-09-06 rsc if(kbd.ri == nelem(kbd.r))
276 a287dbab 2011-09-06 rsc kbd.ri = 0;
277 a287dbab 2011-09-06 rsc replymsg(&m);
278 a287dbab 2011-09-06 rsc }
279 a287dbab 2011-09-06 rsc }
280 a287dbab 2011-09-06 rsc
281 a287dbab 2011-09-06 rsc /*
282 a287dbab 2011-09-06 rsc * Match queued mouse reads with queued mouse events.
283 a287dbab 2011-09-06 rsc */
284 a287dbab 2011-09-06 rsc void
285 a287dbab 2011-09-06 rsc matchmouse(void)
286 a287dbab 2011-09-06 rsc {
287 a287dbab 2011-09-06 rsc Wsysmsg m;
288 a287dbab 2011-09-06 rsc
289 a287dbab 2011-09-06 rsc while(mouse.ri != mouse.wi && mousetags.ri != mousetags.wi){
290 a287dbab 2011-09-06 rsc m.type = Rrdmouse;
291 a287dbab 2011-09-06 rsc m.tag = mousetags.t[mousetags.ri++];
292 a287dbab 2011-09-06 rsc if(mousetags.ri == nelem(mousetags.t))
293 a287dbab 2011-09-06 rsc mousetags.ri = 0;
294 a287dbab 2011-09-06 rsc m.mouse = mouse.m[mouse.ri];
295 a287dbab 2011-09-06 rsc m.resized = mouseresized;
296 a287dbab 2011-09-06 rsc /*
297 a287dbab 2011-09-06 rsc if(m.resized)
298 a287dbab 2011-09-06 rsc fprint(2, "sending resize\n");
299 a287dbab 2011-09-06 rsc */
300 a287dbab 2011-09-06 rsc mouseresized = 0;
301 a287dbab 2011-09-06 rsc mouse.ri++;
302 a287dbab 2011-09-06 rsc if(mouse.ri == nelem(mouse.m))
303 a287dbab 2011-09-06 rsc mouse.ri = 0;
304 a287dbab 2011-09-06 rsc replymsg(&m);
305 a287dbab 2011-09-06 rsc }
306 a287dbab 2011-09-06 rsc }
307 a287dbab 2011-09-06 rsc
308 a287dbab 2011-09-06 rsc void
309 48107872 2011-09-19 rsc mousetrack(int x, int y, int b, uint ms)
310 a287dbab 2011-09-06 rsc {
311 a287dbab 2011-09-06 rsc Mouse *m;
312 a287dbab 2011-09-06 rsc
313 a287dbab 2011-09-06 rsc if(x < mouserect.min.x)
314 a287dbab 2011-09-06 rsc x = mouserect.min.x;
315 a287dbab 2011-09-06 rsc if(x > mouserect.max.x)
316 a287dbab 2011-09-06 rsc x = mouserect.max.x;
317 a287dbab 2011-09-06 rsc if(y < mouserect.min.y)
318 a287dbab 2011-09-06 rsc y = mouserect.min.y;
319 a287dbab 2011-09-06 rsc if(y > mouserect.max.y)
320 a287dbab 2011-09-06 rsc y = mouserect.max.y;
321 a287dbab 2011-09-06 rsc
322 a287dbab 2011-09-06 rsc zlock();
323 a287dbab 2011-09-06 rsc // If reader has stopped reading, don't bother.
324 a287dbab 2011-09-06 rsc // If reader is completely caught up, definitely queue.
325 a287dbab 2011-09-06 rsc // Otherwise, queue only button change events.
326 a287dbab 2011-09-06 rsc if(!mouse.stall)
327 a287dbab 2011-09-06 rsc if(mouse.wi == mouse.ri || mouse.last.buttons != b){
328 a287dbab 2011-09-06 rsc m = &mouse.last;
329 a287dbab 2011-09-06 rsc m->xy.x = x;
330 a287dbab 2011-09-06 rsc m->xy.y = y;
331 a287dbab 2011-09-06 rsc m->buttons = b;
332 a287dbab 2011-09-06 rsc m->msec = ms;
333 a287dbab 2011-09-06 rsc
334 a287dbab 2011-09-06 rsc mouse.m[mouse.wi] = *m;
335 a287dbab 2011-09-06 rsc if(++mouse.wi == nelem(mouse.m))
336 a287dbab 2011-09-06 rsc mouse.wi = 0;
337 a287dbab 2011-09-06 rsc if(mouse.wi == mouse.ri){
338 a287dbab 2011-09-06 rsc mouse.stall = 1;
339 a287dbab 2011-09-06 rsc mouse.ri = 0;
340 a287dbab 2011-09-06 rsc mouse.wi = 1;
341 a287dbab 2011-09-06 rsc mouse.m[0] = *m;
342 a287dbab 2011-09-06 rsc }
343 a287dbab 2011-09-06 rsc matchmouse();
344 a287dbab 2011-09-06 rsc }
345 a287dbab 2011-09-06 rsc zunlock();
346 a287dbab 2011-09-06 rsc }
347 a287dbab 2011-09-06 rsc
348 a287dbab 2011-09-06 rsc void
349 a287dbab 2011-09-06 rsc kputc(int c)
350 a287dbab 2011-09-06 rsc {
351 a287dbab 2011-09-06 rsc zlock();
352 a287dbab 2011-09-06 rsc kbd.r[kbd.wi++] = c;
353 a287dbab 2011-09-06 rsc if(kbd.wi == nelem(kbd.r))
354 a287dbab 2011-09-06 rsc kbd.wi = 0;
355 a287dbab 2011-09-06 rsc if(kbd.ri == kbd.wi)
356 a287dbab 2011-09-06 rsc kbd.stall = 1;
357 a287dbab 2011-09-06 rsc matchkbd();
358 a287dbab 2011-09-06 rsc zunlock();
359 73b0f029 2012-01-16 rsc }
360 73b0f029 2012-01-16 rsc
361 73b0f029 2012-01-16 rsc static int alting;
362 73b0f029 2012-01-16 rsc
363 73b0f029 2012-01-16 rsc void
364 73b0f029 2012-01-16 rsc abortcompose(void)
365 73b0f029 2012-01-16 rsc {
366 73b0f029 2012-01-16 rsc if(alting)
367 73b0f029 2012-01-16 rsc keystroke(Kalt);
368 a287dbab 2011-09-06 rsc }
369 55905845 2012-11-26 rsc
370 55905845 2012-11-26 rsc void resizeimg(void);
371 a287dbab 2011-09-06 rsc
372 a287dbab 2011-09-06 rsc void
373 a287dbab 2011-09-06 rsc keystroke(int c)
374 a287dbab 2011-09-06 rsc {
375 a287dbab 2011-09-06 rsc static Rune k[10];
376 73b0f029 2012-01-16 rsc static int nk;
377 a287dbab 2011-09-06 rsc int i;
378 a287dbab 2011-09-06 rsc
379 a287dbab 2011-09-06 rsc if(c == Kalt){
380 a287dbab 2011-09-06 rsc alting = !alting;
381 73b0f029 2012-01-16 rsc nk = 0;
382 55905845 2012-11-26 rsc return;
383 55905845 2012-11-26 rsc }
384 ffaaaf9d 2012-11-26 rsc if(c == Kcmd+'r') {
385 55905845 2012-11-26 rsc if(forcedpi)
386 55905845 2012-11-26 rsc forcedpi = 0;
387 55905845 2012-11-26 rsc else if(displaydpi >= 200)
388 55905845 2012-11-26 rsc forcedpi = 100;
389 55905845 2012-11-26 rsc else
390 55905845 2012-11-26 rsc forcedpi = 225;
391 55905845 2012-11-26 rsc resizeimg();
392 a287dbab 2011-09-06 rsc return;
393 a287dbab 2011-09-06 rsc }
394 a287dbab 2011-09-06 rsc if(!alting){
395 a287dbab 2011-09-06 rsc kputc(c);
396 a287dbab 2011-09-06 rsc return;
397 a287dbab 2011-09-06 rsc }
398 a287dbab 2011-09-06 rsc if(nk >= nelem(k)) // should not happen
399 a287dbab 2011-09-06 rsc nk = 0;
400 a287dbab 2011-09-06 rsc k[nk++] = c;
401 a287dbab 2011-09-06 rsc c = _latin1(k, nk);
402 a287dbab 2011-09-06 rsc if(c > 0){
403 a287dbab 2011-09-06 rsc alting = 0;
404 a287dbab 2011-09-06 rsc kputc(c);
405 a287dbab 2011-09-06 rsc nk = 0;
406 a287dbab 2011-09-06 rsc return;
407 a287dbab 2011-09-06 rsc }
408 a287dbab 2011-09-06 rsc if(c == -1){
409 a287dbab 2011-09-06 rsc alting = 0;
410 a287dbab 2011-09-06 rsc for(i=0; i<nk; i++)
411 a287dbab 2011-09-06 rsc kputc(k[i]);
412 a287dbab 2011-09-06 rsc nk = 0;
413 a287dbab 2011-09-06 rsc return;
414 a287dbab 2011-09-06 rsc }
415 a287dbab 2011-09-06 rsc // need more input
416 a287dbab 2011-09-06 rsc return;
417 a287dbab 2011-09-06 rsc }