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 40d787ab 2020-01-14 rsc if(_displayrdmouse(mc->display, &m, &resized) < 0) {
56 40d787ab 2020-01-14 rsc if(postnote(PNPROC, getpid(), "hangup") < 0)
57 40d787ab 2020-01-14 rsc fprint(2, "postnote: %r\n");
58 40d787ab 2020-01-14 rsc sleep(10*1000);
59 b65a69c1 2008-06-30 rsc threadexitsall("mouse read error");
61 74dc60da 2006-06-25 devnull if(resized)
62 76193d7c 2003-09-30 devnull send(mc->resizec, &one);
63 74dc60da 2006-06-25 devnull send(mc->c, &m);
65 74dc60da 2006-06-25 devnull * mc->m is updated after send so it doesn't have wrong value if we block during send.
66 74dc60da 2006-06-25 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
67 74dc60da 2006-06-25 devnull * they want full synchrony.
69 74dc60da 2006-06-25 devnull mc->m = m;
73 76193d7c 2003-09-30 devnull Mousectl*
74 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
76 76193d7c 2003-09-30 devnull Mousectl *mc;
78 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
80 74dc60da 2006-06-25 devnull mc->display = i->display;
81 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
82 b20f06ab 2004-12-26 devnull chansetname(mc->c, "mousec");
83 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
84 b20f06ab 2004-12-26 devnull chansetname(mc->resizec, "resizec");
85 74dc60da 2006-06-25 devnull proccreate(_ioproc, mc, 32*1024);
86 76193d7c 2003-09-30 devnull return mc;
90 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
92 8581c2b5 2018-11-16 rsc _displaycursor(mc->display, c, nil);
96 8581c2b5 2018-11-16 rsc setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2)
98 8581c2b5 2018-11-16 rsc _displaycursor(mc->display, c, c2);