tmouse.c - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tmouse.c (1750B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 #include <draw.h> | |
4 #include <thread.h> | |
5 #include <cursor.h> | |
6 #include <mouse.h> | |
7 | |
8 void | |
9 moveto(Mousectl *mc, Point pt) | |
10 { | |
11 _displaymoveto(mc->display, pt); | |
12 mc->m.xy = pt; | |
13 } | |
14 | |
15 void | |
16 closemouse(Mousectl *mc) | |
17 { | |
18 if(mc == nil) | |
19 return; | |
20 | |
21 /* postnote(PNPROC, mc->pid, "kill"); */ | |
22 | |
23 do; while(nbrecv(mc->c, &mc->m) > 0); | |
24 chanfree(mc->c); | |
25 chanfree(mc->resizec); | |
26 free(mc); | |
27 } | |
28 | |
29 int | |
30 readmouse(Mousectl *mc) | |
31 { | |
32 if(mc->display) | |
33 flushimage(mc->display, 1); | |
34 if(recv(mc->c, &mc->m) < 0){ | |
35 fprint(2, "readmouse: %r\n"); | |
36 return -1; | |
37 } | |
38 return 0; | |
39 } | |
40 | |
41 static | |
42 void | |
43 _ioproc(void *arg) | |
44 { | |
45 int one, resized; | |
46 Mouse m; | |
47 Mousectl *mc; | |
48 | |
49 mc = arg; | |
50 threadsetname("mouseproc"); | |
51 memset(&m, 0, sizeof m); | |
52 one = 1; | |
53 resized = 0; | |
54 for(;;){ | |
55 if(_displayrdmouse(mc->display, &m, &resized) < 0) { | |
56 if(postnote(PNPROC, getpid(), "hangup") < 0) | |
57 fprint(2, "postnote: %r\n"); | |
58 sleep(10*1000); | |
59 threadexitsall("mouse read error"); | |
60 } | |
61 if(resized) | |
62 send(mc->resizec, &one); | |
63 send(mc->c, &m); | |
64 /* | |
65 * mc->m is updated after send so it doesn't have wrong … | |
66 * This means that programs should receive into mc->Mous… | |
67 * they want full synchrony. | |
68 */ | |
69 mc->m = m; | |
70 } | |
71 } | |
72 | |
73 Mousectl* | |
74 initmouse(char *file, Image *i) | |
75 { | |
76 Mousectl *mc; | |
77 | |
78 mc = mallocz(sizeof(Mousectl), 1); | |
79 if(i) | |
80 mc->display = i->display; | |
81 mc->c = chancreate(sizeof(Mouse), 0); | |
82 chansetname(mc->c, "mousec"); | |
83 mc->resizec = chancreate(sizeof(int), 2); | |
84 chansetname(mc->resizec, "resizec"); | |
85 proccreate(_ioproc, mc, 32*1024); | |
86 return mc; | |
87 } | |
88 | |
89 void | |
90 setcursor(Mousectl *mc, Cursor *c) | |
91 { | |
92 _displaycursor(mc->display, c, nil); | |
93 } | |
94 | |
95 void | |
96 setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2) | |
97 { | |
98 _displaycursor(mc->display, c, c2); | |
99 } |