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 <thread.h>
5 76193d7c 2003-09-30 devnull #include <cursor.h>
6 76193d7c 2003-09-30 devnull #include <mouse.h>
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull void
9 74dc60da 2006-06-25 devnull moveto(Mousectl *mc, Point pt)
10 76193d7c 2003-09-30 devnull {
11 74dc60da 2006-06-25 devnull _displaymoveto(mc->display, pt);
12 74dc60da 2006-06-25 devnull mc->m.xy = pt;
13 76193d7c 2003-09-30 devnull }
14 76193d7c 2003-09-30 devnull
15 76193d7c 2003-09-30 devnull void
16 76193d7c 2003-09-30 devnull closemouse(Mousectl *mc)
17 76193d7c 2003-09-30 devnull {
18 76193d7c 2003-09-30 devnull if(mc == nil)
19 76193d7c 2003-09-30 devnull return;
20 76193d7c 2003-09-30 devnull
21 74dc60da 2006-06-25 devnull /* postnote(PNPROC, mc->pid, "kill"); */
22 76193d7c 2003-09-30 devnull
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);
27 76193d7c 2003-09-30 devnull }
28 76193d7c 2003-09-30 devnull
29 76193d7c 2003-09-30 devnull int
30 76193d7c 2003-09-30 devnull readmouse(Mousectl *mc)
31 76193d7c 2003-09-30 devnull {
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;
37 76193d7c 2003-09-30 devnull }
38 76193d7c 2003-09-30 devnull return 0;
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull
41 76193d7c 2003-09-30 devnull static
42 76193d7c 2003-09-30 devnull void
43 76193d7c 2003-09-30 devnull _ioproc(void *arg)
44 76193d7c 2003-09-30 devnull {
45 74dc60da 2006-06-25 devnull int one, resized;
46 76193d7c 2003-09-30 devnull Mouse m;
47 76193d7c 2003-09-30 devnull Mousectl *mc;
48 76193d7c 2003-09-30 devnull
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);
52 74dc60da 2006-06-25 devnull one = 1;
53 74dc60da 2006-06-25 devnull resized = 0;
54 76193d7c 2003-09-30 devnull for(;;){
55 74dc60da 2006-06-25 devnull if(_displayrdmouse(mc->display, &m, &resized) < 0)
56 74dc60da 2006-06-25 devnull threadexits("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);
60 74dc60da 2006-06-25 devnull /*
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.
64 74dc60da 2006-06-25 devnull */
65 74dc60da 2006-06-25 devnull mc->m = m;
66 76193d7c 2003-09-30 devnull }
67 76193d7c 2003-09-30 devnull }
68 76193d7c 2003-09-30 devnull
69 76193d7c 2003-09-30 devnull Mousectl*
70 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
71 76193d7c 2003-09-30 devnull {
72 76193d7c 2003-09-30 devnull Mousectl *mc;
73 76193d7c 2003-09-30 devnull
74 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
75 74dc60da 2006-06-25 devnull if(i)
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;
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull
85 76193d7c 2003-09-30 devnull void
86 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
87 76193d7c 2003-09-30 devnull {
88 74dc60da 2006-06-25 devnull _displaycursor(mc->display, c);
89 76193d7c 2003-09-30 devnull }
90 74dc60da 2006-06-25 devnull