Events.c revision 706f2543
1706f2543Smrg/*
2706f2543Smrg
3706f2543SmrgCopyright 1993 by Davor Matic
4706f2543Smrg
5706f2543SmrgPermission to use, copy, modify, distribute, and sell this software
6706f2543Smrgand its documentation for any purpose is hereby granted without fee,
7706f2543Smrgprovided that the above copyright notice appear in all copies and that
8706f2543Smrgboth that copyright notice and this permission notice appear in
9706f2543Smrgsupporting documentation.  Davor Matic makes no representations about
10706f2543Smrgthe suitability of this software for any purpose.  It is provided "as
11706f2543Smrgis" without express or implied warranty.
12706f2543Smrg
13706f2543Smrg*/
14706f2543Smrg
15706f2543Smrg#ifdef HAVE_XNEST_CONFIG_H
16706f2543Smrg#include <xnest-config.h>
17706f2543Smrg#endif
18706f2543Smrg
19706f2543Smrg#include <X11/X.h>
20706f2543Smrg#include <X11/Xproto.h>
21706f2543Smrg#include "screenint.h"
22706f2543Smrg#include "input.h"
23706f2543Smrg#include "misc.h"
24706f2543Smrg#include "scrnintstr.h"
25706f2543Smrg#include "windowstr.h"
26706f2543Smrg#include "servermd.h"
27706f2543Smrg#include "inputstr.h"
28706f2543Smrg#include "inpututils.h"
29706f2543Smrg
30706f2543Smrg#include "mi.h"
31706f2543Smrg
32706f2543Smrg#include "Xnest.h"
33706f2543Smrg
34706f2543Smrg#include "Args.h"
35706f2543Smrg#include "Color.h"
36706f2543Smrg#include "Display.h"
37706f2543Smrg#include "Screen.h"
38706f2543Smrg#include "XNWindow.h"
39706f2543Smrg#include "Events.h"
40706f2543Smrg#include "Keyboard.h"
41706f2543Smrg#include "Pointer.h"
42706f2543Smrg#include "mipointer.h"
43706f2543Smrg
44706f2543SmrgCARD32 lastEventTime = 0;
45706f2543Smrg
46706f2543Smrgextern EventList *xnestEvents;
47706f2543Smrg
48706f2543Smrgvoid
49706f2543SmrgProcessInputEvents(void)
50706f2543Smrg{
51706f2543Smrg  mieqProcessInputEvents();
52706f2543Smrg}
53706f2543Smrg
54706f2543Smrgint
55706f2543SmrgTimeSinceLastInputEvent(void)
56706f2543Smrg{
57706f2543Smrg    if (lastEventTime == 0)
58706f2543Smrg        lastEventTime = GetTimeInMillis();
59706f2543Smrg    return GetTimeInMillis() - lastEventTime;
60706f2543Smrg}
61706f2543Smrg
62706f2543Smrgvoid
63706f2543SmrgSetTimeSinceLastInputEvent(void)
64706f2543Smrg{
65706f2543Smrg  lastEventTime = GetTimeInMillis();
66706f2543Smrg}
67706f2543Smrg
68706f2543Smrgstatic Bool
69706f2543SmrgxnestExposurePredicate(Display *display, XEvent *event, char *args)
70706f2543Smrg{
71706f2543Smrg  return event->type == Expose || event->type == ProcessedExpose;
72706f2543Smrg}
73706f2543Smrg
74706f2543Smrgstatic Bool
75706f2543SmrgxnestNotExposurePredicate(Display *display, XEvent *event, char *args)
76706f2543Smrg{
77706f2543Smrg  return !xnestExposurePredicate(display, event, args);
78706f2543Smrg}
79706f2543Smrg
80706f2543Smrgvoid
81706f2543SmrgxnestCollectExposures(void)
82706f2543Smrg{
83706f2543Smrg  XEvent X;
84706f2543Smrg  WindowPtr pWin;
85706f2543Smrg  RegionRec Rgn;
86706f2543Smrg  BoxRec Box;
87706f2543Smrg
88706f2543Smrg  while (XCheckIfEvent(xnestDisplay, &X, xnestExposurePredicate, NULL)) {
89706f2543Smrg    pWin = xnestWindowPtr(X.xexpose.window);
90706f2543Smrg
91706f2543Smrg    if (pWin && X.xexpose.width && X.xexpose.height) {
92706f2543Smrg      Box.x1 = pWin->drawable.x + wBorderWidth(pWin) + X.xexpose.x;
93706f2543Smrg      Box.y1 = pWin->drawable.y + wBorderWidth(pWin) + X.xexpose.y;
94706f2543Smrg      Box.x2 = Box.x1 + X.xexpose.width;
95706f2543Smrg      Box.y2 = Box.y1 + X.xexpose.height;
96706f2543Smrg
97706f2543Smrg      RegionInit(&Rgn, &Box, 1);
98706f2543Smrg
99706f2543Smrg      miSendExposures(pWin, &Rgn, Box.x2, Box.y2);
100706f2543Smrg    }
101706f2543Smrg  }
102706f2543Smrg}
103706f2543Smrg
104706f2543Smrgvoid
105706f2543SmrgxnestQueueKeyEvent(int type, unsigned int keycode)
106706f2543Smrg{
107706f2543Smrg  int i, n;
108706f2543Smrg
109706f2543Smrg  GetEventList(&xnestEvents);
110706f2543Smrg  lastEventTime = GetTimeInMillis();
111706f2543Smrg  n = GetKeyboardEvents(xnestEvents, xnestKeyboardDevice, type, keycode);
112706f2543Smrg  for (i = 0; i < n; i++)
113706f2543Smrg    mieqEnqueue(xnestKeyboardDevice, (InternalEvent*)(xnestEvents + i)->event);
114706f2543Smrg}
115706f2543Smrg
116706f2543Smrgvoid
117706f2543SmrgxnestCollectEvents(void)
118706f2543Smrg{
119706f2543Smrg  XEvent X;
120706f2543Smrg  int i, n, valuators[2];
121706f2543Smrg  ValuatorMask mask;
122706f2543Smrg  ScreenPtr pScreen;
123706f2543Smrg  GetEventList(&xnestEvents);
124706f2543Smrg
125706f2543Smrg  while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
126706f2543Smrg    switch (X.type) {
127706f2543Smrg    case KeyPress:
128706f2543Smrg      xnestUpdateModifierState(X.xkey.state);
129706f2543Smrg      xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
130706f2543Smrg      break;
131706f2543Smrg
132706f2543Smrg    case KeyRelease:
133706f2543Smrg      xnestUpdateModifierState(X.xkey.state);
134706f2543Smrg      xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
135706f2543Smrg      break;
136706f2543Smrg
137706f2543Smrg    case ButtonPress:
138706f2543Smrg      valuator_mask_set_range(&mask, 0, 0, NULL);
139706f2543Smrg      xnestUpdateModifierState(X.xkey.state);
140706f2543Smrg      lastEventTime = GetTimeInMillis();
141706f2543Smrg      n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonPress,
142706f2543Smrg                           X.xbutton.button, POINTER_RELATIVE, &mask);
143706f2543Smrg      for (i = 0; i < n; i++)
144706f2543Smrg        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
145706f2543Smrg      break;
146706f2543Smrg
147706f2543Smrg    case ButtonRelease:
148706f2543Smrg      valuator_mask_set_range(&mask, 0, 0, NULL);
149706f2543Smrg      xnestUpdateModifierState(X.xkey.state);
150706f2543Smrg      lastEventTime = GetTimeInMillis();
151706f2543Smrg      n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonRelease,
152706f2543Smrg                           X.xbutton.button, POINTER_RELATIVE, &mask);
153706f2543Smrg      for (i = 0; i < n; i++)
154706f2543Smrg        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
155706f2543Smrg      break;
156706f2543Smrg
157706f2543Smrg    case MotionNotify:
158706f2543Smrg      valuators[0] = X.xmotion.x;
159706f2543Smrg      valuators[1] = X.xmotion.y;
160706f2543Smrg      valuator_mask_set_range(&mask, 0, 2, valuators);
161706f2543Smrg      lastEventTime = GetTimeInMillis();
162706f2543Smrg      n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
163706f2543Smrg                           0, POINTER_ABSOLUTE, &mask);
164706f2543Smrg      for (i = 0; i < n; i++)
165706f2543Smrg        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
166706f2543Smrg      break;
167706f2543Smrg
168706f2543Smrg    case FocusIn:
169706f2543Smrg      if (X.xfocus.detail != NotifyInferior) {
170706f2543Smrg	pScreen = xnestScreen(X.xfocus.window);
171706f2543Smrg	if (pScreen)
172706f2543Smrg	  xnestDirectInstallColormaps(pScreen);
173706f2543Smrg      }
174706f2543Smrg      break;
175706f2543Smrg
176706f2543Smrg    case FocusOut:
177706f2543Smrg      if (X.xfocus.detail != NotifyInferior) {
178706f2543Smrg	pScreen = xnestScreen(X.xfocus.window);
179706f2543Smrg	if (pScreen)
180706f2543Smrg	  xnestDirectUninstallColormaps(pScreen);
181706f2543Smrg      }
182706f2543Smrg      break;
183706f2543Smrg
184706f2543Smrg    case KeymapNotify:
185706f2543Smrg      break;
186706f2543Smrg
187706f2543Smrg    case EnterNotify:
188706f2543Smrg      if (X.xcrossing.detail != NotifyInferior) {
189706f2543Smrg	pScreen = xnestScreen(X.xcrossing.window);
190706f2543Smrg	if (pScreen) {
191706f2543Smrg	  NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x, X.xcrossing.y);
192706f2543Smrg          valuators[0] = X.xcrossing.x;
193706f2543Smrg          valuators[1] = X.xcrossing.y;
194706f2543Smrg          valuator_mask_set_range(&mask, 0, 2, valuators);
195706f2543Smrg          lastEventTime = GetTimeInMillis();
196706f2543Smrg          n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
197706f2543Smrg                               0, POINTER_ABSOLUTE, &mask);
198706f2543Smrg          for (i = 0; i < n; i++)
199706f2543Smrg            mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
200706f2543Smrg	  xnestDirectInstallColormaps(pScreen);
201706f2543Smrg	}
202706f2543Smrg      }
203706f2543Smrg      break;
204706f2543Smrg
205706f2543Smrg    case LeaveNotify:
206706f2543Smrg      if (X.xcrossing.detail != NotifyInferior) {
207706f2543Smrg	pScreen = xnestScreen(X.xcrossing.window);
208706f2543Smrg	if (pScreen) {
209706f2543Smrg	  xnestDirectUninstallColormaps(pScreen);
210706f2543Smrg	}
211706f2543Smrg      }
212706f2543Smrg      break;
213706f2543Smrg
214706f2543Smrg    case DestroyNotify:
215706f2543Smrg      if (xnestParentWindow != (Window) 0 &&
216706f2543Smrg	  X.xdestroywindow.window == xnestParentWindow)
217706f2543Smrg	exit (0);
218706f2543Smrg      break;
219706f2543Smrg
220706f2543Smrg    case CirculateNotify:
221706f2543Smrg    case ConfigureNotify:
222706f2543Smrg    case GravityNotify:
223706f2543Smrg    case MapNotify:
224706f2543Smrg    case ReparentNotify:
225706f2543Smrg    case UnmapNotify:
226706f2543Smrg      break;
227706f2543Smrg
228706f2543Smrg    default:
229706f2543Smrg      ErrorF("xnest warning: unhandled event\n");
230706f2543Smrg      break;
231706f2543Smrg    }
232706f2543Smrg  }
233706f2543Smrg}
234