Events.c revision 9ace9065
105b261ecSmrg/* 205b261ecSmrg 305b261ecSmrgCopyright 1993 by Davor Matic 405b261ecSmrg 505b261ecSmrgPermission to use, copy, modify, distribute, and sell this software 605b261ecSmrgand its documentation for any purpose is hereby granted without fee, 705b261ecSmrgprovided that the above copyright notice appear in all copies and that 805b261ecSmrgboth that copyright notice and this permission notice appear in 905b261ecSmrgsupporting documentation. Davor Matic makes no representations about 1005b261ecSmrgthe suitability of this software for any purpose. It is provided "as 1105b261ecSmrgis" without express or implied warranty. 1205b261ecSmrg 1305b261ecSmrg*/ 1405b261ecSmrg 1505b261ecSmrg#ifdef HAVE_XNEST_CONFIG_H 1605b261ecSmrg#include <xnest-config.h> 1705b261ecSmrg#endif 1805b261ecSmrg 1905b261ecSmrg#include <X11/X.h> 2005b261ecSmrg#include <X11/Xproto.h> 2105b261ecSmrg#include "screenint.h" 2205b261ecSmrg#include "input.h" 2305b261ecSmrg#include "misc.h" 2405b261ecSmrg#include "scrnintstr.h" 2505b261ecSmrg#include "windowstr.h" 2605b261ecSmrg#include "servermd.h" 274642e01fSmrg#include "inputstr.h" 289ace9065Smrg#include "inpututils.h" 2905b261ecSmrg 3005b261ecSmrg#include "mi.h" 3105b261ecSmrg 3205b261ecSmrg#include "Xnest.h" 3305b261ecSmrg 3405b261ecSmrg#include "Args.h" 3505b261ecSmrg#include "Color.h" 3605b261ecSmrg#include "Display.h" 3705b261ecSmrg#include "Screen.h" 3805b261ecSmrg#include "XNWindow.h" 3905b261ecSmrg#include "Events.h" 4005b261ecSmrg#include "Keyboard.h" 4105b261ecSmrg#include "Pointer.h" 4205b261ecSmrg#include "mipointer.h" 4305b261ecSmrg 4405b261ecSmrgCARD32 lastEventTime = 0; 4505b261ecSmrg 464642e01fSmrgextern EventList *xnestEvents; 4705b261ecSmrg 4805b261ecSmrgvoid 496747b715SmrgProcessInputEvents(void) 5005b261ecSmrg{ 5105b261ecSmrg mieqProcessInputEvents(); 5205b261ecSmrg} 5305b261ecSmrg 5405b261ecSmrgint 5505b261ecSmrgTimeSinceLastInputEvent(void) 5605b261ecSmrg{ 5705b261ecSmrg if (lastEventTime == 0) 5805b261ecSmrg lastEventTime = GetTimeInMillis(); 5905b261ecSmrg return GetTimeInMillis() - lastEventTime; 6005b261ecSmrg} 6105b261ecSmrg 6205b261ecSmrgvoid 6305b261ecSmrgSetTimeSinceLastInputEvent(void) 6405b261ecSmrg{ 6505b261ecSmrg lastEventTime = GetTimeInMillis(); 6605b261ecSmrg} 6705b261ecSmrg 6805b261ecSmrgstatic Bool 6905b261ecSmrgxnestExposurePredicate(Display *display, XEvent *event, char *args) 7005b261ecSmrg{ 716747b715Smrg return event->type == Expose || event->type == ProcessedExpose; 7205b261ecSmrg} 7305b261ecSmrg 7405b261ecSmrgstatic Bool 7505b261ecSmrgxnestNotExposurePredicate(Display *display, XEvent *event, char *args) 7605b261ecSmrg{ 7705b261ecSmrg return !xnestExposurePredicate(display, event, args); 7805b261ecSmrg} 7905b261ecSmrg 8005b261ecSmrgvoid 8105b261ecSmrgxnestCollectExposures(void) 8205b261ecSmrg{ 8305b261ecSmrg XEvent X; 8405b261ecSmrg WindowPtr pWin; 8505b261ecSmrg RegionRec Rgn; 8605b261ecSmrg BoxRec Box; 8705b261ecSmrg 8805b261ecSmrg while (XCheckIfEvent(xnestDisplay, &X, xnestExposurePredicate, NULL)) { 8905b261ecSmrg pWin = xnestWindowPtr(X.xexpose.window); 9005b261ecSmrg 914642e01fSmrg if (pWin && X.xexpose.width && X.xexpose.height) { 9205b261ecSmrg Box.x1 = pWin->drawable.x + wBorderWidth(pWin) + X.xexpose.x; 9305b261ecSmrg Box.y1 = pWin->drawable.y + wBorderWidth(pWin) + X.xexpose.y; 9405b261ecSmrg Box.x2 = Box.x1 + X.xexpose.width; 9505b261ecSmrg Box.y2 = Box.y1 + X.xexpose.height; 9605b261ecSmrg 976747b715Smrg RegionInit(&Rgn, &Box, 1); 9805b261ecSmrg 994642e01fSmrg miSendExposures(pWin, &Rgn, Box.x2, Box.y2); 10005b261ecSmrg } 10105b261ecSmrg } 10205b261ecSmrg} 10305b261ecSmrg 10405b261ecSmrgvoid 10505b261ecSmrgxnestQueueKeyEvent(int type, unsigned int keycode) 10605b261ecSmrg{ 10705b261ecSmrg int i, n; 10805b261ecSmrg 1094642e01fSmrg GetEventList(&xnestEvents); 11005b261ecSmrg lastEventTime = GetTimeInMillis(); 11105b261ecSmrg n = GetKeyboardEvents(xnestEvents, xnestKeyboardDevice, type, keycode); 11205b261ecSmrg for (i = 0; i < n; i++) 1136747b715Smrg mieqEnqueue(xnestKeyboardDevice, (InternalEvent*)(xnestEvents + i)->event); 11405b261ecSmrg} 11505b261ecSmrg 11605b261ecSmrgvoid 11705b261ecSmrgxnestCollectEvents(void) 11805b261ecSmrg{ 11905b261ecSmrg XEvent X; 12005b261ecSmrg int i, n, valuators[2]; 1219ace9065Smrg ValuatorMask mask; 12205b261ecSmrg ScreenPtr pScreen; 1234642e01fSmrg GetEventList(&xnestEvents); 12405b261ecSmrg 12505b261ecSmrg while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) { 12605b261ecSmrg switch (X.type) { 12705b261ecSmrg case KeyPress: 12805b261ecSmrg xnestUpdateModifierState(X.xkey.state); 12905b261ecSmrg xnestQueueKeyEvent(KeyPress, X.xkey.keycode); 13005b261ecSmrg break; 13105b261ecSmrg 13205b261ecSmrg case KeyRelease: 13305b261ecSmrg xnestUpdateModifierState(X.xkey.state); 13405b261ecSmrg xnestQueueKeyEvent(KeyRelease, X.xkey.keycode); 13505b261ecSmrg break; 13605b261ecSmrg 13705b261ecSmrg case ButtonPress: 1389ace9065Smrg valuator_mask_set_range(&mask, 0, 0, NULL); 13905b261ecSmrg xnestUpdateModifierState(X.xkey.state); 14005b261ecSmrg lastEventTime = GetTimeInMillis(); 14105b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonPress, 1429ace9065Smrg X.xbutton.button, POINTER_RELATIVE, &mask); 14305b261ecSmrg for (i = 0; i < n; i++) 1446747b715Smrg mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event); 14505b261ecSmrg break; 14605b261ecSmrg 14705b261ecSmrg case ButtonRelease: 1489ace9065Smrg valuator_mask_set_range(&mask, 0, 0, NULL); 14905b261ecSmrg xnestUpdateModifierState(X.xkey.state); 15005b261ecSmrg lastEventTime = GetTimeInMillis(); 15105b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonRelease, 1529ace9065Smrg X.xbutton.button, POINTER_RELATIVE, &mask); 15305b261ecSmrg for (i = 0; i < n; i++) 1546747b715Smrg mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event); 15505b261ecSmrg break; 15605b261ecSmrg 15705b261ecSmrg case MotionNotify: 15805b261ecSmrg valuators[0] = X.xmotion.x; 15905b261ecSmrg valuators[1] = X.xmotion.y; 1609ace9065Smrg valuator_mask_set_range(&mask, 0, 2, valuators); 16105b261ecSmrg lastEventTime = GetTimeInMillis(); 16205b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify, 1639ace9065Smrg 0, POINTER_ABSOLUTE, &mask); 16405b261ecSmrg for (i = 0; i < n; i++) 1656747b715Smrg mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event); 16605b261ecSmrg break; 16705b261ecSmrg 16805b261ecSmrg case FocusIn: 16905b261ecSmrg if (X.xfocus.detail != NotifyInferior) { 17005b261ecSmrg pScreen = xnestScreen(X.xfocus.window); 17105b261ecSmrg if (pScreen) 17205b261ecSmrg xnestDirectInstallColormaps(pScreen); 17305b261ecSmrg } 17405b261ecSmrg break; 17505b261ecSmrg 17605b261ecSmrg case FocusOut: 17705b261ecSmrg if (X.xfocus.detail != NotifyInferior) { 17805b261ecSmrg pScreen = xnestScreen(X.xfocus.window); 17905b261ecSmrg if (pScreen) 18005b261ecSmrg xnestDirectUninstallColormaps(pScreen); 18105b261ecSmrg } 18205b261ecSmrg break; 18305b261ecSmrg 18405b261ecSmrg case KeymapNotify: 18505b261ecSmrg break; 18605b261ecSmrg 18705b261ecSmrg case EnterNotify: 18805b261ecSmrg if (X.xcrossing.detail != NotifyInferior) { 18905b261ecSmrg pScreen = xnestScreen(X.xcrossing.window); 19005b261ecSmrg if (pScreen) { 1914642e01fSmrg NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x, X.xcrossing.y); 19205b261ecSmrg valuators[0] = X.xcrossing.x; 19305b261ecSmrg valuators[1] = X.xcrossing.y; 1949ace9065Smrg valuator_mask_set_range(&mask, 0, 2, valuators); 19505b261ecSmrg lastEventTime = GetTimeInMillis(); 19605b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify, 1979ace9065Smrg 0, POINTER_ABSOLUTE, &mask); 19805b261ecSmrg for (i = 0; i < n; i++) 1996747b715Smrg mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event); 20005b261ecSmrg xnestDirectInstallColormaps(pScreen); 20105b261ecSmrg } 20205b261ecSmrg } 20305b261ecSmrg break; 20405b261ecSmrg 20505b261ecSmrg case LeaveNotify: 20605b261ecSmrg if (X.xcrossing.detail != NotifyInferior) { 20705b261ecSmrg pScreen = xnestScreen(X.xcrossing.window); 20805b261ecSmrg if (pScreen) { 20905b261ecSmrg xnestDirectUninstallColormaps(pScreen); 21005b261ecSmrg } 21105b261ecSmrg } 21205b261ecSmrg break; 21305b261ecSmrg 21405b261ecSmrg case DestroyNotify: 21505b261ecSmrg if (xnestParentWindow != (Window) 0 && 21605b261ecSmrg X.xdestroywindow.window == xnestParentWindow) 21705b261ecSmrg exit (0); 21805b261ecSmrg break; 21905b261ecSmrg 22005b261ecSmrg case CirculateNotify: 22105b261ecSmrg case ConfigureNotify: 22205b261ecSmrg case GravityNotify: 22305b261ecSmrg case MapNotify: 22405b261ecSmrg case ReparentNotify: 22505b261ecSmrg case UnmapNotify: 22605b261ecSmrg break; 22705b261ecSmrg 22805b261ecSmrg default: 22905b261ecSmrg ErrorF("xnest warning: unhandled event\n"); 23005b261ecSmrg break; 23105b261ecSmrg } 23205b261ecSmrg } 23305b261ecSmrg} 234