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 161060a4 2003-10-11 devnull ulong mask;
52 76193d7c 2003-09-30 devnull Mouse m;
53 76193d7c 2003-09-30 devnull Mousectl *mc;
54 76193d7c 2003-09-30 devnull XEvent xevent;
55 76193d7c 2003-09-30 devnull
56 76193d7c 2003-09-30 devnull one = 1;
57 76193d7c 2003-09-30 devnull mc = arg;
58 76193d7c 2003-09-30 devnull threadsetname("mouseproc");
59 76193d7c 2003-09-30 devnull memset(&m, 0, sizeof m);
60 76193d7c 2003-09-30 devnull mc->pid = getpid();
61 161060a4 2003-10-11 devnull mask = MouseMask|ExposureMask|StructureNotifyMask;
62 161060a4 2003-10-11 devnull XSelectInput(_x.mousecon, _x.drawable, mask);
63 76193d7c 2003-09-30 devnull for(;;){
64 161060a4 2003-10-11 devnull XNextEvent(_x.mousecon, &xevent);
65 76193d7c 2003-09-30 devnull switch(xevent.type){
66 76193d7c 2003-09-30 devnull case Expose:
67 76193d7c 2003-09-30 devnull xexpose(&xevent, _x.mousecon);
68 76193d7c 2003-09-30 devnull continue;
69 16a70966 2003-11-23 devnull case DestroyNotify:
70 16a70966 2003-11-23 devnull if(xdestroy(&xevent, _x.mousecon)){
71 16a70966 2003-11-23 devnull /* drain it before sending */
72 16a70966 2003-11-23 devnull /* apps that care can notice we sent a 0 */
73 16a70966 2003-11-23 devnull /* otherwise we'll have getwindow send SIGHUP */
74 16a70966 2003-11-23 devnull nbrecv(mc->resizec, 0);
75 16a70966 2003-11-23 devnull nbrecv(mc->resizec, 0);
76 16a70966 2003-11-23 devnull send(mc->resizec, 0);
77 16a70966 2003-11-23 devnull }
78 16a70966 2003-11-23 devnull continue;
79 76193d7c 2003-09-30 devnull case ConfigureNotify:
80 76193d7c 2003-09-30 devnull if(xconfigure(&xevent, _x.mousecon))
81 76193d7c 2003-09-30 devnull nbsend(mc->resizec, &one);
82 76193d7c 2003-09-30 devnull continue;
83 161060a4 2003-10-11 devnull case SelectionRequest:
84 161060a4 2003-10-11 devnull xselect(&xevent, _x.mousecon);
85 161060a4 2003-10-11 devnull continue;
86 76193d7c 2003-09-30 devnull case ButtonPress:
87 76193d7c 2003-09-30 devnull case ButtonRelease:
88 76193d7c 2003-09-30 devnull case MotionNotify:
89 16a70966 2003-11-23 devnull if(xtoplan9mouse(_x.mousecon, &xevent, &m) < 0)
90 76193d7c 2003-09-30 devnull continue;
91 76193d7c 2003-09-30 devnull send(mc->c, &m);
92 76193d7c 2003-09-30 devnull /*
93 76193d7c 2003-09-30 devnull * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
94 76193d7c 2003-09-30 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
95 76193d7c 2003-09-30 devnull * they want full synchrony.
96 76193d7c 2003-09-30 devnull */
97 76193d7c 2003-09-30 devnull mc->m = m;
98 76193d7c 2003-09-30 devnull break;
99 76193d7c 2003-09-30 devnull }
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull Mousectl*
104 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
105 76193d7c 2003-09-30 devnull {
106 76193d7c 2003-09-30 devnull Mousectl *mc;
107 76193d7c 2003-09-30 devnull
108 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
109 76193d7c 2003-09-30 devnull if(i)
110 76193d7c 2003-09-30 devnull mc->display = i->display;
111 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
112 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
113 76193d7c 2003-09-30 devnull proccreate(_ioproc, mc, 16384);
114 76193d7c 2003-09-30 devnull return mc;
115 76193d7c 2003-09-30 devnull }
116 76193d7c 2003-09-30 devnull
117 76193d7c 2003-09-30 devnull void
118 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
119 76193d7c 2003-09-30 devnull {
120 76193d7c 2003-09-30 devnull xsetcursor(c);
121 76193d7c 2003-09-30 devnull }
122 76193d7c 2003-09-30 devnull