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 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");
60 40d787ab 2020-01-14 rsc }
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);
64 74dc60da 2006-06-25 devnull /*
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.
68 74dc60da 2006-06-25 devnull */
69 74dc60da 2006-06-25 devnull mc->m = m;
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull }
72 76193d7c 2003-09-30 devnull
73 76193d7c 2003-09-30 devnull Mousectl*
74 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
75 76193d7c 2003-09-30 devnull {
76 76193d7c 2003-09-30 devnull Mousectl *mc;
77 76193d7c 2003-09-30 devnull
78 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
79 74dc60da 2006-06-25 devnull if(i)
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;
87 76193d7c 2003-09-30 devnull }
88 76193d7c 2003-09-30 devnull
89 76193d7c 2003-09-30 devnull void
90 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
91 76193d7c 2003-09-30 devnull {
92 8581c2b5 2018-11-16 rsc _displaycursor(mc->display, c, nil);
93 76193d7c 2003-09-30 devnull }
94 74dc60da 2006-06-25 devnull
95 8581c2b5 2018-11-16 rsc void
96 8581c2b5 2018-11-16 rsc setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2)
97 8581c2b5 2018-11-16 rsc {
98 8581c2b5 2018-11-16 rsc _displaycursor(mc->display, c, c2);
99 8581c2b5 2018-11-16 rsc }