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 "inputstr.h"
23706f2543Smrg#include "input.h"
24706f2543Smrg#include "misc.h"
25706f2543Smrg#include "scrnintstr.h"
26706f2543Smrg#include "servermd.h"
27706f2543Smrg#include "mipointer.h"
28706f2543Smrg
29706f2543Smrg#include "Xnest.h"
30706f2543Smrg
31706f2543Smrg#include "Display.h"
32706f2543Smrg#include "Screen.h"
33706f2543Smrg#include "Pointer.h"
34706f2543Smrg#include "Args.h"
35706f2543Smrg
36706f2543Smrg#include "xserver-properties.h"
37706f2543Smrg#include "exevents.h" /* For XIGetKnownProperty */
38706f2543Smrg
39706f2543SmrgDeviceIntPtr xnestPointerDevice = NULL;
40706f2543Smrg
41706f2543Smrgvoid
42706f2543SmrgxnestChangePointerControl(DeviceIntPtr pDev, PtrCtrl *ctrl)
43706f2543Smrg{
44706f2543Smrg  XChangePointerControl(xnestDisplay, True, True,
45706f2543Smrg			ctrl->num, ctrl->den, ctrl->threshold);
46706f2543Smrg}
47706f2543Smrg
48706f2543Smrgint
49706f2543SmrgxnestPointerProc(DeviceIntPtr pDev, int onoff)
50706f2543Smrg{
51706f2543Smrg  CARD8 map[MAXBUTTONS];
52706f2543Smrg  Atom btn_labels[MAXBUTTONS] = {0};
53706f2543Smrg  Atom axes_labels[2] = {0};
54706f2543Smrg  int nmap;
55706f2543Smrg  int i;
56706f2543Smrg
57706f2543Smrg  switch (onoff)
58706f2543Smrg    {
59706f2543Smrg    case DEVICE_INIT:
60706f2543Smrg      nmap = XGetPointerMapping(xnestDisplay, map, MAXBUTTONS);
61706f2543Smrg      for (i = 0; i <= nmap; i++)
62706f2543Smrg	map[i] = i; /* buttons are already mapped */
63706f2543Smrg
64706f2543Smrg      btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
65706f2543Smrg      btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
66706f2543Smrg      btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
67706f2543Smrg      btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
68706f2543Smrg      btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
69706f2543Smrg      btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
70706f2543Smrg      btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
71706f2543Smrg
72706f2543Smrg      axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
73706f2543Smrg      axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
74706f2543Smrg
75706f2543Smrg      XGetPointerControl(xnestDisplay,
76706f2543Smrg                         &defaultPointerControl.num,
77706f2543Smrg                         &defaultPointerControl.den,
78706f2543Smrg                         &defaultPointerControl.threshold);
79706f2543Smrg      InitPointerDeviceStruct(&pDev->public, map, nmap, btn_labels,
80706f2543Smrg			      xnestChangePointerControl,
81706f2543Smrg			      GetMotionHistorySize(), 2, axes_labels);
82706f2543Smrg      break;
83706f2543Smrg    case DEVICE_ON:
84706f2543Smrg      xnestEventMask |= XNEST_POINTER_EVENT_MASK;
85706f2543Smrg      for (i = 0; i < xnestNumScreens; i++)
86706f2543Smrg	XSelectInput(xnestDisplay, xnestDefaultWindows[i], xnestEventMask);
87706f2543Smrg      break;
88706f2543Smrg    case DEVICE_OFF:
89706f2543Smrg      xnestEventMask &= ~XNEST_POINTER_EVENT_MASK;
90706f2543Smrg      for (i = 0; i < xnestNumScreens; i++)
91706f2543Smrg	XSelectInput(xnestDisplay, xnestDefaultWindows[i], xnestEventMask);
92706f2543Smrg      break;
93706f2543Smrg    case DEVICE_CLOSE:
94706f2543Smrg      break;
95706f2543Smrg    }
96706f2543Smrg  return Success;
97706f2543Smrg}
98