eventstr.h revision 9ace9065
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
25#ifndef EVENTSTR_H
26#define EVENTSTR_H
27
28#include <events.h>
29/**
30 * @file events.h
31 * This file describes the event structures used internally by the X
32 * server during event generation and event processing.
33 *
34 * When are internal events used?
35 * Events from input devices are stored as internal events in the EQ and
36 * processed as internal events until late in the processing cycle. Only then
37 * do they switch to their respective wire events.
38 */
39
40/**
41 * Event types. Used exclusively internal to the server, not visible on the
42 * protocol.
43 *
44 * Note: Keep KeyPress to Motion aligned with the core events.
45 *       Keep ET_Raw* in the same order as KeyPress - Motion
46 */
47enum EventType {
48    ET_KeyPress = 2,
49    ET_KeyRelease,
50    ET_ButtonPress,
51    ET_ButtonRelease,
52    ET_Motion,
53    ET_Enter,
54    ET_Leave,
55    ET_FocusIn,
56    ET_FocusOut,
57    ET_ProximityIn,
58    ET_ProximityOut,
59    ET_DeviceChanged,
60    ET_Hierarchy,
61    ET_DGAEvent,
62    ET_RawKeyPress,
63    ET_RawKeyRelease,
64    ET_RawButtonPress,
65    ET_RawButtonRelease,
66    ET_RawMotion,
67    ET_XQuartz,
68    ET_Internal = 0xFF /* First byte */
69};
70
71#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->any.header != 0xFF) \
72                          FatalError("Wrong event type %d.\n", \
73                                     ((InternalEvent*)(ev))->any.header);
74
75/**
76 * Used for ALL input device events internal in the server until
77 * copied into the matching protocol event.
78 *
79 * Note: We only use the device id because the DeviceIntPtr may become invalid while
80 * the event is in the EQ.
81 */
82struct _DeviceEvent
83{
84    unsigned char header; /**< Always ET_Internal */
85    enum EventType type;  /**< One of EventType */
86    int length;           /**< Length in bytes */
87    Time time;            /**< Time in ms */
88    int deviceid;         /**< Device to post this event for */
89    int sourceid;         /**< The physical source device */
90    union {
91        uint32_t button;  /**< Button number */
92        uint32_t key;     /**< Key code */
93    } detail;
94    int16_t root_x;       /**< Pos relative to root window in integral data */
95    float root_x_frac;    /**< Pos relative to root window in frac part */
96    int16_t root_y;       /**< Pos relative to root window in integral part */
97    float root_y_frac;    /**< Pos relative to root window in frac part */
98    uint8_t    buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
99    struct {
100        uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
101        uint8_t  mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
102        int32_t  data[MAX_VALUATORS];         /**< Valuator data */
103        int32_t  data_frac[MAX_VALUATORS];    /**< Fractional part for data */
104    } valuators;
105    struct {
106        uint32_t base;    /**< XKB base modifiers */
107        uint32_t latched; /**< XKB latched modifiers */
108        uint32_t locked;  /**< XKB locked modifiers */
109        uint32_t effective;/**< XKB effective modifiers */
110    } mods;
111    struct {
112        uint8_t base;    /**< XKB base group */
113        uint8_t latched; /**< XKB latched group */
114        uint8_t locked;  /**< XKB locked group */
115        uint8_t effective;/**< XKB effective group */
116    } group;
117    Window      root; /**< Root window of the event */
118    int corestate;    /**< Core key/button state BEFORE the event */
119    int key_repeat;   /**< Internally-generated key repeat event */
120};
121
122
123/* Flags used in DeviceChangedEvent to signal if the slave has changed */
124#define DEVCHANGE_SLAVE_SWITCH 0x2
125/* Flags used in DeviceChangedEvent to signal whether the event was a
126 * pointer event or a keyboard event */
127#define DEVCHANGE_POINTER_EVENT 0x4
128#define DEVCHANGE_KEYBOARD_EVENT 0x8
129/* device capabilities changed */
130#define DEVCHANGE_DEVICE_CHANGE 0x10
131
132/**
133 * Sent whenever a device's capabilities have changed.
134 */
135struct _DeviceChangedEvent
136{
137    unsigned char header; /**< Always ET_Internal */
138    enum EventType type;  /**< ET_DeviceChanged */
139    int length;           /**< Length in bytes */
140    Time time;            /**< Time in ms */
141    int deviceid;         /**< Device whose capabilities have changed */
142    int flags;            /**< Mask of ::HAS_NEW_SLAVE,
143                               ::POINTER_EVENT, ::KEYBOARD_EVENT */
144    int masterid;         /**< MD when event was generated */
145    int sourceid;         /**< The device that caused the change */
146
147    struct {
148        int num_buttons;        /**< Number of buttons */
149        Atom names[MAX_BUTTONS];/**< Button names */
150    } buttons;
151
152    int num_valuators;          /**< Number of axes */
153    struct {
154        uint32_t min;           /**< Minimum value */
155        uint32_t max;           /**< Maximum value */
156        /* FIXME: frac parts of min/max */
157        uint32_t resolution;    /**< Resolution counts/m */
158        uint8_t mode;           /**< Relative or Absolute */
159        Atom name;              /**< Axis name */
160    } valuators[MAX_VALUATORS];
161
162    struct {
163        int min_keycode;
164        int max_keycode;
165    } keys;
166};
167
168#if XFreeXDGA
169/**
170 * DGAEvent, used by DGA to intercept and emulate input events.
171 */
172struct _DGAEvent
173{
174    unsigned char header; /**<  Always ET_Internal */
175    enum EventType type;  /**<  ET_DGAEvent */
176    int length;           /**<  Length in bytes */
177    Time time;            /**<  Time in ms */
178    int subtype;          /**<  KeyPress, KeyRelease, ButtonPress,
179                                ButtonRelease, MotionNotify */
180    int detail;           /**<  Button number or key code */
181    int dx;               /**<  Relative x coordinate */
182    int dy;               /**<  Relative y coordinate */
183    int screen;           /**<  Screen number this event applies to */
184    uint16_t state;       /**<  Core modifier/button state */
185};
186#endif
187
188/**
189 * Raw event, contains the data as posted by the device.
190 */
191struct _RawDeviceEvent
192{
193    unsigned char header; /**<  Always ET_Internal */
194    enum EventType type;  /**<  ET_Raw */
195    int length;           /**<  Length in bytes */
196    Time time;            /**<  Time in ms */
197    int deviceid;         /**< Device to post this event for */
198    int sourceid;         /**< The physical source device */
199    union {
200        uint32_t button;  /**< Button number */
201        uint32_t key;     /**< Key code */
202    } detail;
203    struct {
204        uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
205        int32_t  data[MAX_VALUATORS];         /**< Valuator data */
206        int32_t  data_frac[MAX_VALUATORS];    /**< Fractional part for data */
207        int32_t  data_raw[MAX_VALUATORS];     /**< Valuator data as posted */
208        int32_t  data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */
209    } valuators;
210};
211
212#ifdef XQUARTZ
213#define XQUARTZ_EVENT_MAXARGS 5
214struct _XQuartzEvent {
215    unsigned char header; /**< Always ET_Internal */
216    enum EventType type;  /**< Always ET_XQuartz */
217    int length;           /**< Length in bytes */
218    Time time;            /**< Time in ms. */
219    int subtype;          /**< Subtype defined by XQuartz DDX */
220    uint32_t data[XQUARTZ_EVENT_MAXARGS]; /**< Up to 5 32bit values passed to handler */
221};
222#endif
223
224/**
225 * Event type used inside the X server for input event
226 * processing.
227 */
228union _InternalEvent {
229        struct {
230            unsigned char header; /**< Always ET_Internal */
231            enum EventType type;  /**< One of ET_* */
232            int length;           /**< Length in bytes */
233            Time time;            /**< Time in ms. */
234        } any;
235        DeviceEvent device_event;
236        DeviceChangedEvent changed_event;
237#if XFreeXDGA
238        DGAEvent dga_event;
239#endif
240        RawDeviceEvent raw_event;
241#ifdef XQUARTZ
242        XQuartzEvent xquartz_event;
243#endif
244};
245
246#endif
247