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 <thread.h>
5 76193d7c 2003-09-30 devnull #include <cursor.h>
6 76193d7c 2003-09-30 devnull #include <mouse.h>
9 74dc60da 2006-06-25 devnull moveto(Mousectl *mc, Point pt)
11 74dc60da 2006-06-25 devnull _displaymoveto(mc->display, pt);
12 74dc60da 2006-06-25 devnull mc->m.xy = pt;
16 76193d7c 2003-09-30 devnull closemouse(Mousectl *mc)
18 76193d7c 2003-09-30 devnull if(mc == nil)
21 74dc60da 2006-06-25 devnull /* postnote(PNPROC, mc->pid, "kill"); */
23 74dc60da 2006-06-25 devnull do; while(nbrecv(mc->c, &mc->m) > 0);
24 74dc60da 2006-06-25 devnull chanfree(mc->c);
25 74dc60da 2006-06-25 devnull chanfree(mc->resizec);
26 76193d7c 2003-09-30 devnull free(mc);
30 76193d7c 2003-09-30 devnull readmouse(Mousectl *mc)
32 74dc60da 2006-06-25 devnull if(mc->display)
33 74dc60da 2006-06-25 devnull flushimage(mc->display, 1);
34 74dc60da 2006-06-25 devnull if(recv(mc->c, &mc->m) < 0){
35 76193d7c 2003-09-30 devnull fprint(2, "readmouse: %r\n");
36 76193d7c 2003-09-30 devnull return -1;
38 76193d7c 2003-09-30 devnull return 0;
43 76193d7c 2003-09-30 devnull _ioproc(void *arg)
45 74dc60da 2006-06-25 devnull int one, resized;
47 76193d7c 2003-09-30 devnull Mousectl *mc;
49 76193d7c 2003-09-30 devnull mc = arg;
50 76193d7c 2003-09-30 devnull threadsetname("mouseproc");
51 76193d7c 2003-09-30 devnull memset(&m, 0, sizeof m);
53 74dc60da 2006-06-25 devnull resized = 0;
55 74dc60da 2006-06-25 devnull if(_displayrdmouse(mc->display, &m, &resized) < 0)
56 b65a69c1 2008-06-30 rsc threadexitsall("mouse read error");
57 74dc60da 2006-06-25 devnull if(resized)
58 76193d7c 2003-09-30 devnull send(mc->resizec, &one);
59 74dc60da 2006-06-25 devnull send(mc->c, &m);
61 74dc60da 2006-06-25 devnull * mc->m is updated after send so it doesn't have wrong value if we block during send.
62 74dc60da 2006-06-25 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
63 74dc60da 2006-06-25 devnull * they want full synchrony.
65 74dc60da 2006-06-25 devnull mc->m = m;
69 76193d7c 2003-09-30 devnull Mousectl*
70 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
72 76193d7c 2003-09-30 devnull Mousectl *mc;
74 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
76 74dc60da 2006-06-25 devnull mc->display = i->display;
77 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
78 b20f06ab 2004-12-26 devnull chansetname(mc->c, "mousec");
79 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
80 b20f06ab 2004-12-26 devnull chansetname(mc->resizec, "resizec");
81 74dc60da 2006-06-25 devnull proccreate(_ioproc, mc, 32*1024);
82 76193d7c 2003-09-30 devnull return mc;
86 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
88 74dc60da 2006-06-25 devnull _displaycursor(mc->display, c);