Blob


1 #include "x11-inc.h"
2 #include <u.h>
3 #include <libc.h>
4 #include <draw.h>
5 #include <thread.h>
6 #include <cursor.h>
7 #include <mouse.h>
8 #include <memdraw.h>
9 #include "x11-memdraw.h"
11 void
12 moveto(Mousectl *m, Point pt)
13 {
14 xmoveto(pt);
15 }
17 void
18 closemouse(Mousectl *mc)
19 {
20 if(mc == nil)
21 return;
23 /* postnote(PNPROC, mc->pid, "kill");
24 */
25 do; while(nbrecv(mc->c, &mc->m) > 0);
26 close(mc->mfd);
27 close(mc->cfd);
28 free(mc->file);
29 chanfree(mc->c);
30 chanfree(mc->resizec);
31 free(mc);
32 }
34 int
35 readmouse(Mousectl *mc)
36 {
37 if(mc->display)
38 flushimage(mc->display, 1);
39 if(recv(mc->c, &mc->m) < 0){
40 fprint(2, "readmouse: %r\n");
41 return -1;
42 }
43 return 0;
44 }
46 static
47 void
48 _ioproc(void *arg)
49 {
50 int one;
51 Mouse m;
52 Mousectl *mc;
53 XEvent xevent;
55 one = 1;
56 mc = arg;
57 threadsetname("mouseproc");
58 memset(&m, 0, sizeof m);
59 mc->pid = getpid();
60 for(;;){
61 XSelectInput(_x.mousecon, _x.drawable, MouseMask|ExposureMask|StructureNotifyMask);
62 XWindowEvent(_x.mousecon, _x.drawable, MouseMask|ExposureMask|StructureNotifyMask, &xevent);
63 switch(xevent.type){
64 case Expose:
65 xexpose(&xevent, _x.mousecon);
66 continue;
67 case ConfigureNotify:
68 if(xconfigure(&xevent, _x.mousecon))
69 nbsend(mc->resizec, &one);
70 continue;
71 case ButtonPress:
72 case ButtonRelease:
73 case MotionNotify:
74 if(xtoplan9mouse(&xevent, &m) < 0)
75 continue;
76 send(mc->c, &m);
77 /*
78 * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
79 * This means that programs should receive into mc->Mouse (see readmouse() above) if
80 * they want full synchrony.
81 */
82 mc->m = m;
83 break;
84 }
85 }
86 }
88 Mousectl*
89 initmouse(char *file, Image *i)
90 {
91 Mousectl *mc;
93 mc = mallocz(sizeof(Mousectl), 1);
94 if(i)
95 mc->display = i->display;
96 mc->c = chancreate(sizeof(Mouse), 0);
97 mc->resizec = chancreate(sizeof(int), 2);
98 proccreate(_ioproc, mc, 16384);
99 return mc;
102 void
103 setcursor(Mousectl *mc, Cursor *c)
105 xsetcursor(c);