Blame


1 76193d7c 2003-09-30 devnull #include "x11-inc.h"
2 76193d7c 2003-09-30 devnull #include <u.h>
3 76193d7c 2003-09-30 devnull #include <libc.h>
4 76193d7c 2003-09-30 devnull #include <draw.h>
5 76193d7c 2003-09-30 devnull #include <thread.h>
6 76193d7c 2003-09-30 devnull #include <cursor.h>
7 76193d7c 2003-09-30 devnull #include <mouse.h>
8 76193d7c 2003-09-30 devnull #include <memdraw.h>
9 76193d7c 2003-09-30 devnull #include "x11-memdraw.h"
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull void
12 76193d7c 2003-09-30 devnull moveto(Mousectl *m, Point pt)
13 76193d7c 2003-09-30 devnull {
14 76193d7c 2003-09-30 devnull xmoveto(pt);
15 76193d7c 2003-09-30 devnull }
16 76193d7c 2003-09-30 devnull
17 76193d7c 2003-09-30 devnull void
18 76193d7c 2003-09-30 devnull closemouse(Mousectl *mc)
19 76193d7c 2003-09-30 devnull {
20 76193d7c 2003-09-30 devnull if(mc == nil)
21 76193d7c 2003-09-30 devnull return;
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull /* postnote(PNPROC, mc->pid, "kill");
24 76193d7c 2003-09-30 devnull */
25 76193d7c 2003-09-30 devnull do; while(nbrecv(mc->c, &mc->m) > 0);
26 76193d7c 2003-09-30 devnull close(mc->mfd);
27 76193d7c 2003-09-30 devnull close(mc->cfd);
28 76193d7c 2003-09-30 devnull free(mc->file);
29 76193d7c 2003-09-30 devnull chanfree(mc->c);
30 76193d7c 2003-09-30 devnull chanfree(mc->resizec);
31 76193d7c 2003-09-30 devnull free(mc);
32 76193d7c 2003-09-30 devnull }
33 76193d7c 2003-09-30 devnull
34 76193d7c 2003-09-30 devnull int
35 76193d7c 2003-09-30 devnull readmouse(Mousectl *mc)
36 76193d7c 2003-09-30 devnull {
37 76193d7c 2003-09-30 devnull if(mc->display)
38 76193d7c 2003-09-30 devnull flushimage(mc->display, 1);
39 76193d7c 2003-09-30 devnull if(recv(mc->c, &mc->m) < 0){
40 76193d7c 2003-09-30 devnull fprint(2, "readmouse: %r\n");
41 76193d7c 2003-09-30 devnull return -1;
42 76193d7c 2003-09-30 devnull }
43 76193d7c 2003-09-30 devnull return 0;
44 76193d7c 2003-09-30 devnull }
45 76193d7c 2003-09-30 devnull
46 76193d7c 2003-09-30 devnull static
47 76193d7c 2003-09-30 devnull void
48 76193d7c 2003-09-30 devnull _ioproc(void *arg)
49 76193d7c 2003-09-30 devnull {
50 76193d7c 2003-09-30 devnull int one;
51 76193d7c 2003-09-30 devnull Mouse m;
52 76193d7c 2003-09-30 devnull Mousectl *mc;
53 76193d7c 2003-09-30 devnull XEvent xevent;
54 76193d7c 2003-09-30 devnull
55 76193d7c 2003-09-30 devnull one = 1;
56 76193d7c 2003-09-30 devnull mc = arg;
57 76193d7c 2003-09-30 devnull threadsetname("mouseproc");
58 76193d7c 2003-09-30 devnull memset(&m, 0, sizeof m);
59 76193d7c 2003-09-30 devnull mc->pid = getpid();
60 76193d7c 2003-09-30 devnull for(;;){
61 76193d7c 2003-09-30 devnull XSelectInput(_x.mousecon, _x.drawable, MouseMask|ExposureMask|StructureNotifyMask);
62 76193d7c 2003-09-30 devnull XWindowEvent(_x.mousecon, _x.drawable, MouseMask|ExposureMask|StructureNotifyMask, &xevent);
63 76193d7c 2003-09-30 devnull switch(xevent.type){
64 76193d7c 2003-09-30 devnull case Expose:
65 76193d7c 2003-09-30 devnull xexpose(&xevent, _x.mousecon);
66 76193d7c 2003-09-30 devnull continue;
67 76193d7c 2003-09-30 devnull case ConfigureNotify:
68 76193d7c 2003-09-30 devnull if(xconfigure(&xevent, _x.mousecon))
69 76193d7c 2003-09-30 devnull nbsend(mc->resizec, &one);
70 76193d7c 2003-09-30 devnull continue;
71 76193d7c 2003-09-30 devnull case ButtonPress:
72 76193d7c 2003-09-30 devnull case ButtonRelease:
73 76193d7c 2003-09-30 devnull case MotionNotify:
74 76193d7c 2003-09-30 devnull if(xtoplan9mouse(&xevent, &m) < 0)
75 76193d7c 2003-09-30 devnull continue;
76 76193d7c 2003-09-30 devnull send(mc->c, &m);
77 76193d7c 2003-09-30 devnull /*
78 76193d7c 2003-09-30 devnull * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
79 76193d7c 2003-09-30 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
80 76193d7c 2003-09-30 devnull * they want full synchrony.
81 76193d7c 2003-09-30 devnull */
82 76193d7c 2003-09-30 devnull mc->m = m;
83 76193d7c 2003-09-30 devnull break;
84 76193d7c 2003-09-30 devnull }
85 76193d7c 2003-09-30 devnull }
86 76193d7c 2003-09-30 devnull }
87 76193d7c 2003-09-30 devnull
88 76193d7c 2003-09-30 devnull Mousectl*
89 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
90 76193d7c 2003-09-30 devnull {
91 76193d7c 2003-09-30 devnull Mousectl *mc;
92 76193d7c 2003-09-30 devnull
93 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
94 76193d7c 2003-09-30 devnull if(i)
95 76193d7c 2003-09-30 devnull mc->display = i->display;
96 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
97 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
98 76193d7c 2003-09-30 devnull proccreate(_ioproc, mc, 16384);
99 76193d7c 2003-09-30 devnull return mc;
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull
102 76193d7c 2003-09-30 devnull void
103 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
104 76193d7c 2003-09-30 devnull {
105 76193d7c 2003-09-30 devnull xsetcursor(c);
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull