Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xnest / Events.c
1 /*
2
3 Copyright 1993 by Davor Matic
4
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and that
8 both that copyright notice and this permission notice appear in
9 supporting documentation. Davor Matic makes no representations about
10 the suitability of this software for any purpose. It is provided "as
11 is" without express or implied warranty.
12
13 */
14
15 #ifdef HAVE_XNEST_CONFIG_H
16 #include <xnest-config.h>
17 #endif
18
19 #include <X11/X.h>
20 #include <X11/Xproto.h>
21 #include "screenint.h"
22 #include "input.h"
23 #include "misc.h"
24 #include "scrnintstr.h"
25 #include "windowstr.h"
26 #include "servermd.h"
27 #include "inputstr.h"
28 #include "inpututils.h"
29
30 #include "mi.h"
31
32 #include "Xnest.h"
33
34 #include "Args.h"
35 #include "Color.h"
36 #include "Display.h"
37 #include "Screen.h"
38 #include "XNWindow.h"
39 #include "Events.h"
40 #include "Keyboard.h"
41 #include "Pointer.h"
42 #include "mipointer.h"
43
44 CARD32 lastEventTime = 0;
45
46 void
47 ProcessInputEvents(void)
48 {
49 mieqProcessInputEvents();
50 }
51
52 int
53 TimeSinceLastInputEvent(void)
54 {
55 if (lastEventTime == 0)
56 lastEventTime = GetTimeInMillis();
57 return GetTimeInMillis() - lastEventTime;
58 }
59
60 void
61 SetTimeSinceLastInputEvent(void)
62 {
63 lastEventTime = GetTimeInMillis();
64 }
65
66 static Bool
67 xnestExposurePredicate(Display * display, XEvent * event, char *args)
68 {
69 return event->type == Expose || event->type == ProcessedExpose;
70 }
71
72 static Bool
73 xnestNotExposurePredicate(Display * display, XEvent * event, char *args)
74 {
75 return !xnestExposurePredicate(display, event, args);
76 }
77
78 void
79 xnestCollectExposures(void)
80 {
81 XEvent X;
82 WindowPtr pWin;
83 RegionRec Rgn;
84 BoxRec Box;
85
86 while (XCheckIfEvent(xnestDisplay, &X, xnestExposurePredicate, NULL)) {
87 pWin = xnestWindowPtr(X.xexpose.window);
88
89 if (pWin && X.xexpose.width && X.xexpose.height) {
90 Box.x1 = pWin->drawable.x + wBorderWidth(pWin) + X.xexpose.x;
91 Box.y1 = pWin->drawable.y + wBorderWidth(pWin) + X.xexpose.y;
92 Box.x2 = Box.x1 + X.xexpose.width;
93 Box.y2 = Box.y1 + X.xexpose.height;
94
95 RegionInit(&Rgn, &Box, 1);
96
97 miSendExposures(pWin, &Rgn, Box.x2, Box.y2);
98 }
99 }
100 }
101
102 void
103 xnestQueueKeyEvent(int type, unsigned int keycode)
104 {
105 lastEventTime = GetTimeInMillis();
106 QueueKeyboardEvents(xnestKeyboardDevice, type, keycode, NULL);
107 }
108
109 void
110 xnestCollectEvents(void)
111 {
112 XEvent X;
113 int valuators[2];
114 ValuatorMask mask;
115 ScreenPtr pScreen;
116
117 while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
118 switch (X.type) {
119 case KeyPress:
120 xnestUpdateModifierState(X.xkey.state);
121 xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
122 break;
123
124 case KeyRelease:
125 xnestUpdateModifierState(X.xkey.state);
126 xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
127 break;
128
129 case ButtonPress:
130 valuator_mask_set_range(&mask, 0, 0, NULL);
131 xnestUpdateModifierState(X.xkey.state);
132 lastEventTime = GetTimeInMillis();
133 QueuePointerEvents(xnestPointerDevice, ButtonPress,
134 X.xbutton.button, POINTER_RELATIVE, &mask);
135 break;
136
137 case ButtonRelease:
138 valuator_mask_set_range(&mask, 0, 0, NULL);
139 xnestUpdateModifierState(X.xkey.state);
140 lastEventTime = GetTimeInMillis();
141 QueuePointerEvents(xnestPointerDevice, ButtonRelease,
142 X.xbutton.button, POINTER_RELATIVE, &mask);
143 break;
144
145 case MotionNotify:
146 valuators[0] = X.xmotion.x;
147 valuators[1] = X.xmotion.y;
148 valuator_mask_set_range(&mask, 0, 2, valuators);
149 lastEventTime = GetTimeInMillis();
150 QueuePointerEvents(xnestPointerDevice, MotionNotify,
151 0, POINTER_ABSOLUTE, &mask);
152 break;
153
154 case FocusIn:
155 if (X.xfocus.detail != NotifyInferior) {
156 pScreen = xnestScreen(X.xfocus.window);
157 if (pScreen)
158 xnestDirectInstallColormaps(pScreen);
159 }
160 break;
161
162 case FocusOut:
163 if (X.xfocus.detail != NotifyInferior) {
164 pScreen = xnestScreen(X.xfocus.window);
165 if (pScreen)
166 xnestDirectUninstallColormaps(pScreen);
167 }
168 break;
169
170 case KeymapNotify:
171 break;
172
173 case EnterNotify:
174 if (X.xcrossing.detail != NotifyInferior) {
175 pScreen = xnestScreen(X.xcrossing.window);
176 if (pScreen) {
177 NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x,
178 X.xcrossing.y);
179 valuators[0] = X.xcrossing.x;
180 valuators[1] = X.xcrossing.y;
181 valuator_mask_set_range(&mask, 0, 2, valuators);
182 lastEventTime = GetTimeInMillis();
183 QueuePointerEvents(xnestPointerDevice, MotionNotify,
184 0, POINTER_ABSOLUTE, &mask);
185 xnestDirectInstallColormaps(pScreen);
186 }
187 }
188 break;
189
190 case LeaveNotify:
191 if (X.xcrossing.detail != NotifyInferior) {
192 pScreen = xnestScreen(X.xcrossing.window);
193 if (pScreen) {
194 xnestDirectUninstallColormaps(pScreen);
195 }
196 }
197 break;
198
199 case DestroyNotify:
200 if (xnestParentWindow != (Window) 0 &&
201 X.xdestroywindow.window == xnestParentWindow)
202 exit(0);
203 break;
204
205 case CirculateNotify:
206 case ConfigureNotify:
207 case GravityNotify:
208 case MapNotify:
209 case ReparentNotify:
210 case UnmapNotify:
211 break;
212
213 default:
214 ErrorF("xnest warning: unhandled event\n");
215 break;
216 }
217 }
218 }