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 76193d7c 2003-09-30 devnull moveto(Mousectl *m, Point pt)
10 76193d7c 2003-09-30 devnull {
11 76193d7c 2003-09-30 devnull fprint(m->mfd, "m%d %d", pt.x, pt.y);
12 76193d7c 2003-09-30 devnull 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 76193d7c 2003-09-30 devnull postnote(PNPROC, mc->pid, "kill");
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull do; while(nbrecv(mc->c, &mc->Mouse) > 0);
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull close(mc->mfd);
26 76193d7c 2003-09-30 devnull close(mc->cfd);
27 76193d7c 2003-09-30 devnull free(mc->file);
28 76193d7c 2003-09-30 devnull free(mc->c);
29 76193d7c 2003-09-30 devnull free(mc->resizec);
30 76193d7c 2003-09-30 devnull free(mc);
31 76193d7c 2003-09-30 devnull }
32 76193d7c 2003-09-30 devnull
33 76193d7c 2003-09-30 devnull int
34 76193d7c 2003-09-30 devnull readmouse(Mousectl *mc)
35 76193d7c 2003-09-30 devnull {
36 76193d7c 2003-09-30 devnull if(mc->image)
37 76193d7c 2003-09-30 devnull flushimage(mc->image->display, 1);
38 76193d7c 2003-09-30 devnull if(recv(mc->c, &mc->Mouse) < 0){
39 76193d7c 2003-09-30 devnull fprint(2, "readmouse: %r\n");
40 76193d7c 2003-09-30 devnull return -1;
41 76193d7c 2003-09-30 devnull }
42 76193d7c 2003-09-30 devnull return 0;
43 76193d7c 2003-09-30 devnull }
44 76193d7c 2003-09-30 devnull
45 76193d7c 2003-09-30 devnull static
46 76193d7c 2003-09-30 devnull void
47 76193d7c 2003-09-30 devnull _ioproc(void *arg)
48 76193d7c 2003-09-30 devnull {
49 76193d7c 2003-09-30 devnull int n, nerr, one;
50 76193d7c 2003-09-30 devnull char buf[1+5*12];
51 76193d7c 2003-09-30 devnull Mouse m;
52 76193d7c 2003-09-30 devnull Mousectl *mc;
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull mc = arg;
55 76193d7c 2003-09-30 devnull threadsetname("mouseproc");
56 76193d7c 2003-09-30 devnull one = 1;
57 76193d7c 2003-09-30 devnull memset(&m, 0, sizeof m);
58 76193d7c 2003-09-30 devnull mc->pid = getpid();
59 76193d7c 2003-09-30 devnull nerr = 0;
60 76193d7c 2003-09-30 devnull for(;;){
61 76193d7c 2003-09-30 devnull n = read(mc->mfd, buf, sizeof buf);
62 76193d7c 2003-09-30 devnull if(n != 1+4*12){
63 76193d7c 2003-09-30 devnull yield(); /* if error is due to exiting, we'll exit here */
64 76193d7c 2003-09-30 devnull fprint(2, "mouse: bad count %d not 49: %r\n", n);
65 76193d7c 2003-09-30 devnull if(n<0 || ++nerr>10)
66 76193d7c 2003-09-30 devnull threadexits("read error");
67 76193d7c 2003-09-30 devnull continue;
68 76193d7c 2003-09-30 devnull }
69 76193d7c 2003-09-30 devnull nerr = 0;
70 76193d7c 2003-09-30 devnull switch(buf[0]){
71 76193d7c 2003-09-30 devnull case 'r':
72 76193d7c 2003-09-30 devnull send(mc->resizec, &one);
73 76193d7c 2003-09-30 devnull /* fall through */
74 76193d7c 2003-09-30 devnull case 'm':
75 76193d7c 2003-09-30 devnull m.xy.x = atoi(buf+1+0*12);
76 76193d7c 2003-09-30 devnull m.xy.y = atoi(buf+1+1*12);
77 76193d7c 2003-09-30 devnull m.buttons = atoi(buf+1+2*12);
78 76193d7c 2003-09-30 devnull m.msec = atoi(buf+1+3*12);
79 76193d7c 2003-09-30 devnull send(mc->c, &m);
80 76193d7c 2003-09-30 devnull /*
81 76193d7c 2003-09-30 devnull * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
82 76193d7c 2003-09-30 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
83 76193d7c 2003-09-30 devnull * they want full synchrony.
84 76193d7c 2003-09-30 devnull */
85 76193d7c 2003-09-30 devnull mc->Mouse = m;
86 76193d7c 2003-09-30 devnull break;
87 76193d7c 2003-09-30 devnull }
88 76193d7c 2003-09-30 devnull }
89 76193d7c 2003-09-30 devnull }
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull Mousectl*
92 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
93 76193d7c 2003-09-30 devnull {
94 76193d7c 2003-09-30 devnull Mousectl *mc;
95 76193d7c 2003-09-30 devnull char *t, *sl;
96 76193d7c 2003-09-30 devnull
97 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
98 76193d7c 2003-09-30 devnull if(file == nil)
99 76193d7c 2003-09-30 devnull file = "/dev/mouse";
100 76193d7c 2003-09-30 devnull mc->file = strdup(file);
101 76193d7c 2003-09-30 devnull mc->mfd = open(file, ORDWR|OCEXEC);
102 76193d7c 2003-09-30 devnull if(mc->mfd<0 && strcmp(file, "/dev/mouse")==0){
103 76193d7c 2003-09-30 devnull bind("#m", "/dev", MAFTER);
104 76193d7c 2003-09-30 devnull mc->mfd = open(file, ORDWR|OCEXEC);
105 76193d7c 2003-09-30 devnull }
106 76193d7c 2003-09-30 devnull if(mc->mfd < 0){
107 76193d7c 2003-09-30 devnull free(mc);
108 76193d7c 2003-09-30 devnull return nil;
109 76193d7c 2003-09-30 devnull }
110 76193d7c 2003-09-30 devnull t = malloc(strlen(file)+16);
111 76193d7c 2003-09-30 devnull strcpy(t, file);
112 76193d7c 2003-09-30 devnull sl = utfrrune(t, '/');
113 76193d7c 2003-09-30 devnull if(sl)
114 76193d7c 2003-09-30 devnull strcpy(sl, "/cursor");
115 76193d7c 2003-09-30 devnull else
116 76193d7c 2003-09-30 devnull strcpy(t, "/dev/cursor");
117 76193d7c 2003-09-30 devnull mc->cfd = open(t, ORDWR|OCEXEC);
118 76193d7c 2003-09-30 devnull free(t);
119 76193d7c 2003-09-30 devnull mc->image = i;
120 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
121 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
122 76193d7c 2003-09-30 devnull proccreate(_ioproc, mc, 4096);
123 76193d7c 2003-09-30 devnull return mc;
124 76193d7c 2003-09-30 devnull }
125 76193d7c 2003-09-30 devnull
126 76193d7c 2003-09-30 devnull void
127 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
128 76193d7c 2003-09-30 devnull {
129 76193d7c 2003-09-30 devnull char curs[2*4+2*2*16];
130 76193d7c 2003-09-30 devnull
131 76193d7c 2003-09-30 devnull if(c == nil)
132 76193d7c 2003-09-30 devnull write(mc->cfd, curs, 0);
133 76193d7c 2003-09-30 devnull else{
134 76193d7c 2003-09-30 devnull BPLONG(curs+0*4, c->offset.x);
135 76193d7c 2003-09-30 devnull BPLONG(curs+1*4, c->offset.y);
136 76193d7c 2003-09-30 devnull memmove(curs+2*4, c->clr, 2*2*16);
137 76193d7c 2003-09-30 devnull write(mc->cfd, curs, sizeof curs);
138 76193d7c 2003-09-30 devnull }
139 76193d7c 2003-09-30 devnull }