1 76193d7c 2003-09-30 devnull #include <u.h>
2 74dc60da 2006-06-25 devnull #include <sys/select.h>
3 76193d7c 2003-09-30 devnull #include <libc.h>
4 76193d7c 2003-09-30 devnull #include <draw.h>
5 76193d7c 2003-09-30 devnull #include <cursor.h>
6 76193d7c 2003-09-30 devnull #include <event.h>
7 150f8802 2006-06-25 devnull #include <mux.h>
8 150f8802 2006-06-25 devnull #include <drawfcall.h>
10 150f8802 2006-06-25 devnull typedef struct Slave Slave;
11 150f8802 2006-06-25 devnull typedef struct Ebuf Ebuf;
12 54bebe6a 2012-09-17 rsc extern Mouse _drawmouse;
14 150f8802 2006-06-25 devnull struct Slave
16 150f8802 2006-06-25 devnull int inuse;
17 150f8802 2006-06-25 devnull Ebuf *head; /* queue of messages for this descriptor */
18 150f8802 2006-06-25 devnull Ebuf *tail;
19 150f8802 2006-06-25 devnull int (*fn)(int, Event*, uchar*, int);
20 150f8802 2006-06-25 devnull Muxrpc *rpc;
21 150f8802 2006-06-25 devnull vlong nexttick;
26 150f8802 2006-06-25 devnull struct Ebuf
28 150f8802 2006-06-25 devnull Ebuf *next;
29 150f8802 2006-06-25 devnull int n; /* number of bytes in buf */
31 150f8802 2006-06-25 devnull uchar buf[EMAXMSG];
32 150f8802 2006-06-25 devnull Rune rune;
33 150f8802 2006-06-25 devnull Mouse mouse;
37 150f8802 2006-06-25 devnull static Slave eslave[MAXSLAVE];
38 76193d7c 2003-09-30 devnull static int Skeyboard = -1;
39 76193d7c 2003-09-30 devnull static int Smouse = -1;
40 76193d7c 2003-09-30 devnull static int Stimer = -1;
42 76193d7c 2003-09-30 devnull static int nslave;
43 150f8802 2006-06-25 devnull static int newkey(ulong);
44 150f8802 2006-06-25 devnull static int extract(int canblock);
48 76193d7c 2003-09-30 devnull ebread(Slave *s)
50 76193d7c 2003-09-30 devnull Ebuf *eb;
52 150f8802 2006-06-25 devnull while(!s->head)
53 150f8802 2006-06-25 devnull extract(1);
54 76193d7c 2003-09-30 devnull eb = s->head;
55 76193d7c 2003-09-30 devnull s->head = s->head->next;
56 76193d7c 2003-09-30 devnull if(s->head == 0)
57 76193d7c 2003-09-30 devnull s->tail = 0;
58 76193d7c 2003-09-30 devnull return eb;
62 76193d7c 2003-09-30 devnull event(Event *e)
64 76193d7c 2003-09-30 devnull return eread(~0UL, e);
68 76193d7c 2003-09-30 devnull eread(ulong keys, Event *e)
70 76193d7c 2003-09-30 devnull Ebuf *eb;
71 76193d7c 2003-09-30 devnull int i, id;
73 76193d7c 2003-09-30 devnull if(keys == 0)
74 76193d7c 2003-09-30 devnull return 0;
76 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
77 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head){
78 76193d7c 2003-09-30 devnull id = 1<<i;
79 76193d7c 2003-09-30 devnull if(i == Smouse)
80 76193d7c 2003-09-30 devnull e->mouse = emouse();
81 76193d7c 2003-09-30 devnull else if(i == Skeyboard)
82 76193d7c 2003-09-30 devnull e->kbdc = ekbd();
83 76193d7c 2003-09-30 devnull else if(i == Stimer)
84 76193d7c 2003-09-30 devnull eslave[i].head = 0;
86 76193d7c 2003-09-30 devnull eb = ebread(&eslave[i]);
87 76193d7c 2003-09-30 devnull e->n = eb->n;
88 76193d7c 2003-09-30 devnull if(eslave[i].fn)
89 150f8802 2006-06-25 devnull id = (*eslave[i].fn)(id, e, eb->u.buf, eb->n);
91 150f8802 2006-06-25 devnull memmove(e->data, eb->u.buf, eb->n);
92 76193d7c 2003-09-30 devnull free(eb);
94 76193d7c 2003-09-30 devnull return id;
96 33da33e7 2006-11-05 devnull extract(1);
98 76193d7c 2003-09-30 devnull return 0;
102 76193d7c 2003-09-30 devnull ecanmouse(void)
104 76193d7c 2003-09-30 devnull if(Smouse < 0)
105 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
106 76193d7c 2003-09-30 devnull return ecanread(Emouse);
110 76193d7c 2003-09-30 devnull ecankbd(void)
112 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
113 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
114 76193d7c 2003-09-30 devnull return ecanread(Ekeyboard);
118 76193d7c 2003-09-30 devnull ecanread(ulong keys)
122 76193d7c 2003-09-30 devnull for(;;){
123 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
124 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head)
125 76193d7c 2003-09-30 devnull return 1;
126 150f8802 2006-06-25 devnull if(!extract(0))
127 76193d7c 2003-09-30 devnull return 0;
129 76193d7c 2003-09-30 devnull return -1;
133 76193d7c 2003-09-30 devnull estartfn(ulong key, int fd, int n, int (*fn)(int, Event*, uchar*, int))
137 76193d7c 2003-09-30 devnull if(fd < 0)
138 76193d7c 2003-09-30 devnull drawerror(display, "events: bad file descriptor");
139 76193d7c 2003-09-30 devnull if(n <= 0 || n > EMAXMSG)
140 76193d7c 2003-09-30 devnull n = EMAXMSG;
141 150f8802 2006-06-25 devnull i = newkey(key);
142 150f8802 2006-06-25 devnull eslave[i].fn = fn;
143 150f8802 2006-06-25 devnull eslave[i].fd = fd;
144 150f8802 2006-06-25 devnull eslave[i].n = n;
145 150f8802 2006-06-25 devnull return 1<<i;
149 76193d7c 2003-09-30 devnull estart(ulong key, int fd, int n)
151 76193d7c 2003-09-30 devnull return estartfn(key, fd, n, nil);
155 76193d7c 2003-09-30 devnull etimer(ulong key, int n)
157 76193d7c 2003-09-30 devnull if(Stimer != -1)
158 76193d7c 2003-09-30 devnull drawerror(display, "events: timer started twice");
159 150f8802 2006-06-25 devnull Stimer = newkey(key);
160 76193d7c 2003-09-30 devnull if(n <= 0)
161 76193d7c 2003-09-30 devnull n = 1000;
162 150f8802 2006-06-25 devnull eslave[Stimer].n = n;
163 0a98a883 2008-01-11 rsc eslave[Stimer].nexttick = nsec()+n*1000000LL;
164 150f8802 2006-06-25 devnull return 1<<Stimer;
168 76193d7c 2003-09-30 devnull einit(ulong keys)
170 76193d7c 2003-09-30 devnull if(keys&Ekeyboard){
171 76193d7c 2003-09-30 devnull for(Skeyboard=0; Ekeyboard & ~(1<<Skeyboard); Skeyboard++)
173 150f8802 2006-06-25 devnull eslave[Skeyboard].inuse = 1;
174 150f8802 2006-06-25 devnull if(nslave <= Skeyboard)
175 150f8802 2006-06-25 devnull nslave = Skeyboard+1;
177 76193d7c 2003-09-30 devnull if(keys&Emouse){
178 76193d7c 2003-09-30 devnull for(Smouse=0; Emouse & ~(1<<Smouse); Smouse++)
180 150f8802 2006-06-25 devnull eslave[Smouse].inuse = 1;
181 150f8802 2006-06-25 devnull if(nslave <= Smouse)
182 150f8802 2006-06-25 devnull nslave = Smouse+1;
186 150f8802 2006-06-25 devnull static Ebuf*
187 150f8802 2006-06-25 devnull newebuf(Slave *s, int n)
189 76193d7c 2003-09-30 devnull Ebuf *eb;
191 150f8802 2006-06-25 devnull eb = malloc(sizeof(*eb) - sizeof(eb->u.buf) + n);
192 150f8802 2006-06-25 devnull if(eb == nil)
193 150f8802 2006-06-25 devnull drawerror(display, "events: out of memory");
194 150f8802 2006-06-25 devnull eb->n = n;
195 150f8802 2006-06-25 devnull eb->next = 0;
196 150f8802 2006-06-25 devnull if(s->head)
197 150f8802 2006-06-25 devnull s->tail = s->tail->next = eb;
199 150f8802 2006-06-25 devnull s->head = s->tail = eb;
200 150f8802 2006-06-25 devnull return eb;
203 150f8802 2006-06-25 devnull static Muxrpc*
204 150f8802 2006-06-25 devnull startrpc(int type)
206 d92ac2d1 2022-07-26 crossd uchar buf[512];
207 150f8802 2006-06-25 devnull Wsysmsg w;
209 150f8802 2006-06-25 devnull w.type = type;
210 07b24459 2022-07-26 crossd if(convW2M(&w, buf, sizeof buf) == 0)
211 07b24459 2022-07-26 crossd return nil;
212 150f8802 2006-06-25 devnull return muxrpcstart(display->mux, buf);
215 150f8802 2006-06-25 devnull static int
216 150f8802 2006-06-25 devnull finishrpc(Muxrpc *r, Wsysmsg *w)
218 150f8802 2006-06-25 devnull uchar *p;
219 3a194702 2006-11-04 devnull void *v;
222 3a194702 2006-11-04 devnull if(!muxrpccanfinish(r, &v))
223 150f8802 2006-06-25 devnull return 0;
225 3a194702 2006-11-04 devnull if(p == nil) /* eof on connection */
226 3a194702 2006-11-04 devnull exit(0);
227 150f8802 2006-06-25 devnull GET(p, n);
228 150f8802 2006-06-25 devnull convM2W(p, n, w);
229 150f8802 2006-06-25 devnull free(p);
230 150f8802 2006-06-25 devnull return 1;
233 150f8802 2006-06-25 devnull static int
234 150f8802 2006-06-25 devnull extract(int canblock)
236 150f8802 2006-06-25 devnull Ebuf *eb;
237 150f8802 2006-06-25 devnull int i, n, max;
238 150f8802 2006-06-25 devnull fd_set rset, wset, xset;
239 150f8802 2006-06-25 devnull struct timeval tv, *timeout;
240 150f8802 2006-06-25 devnull Wsysmsg w;
241 150f8802 2006-06-25 devnull vlong t0;
244 150f8802 2006-06-25 devnull * Flush draw buffer before waiting for responses.
245 150f8802 2006-06-25 devnull * Avoid doing so if buffer is empty.
246 150f8802 2006-06-25 devnull * Also make sure that we don't interfere with app-specific locking.
248 76193d7c 2003-09-30 devnull if(display->locking){
250 fa325e9b 2020-01-10 cross * if locking is being done by program,
251 fa325e9b 2020-01-10 cross * this means it can't depend on automatic
252 150f8802 2006-06-25 devnull * flush in emouse() etc.
254 76193d7c 2003-09-30 devnull if(canqlock(&display->qlock)){
255 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
256 76193d7c 2003-09-30 devnull flushimage(display, 1);
257 76193d7c 2003-09-30 devnull unlockdisplay(display);
260 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
261 76193d7c 2003-09-30 devnull flushimage(display, 1);
264 150f8802 2006-06-25 devnull * Set up for select.
266 150f8802 2006-06-25 devnull FD_ZERO(&rset);
267 150f8802 2006-06-25 devnull FD_ZERO(&wset);
268 150f8802 2006-06-25 devnull FD_ZERO(&xset);
269 150f8802 2006-06-25 devnull max = -1;
270 150f8802 2006-06-25 devnull timeout = nil;
271 150f8802 2006-06-25 devnull for(i=0; i<nslave; i++){
272 150f8802 2006-06-25 devnull if(!eslave[i].inuse)
273 150f8802 2006-06-25 devnull continue;
274 150f8802 2006-06-25 devnull if(i == Smouse){
275 150f8802 2006-06-25 devnull if(eslave[i].rpc == nil)
276 150f8802 2006-06-25 devnull eslave[i].rpc = startrpc(Trdmouse);
277 150f8802 2006-06-25 devnull if(eslave[i].rpc){
278 3a194702 2006-11-04 devnull /* if ready, don't block in select */
279 3a194702 2006-11-04 devnull if(eslave[i].rpc->p)
280 3a194702 2006-11-04 devnull canblock = 0;
281 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &rset);
282 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &xset);
283 150f8802 2006-06-25 devnull if(display->srvfd > max)
284 150f8802 2006-06-25 devnull max = display->srvfd;
286 150f8802 2006-06-25 devnull }else if(i == Skeyboard){
287 150f8802 2006-06-25 devnull if(eslave[i].rpc == nil)
288 d25d0ca1 2020-05-19 rsc eslave[i].rpc = startrpc(Trdkbd4);
289 150f8802 2006-06-25 devnull if(eslave[i].rpc){
290 3a194702 2006-11-04 devnull /* if ready, don't block in select */
291 3a194702 2006-11-04 devnull if(eslave[i].rpc->p)
292 3a194702 2006-11-04 devnull canblock = 0;
293 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &rset);
294 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &xset);
295 150f8802 2006-06-25 devnull if(display->srvfd > max)
296 150f8802 2006-06-25 devnull max = display->srvfd;
298 150f8802 2006-06-25 devnull }else if(i == Stimer){
299 150f8802 2006-06-25 devnull t0 = nsec();
300 0a98a883 2008-01-11 rsc if(t0 >= eslave[i].nexttick){
301 150f8802 2006-06-25 devnull tv.tv_sec = 0;
302 150f8802 2006-06-25 devnull tv.tv_usec = 0;
304 0a98a883 2008-01-11 rsc tv.tv_sec = (eslave[i].nexttick-t0)/1000000000;
305 0a98a883 2008-01-11 rsc tv.tv_usec = (eslave[i].nexttick-t0)%1000000000 / 1000;
307 150f8802 2006-06-25 devnull timeout = &tv;
309 150f8802 2006-06-25 devnull FD_SET(eslave[i].fd, &rset);
310 150f8802 2006-06-25 devnull FD_SET(eslave[i].fd, &xset);
311 150f8802 2006-06-25 devnull if(eslave[i].fd > max)
312 150f8802 2006-06-25 devnull max = eslave[i].fd;
316 150f8802 2006-06-25 devnull if(!canblock){
317 150f8802 2006-06-25 devnull tv.tv_sec = 0;
318 150f8802 2006-06-25 devnull tv.tv_usec = 0;
319 150f8802 2006-06-25 devnull timeout = &tv;
322 150f8802 2006-06-25 devnull if(select(max+1, &rset, &wset, &xset, timeout) < 0)
323 150f8802 2006-06-25 devnull drawerror(display, "select failure");
326 150f8802 2006-06-25 devnull * Look to see what can proceed.
329 150f8802 2006-06-25 devnull for(i=0; i<nslave; i++){
330 150f8802 2006-06-25 devnull if(!eslave[i].inuse)
331 150f8802 2006-06-25 devnull continue;
332 150f8802 2006-06-25 devnull if(i == Smouse){
333 150f8802 2006-06-25 devnull if(finishrpc(eslave[i].rpc, &w)){
334 150f8802 2006-06-25 devnull eslave[i].rpc = nil;
335 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], sizeof(Mouse));
336 54bebe6a 2012-09-17 rsc _drawmouse = w.mouse;
337 150f8802 2006-06-25 devnull eb->u.mouse = w.mouse;
338 150f8802 2006-06-25 devnull if(w.resized)
339 150f8802 2006-06-25 devnull eresized(1);
342 150f8802 2006-06-25 devnull }else if(i == Skeyboard){
343 150f8802 2006-06-25 devnull if(finishrpc(eslave[i].rpc, &w)){
344 150f8802 2006-06-25 devnull eslave[i].rpc = nil;
345 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], sizeof(Rune)+2); /* +8: alignment */
346 150f8802 2006-06-25 devnull eb->u.rune = w.rune;
349 150f8802 2006-06-25 devnull }else if(i == Stimer){
350 150f8802 2006-06-25 devnull t0 = nsec();
351 0a98a883 2008-01-11 rsc while(t0 > eslave[i].nexttick){
352 0a98a883 2008-01-11 rsc eslave[i].nexttick += eslave[i].n*1000000LL;
353 150f8802 2006-06-25 devnull eslave[i].head = (Ebuf*)1;
357 150f8802 2006-06-25 devnull if(FD_ISSET(eslave[i].fd, &rset)){
358 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], eslave[i].n);
359 150f8802 2006-06-25 devnull eb->n = read(eslave[i].fd, eb->u.buf, eslave[i].n);
364 150f8802 2006-06-25 devnull return n;
367 76193d7c 2003-09-30 devnull static int
368 150f8802 2006-06-25 devnull newkey(ulong key)
372 76193d7c 2003-09-30 devnull for(i=0; i<MAXSLAVE; i++)
373 150f8802 2006-06-25 devnull if((key & ~(1<<i)) == 0 && eslave[i].inuse == 0){
374 76193d7c 2003-09-30 devnull if(nslave <= i)
375 76193d7c 2003-09-30 devnull nslave = i + 1;
376 150f8802 2006-06-25 devnull eslave[i].inuse = 1;
377 76193d7c 2003-09-30 devnull return i;
379 76193d7c 2003-09-30 devnull drawerror(display, "events: bad slave assignment");
380 76193d7c 2003-09-30 devnull return 0;
384 76193d7c 2003-09-30 devnull emouse(void)
386 76193d7c 2003-09-30 devnull Mouse m;
387 76193d7c 2003-09-30 devnull Ebuf *eb;
389 76193d7c 2003-09-30 devnull if(Smouse < 0)
390 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
391 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Smouse]);
392 150f8802 2006-06-25 devnull m = eb->u.mouse;
393 76193d7c 2003-09-30 devnull free(eb);
394 76193d7c 2003-09-30 devnull return m;
398 76193d7c 2003-09-30 devnull ekbd(void)
400 76193d7c 2003-09-30 devnull Ebuf *eb;
403 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
404 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
405 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Skeyboard]);
406 150f8802 2006-06-25 devnull c = eb->u.rune;
407 76193d7c 2003-09-30 devnull free(eb);
408 76193d7c 2003-09-30 devnull return c;
412 76193d7c 2003-09-30 devnull emoveto(Point pt)
414 150f8802 2006-06-25 devnull _displaymoveto(display, pt);
418 76193d7c 2003-09-30 devnull esetcursor(Cursor *c)
420 8581c2b5 2018-11-16 rsc _displaycursor(display, c, nil);
424 8581c2b5 2018-11-16 rsc esetcursor2(Cursor *c, Cursor2 *c2)
426 8581c2b5 2018-11-16 rsc _displaycursor(display, c, c2);
430 76193d7c 2003-09-30 devnull ereadmouse(Mouse *m)
432 150f8802 2006-06-25 devnull int resized;
434 150f8802 2006-06-25 devnull resized = 0;
435 150f8802 2006-06-25 devnull if(_displayrdmouse(display, m, &resized) < 0)
436 76193d7c 2003-09-30 devnull return -1;
437 150f8802 2006-06-25 devnull if(resized)
438 76193d7c 2003-09-30 devnull eresized(1);
439 150f8802 2006-06-25 devnull return 1;