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