Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull #include <cursor.h>
5 76193d7c 2003-09-30 devnull #include <event.h>
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull typedef struct Slave Slave;
8 76193d7c 2003-09-30 devnull typedef struct Ebuf Ebuf;
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull struct Slave
11 76193d7c 2003-09-30 devnull {
12 76193d7c 2003-09-30 devnull int pid;
13 76193d7c 2003-09-30 devnull Ebuf *head; /* ueue of messages for this descriptor */
14 76193d7c 2003-09-30 devnull Ebuf *tail;
15 76193d7c 2003-09-30 devnull int (*fn)(int, Event*, uchar*, int);
16 76193d7c 2003-09-30 devnull };
17 76193d7c 2003-09-30 devnull
18 76193d7c 2003-09-30 devnull struct Ebuf
19 76193d7c 2003-09-30 devnull {
20 76193d7c 2003-09-30 devnull Ebuf *next;
21 76193d7c 2003-09-30 devnull int n; /* number of bytes in buf */
22 76193d7c 2003-09-30 devnull uchar buf[EMAXMSG];
23 76193d7c 2003-09-30 devnull };
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull static Slave eslave[MAXSLAVE];
26 76193d7c 2003-09-30 devnull static int Skeyboard = -1;
27 76193d7c 2003-09-30 devnull static int Smouse = -1;
28 76193d7c 2003-09-30 devnull static int Stimer = -1;
29 76193d7c 2003-09-30 devnull static int logfid;
30 76193d7c 2003-09-30 devnull
31 76193d7c 2003-09-30 devnull static int nslave;
32 76193d7c 2003-09-30 devnull static int parentpid;
33 76193d7c 2003-09-30 devnull static int epipe[2];
34 76193d7c 2003-09-30 devnull static int eforkslave(ulong);
35 76193d7c 2003-09-30 devnull static void extract(void);
36 76193d7c 2003-09-30 devnull static void ekill(void);
37 76193d7c 2003-09-30 devnull static int enote(void *, char *);
38 76193d7c 2003-09-30 devnull static int mousefd;
39 76193d7c 2003-09-30 devnull static int cursorfd;
40 76193d7c 2003-09-30 devnull
41 76193d7c 2003-09-30 devnull static
42 76193d7c 2003-09-30 devnull Ebuf*
43 76193d7c 2003-09-30 devnull ebread(Slave *s)
44 76193d7c 2003-09-30 devnull {
45 76193d7c 2003-09-30 devnull Ebuf *eb;
46 76193d7c 2003-09-30 devnull Dir *d;
47 76193d7c 2003-09-30 devnull ulong l;
48 76193d7c 2003-09-30 devnull
49 76193d7c 2003-09-30 devnull for(;;){
50 76193d7c 2003-09-30 devnull d = dirfstat(epipe[0]);
51 76193d7c 2003-09-30 devnull if(d == nil)
52 76193d7c 2003-09-30 devnull drawerror(display, "events: eread stat error");
53 76193d7c 2003-09-30 devnull l = d->length;
54 76193d7c 2003-09-30 devnull free(d);
55 76193d7c 2003-09-30 devnull if(s->head && l==0)
56 76193d7c 2003-09-30 devnull break;
57 76193d7c 2003-09-30 devnull extract();
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull eb = s->head;
60 76193d7c 2003-09-30 devnull s->head = s->head->next;
61 76193d7c 2003-09-30 devnull if(s->head == 0)
62 76193d7c 2003-09-30 devnull s->tail = 0;
63 76193d7c 2003-09-30 devnull return eb;
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 event(Event *e)
68 76193d7c 2003-09-30 devnull {
69 76193d7c 2003-09-30 devnull return eread(~0UL, e);
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull ulong
73 76193d7c 2003-09-30 devnull eread(ulong keys, Event *e)
74 76193d7c 2003-09-30 devnull {
75 76193d7c 2003-09-30 devnull Ebuf *eb;
76 76193d7c 2003-09-30 devnull int i, id;
77 76193d7c 2003-09-30 devnull
78 76193d7c 2003-09-30 devnull if(keys == 0)
79 76193d7c 2003-09-30 devnull return 0;
80 76193d7c 2003-09-30 devnull for(;;){
81 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
82 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head){
83 76193d7c 2003-09-30 devnull id = 1<<i;
84 76193d7c 2003-09-30 devnull if(i == Smouse)
85 76193d7c 2003-09-30 devnull e->mouse = emouse();
86 76193d7c 2003-09-30 devnull else if(i == Skeyboard)
87 76193d7c 2003-09-30 devnull e->kbdc = ekbd();
88 76193d7c 2003-09-30 devnull else if(i == Stimer)
89 76193d7c 2003-09-30 devnull eslave[i].head = 0;
90 76193d7c 2003-09-30 devnull else{
91 76193d7c 2003-09-30 devnull eb = ebread(&eslave[i]);
92 76193d7c 2003-09-30 devnull e->n = eb->n;
93 76193d7c 2003-09-30 devnull if(eslave[i].fn)
94 76193d7c 2003-09-30 devnull id = (*eslave[i].fn)(id, e, eb->buf, eb->n);
95 76193d7c 2003-09-30 devnull else
96 76193d7c 2003-09-30 devnull memmove(e->data, eb->buf, eb->n);
97 76193d7c 2003-09-30 devnull free(eb);
98 76193d7c 2003-09-30 devnull }
99 76193d7c 2003-09-30 devnull return id;
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull extract();
102 76193d7c 2003-09-30 devnull }
103 76193d7c 2003-09-30 devnull return 0;
104 76193d7c 2003-09-30 devnull }
105 76193d7c 2003-09-30 devnull
106 76193d7c 2003-09-30 devnull int
107 76193d7c 2003-09-30 devnull ecanmouse(void)
108 76193d7c 2003-09-30 devnull {
109 76193d7c 2003-09-30 devnull if(Smouse < 0)
110 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
111 76193d7c 2003-09-30 devnull return ecanread(Emouse);
112 76193d7c 2003-09-30 devnull }
113 76193d7c 2003-09-30 devnull
114 76193d7c 2003-09-30 devnull int
115 76193d7c 2003-09-30 devnull ecankbd(void)
116 76193d7c 2003-09-30 devnull {
117 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
118 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
119 76193d7c 2003-09-30 devnull return ecanread(Ekeyboard);
120 76193d7c 2003-09-30 devnull }
121 76193d7c 2003-09-30 devnull
122 76193d7c 2003-09-30 devnull int
123 76193d7c 2003-09-30 devnull ecanread(ulong keys)
124 76193d7c 2003-09-30 devnull {
125 76193d7c 2003-09-30 devnull Dir *d;
126 76193d7c 2003-09-30 devnull int i;
127 76193d7c 2003-09-30 devnull ulong l;
128 76193d7c 2003-09-30 devnull
129 76193d7c 2003-09-30 devnull for(;;){
130 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++)
131 76193d7c 2003-09-30 devnull if((keys & (1<<i)) && eslave[i].head)
132 76193d7c 2003-09-30 devnull return 1;
133 76193d7c 2003-09-30 devnull d = dirfstat(epipe[0]);
134 76193d7c 2003-09-30 devnull if(d == nil)
135 76193d7c 2003-09-30 devnull drawerror(display, "events: ecanread stat error");
136 76193d7c 2003-09-30 devnull l = d->length;
137 76193d7c 2003-09-30 devnull free(d);
138 76193d7c 2003-09-30 devnull if(l == 0)
139 76193d7c 2003-09-30 devnull return 0;
140 76193d7c 2003-09-30 devnull extract();
141 76193d7c 2003-09-30 devnull }
142 76193d7c 2003-09-30 devnull return -1;
143 76193d7c 2003-09-30 devnull }
144 76193d7c 2003-09-30 devnull
145 76193d7c 2003-09-30 devnull ulong
146 76193d7c 2003-09-30 devnull estartfn(ulong key, int fd, int n, int (*fn)(int, Event*, uchar*, int))
147 76193d7c 2003-09-30 devnull {
148 76193d7c 2003-09-30 devnull char buf[EMAXMSG+1];
149 76193d7c 2003-09-30 devnull int i, r;
150 76193d7c 2003-09-30 devnull
151 76193d7c 2003-09-30 devnull if(fd < 0)
152 76193d7c 2003-09-30 devnull drawerror(display, "events: bad file descriptor");
153 76193d7c 2003-09-30 devnull if(n <= 0 || n > EMAXMSG)
154 76193d7c 2003-09-30 devnull n = EMAXMSG;
155 76193d7c 2003-09-30 devnull i = eforkslave(key);
156 76193d7c 2003-09-30 devnull if(i < MAXSLAVE){
157 76193d7c 2003-09-30 devnull eslave[i].fn = fn;
158 76193d7c 2003-09-30 devnull return 1<<i;
159 76193d7c 2003-09-30 devnull }
160 76193d7c 2003-09-30 devnull buf[0] = i - MAXSLAVE;
161 76193d7c 2003-09-30 devnull while((r = read(fd, buf+1, n))>0)
162 76193d7c 2003-09-30 devnull if(write(epipe[1], buf, r+1)!=r+1)
163 76193d7c 2003-09-30 devnull break;
164 76193d7c 2003-09-30 devnull buf[0] = MAXSLAVE;
165 76193d7c 2003-09-30 devnull write(epipe[1], buf, 1);
166 76193d7c 2003-09-30 devnull _exits(0);
167 76193d7c 2003-09-30 devnull return 0;
168 76193d7c 2003-09-30 devnull }
169 76193d7c 2003-09-30 devnull
170 76193d7c 2003-09-30 devnull ulong
171 76193d7c 2003-09-30 devnull estart(ulong key, int fd, int n)
172 76193d7c 2003-09-30 devnull {
173 76193d7c 2003-09-30 devnull return estartfn(key, fd, n, nil);
174 76193d7c 2003-09-30 devnull }
175 76193d7c 2003-09-30 devnull
176 76193d7c 2003-09-30 devnull ulong
177 76193d7c 2003-09-30 devnull etimer(ulong key, int n)
178 76193d7c 2003-09-30 devnull {
179 76193d7c 2003-09-30 devnull char t[2];
180 76193d7c 2003-09-30 devnull
181 76193d7c 2003-09-30 devnull if(Stimer != -1)
182 76193d7c 2003-09-30 devnull drawerror(display, "events: timer started twice");
183 76193d7c 2003-09-30 devnull Stimer = eforkslave(key);
184 76193d7c 2003-09-30 devnull if(Stimer < MAXSLAVE)
185 76193d7c 2003-09-30 devnull return 1<<Stimer;
186 76193d7c 2003-09-30 devnull if(n <= 0)
187 76193d7c 2003-09-30 devnull n = 1000;
188 76193d7c 2003-09-30 devnull t[0] = t[1] = Stimer - MAXSLAVE;
189 76193d7c 2003-09-30 devnull do
190 76193d7c 2003-09-30 devnull sleep(n);
191 76193d7c 2003-09-30 devnull while(write(epipe[1], t, 2) == 2);
192 76193d7c 2003-09-30 devnull t[0] = MAXSLAVE;
193 76193d7c 2003-09-30 devnull write(epipe[1], t, 1);
194 76193d7c 2003-09-30 devnull _exits(0);
195 76193d7c 2003-09-30 devnull return 0;
196 76193d7c 2003-09-30 devnull }
197 76193d7c 2003-09-30 devnull
198 76193d7c 2003-09-30 devnull static void
199 76193d7c 2003-09-30 devnull ekeyslave(int fd)
200 76193d7c 2003-09-30 devnull {
201 76193d7c 2003-09-30 devnull Rune r;
202 76193d7c 2003-09-30 devnull char t[3], k[10];
203 76193d7c 2003-09-30 devnull int kr, kn, w;
204 76193d7c 2003-09-30 devnull
205 76193d7c 2003-09-30 devnull if(eforkslave(Ekeyboard) < MAXSLAVE)
206 76193d7c 2003-09-30 devnull return;
207 76193d7c 2003-09-30 devnull kn = 0;
208 76193d7c 2003-09-30 devnull t[0] = Skeyboard;
209 76193d7c 2003-09-30 devnull for(;;){
210 76193d7c 2003-09-30 devnull while(!fullrune(k, kn)){
211 76193d7c 2003-09-30 devnull kr = read(fd, k+kn, sizeof k - kn);
212 76193d7c 2003-09-30 devnull if(kr <= 0)
213 76193d7c 2003-09-30 devnull goto breakout;
214 76193d7c 2003-09-30 devnull kn += kr;
215 76193d7c 2003-09-30 devnull }
216 76193d7c 2003-09-30 devnull w = chartorune(&r, k);
217 76193d7c 2003-09-30 devnull kn -= w;
218 76193d7c 2003-09-30 devnull memmove(k, &k[w], kn);
219 76193d7c 2003-09-30 devnull t[1] = r;
220 76193d7c 2003-09-30 devnull t[2] = r>>8;
221 76193d7c 2003-09-30 devnull if(write(epipe[1], t, 3) != 3)
222 76193d7c 2003-09-30 devnull break;
223 76193d7c 2003-09-30 devnull }
224 76193d7c 2003-09-30 devnull breakout:;
225 76193d7c 2003-09-30 devnull t[0] = MAXSLAVE;
226 76193d7c 2003-09-30 devnull write(epipe[1], t, 1);
227 76193d7c 2003-09-30 devnull _exits(0);
228 76193d7c 2003-09-30 devnull }
229 76193d7c 2003-09-30 devnull
230 76193d7c 2003-09-30 devnull void
231 76193d7c 2003-09-30 devnull einit(ulong keys)
232 76193d7c 2003-09-30 devnull {
233 76193d7c 2003-09-30 devnull int ctl, fd;
234 76193d7c 2003-09-30 devnull char buf[256];
235 76193d7c 2003-09-30 devnull
236 76193d7c 2003-09-30 devnull parentpid = getpid();
237 76193d7c 2003-09-30 devnull if(pipe(epipe) < 0)
238 76193d7c 2003-09-30 devnull drawerror(display, "events: einit pipe");
239 76193d7c 2003-09-30 devnull atexit(ekill);
240 76193d7c 2003-09-30 devnull atnotify(enote, 1);
241 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "%s/mouse", display->devdir);
242 76193d7c 2003-09-30 devnull mousefd = open(buf, ORDWR|OCEXEC);
243 76193d7c 2003-09-30 devnull if(mousefd < 0)
244 76193d7c 2003-09-30 devnull drawerror(display, "einit: can't open mouse\n");
245 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "%s/cursor", display->devdir);
246 76193d7c 2003-09-30 devnull cursorfd = open(buf, ORDWR|OCEXEC);
247 76193d7c 2003-09-30 devnull if(cursorfd < 0)
248 76193d7c 2003-09-30 devnull drawerror(display, "einit: can't open cursor\n");
249 76193d7c 2003-09-30 devnull if(keys&Ekeyboard){
250 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "%s/cons", display->devdir);
251 76193d7c 2003-09-30 devnull fd = open(buf, OREAD);
252 76193d7c 2003-09-30 devnull if(fd < 0)
253 76193d7c 2003-09-30 devnull drawerror(display, "events: can't open console");
254 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "%s/consctl", display->devdir);
255 76193d7c 2003-09-30 devnull ctl = open("/dev/consctl", OWRITE|OCEXEC);
256 76193d7c 2003-09-30 devnull if(ctl < 0)
257 76193d7c 2003-09-30 devnull drawerror(display, "events: can't open consctl");
258 76193d7c 2003-09-30 devnull write(ctl, "rawon", 5);
259 76193d7c 2003-09-30 devnull for(Skeyboard=0; Ekeyboard & ~(1<<Skeyboard); Skeyboard++)
260 76193d7c 2003-09-30 devnull ;
261 76193d7c 2003-09-30 devnull ekeyslave(fd);
262 76193d7c 2003-09-30 devnull }
263 76193d7c 2003-09-30 devnull if(keys&Emouse){
264 76193d7c 2003-09-30 devnull estart(Emouse, mousefd, 1+4*12);
265 76193d7c 2003-09-30 devnull for(Smouse=0; Emouse & ~(1<<Smouse); Smouse++)
266 76193d7c 2003-09-30 devnull ;
267 76193d7c 2003-09-30 devnull }
268 76193d7c 2003-09-30 devnull }
269 76193d7c 2003-09-30 devnull
270 76193d7c 2003-09-30 devnull static void
271 76193d7c 2003-09-30 devnull extract(void)
272 76193d7c 2003-09-30 devnull {
273 76193d7c 2003-09-30 devnull Slave *s;
274 76193d7c 2003-09-30 devnull Ebuf *eb;
275 76193d7c 2003-09-30 devnull int i, n;
276 76193d7c 2003-09-30 devnull uchar ebuf[EMAXMSG+1];
277 76193d7c 2003-09-30 devnull
278 76193d7c 2003-09-30 devnull /* avoid generating a message if there's nothing to show. */
279 76193d7c 2003-09-30 devnull /* this test isn't perfect, though; could do flushimage(display, 0) then call extract */
280 76193d7c 2003-09-30 devnull /* also: make sure we don't interfere if we're multiprocessing the display */
281 76193d7c 2003-09-30 devnull if(display->locking){
282 76193d7c 2003-09-30 devnull /* if locking is being done by program, this means it can't depend on automatic flush in emouse() etc. */
283 76193d7c 2003-09-30 devnull if(canqlock(&display->qlock)){
284 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
285 76193d7c 2003-09-30 devnull flushimage(display, 1);
286 76193d7c 2003-09-30 devnull unlockdisplay(display);
287 76193d7c 2003-09-30 devnull }
288 76193d7c 2003-09-30 devnull }else
289 76193d7c 2003-09-30 devnull if(display->bufp > display->buf)
290 76193d7c 2003-09-30 devnull flushimage(display, 1);
291 76193d7c 2003-09-30 devnull loop:
292 76193d7c 2003-09-30 devnull if((n=read(epipe[0], ebuf, EMAXMSG+1)) < 0
293 76193d7c 2003-09-30 devnull || ebuf[0] >= MAXSLAVE)
294 76193d7c 2003-09-30 devnull drawerror(display, "eof on event pipe");
295 76193d7c 2003-09-30 devnull if(n == 0)
296 76193d7c 2003-09-30 devnull goto loop;
297 76193d7c 2003-09-30 devnull i = ebuf[0];
298 76193d7c 2003-09-30 devnull if(i >= nslave || n <= 1)
299 76193d7c 2003-09-30 devnull drawerror(display, "events: protocol error: short read");
300 76193d7c 2003-09-30 devnull s = &eslave[i];
301 76193d7c 2003-09-30 devnull if(i == Stimer){
302 76193d7c 2003-09-30 devnull s->head = (Ebuf *)1;
303 76193d7c 2003-09-30 devnull return;
304 76193d7c 2003-09-30 devnull }
305 76193d7c 2003-09-30 devnull if(i == Skeyboard && n != 3)
306 76193d7c 2003-09-30 devnull drawerror(display, "events: protocol error: keyboard");
307 76193d7c 2003-09-30 devnull if(i == Smouse){
308 76193d7c 2003-09-30 devnull if(n < 1+1+2*12)
309 76193d7c 2003-09-30 devnull drawerror(display, "events: protocol error: mouse");
310 76193d7c 2003-09-30 devnull if(ebuf[1] == 'r')
311 76193d7c 2003-09-30 devnull eresized(1);
312 76193d7c 2003-09-30 devnull /* squash extraneous mouse events */
313 76193d7c 2003-09-30 devnull if((eb=s->tail) && memcmp(eb->buf+1+2*12, ebuf+1+1+2*12, 12)==0){
314 76193d7c 2003-09-30 devnull memmove(eb->buf, &ebuf[1], n - 1);
315 76193d7c 2003-09-30 devnull return;
316 76193d7c 2003-09-30 devnull }
317 76193d7c 2003-09-30 devnull }
318 76193d7c 2003-09-30 devnull /* try to save space by only allocating as much buffer as we need */
319 76193d7c 2003-09-30 devnull eb = malloc(sizeof(*eb) - sizeof(eb->buf) + n - 1);
320 76193d7c 2003-09-30 devnull if(eb == 0)
321 76193d7c 2003-09-30 devnull drawerror(display, "events: protocol error 4");
322 76193d7c 2003-09-30 devnull eb->n = n - 1;
323 76193d7c 2003-09-30 devnull memmove(eb->buf, &ebuf[1], n - 1);
324 76193d7c 2003-09-30 devnull eb->next = 0;
325 76193d7c 2003-09-30 devnull if(s->head)
326 76193d7c 2003-09-30 devnull s->tail = s->tail->next = eb;
327 76193d7c 2003-09-30 devnull else
328 76193d7c 2003-09-30 devnull s->head = s->tail = eb;
329 76193d7c 2003-09-30 devnull }
330 76193d7c 2003-09-30 devnull
331 76193d7c 2003-09-30 devnull static int
332 76193d7c 2003-09-30 devnull eforkslave(ulong key)
333 76193d7c 2003-09-30 devnull {
334 76193d7c 2003-09-30 devnull int i, pid;
335 76193d7c 2003-09-30 devnull
336 76193d7c 2003-09-30 devnull for(i=0; i<MAXSLAVE; i++)
337 76193d7c 2003-09-30 devnull if((key & ~(1<<i)) == 0 && eslave[i].pid == 0){
338 76193d7c 2003-09-30 devnull if(nslave <= i)
339 76193d7c 2003-09-30 devnull nslave = i + 1;
340 76193d7c 2003-09-30 devnull /*
341 76193d7c 2003-09-30 devnull * share the file descriptors so the last child
342 76193d7c 2003-09-30 devnull * out closes all connections to the window server.
343 76193d7c 2003-09-30 devnull */
344 76193d7c 2003-09-30 devnull switch(pid = rfork(RFPROC)){
345 76193d7c 2003-09-30 devnull case 0:
346 76193d7c 2003-09-30 devnull return MAXSLAVE+i;
347 76193d7c 2003-09-30 devnull case -1:
348 76193d7c 2003-09-30 devnull fprint(2, "events: fork error\n");
349 76193d7c 2003-09-30 devnull exits("fork");
350 76193d7c 2003-09-30 devnull }
351 76193d7c 2003-09-30 devnull eslave[i].pid = pid;
352 76193d7c 2003-09-30 devnull eslave[i].head = eslave[i].tail = 0;
353 76193d7c 2003-09-30 devnull return i;
354 76193d7c 2003-09-30 devnull }
355 76193d7c 2003-09-30 devnull drawerror(display, "events: bad slave assignment");
356 76193d7c 2003-09-30 devnull return 0;
357 76193d7c 2003-09-30 devnull }
358 76193d7c 2003-09-30 devnull
359 76193d7c 2003-09-30 devnull static int
360 76193d7c 2003-09-30 devnull enote(void *v, char *s)
361 76193d7c 2003-09-30 devnull {
362 76193d7c 2003-09-30 devnull char t[1];
363 76193d7c 2003-09-30 devnull int i, pid;
364 76193d7c 2003-09-30 devnull
365 76193d7c 2003-09-30 devnull USED(v, s);
366 76193d7c 2003-09-30 devnull pid = getpid();
367 76193d7c 2003-09-30 devnull if(pid != parentpid){
368 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++){
369 76193d7c 2003-09-30 devnull if(pid == eslave[i].pid){
370 76193d7c 2003-09-30 devnull t[0] = MAXSLAVE;
371 76193d7c 2003-09-30 devnull write(epipe[1], t, 1);
372 76193d7c 2003-09-30 devnull break;
373 76193d7c 2003-09-30 devnull }
374 76193d7c 2003-09-30 devnull }
375 76193d7c 2003-09-30 devnull return 0;
376 76193d7c 2003-09-30 devnull }
377 76193d7c 2003-09-30 devnull close(epipe[0]);
378 76193d7c 2003-09-30 devnull epipe[0] = -1;
379 76193d7c 2003-09-30 devnull close(epipe[1]);
380 76193d7c 2003-09-30 devnull epipe[1] = -1;
381 76193d7c 2003-09-30 devnull for(i=0; i<nslave; i++){
382 76193d7c 2003-09-30 devnull if(pid == eslave[i].pid)
383 76193d7c 2003-09-30 devnull continue; /* don't kill myself */
384 76193d7c 2003-09-30 devnull postnote(PNPROC, eslave[i].pid, "die");
385 76193d7c 2003-09-30 devnull }
386 76193d7c 2003-09-30 devnull return 0;
387 76193d7c 2003-09-30 devnull }
388 76193d7c 2003-09-30 devnull
389 76193d7c 2003-09-30 devnull static void
390 76193d7c 2003-09-30 devnull ekill(void)
391 76193d7c 2003-09-30 devnull {
392 76193d7c 2003-09-30 devnull enote(0, 0);
393 76193d7c 2003-09-30 devnull }
394 76193d7c 2003-09-30 devnull
395 76193d7c 2003-09-30 devnull Mouse
396 76193d7c 2003-09-30 devnull emouse(void)
397 76193d7c 2003-09-30 devnull {
398 76193d7c 2003-09-30 devnull Mouse m;
399 76193d7c 2003-09-30 devnull Ebuf *eb;
400 76193d7c 2003-09-30 devnull static but[2];
401 76193d7c 2003-09-30 devnull int b;
402 76193d7c 2003-09-30 devnull
403 76193d7c 2003-09-30 devnull if(Smouse < 0)
404 76193d7c 2003-09-30 devnull drawerror(display, "events: mouse not initialized");
405 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Smouse]);
406 76193d7c 2003-09-30 devnull m.xy.x = atoi((char*)eb->buf+1+0*12);
407 76193d7c 2003-09-30 devnull m.xy.y = atoi((char*)eb->buf+1+1*12);
408 76193d7c 2003-09-30 devnull b = atoi((char*)eb->buf+1+2*12);
409 76193d7c 2003-09-30 devnull m.buttons = b&7;
410 76193d7c 2003-09-30 devnull m.msec = atoi((char*)eb->buf+1+3*12);
411 76193d7c 2003-09-30 devnull if (logfid)
412 76193d7c 2003-09-30 devnull fprint(logfid, "b: %d xy: %P\n", m.buttons, m.xy);
413 76193d7c 2003-09-30 devnull free(eb);
414 76193d7c 2003-09-30 devnull return m;
415 76193d7c 2003-09-30 devnull }
416 76193d7c 2003-09-30 devnull
417 76193d7c 2003-09-30 devnull int
418 76193d7c 2003-09-30 devnull ekbd(void)
419 76193d7c 2003-09-30 devnull {
420 76193d7c 2003-09-30 devnull Ebuf *eb;
421 76193d7c 2003-09-30 devnull int c;
422 76193d7c 2003-09-30 devnull
423 76193d7c 2003-09-30 devnull if(Skeyboard < 0)
424 76193d7c 2003-09-30 devnull drawerror(display, "events: keyboard not initialzed");
425 76193d7c 2003-09-30 devnull eb = ebread(&eslave[Skeyboard]);
426 76193d7c 2003-09-30 devnull c = eb->buf[0] + (eb->buf[1]<<8);
427 76193d7c 2003-09-30 devnull free(eb);
428 76193d7c 2003-09-30 devnull return c;
429 76193d7c 2003-09-30 devnull }
430 76193d7c 2003-09-30 devnull
431 76193d7c 2003-09-30 devnull void
432 76193d7c 2003-09-30 devnull emoveto(Point pt)
433 76193d7c 2003-09-30 devnull {
434 76193d7c 2003-09-30 devnull char buf[2*12+2];
435 76193d7c 2003-09-30 devnull int n;
436 76193d7c 2003-09-30 devnull
437 76193d7c 2003-09-30 devnull n = sprint(buf, "m%d %d", pt.x, pt.y);
438 76193d7c 2003-09-30 devnull write(mousefd, buf, n);
439 76193d7c 2003-09-30 devnull }
440 76193d7c 2003-09-30 devnull
441 76193d7c 2003-09-30 devnull void
442 76193d7c 2003-09-30 devnull esetcursor(Cursor *c)
443 76193d7c 2003-09-30 devnull {
444 76193d7c 2003-09-30 devnull uchar curs[2*4+2*2*16];
445 76193d7c 2003-09-30 devnull
446 76193d7c 2003-09-30 devnull if(c == 0)
447 76193d7c 2003-09-30 devnull write(cursorfd, curs, 0);
448 76193d7c 2003-09-30 devnull else{
449 76193d7c 2003-09-30 devnull BPLONG(curs+0*4, c->offset.x);
450 76193d7c 2003-09-30 devnull BPLONG(curs+1*4, c->offset.y);
451 76193d7c 2003-09-30 devnull memmove(curs+2*4, c->clr, 2*2*16);
452 76193d7c 2003-09-30 devnull write(cursorfd, curs, sizeof curs);
453 76193d7c 2003-09-30 devnull }
454 76193d7c 2003-09-30 devnull }
455 76193d7c 2003-09-30 devnull
456 76193d7c 2003-09-30 devnull int
457 76193d7c 2003-09-30 devnull ereadmouse(Mouse *m)
458 76193d7c 2003-09-30 devnull {
459 76193d7c 2003-09-30 devnull int n;
460 76193d7c 2003-09-30 devnull char buf[128];
461 76193d7c 2003-09-30 devnull
462 76193d7c 2003-09-30 devnull do{
463 76193d7c 2003-09-30 devnull n = read(mousefd, buf, sizeof(buf));
464 76193d7c 2003-09-30 devnull if(n < 0) /* probably interrupted */
465 76193d7c 2003-09-30 devnull return -1;
466 76193d7c 2003-09-30 devnull n = eatomouse(m, buf, n);
467 76193d7c 2003-09-30 devnull }while(n == 0);
468 76193d7c 2003-09-30 devnull return n;
469 76193d7c 2003-09-30 devnull }
470 76193d7c 2003-09-30 devnull
471 76193d7c 2003-09-30 devnull int
472 76193d7c 2003-09-30 devnull eatomouse(Mouse *m, char *buf, int n)
473 76193d7c 2003-09-30 devnull {
474 76193d7c 2003-09-30 devnull if(n != 1+4*12){
475 76193d7c 2003-09-30 devnull werrstr("atomouse: bad count");
476 76193d7c 2003-09-30 devnull return -1;
477 76193d7c 2003-09-30 devnull }
478 76193d7c 2003-09-30 devnull
479 76193d7c 2003-09-30 devnull if(buf[0] == 'r')
480 76193d7c 2003-09-30 devnull eresized(1);
481 76193d7c 2003-09-30 devnull m->xy.x = atoi(buf+1+0*12);
482 76193d7c 2003-09-30 devnull m->xy.y = atoi(buf+1+1*12);
483 76193d7c 2003-09-30 devnull m->buttons = atoi(buf+1+2*12);
484 76193d7c 2003-09-30 devnull m->msec = atoi(buf+1+3*12);
485 76193d7c 2003-09-30 devnull return n;
486 76193d7c 2003-09-30 devnull }