test: fix two more failing FP3232 tests
[gstreamer-omap:xserver.git] / test / xi2 / protocol-common.c
1 /**
2  * Copyright © 2009 Red Hat, Inc.
3  *
4  *  Permission is hereby granted, free of charge, to any person obtaining a
5  *  copy of this software and associated documentation files (the "Software"),
6  *  to deal in the Software without restriction, including without limitation
7  *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  *  and/or sell copies of the Software, and to permit persons to whom the
9  *  Software is furnished to do so, subject to the following conditions:
10  *
11  *  The above copyright notice and this permission notice (including the next
12  *  paragraph) shall be included in all copies or substantial portions of the
13  *  Software.
14  *
15  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  *  DEALINGS IN THE SOFTWARE.
22  */
23
24 #ifdef HAVE_DIX_CONFIG_H
25 #include <dix-config.h>
26 #endif
27
28 #include <stdint.h>
29 #include "extinit.h" /* for XInputExtensionInit */
30 #include "exglobals.h"
31 #include "xkbsrv.h" /* for XkbInitPrivates */
32 #include "xserver-properties.h"
33 #include <X11/extensions/XI2.h>
34
35 #include "protocol-common.h"
36
37 struct devices devices;
38 ScreenRec screen;
39 WindowRec root;
40 WindowRec window;
41
42 void *userdata;
43
44 extern int CorePointerProc(DeviceIntPtr pDev, int what);
45 extern int CoreKeyboardProc(DeviceIntPtr pDev, int what);
46
47 static void fake_init_sprite(DeviceIntPtr dev)
48 {
49     SpritePtr sprite;
50     sprite = dev->spriteInfo->sprite;
51
52     sprite->spriteTraceSize = 10;
53     sprite->spriteTrace = calloc(sprite->spriteTraceSize, sizeof(WindowPtr));
54     sprite->spriteTraceGood = 1;
55     sprite->spriteTrace[0] = &root;
56     sprite->hot.x = SPRITE_X;
57     sprite->hot.y = SPRITE_Y;
58     sprite->hotPhys.x = sprite->hot.x;
59     sprite->hotPhys.y = sprite->hot.y;
60     sprite->win = &window;
61     sprite->hotPhys.pScreen = &screen;
62     sprite->physLimits.x1 = 0;
63     sprite->physLimits.y1 = 0;
64     sprite->physLimits.x2 = screen.width;
65     sprite->physLimits.y2 = screen.height;
66 }
67
68 /* This is essentially CorePointerProc with ScrollAxes added */
69 static int
70 TestPointerProc(DeviceIntPtr pDev, int what)
71 {
72 #define NBUTTONS 10
73 #define NAXES 4
74     BYTE map[NBUTTONS + 1];
75     int i = 0;
76     Atom btn_labels[NBUTTONS] = {0};
77     Atom axes_labels[NAXES] = {0};
78
79     switch (what) {
80     case DEVICE_INIT:
81         for (i = 1; i <= NBUTTONS; i++)
82             map[i] = i;
83
84         btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
85         btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
86         btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
87         btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
88         btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
89         btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
90         btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
91         /* don't know about the rest */
92
93         axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
94         axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
95         axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_VSCROLL);
96         axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HSCROLL);
97
98         if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels,
99                                 (PtrCtrlProcPtr)NoopDDA,
100                                 GetMotionHistorySize(), NAXES, axes_labels))
101         {
102             ErrorF("Could not initialize device '%s'. Out of memory.\n",
103                    pDev->name);
104             return BadAlloc;
105         }
106         pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
107         pDev->last.valuators[0] = pDev->valuator->axisVal[0];
108         pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
109         pDev->last.valuators[1] = pDev->valuator->axisVal[1];
110
111         /* protocol-xiquerydevice.c relies on these increment */
112         SetScrollValuator(pDev, 2, SCROLL_TYPE_VERTICAL, 2.4, SCROLL_FLAG_NONE);
113         SetScrollValuator(pDev, 3, SCROLL_TYPE_HORIZONTAL, 3.5, SCROLL_FLAG_PREFERRED);
114         break;
115
116     case DEVICE_CLOSE:
117         break;
118
119     default:
120         break;
121     }
122
123     return Success;
124
125 #undef NBUTTONS
126 #undef NAXES
127 }
128 /**
129  * Create and init 2 master devices (VCP + VCK) and two slave devices, one
130  * default mouse, one default keyboard.
131  */
132 struct devices init_devices(void)
133 {
134     ClientRec client;
135     struct devices devices;
136
137     client = init_client(0, NULL);
138
139     AllocDevicePair(&client, "Virtual core", &devices.vcp, &devices.vck,
140                     CorePointerProc, CoreKeyboardProc, TRUE);
141     inputInfo.pointer = devices.vcp;
142     inputInfo.keyboard = devices.vck;
143     ActivateDevice(devices.vcp, FALSE);
144     ActivateDevice(devices.vck, FALSE);
145     EnableDevice(devices.vcp, FALSE);
146     EnableDevice(devices.vck, FALSE);
147
148     AllocDevicePair(&client, "", &devices.mouse, &devices.kbd,
149                     TestPointerProc, CoreKeyboardProc, FALSE);
150     ActivateDevice(devices.mouse, FALSE);
151     ActivateDevice(devices.kbd, FALSE);
152     EnableDevice(devices.mouse, FALSE);
153     EnableDevice(devices.kbd, FALSE);
154
155     devices.num_devices = 4;
156     devices.num_master_devices = 2;
157
158     fake_init_sprite(devices.mouse);
159     fake_init_sprite(devices.vcp);
160
161     return devices;
162 }
163
164
165 /* Create minimal client, with the given buffer and len as request buffer */
166 ClientRec init_client(int len, void *data)
167 {
168     ClientRec client = { 0 };
169
170     /* we store the privates now and reassign it after the memset. this way
171      * we can share them across multiple test runs and don't have to worry
172      * about freeing them after each test run. */
173
174     client.index = CLIENT_INDEX;
175     client.clientAsMask = CLIENT_MASK;
176     client.sequence = CLIENT_SEQUENCE;
177     client.req_len = len;
178
179     client.requestBuffer = data;
180     dixAllocatePrivates(&client.devPrivates, PRIVATE_CLIENT);
181     return client;
182 }
183
184 void init_window(WindowPtr window, WindowPtr parent, int id)
185 {
186     memset(window, 0, sizeof(*window));
187
188     window->drawable.id = id;
189     if (parent)
190     {
191         window->drawable.x = 30;
192         window->drawable.y = 50;
193         window->drawable.width = 100;
194         window->drawable.height = 200;
195     }
196     window->parent = parent;
197     window->optional = calloc(1, sizeof(WindowOptRec));
198     assert(window->optional);
199 }
200
201 extern DevPrivateKeyRec miPointerScreenKeyRec;
202 extern DevPrivateKeyRec miPointerPrivKeyRec;
203
204 /* Needed for the screen setup, otherwise we crash during sprite initialization */
205 static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
206 static Bool set_cursor_pos(DeviceIntPtr dev, ScreenPtr screen, int x, int y, Bool event) { return TRUE; }
207 void init_simple(void)
208 {
209     screenInfo.numScreens = 1;
210     screenInfo.screens[0] = &screen;
211
212     screen.myNum = 0;
213     screen.id = 100;
214     screen.width = 640;
215     screen.height = 480;
216     screen.DeviceCursorInitialize = device_cursor_init;
217     screen.SetCursorPosition = set_cursor_pos;
218
219     dixResetPrivates();
220     InitAtoms();
221     XkbInitPrivates();
222     dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec));
223     dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0);
224     dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0);
225     XInputExtensionInit();
226
227     init_window(&root, NULL, ROOT_WINDOW_ID);
228     init_window(&window, &root, CLIENT_WINDOW_ID);
229
230     devices = init_devices();
231 }
232
233 void __wrap_WriteToClient(ClientPtr client, int len, void *data)
234 {
235     assert(reply_handler != NULL);
236
237     (*reply_handler)(client, len, data, userdata);
238 }
239