xref: /OK3568_Linux_fs/external/xserver/hw/xnest/Events.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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
ProcessInputEvents(void)47 ProcessInputEvents(void)
48 {
49     mieqProcessInputEvents();
50 }
51 
52 int
TimeSinceLastInputEvent(void)53 TimeSinceLastInputEvent(void)
54 {
55     if (lastEventTime == 0)
56         lastEventTime = GetTimeInMillis();
57     return GetTimeInMillis() - lastEventTime;
58 }
59 
60 void
SetTimeSinceLastInputEvent(void)61 SetTimeSinceLastInputEvent(void)
62 {
63     lastEventTime = GetTimeInMillis();
64 }
65 
66 static Bool
xnestExposurePredicate(Display * dpy,XEvent * event,char * args)67 xnestExposurePredicate(Display * dpy, XEvent * event, char *args)
68 {
69     return event->type == Expose || event->type == ProcessedExpose;
70 }
71 
72 static Bool
xnestNotExposurePredicate(Display * dpy,XEvent * event,char * args)73 xnestNotExposurePredicate(Display * dpy, XEvent * event, char *args)
74 {
75     return !xnestExposurePredicate(dpy, event, args);
76 }
77 
78 void
xnestCollectExposures(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
xnestQueueKeyEvent(int type,unsigned int keycode)103 xnestQueueKeyEvent(int type, unsigned int keycode)
104 {
105     lastEventTime = GetTimeInMillis();
106     QueueKeyboardEvents(xnestKeyboardDevice, type, keycode);
107 }
108 
109 void
xnestCollectEvents(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 }
219