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