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