Blame


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>
9 76193d7c 2003-09-30 devnull
10 150f8802 2006-06-25 devnull typedef struct Slave Slave;
11 150f8802 2006-06-25 devnull typedef struct Ebuf Ebuf;
12 76193d7c 2003-09-30 devnull
13 150f8802 2006-06-25 devnull struct Slave
14 150f8802 2006-06-25 devnull {
15 150f8802 2006-06-25 devnull int inuse;
16 150f8802 2006-06-25 devnull Ebuf *head; /* queue of messages for this descriptor */
17 150f8802 2006-06-25 devnull Ebuf *tail;
18 150f8802 2006-06-25 devnull int (*fn)(int, Event*, uchar*, int);
19 150f8802 2006-06-25 devnull Muxrpc *rpc;
20 150f8802 2006-06-25 devnull vlong nexttick;
21 150f8802 2006-06-25 devnull int fd;
22 150f8802 2006-06-25 devnull int n;
23 150f8802 2006-06-25 devnull };
24 76193d7c 2003-09-30 devnull
25 150f8802 2006-06-25 devnull struct Ebuf
26 150f8802 2006-06-25 devnull {
27 150f8802 2006-06-25 devnull Ebuf *next;
28 150f8802 2006-06-25 devnull int n; /* number of bytes in buf */
29 150f8802 2006-06-25 devnull union {
30 150f8802 2006-06-25 devnull uchar buf[EMAXMSG];
31 150f8802 2006-06-25 devnull Rune rune;
32 150f8802 2006-06-25 devnull Mouse mouse;
33 150f8802 2006-06-25 devnull } u;
34 150f8802 2006-06-25 devnull };
35 150f8802 2006-06-25 devnull
36 150f8802 2006-06-25 devnull static Slave eslave[MAXSLAVE];
37 76193d7c 2003-09-30 devnull static int Skeyboard = -1;
38 76193d7c 2003-09-30 devnull static int Smouse = -1;
39 76193d7c 2003-09-30 devnull static int Stimer = -1;
40 76193d7c 2003-09-30 devnull
41 76193d7c 2003-09-30 devnull static int nslave;
42 150f8802 2006-06-25 devnull static int newkey(ulong);
43 150f8802 2006-06-25 devnull static int extract(int canblock);
44 76193d7c 2003-09-30 devnull
45 76193d7c 2003-09-30 devnull static
46 76193d7c 2003-09-30 devnull Ebuf*
47 76193d7c 2003-09-30 devnull ebread(Slave *s)
48 76193d7c 2003-09-30 devnull {
49 76193d7c 2003-09-30 devnull Ebuf *eb;
50 76193d7c 2003-09-30 devnull
51 150f8802 2006-06-25 devnull while(!s->head)
52 150f8802 2006-06-25 devnull extract(1);
53 76193d7c 2003-09-30 devnull eb = s->head;
54 76193d7c 2003-09-30 devnull s->head = s->head->next;
55 76193d7c 2003-09-30 devnull if(s->head == 0)
56 76193d7c 2003-09-30 devnull s->tail = 0;
57 76193d7c 2003-09-30 devnull return eb;
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull
60 76193d7c 2003-09-30 devnull ulong
61 76193d7c 2003-09-30 devnull event(Event *e)
62 76193d7c 2003-09-30 devnull {
63 76193d7c 2003-09-30 devnull return eread(~0UL, e);
64 76193d7c 2003-09-30 devnull }
65 76193d7c 2003-09-30 devnull
66 76193d7c 2003-09-30 devnull ulong
67 76193d7c 2003-09-30 devnull eread(ulong keys, Event *e)
68 76193d7c 2003-09-30 devnull {
69 76193d7c 2003-09-30 devnull Ebuf *eb;
70 76193d7c 2003-09-30 devnull int i, id;
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull if(keys == 0)
73 76193d7c 2003-09-30 devnull return 0;
74 76193d7c 2003-09-30 devnull for(;;){
75 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
76 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head){
77 76193d7c 2003-09-30 devnull id = 1<<i;
78 76193d7c 2003-09-30 devnull if(i == Smouse)
79 76193d7c 2003-09-30 devnull e->mouse = emouse();
80 76193d7c 2003-09-30 devnull else if(i == Skeyboard)
81 76193d7c 2003-09-30 devnull e->kbdc = ekbd();
82 76193d7c 2003-09-30 devnull else if(i == Stimer)
83 76193d7c 2003-09-30 devnull eslave[i].head = 0;
84 76193d7c 2003-09-30 devnull else{
85 76193d7c 2003-09-30 devnull eb = ebread(&eslave[i]);
86 76193d7c 2003-09-30 devnull e->n = eb->n;
87 76193d7c 2003-09-30 devnull if(eslave[i].fn)
88 150f8802 2006-06-25 devnull id = (*eslave[i].fn)(id, e, eb->u.buf, eb->n);
89 76193d7c 2003-09-30 devnull else
90 150f8802 2006-06-25 devnull memmove(e->data, eb->u.buf, eb->n);
91 76193d7c 2003-09-30 devnull free(eb);
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull return id;
94 76193d7c 2003-09-30 devnull }
95 150f8802 2006-06-25 devnull extract(0);
96 76193d7c 2003-09-30 devnull }
97 76193d7c 2003-09-30 devnull return 0;
98 76193d7c 2003-09-30 devnull }
99 76193d7c 2003-09-30 devnull
100 76193d7c 2003-09-30 devnull int
101 76193d7c 2003-09-30 devnull ecanmouse(void)
102 76193d7c 2003-09-30 devnull {
103 76193d7c 2003-09-30 devnull if(Smouse < 0)
104 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
105 76193d7c 2003-09-30 devnull return ecanread(Emouse);
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull
108 76193d7c 2003-09-30 devnull int
109 76193d7c 2003-09-30 devnull ecankbd(void)
110 76193d7c 2003-09-30 devnull {
111 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
112 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
113 76193d7c 2003-09-30 devnull return ecanread(Ekeyboard);
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull int
117 76193d7c 2003-09-30 devnull ecanread(ulong keys)
118 76193d7c 2003-09-30 devnull {
119 76193d7c 2003-09-30 devnull int i;
120 76193d7c 2003-09-30 devnull
121 76193d7c 2003-09-30 devnull for(;;){
122 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
123 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head)
124 76193d7c 2003-09-30 devnull return 1;
125 150f8802 2006-06-25 devnull if(!extract(0))
126 76193d7c 2003-09-30 devnull return 0;
127 76193d7c 2003-09-30 devnull }
128 76193d7c 2003-09-30 devnull return -1;
129 76193d7c 2003-09-30 devnull }
130 76193d7c 2003-09-30 devnull
131 76193d7c 2003-09-30 devnull ulong
132 76193d7c 2003-09-30 devnull estartfn(ulong key, int fd, int n, int (*fn)(int, Event*, uchar*, int))
133 76193d7c 2003-09-30 devnull {
134 150f8802 2006-06-25 devnull int i;
135 76193d7c 2003-09-30 devnull
136 76193d7c 2003-09-30 devnull if(fd < 0)
137 76193d7c 2003-09-30 devnull drawerror(display, "events: bad file descriptor");
138 76193d7c 2003-09-30 devnull if(n <= 0 || n > EMAXMSG)
139 76193d7c 2003-09-30 devnull n = EMAXMSG;
140 150f8802 2006-06-25 devnull i = newkey(key);
141 150f8802 2006-06-25 devnull eslave[i].fn = fn;
142 150f8802 2006-06-25 devnull eslave[i].fd = fd;
143 150f8802 2006-06-25 devnull eslave[i].n = n;
144 150f8802 2006-06-25 devnull return 1<<i;
145 76193d7c 2003-09-30 devnull }
146 76193d7c 2003-09-30 devnull
147 76193d7c 2003-09-30 devnull ulong
148 76193d7c 2003-09-30 devnull estart(ulong key, int fd, int n)
149 76193d7c 2003-09-30 devnull {
150 76193d7c 2003-09-30 devnull return estartfn(key, fd, n, nil);
151 76193d7c 2003-09-30 devnull }
152 76193d7c 2003-09-30 devnull
153 76193d7c 2003-09-30 devnull ulong
154 76193d7c 2003-09-30 devnull etimer(ulong key, int n)
155 76193d7c 2003-09-30 devnull {
156 76193d7c 2003-09-30 devnull if(Stimer != -1)
157 76193d7c 2003-09-30 devnull drawerror(display, "events: timer started twice");
158 150f8802 2006-06-25 devnull Stimer = newkey(key);
159 76193d7c 2003-09-30 devnull if(n <= 0)
160 76193d7c 2003-09-30 devnull n = 1000;
161 150f8802 2006-06-25 devnull eslave[Stimer].n = n;
162 150f8802 2006-06-25 devnull eslave[Stimer].nexttick = nsec()+n*1000LL;
163 150f8802 2006-06-25 devnull return 1<<Stimer;
164 76193d7c 2003-09-30 devnull }
165 76193d7c 2003-09-30 devnull
166 76193d7c 2003-09-30 devnull void
167 76193d7c 2003-09-30 devnull einit(ulong keys)
168 76193d7c 2003-09-30 devnull {
169 76193d7c 2003-09-30 devnull if(keys&Ekeyboard){
170 76193d7c 2003-09-30 devnull for(Skeyboard=0; Ekeyboard & ~(1<<Skeyboard); Skeyboard++)
171 76193d7c 2003-09-30 devnull ;
172 150f8802 2006-06-25 devnull eslave[Skeyboard].inuse = 1;
173 150f8802 2006-06-25 devnull if(nslave <= Skeyboard)
174 150f8802 2006-06-25 devnull nslave = Skeyboard+1;
175 76193d7c 2003-09-30 devnull }
176 76193d7c 2003-09-30 devnull if(keys&Emouse){
177 76193d7c 2003-09-30 devnull for(Smouse=0; Emouse & ~(1<<Smouse); Smouse++)
178 76193d7c 2003-09-30 devnull ;
179 150f8802 2006-06-25 devnull eslave[Smouse].inuse = 1;
180 150f8802 2006-06-25 devnull if(nslave <= Smouse)
181 150f8802 2006-06-25 devnull nslave = Smouse+1;
182 76193d7c 2003-09-30 devnull }
183 76193d7c 2003-09-30 devnull }
184 76193d7c 2003-09-30 devnull
185 150f8802 2006-06-25 devnull static Ebuf*
186 150f8802 2006-06-25 devnull newebuf(Slave *s, int n)
187 76193d7c 2003-09-30 devnull {
188 76193d7c 2003-09-30 devnull Ebuf *eb;
189 150f8802 2006-06-25 devnull
190 150f8802 2006-06-25 devnull eb = malloc(sizeof(*eb) - sizeof(eb->u.buf) + n);
191 150f8802 2006-06-25 devnull if(eb == nil)
192 150f8802 2006-06-25 devnull drawerror(display, "events: out of memory");
193 150f8802 2006-06-25 devnull eb->n = n;
194 150f8802 2006-06-25 devnull eb->next = 0;
195 150f8802 2006-06-25 devnull if(s->head)
196 150f8802 2006-06-25 devnull s->tail = s->tail->next = eb;
197 150f8802 2006-06-25 devnull else
198 150f8802 2006-06-25 devnull s->head = s->tail = eb;
199 150f8802 2006-06-25 devnull return eb;
200 150f8802 2006-06-25 devnull }
201 76193d7c 2003-09-30 devnull
202 150f8802 2006-06-25 devnull static Muxrpc*
203 150f8802 2006-06-25 devnull startrpc(int type)
204 150f8802 2006-06-25 devnull {
205 150f8802 2006-06-25 devnull uchar buf[100];
206 150f8802 2006-06-25 devnull Wsysmsg w;
207 150f8802 2006-06-25 devnull
208 150f8802 2006-06-25 devnull w.type = type;
209 150f8802 2006-06-25 devnull convW2M(&w, buf, sizeof buf);
210 150f8802 2006-06-25 devnull return muxrpcstart(display->mux, buf);
211 150f8802 2006-06-25 devnull }
212 150f8802 2006-06-25 devnull
213 150f8802 2006-06-25 devnull static int
214 150f8802 2006-06-25 devnull finishrpc(Muxrpc *r, Wsysmsg *w)
215 150f8802 2006-06-25 devnull {
216 150f8802 2006-06-25 devnull uchar *p;
217 150f8802 2006-06-25 devnull int n;
218 150f8802 2006-06-25 devnull
219 150f8802 2006-06-25 devnull if((p = muxrpccanfinish(r)) == nil)
220 150f8802 2006-06-25 devnull return 0;
221 150f8802 2006-06-25 devnull GET(p, n);
222 150f8802 2006-06-25 devnull convM2W(p, n, w);
223 150f8802 2006-06-25 devnull free(p);
224 150f8802 2006-06-25 devnull return 1;
225 150f8802 2006-06-25 devnull }
226 150f8802 2006-06-25 devnull
227 150f8802 2006-06-25 devnull static int
228 150f8802 2006-06-25 devnull extract(int canblock)
229 150f8802 2006-06-25 devnull {
230 150f8802 2006-06-25 devnull Ebuf *eb;
231 150f8802 2006-06-25 devnull int i, n, max;
232 150f8802 2006-06-25 devnull fd_set rset, wset, xset;
233 150f8802 2006-06-25 devnull struct timeval tv, *timeout;
234 150f8802 2006-06-25 devnull Wsysmsg w;
235 150f8802 2006-06-25 devnull vlong t0;
236 150f8802 2006-06-25 devnull
237 150f8802 2006-06-25 devnull /*
238 150f8802 2006-06-25 devnull * Flush draw buffer before waiting for responses.
239 150f8802 2006-06-25 devnull * Avoid doing so if buffer is empty.
240 150f8802 2006-06-25 devnull * Also make sure that we don't interfere with app-specific locking.
241 150f8802 2006-06-25 devnull */
242 76193d7c 2003-09-30 devnull if(display->locking){
243 150f8802 2006-06-25 devnull /*
244 150f8802 2006-06-25 devnull * if locking is being done by program,
245 150f8802 2006-06-25 devnull * this means it can't depend on automatic
246 150f8802 2006-06-25 devnull * flush in emouse() etc.
247 150f8802 2006-06-25 devnull */
248 76193d7c 2003-09-30 devnull if(canqlock(&display->qlock)){
249 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
250 76193d7c 2003-09-30 devnull flushimage(display, 1);
251 76193d7c 2003-09-30 devnull unlockdisplay(display);
252 76193d7c 2003-09-30 devnull }
253 76193d7c 2003-09-30 devnull }else
254 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
255 76193d7c 2003-09-30 devnull flushimage(display, 1);
256 150f8802 2006-06-25 devnull
257 150f8802 2006-06-25 devnull /*
258 150f8802 2006-06-25 devnull * Set up for select.
259 150f8802 2006-06-25 devnull */
260 150f8802 2006-06-25 devnull FD_ZERO(&rset);
261 150f8802 2006-06-25 devnull FD_ZERO(&wset);
262 150f8802 2006-06-25 devnull FD_ZERO(&xset);
263 150f8802 2006-06-25 devnull max = -1;
264 150f8802 2006-06-25 devnull timeout = nil;
265 150f8802 2006-06-25 devnull for(i=0; i<nslave; i++){
266 150f8802 2006-06-25 devnull if(!eslave[i].inuse)
267 150f8802 2006-06-25 devnull continue;
268 150f8802 2006-06-25 devnull if(i == Smouse){
269 150f8802 2006-06-25 devnull if(eslave[i].rpc == nil)
270 150f8802 2006-06-25 devnull eslave[i].rpc = startrpc(Trdmouse);
271 150f8802 2006-06-25 devnull if(eslave[i].rpc){
272 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &rset);
273 150f8802 2006-06-25 devnull FD_SET(display->srvfd, &xset);
274 150f8802 2006-06-25 devnull if(display->srvfd > max)
275 150f8802 2006-06-25 devnull max = display->srvfd;
276 150f8802 2006-06-25 devnull }
277 150f8802 2006-06-25 devnull }else if(i == Skeyboard){
278 150f8802 2006-06-25 devnull if(eslave[i].rpc == nil)
279 150f8802 2006-06-25 devnull eslave[i].rpc = startrpc(Trdkbd);
280 150f8802 2006-06-25 devnull if(eslave[i].rpc){
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;
285 150f8802 2006-06-25 devnull }
286 150f8802 2006-06-25 devnull }else if(i == Stimer){
287 150f8802 2006-06-25 devnull t0 = nsec();
288 150f8802 2006-06-25 devnull if(t0-eslave[i].nexttick <= 0){
289 150f8802 2006-06-25 devnull tv.tv_sec = 0;
290 150f8802 2006-06-25 devnull tv.tv_usec = 0;
291 150f8802 2006-06-25 devnull }else{
292 150f8802 2006-06-25 devnull tv.tv_sec = (t0-eslave[i].nexttick)/1000000000;
293 150f8802 2006-06-25 devnull tv.tv_usec = (t0-eslave[i].nexttick)%1000000000 / 1000;
294 150f8802 2006-06-25 devnull }
295 150f8802 2006-06-25 devnull timeout = &tv;
296 150f8802 2006-06-25 devnull }else{
297 150f8802 2006-06-25 devnull FD_SET(eslave[i].fd, &rset);
298 150f8802 2006-06-25 devnull FD_SET(eslave[i].fd, &xset);
299 150f8802 2006-06-25 devnull if(eslave[i].fd > max)
300 150f8802 2006-06-25 devnull max = eslave[i].fd;
301 150f8802 2006-06-25 devnull }
302 76193d7c 2003-09-30 devnull }
303 150f8802 2006-06-25 devnull
304 150f8802 2006-06-25 devnull if(!canblock){
305 150f8802 2006-06-25 devnull tv.tv_sec = 0;
306 150f8802 2006-06-25 devnull tv.tv_usec = 0;
307 150f8802 2006-06-25 devnull timeout = &tv;
308 150f8802 2006-06-25 devnull }
309 150f8802 2006-06-25 devnull
310 150f8802 2006-06-25 devnull if(select(max+1, &rset, &wset, &xset, timeout) < 0)
311 150f8802 2006-06-25 devnull drawerror(display, "select failure");
312 150f8802 2006-06-25 devnull
313 150f8802 2006-06-25 devnull /*
314 150f8802 2006-06-25 devnull * Look to see what can proceed.
315 150f8802 2006-06-25 devnull */
316 150f8802 2006-06-25 devnull n = 0;
317 150f8802 2006-06-25 devnull for(i=0; i<nslave; i++){
318 150f8802 2006-06-25 devnull if(!eslave[i].inuse)
319 150f8802 2006-06-25 devnull continue;
320 150f8802 2006-06-25 devnull if(i == Smouse){
321 150f8802 2006-06-25 devnull if(finishrpc(eslave[i].rpc, &w)){
322 150f8802 2006-06-25 devnull eslave[i].rpc = nil;
323 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], sizeof(Mouse));
324 150f8802 2006-06-25 devnull eb->u.mouse = w.mouse;
325 150f8802 2006-06-25 devnull if(w.resized)
326 150f8802 2006-06-25 devnull eresized(1);
327 150f8802 2006-06-25 devnull n++;
328 150f8802 2006-06-25 devnull }
329 150f8802 2006-06-25 devnull }else if(i == Skeyboard){
330 150f8802 2006-06-25 devnull if(finishrpc(eslave[i].rpc, &w)){
331 150f8802 2006-06-25 devnull eslave[i].rpc = nil;
332 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], sizeof(Rune)+2); /* +8: alignment */
333 150f8802 2006-06-25 devnull eb->u.rune = w.rune;
334 150f8802 2006-06-25 devnull n++;
335 150f8802 2006-06-25 devnull }
336 150f8802 2006-06-25 devnull }else if(i == Stimer){
337 150f8802 2006-06-25 devnull t0 = nsec();
338 150f8802 2006-06-25 devnull while(t0-eslave[i].nexttick > 0){
339 150f8802 2006-06-25 devnull eslave[i].nexttick += eslave[i].n*1000LL;
340 150f8802 2006-06-25 devnull eslave[i].head = (Ebuf*)1;
341 150f8802 2006-06-25 devnull n++;
342 150f8802 2006-06-25 devnull }
343 150f8802 2006-06-25 devnull }else{
344 150f8802 2006-06-25 devnull if(FD_ISSET(eslave[i].fd, &rset)){
345 150f8802 2006-06-25 devnull eb = newebuf(&eslave[i], eslave[i].n);
346 150f8802 2006-06-25 devnull eb->n = read(eslave[i].fd, eb->u.buf, eslave[i].n);
347 150f8802 2006-06-25 devnull n++;
348 150f8802 2006-06-25 devnull }
349 76193d7c 2003-09-30 devnull }
350 76193d7c 2003-09-30 devnull }
351 150f8802 2006-06-25 devnull return n;
352 76193d7c 2003-09-30 devnull }
353 76193d7c 2003-09-30 devnull
354 76193d7c 2003-09-30 devnull static int
355 150f8802 2006-06-25 devnull newkey(ulong key)
356 76193d7c 2003-09-30 devnull {
357 150f8802 2006-06-25 devnull int i;
358 76193d7c 2003-09-30 devnull
359 76193d7c 2003-09-30 devnull for(i=0; i<MAXSLAVE; i++)
360 150f8802 2006-06-25 devnull if((key & ~(1<<i)) == 0 && eslave[i].inuse == 0){
361 76193d7c 2003-09-30 devnull if(nslave <= i)
362 76193d7c 2003-09-30 devnull nslave = i + 1;
363 150f8802 2006-06-25 devnull eslave[i].inuse = 1;
364 76193d7c 2003-09-30 devnull return i;
365 76193d7c 2003-09-30 devnull }
366 76193d7c 2003-09-30 devnull drawerror(display, "events: bad slave assignment");
367 76193d7c 2003-09-30 devnull return 0;
368 76193d7c 2003-09-30 devnull }
369 76193d7c 2003-09-30 devnull
370 76193d7c 2003-09-30 devnull Mouse
371 76193d7c 2003-09-30 devnull emouse(void)
372 76193d7c 2003-09-30 devnull {
373 76193d7c 2003-09-30 devnull Mouse m;
374 76193d7c 2003-09-30 devnull Ebuf *eb;
375 76193d7c 2003-09-30 devnull
376 76193d7c 2003-09-30 devnull if(Smouse < 0)
377 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
378 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Smouse]);
379 150f8802 2006-06-25 devnull m = eb->u.mouse;
380 76193d7c 2003-09-30 devnull free(eb);
381 76193d7c 2003-09-30 devnull return m;
382 76193d7c 2003-09-30 devnull }
383 76193d7c 2003-09-30 devnull
384 76193d7c 2003-09-30 devnull int
385 76193d7c 2003-09-30 devnull ekbd(void)
386 76193d7c 2003-09-30 devnull {
387 76193d7c 2003-09-30 devnull Ebuf *eb;
388 76193d7c 2003-09-30 devnull int c;
389 76193d7c 2003-09-30 devnull
390 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
391 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
392 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Skeyboard]);
393 150f8802 2006-06-25 devnull c = eb->u.rune;
394 76193d7c 2003-09-30 devnull free(eb);
395 76193d7c 2003-09-30 devnull return c;
396 76193d7c 2003-09-30 devnull }
397 76193d7c 2003-09-30 devnull
398 76193d7c 2003-09-30 devnull void
399 76193d7c 2003-09-30 devnull emoveto(Point pt)
400 76193d7c 2003-09-30 devnull {
401 150f8802 2006-06-25 devnull _displaymoveto(display, pt);
402 76193d7c 2003-09-30 devnull }
403 76193d7c 2003-09-30 devnull
404 76193d7c 2003-09-30 devnull void
405 76193d7c 2003-09-30 devnull esetcursor(Cursor *c)
406 76193d7c 2003-09-30 devnull {
407 150f8802 2006-06-25 devnull _displaycursor(display, c);
408 76193d7c 2003-09-30 devnull }
409 76193d7c 2003-09-30 devnull
410 76193d7c 2003-09-30 devnull int
411 76193d7c 2003-09-30 devnull ereadmouse(Mouse *m)
412 76193d7c 2003-09-30 devnull {
413 150f8802 2006-06-25 devnull int resized;
414 76193d7c 2003-09-30 devnull
415 150f8802 2006-06-25 devnull resized = 0;
416 150f8802 2006-06-25 devnull if(_displayrdmouse(display, m, &resized) < 0)
417 76193d7c 2003-09-30 devnull return -1;
418 150f8802 2006-06-25 devnull if(resized)
419 76193d7c 2003-09-30 devnull eresized(1);
420 150f8802 2006-06-25 devnull return 1;
421 76193d7c 2003-09-30 devnull }
422 150f8802 2006-06-25 devnull