1 76193d7c 2003-09-30 devnull #include <u.h>
2 be22ae2d 2004-03-26 devnull #include "x11-inc.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"
11 4f30f3b4 2004-03-30 devnull int _windowhasfocus = 1;
12 4f30f3b4 2004-03-30 devnull int _wantfocuschanges;
15 76193d7c 2003-09-30 devnull moveto(Mousectl *m, Point pt)
17 32f69c36 2003-12-11 devnull _xmoveto(pt);
21 76193d7c 2003-09-30 devnull closemouse(Mousectl *mc)
23 76193d7c 2003-09-30 devnull if(mc == nil)
26 76193d7c 2003-09-30 devnull /* postnote(PNPROC, mc->pid, "kill");
28 76193d7c 2003-09-30 devnull do; while(nbrecv(mc->c, &mc->m) > 0);
29 76193d7c 2003-09-30 devnull close(mc->mfd);
30 76193d7c 2003-09-30 devnull close(mc->cfd);
31 76193d7c 2003-09-30 devnull free(mc->file);
32 76193d7c 2003-09-30 devnull chanfree(mc->c);
33 76193d7c 2003-09-30 devnull chanfree(mc->resizec);
34 76193d7c 2003-09-30 devnull free(mc);
38 76193d7c 2003-09-30 devnull readmouse(Mousectl *mc)
40 76193d7c 2003-09-30 devnull if(mc->display)
41 76193d7c 2003-09-30 devnull flushimage(mc->display, 1);
42 76193d7c 2003-09-30 devnull if(recv(mc->c, &mc->m) < 0){
43 76193d7c 2003-09-30 devnull fprint(2, "readmouse: %r\n");
44 76193d7c 2003-09-30 devnull return -1;
46 76193d7c 2003-09-30 devnull return 0;
51 76193d7c 2003-09-30 devnull _ioproc(void *arg)
53 5a8e63b2 2004-02-29 devnull int fd, one;
55 161060a4 2003-10-11 devnull ulong mask;
57 76193d7c 2003-09-30 devnull Mousectl *mc;
58 76193d7c 2003-09-30 devnull XEvent xevent;
61 76193d7c 2003-09-30 devnull mc = arg;
62 76193d7c 2003-09-30 devnull threadsetname("mouseproc");
63 76193d7c 2003-09-30 devnull memset(&m, 0, sizeof m);
64 76193d7c 2003-09-30 devnull mc->pid = getpid();
65 161060a4 2003-10-11 devnull mask = MouseMask|ExposureMask|StructureNotifyMask;
66 161060a4 2003-10-11 devnull XSelectInput(_x.mousecon, _x.drawable, mask);
67 5a8e63b2 2004-02-29 devnull fd = XConnectionNumber(_x.mousecon);
69 5a8e63b2 2004-02-29 devnull while(XPending(_x.mousecon) == False)
70 5a8e63b2 2004-02-29 devnull threadfdwait(fd, 'r');
71 161060a4 2003-10-11 devnull XNextEvent(_x.mousecon, &xevent);
72 76193d7c 2003-09-30 devnull switch(xevent.type){
73 76193d7c 2003-09-30 devnull case Expose:
74 32f69c36 2003-12-11 devnull _xexpose(&xevent, _x.mousecon);
75 76193d7c 2003-09-30 devnull continue;
76 16a70966 2003-11-23 devnull case DestroyNotify:
77 32f69c36 2003-12-11 devnull if(_xdestroy(&xevent, _x.mousecon)){
78 16a70966 2003-11-23 devnull /* drain it before sending */
79 16a70966 2003-11-23 devnull /* apps that care can notice we sent a 0 */
80 16a70966 2003-11-23 devnull /* otherwise we'll have getwindow send SIGHUP */
81 16a70966 2003-11-23 devnull nbrecv(mc->resizec, 0);
82 16a70966 2003-11-23 devnull nbrecv(mc->resizec, 0);
83 16a70966 2003-11-23 devnull send(mc->resizec, 0);
85 16a70966 2003-11-23 devnull continue;
86 76193d7c 2003-09-30 devnull case ConfigureNotify:
87 32f69c36 2003-12-11 devnull if(_xconfigure(&xevent, _x.mousecon))
88 76193d7c 2003-09-30 devnull nbsend(mc->resizec, &one);
89 76193d7c 2003-09-30 devnull continue;
90 161060a4 2003-10-11 devnull case SelectionRequest:
91 32f69c36 2003-12-11 devnull _xselect(&xevent, _x.mousecon);
92 161060a4 2003-10-11 devnull continue;
93 76193d7c 2003-09-30 devnull case ButtonPress:
94 76193d7c 2003-09-30 devnull case ButtonRelease:
95 76193d7c 2003-09-30 devnull case MotionNotify:
96 732be70c 2004-03-31 devnull /* If the motion notifications are backing up, skip over some. */
97 732be70c 2004-03-31 devnull if(xevent.type == MotionNotify){
98 732be70c 2004-03-31 devnull while(XCheckWindowEvent(_x.mousecon, _x.drawable, MouseMask, &xevent)){
99 732be70c 2004-03-31 devnull if(xevent.type != MotionNotify)
103 32f69c36 2003-12-11 devnull if(_xtoplan9mouse(_x.mousecon, &xevent, &m) < 0)
104 76193d7c 2003-09-30 devnull continue;
105 76193d7c 2003-09-30 devnull send(mc->c, &m);
107 76193d7c 2003-09-30 devnull * mc->Mouse is updated after send so it doesn't have wrong value if we block during send.
108 76193d7c 2003-09-30 devnull * This means that programs should receive into mc->Mouse (see readmouse() above) if
109 76193d7c 2003-09-30 devnull * they want full synchrony.
111 76193d7c 2003-09-30 devnull mc->m = m;
113 4f30f3b4 2004-03-30 devnull case ClientMessage:
114 4f30f3b4 2004-03-30 devnull if(xevent.xclient.message_type == _x.wmprotos){
115 4f30f3b4 2004-03-30 devnull a = xevent.xclient.data.l[0];
116 4f30f3b4 2004-03-30 devnull if(_wantfocuschanges && a == _x.takefocus){
117 4f30f3b4 2004-03-30 devnull _windowhasfocus = 1;
118 4f30f3b4 2004-03-30 devnull _x.newscreenr = _x.screenr;
119 4f30f3b4 2004-03-30 devnull nbsend(mc->resizec, &one);
120 4f30f3b4 2004-03-30 devnull }else if(_wantfocuschanges && a == _x.losefocus){
121 4f30f3b4 2004-03-30 devnull _windowhasfocus = 0;
122 4f30f3b4 2004-03-30 devnull _x.newscreenr = _x.screenr;
123 4f30f3b4 2004-03-30 devnull nbsend(mc->resizec, &one);
131 76193d7c 2003-09-30 devnull Mousectl*
132 76193d7c 2003-09-30 devnull initmouse(char *file, Image *i)
134 76193d7c 2003-09-30 devnull Mousectl *mc;
136 5a8e63b2 2004-02-29 devnull threadfdwaitsetup();
137 76193d7c 2003-09-30 devnull mc = mallocz(sizeof(Mousectl), 1);
139 76193d7c 2003-09-30 devnull mc->display = i->display;
140 76193d7c 2003-09-30 devnull mc->c = chancreate(sizeof(Mouse), 0);
141 76193d7c 2003-09-30 devnull mc->resizec = chancreate(sizeof(int), 2);
142 5a8e63b2 2004-02-29 devnull threadcreate(_ioproc, mc, 16384);
143 76193d7c 2003-09-30 devnull return mc;
147 76193d7c 2003-09-30 devnull setcursor(Mousectl *mc, Cursor *c)
149 32f69c36 2003-12-11 devnull _xsetcursor(c);
153 4f30f3b4 2004-03-30 devnull bouncemouse(Mouse *m)
155 4f30f3b4 2004-03-30 devnull XButtonEvent e;
157 4f30f3b4 2004-03-30 devnull e.type = ButtonPress;
158 4f30f3b4 2004-03-30 devnull e.window = DefaultRootWindow(_x.display);
159 4f30f3b4 2004-03-30 devnull e.state = 0;
160 4f30f3b4 2004-03-30 devnull e.button = 0;
161 4f30f3b4 2004-03-30 devnull if(m->buttons&1)
162 4f30f3b4 2004-03-30 devnull e.button = 1;
163 4f30f3b4 2004-03-30 devnull else if(m->buttons&2)
164 4f30f3b4 2004-03-30 devnull e.button = 2;
165 4f30f3b4 2004-03-30 devnull else if(m->buttons&4)
166 4f30f3b4 2004-03-30 devnull e.button = 3;
167 4f30f3b4 2004-03-30 devnull e.x = m->xy.x;
168 4f30f3b4 2004-03-30 devnull e.y = m->xy.y;
169 4f30f3b4 2004-03-30 devnull #undef time
170 4f30f3b4 2004-03-30 devnull e.time = CurrentTime;
171 4f30f3b4 2004-03-30 devnull XSendEvent(_x.display, e.window, True, ButtonPressMask, (XEvent*)&e);
172 4f30f3b4 2004-03-30 devnull XFlush(_x.display);