Events.c revision 05b261ec
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#define NEED_EVENTS 2105b261ecSmrg#include <X11/Xproto.h> 2205b261ecSmrg#include "screenint.h" 2305b261ecSmrg#include "input.h" 2405b261ecSmrg#include "misc.h" 2505b261ecSmrg#include "scrnintstr.h" 2605b261ecSmrg#include "windowstr.h" 2705b261ecSmrg#include "servermd.h" 2805b261ecSmrg 2905b261ecSmrg#include "mi.h" 3005b261ecSmrg 3105b261ecSmrg#include "Xnest.h" 3205b261ecSmrg 3305b261ecSmrg#include "Args.h" 3405b261ecSmrg#include "Color.h" 3505b261ecSmrg#include "Display.h" 3605b261ecSmrg#include "Screen.h" 3705b261ecSmrg#include "XNWindow.h" 3805b261ecSmrg#include "Events.h" 3905b261ecSmrg#include "Keyboard.h" 4005b261ecSmrg#include "Pointer.h" 4105b261ecSmrg#include "mipointer.h" 4205b261ecSmrg 4305b261ecSmrgCARD32 lastEventTime = 0; 4405b261ecSmrg 4505b261ecSmrgextern xEvent *xnestEvents; 4605b261ecSmrg 4705b261ecSmrgvoid 4805b261ecSmrgProcessInputEvents() 4905b261ecSmrg{ 5005b261ecSmrg mieqProcessInputEvents(); 5105b261ecSmrg miPointerUpdate(); 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{ 7105b261ecSmrg 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 9105b261ecSmrg if (pWin) { 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 9705b261ecSmrg REGION_INIT(pWin->drawable.pScreen, &Rgn, &Box, 1); 9805b261ecSmrg 9905b261ecSmrg miWindowExposures(pWin, &Rgn, NullRegion); 10005b261ecSmrg } 10105b261ecSmrg } 10205b261ecSmrg} 10305b261ecSmrg 10405b261ecSmrgvoid 10505b261ecSmrgxnestQueueKeyEvent(int type, unsigned int keycode) 10605b261ecSmrg{ 10705b261ecSmrg int i, n; 10805b261ecSmrg 10905b261ecSmrg lastEventTime = GetTimeInMillis(); 11005b261ecSmrg n = GetKeyboardEvents(xnestEvents, xnestKeyboardDevice, type, keycode); 11105b261ecSmrg for (i = 0; i < n; i++) 11205b261ecSmrg mieqEnqueue(xnestKeyboardDevice, xnestEvents + i); 11305b261ecSmrg} 11405b261ecSmrg 11505b261ecSmrgvoid 11605b261ecSmrgxnestCollectEvents(void) 11705b261ecSmrg{ 11805b261ecSmrg XEvent X; 11905b261ecSmrg xEvent x; 12005b261ecSmrg int i, n, valuators[2]; 12105b261ecSmrg ScreenPtr pScreen; 12205b261ecSmrg 12305b261ecSmrg while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) { 12405b261ecSmrg switch (X.type) { 12505b261ecSmrg case KeyPress: 12605b261ecSmrg xnestUpdateModifierState(X.xkey.state); 12705b261ecSmrg xnestQueueKeyEvent(KeyPress, X.xkey.keycode); 12805b261ecSmrg break; 12905b261ecSmrg 13005b261ecSmrg case KeyRelease: 13105b261ecSmrg xnestUpdateModifierState(X.xkey.state); 13205b261ecSmrg xnestQueueKeyEvent(KeyRelease, X.xkey.keycode); 13305b261ecSmrg break; 13405b261ecSmrg 13505b261ecSmrg case ButtonPress: 13605b261ecSmrg xnestUpdateModifierState(X.xkey.state); 13705b261ecSmrg lastEventTime = GetTimeInMillis(); 13805b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonPress, 13905b261ecSmrg X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL); 14005b261ecSmrg for (i = 0; i < n; i++) 14105b261ecSmrg mieqEnqueue(xnestPointerDevice, xnestEvents + i); 14205b261ecSmrg break; 14305b261ecSmrg 14405b261ecSmrg case ButtonRelease: 14505b261ecSmrg xnestUpdateModifierState(X.xkey.state); 14605b261ecSmrg lastEventTime = GetTimeInMillis(); 14705b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonRelease, 14805b261ecSmrg X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL); 14905b261ecSmrg for (i = 0; i < n; i++) 15005b261ecSmrg mieqEnqueue(xnestPointerDevice, xnestEvents + i); 15105b261ecSmrg break; 15205b261ecSmrg 15305b261ecSmrg case MotionNotify: 15405b261ecSmrg valuators[0] = X.xmotion.x; 15505b261ecSmrg valuators[1] = X.xmotion.y; 15605b261ecSmrg lastEventTime = GetTimeInMillis(); 15705b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify, 15805b261ecSmrg 0, POINTER_ABSOLUTE, 0, 2, valuators); 15905b261ecSmrg for (i = 0; i < n; i++) 16005b261ecSmrg mieqEnqueue(xnestPointerDevice, xnestEvents + i); 16105b261ecSmrg break; 16205b261ecSmrg 16305b261ecSmrg case FocusIn: 16405b261ecSmrg if (X.xfocus.detail != NotifyInferior) { 16505b261ecSmrg pScreen = xnestScreen(X.xfocus.window); 16605b261ecSmrg if (pScreen) 16705b261ecSmrg xnestDirectInstallColormaps(pScreen); 16805b261ecSmrg } 16905b261ecSmrg break; 17005b261ecSmrg 17105b261ecSmrg case FocusOut: 17205b261ecSmrg if (X.xfocus.detail != NotifyInferior) { 17305b261ecSmrg pScreen = xnestScreen(X.xfocus.window); 17405b261ecSmrg if (pScreen) 17505b261ecSmrg xnestDirectUninstallColormaps(pScreen); 17605b261ecSmrg } 17705b261ecSmrg break; 17805b261ecSmrg 17905b261ecSmrg case KeymapNotify: 18005b261ecSmrg break; 18105b261ecSmrg 18205b261ecSmrg case EnterNotify: 18305b261ecSmrg if (X.xcrossing.detail != NotifyInferior) { 18405b261ecSmrg pScreen = xnestScreen(X.xcrossing.window); 18505b261ecSmrg if (pScreen) { 18605b261ecSmrg NewCurrentScreen(pScreen, X.xcrossing.x, X.xcrossing.y); 18705b261ecSmrg valuators[0] = X.xcrossing.x; 18805b261ecSmrg valuators[1] = X.xcrossing.y; 18905b261ecSmrg lastEventTime = GetTimeInMillis(); 19005b261ecSmrg n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify, 19105b261ecSmrg 0, POINTER_ABSOLUTE, 0, 2, valuators); 19205b261ecSmrg for (i = 0; i < n; i++) 19305b261ecSmrg mieqEnqueue(xnestPointerDevice, xnestEvents + i); 19405b261ecSmrg xnestDirectInstallColormaps(pScreen); 19505b261ecSmrg } 19605b261ecSmrg } 19705b261ecSmrg break; 19805b261ecSmrg 19905b261ecSmrg case LeaveNotify: 20005b261ecSmrg if (X.xcrossing.detail != NotifyInferior) { 20105b261ecSmrg pScreen = xnestScreen(X.xcrossing.window); 20205b261ecSmrg if (pScreen) { 20305b261ecSmrg xnestDirectUninstallColormaps(pScreen); 20405b261ecSmrg } 20505b261ecSmrg } 20605b261ecSmrg break; 20705b261ecSmrg 20805b261ecSmrg case DestroyNotify: 20905b261ecSmrg if (xnestParentWindow != (Window) 0 && 21005b261ecSmrg X.xdestroywindow.window == xnestParentWindow) 21105b261ecSmrg exit (0); 21205b261ecSmrg break; 21305b261ecSmrg 21405b261ecSmrg case CirculateNotify: 21505b261ecSmrg case ConfigureNotify: 21605b261ecSmrg case GravityNotify: 21705b261ecSmrg case MapNotify: 21805b261ecSmrg case ReparentNotify: 21905b261ecSmrg case UnmapNotify: 22005b261ecSmrg break; 22105b261ecSmrg 22205b261ecSmrg default: 22305b261ecSmrg ErrorF("xnest warning: unhandled event\n"); 22405b261ecSmrg break; 22505b261ecSmrg } 22605b261ecSmrg } 22705b261ecSmrg} 228