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 | */
|
---|
47 | enum EventType {
|
---|
48 | ET_KeyPress = 2,
|
---|
49 | ET_KeyRelease,
|
---|
50 | ET_ButtonPress,
|
---|
51 | ET_ButtonRelease,
|
---|
52 | ET_Motion,
|
---|
53 | ET_TouchBegin,
|
---|
54 | ET_TouchUpdate,
|
---|
55 | ET_TouchEnd,
|
---|
56 | ET_TouchOwnership,
|
---|
57 | ET_Enter,
|
---|
58 | ET_Leave,
|
---|
59 | ET_FocusIn,
|
---|
60 | ET_FocusOut,
|
---|
61 | ET_ProximityIn,
|
---|
62 | ET_ProximityOut,
|
---|
63 | ET_DeviceChanged,
|
---|
64 | ET_Hierarchy,
|
---|
65 | ET_DGAEvent,
|
---|
66 | ET_RawKeyPress,
|
---|
67 | ET_RawKeyRelease,
|
---|
68 | ET_RawButtonPress,
|
---|
69 | ET_RawButtonRelease,
|
---|
70 | ET_RawMotion,
|
---|
71 | ET_RawTouchBegin,
|
---|
72 | ET_RawTouchUpdate,
|
---|
73 | ET_RawTouchEnd,
|
---|
74 | ET_XQuartz,
|
---|
75 | ET_BarrierHit,
|
---|
76 | ET_BarrierLeave,
|
---|
77 | ET_Internal = 0xFF /* First byte */
|
---|
78 | };
|
---|
79 |
|
---|
80 | /**
|
---|
81 | * Used for ALL input device events internal in the server until
|
---|
82 | * copied into the matching protocol event.
|
---|
83 | *
|
---|
84 | * Note: We only use the device id because the DeviceIntPtr may become invalid while
|
---|
85 | * the event is in the EQ.
|
---|
86 | */
|
---|
87 | struct _DeviceEvent {
|
---|
88 | unsigned char header; /**< Always ET_Internal */
|
---|
89 | enum EventType type; /**< One of EventType */
|
---|
90 | int length; /**< Length in bytes */
|
---|
91 | Time time; /**< Time in ms */
|
---|
92 | int deviceid; /**< Device to post this event for */
|
---|
93 | int sourceid; /**< The physical source device */
|
---|
94 | union {
|
---|
95 | uint32_t button; /**< Button number (also used in pointer emulating
|
---|
96 | touch events) */
|
---|
97 | uint32_t key; /**< Key code */
|
---|
98 | } detail;
|
---|
99 | uint32_t touchid; /**< Touch ID (client_id) */
|
---|
100 | int16_t root_x; /**< Pos relative to root window in integral data */
|
---|
101 | float root_x_frac; /**< Pos relative to root window in frac part */
|
---|
102 | int16_t root_y; /**< Pos relative to root window in integral part */
|
---|
103 | float root_y_frac; /**< Pos relative to root window in frac part */
|
---|
104 | uint8_t buttons[(MAX_BUTTONS + 7) / 8]; /**< Button mask */
|
---|
105 | struct {
|
---|
106 | uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
|
---|
107 | uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
|
---|
108 | double data[MAX_VALUATORS]; /**< Valuator data */
|
---|
109 | } valuators;
|
---|
110 | struct {
|
---|
111 | uint32_t base; /**< XKB base modifiers */
|
---|
112 | uint32_t latched; /**< XKB latched modifiers */
|
---|
113 | uint32_t locked; /**< XKB locked modifiers */
|
---|
114 | uint32_t effective;/**< XKB effective modifiers */
|
---|
115 | } mods;
|
---|
116 | struct {
|
---|
117 | uint8_t base; /**< XKB base group */
|
---|
118 | uint8_t latched; /**< XKB latched group */
|
---|
119 | uint8_t locked; /**< XKB locked group */
|
---|
120 | uint8_t effective;/**< XKB effective group */
|
---|
121 | } group;
|
---|
122 | Window root; /**< Root window of the event */
|
---|
123 | int corestate; /**< Core key/button state BEFORE the event */
|
---|
124 | int key_repeat; /**< Internally-generated key repeat event */
|
---|
125 | uint32_t flags; /**< Flags to be copied into the generated event */
|
---|
126 | uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */
|
---|
127 | };
|
---|
128 |
|
---|
129 | /**
|
---|
130 | * Generated internally whenever a touch ownership chain changes - an owner
|
---|
131 | * has accepted or rejected a touch, or a grab/event selection in the delivery
|
---|
132 | * chain has been removed.
|
---|
133 | */
|
---|
134 | struct _TouchOwnershipEvent {
|
---|
135 | unsigned char header; /**< Always ET_Internal */
|
---|
136 | enum EventType type; /**< ET_TouchOwnership */
|
---|
137 | int length; /**< Length in bytes */
|
---|
138 | Time time; /**< Time in ms */
|
---|
139 | int deviceid; /**< Device to post this event for */
|
---|
140 | int sourceid; /**< The physical source device */
|
---|
141 | uint32_t touchid; /**< Touch ID (client_id) */
|
---|
142 | uint8_t reason; /**< ::XIAcceptTouch, ::XIRejectTouch */
|
---|
143 | uint32_t resource; /**< Provoking grab or event selection */
|
---|
144 | uint32_t flags; /**< Flags to be copied into the generated event */
|
---|
145 | };
|
---|
146 |
|
---|
147 | /* Flags used in DeviceChangedEvent to signal if the slave has changed */
|
---|
148 | #define DEVCHANGE_SLAVE_SWITCH 0x2
|
---|
149 | /* Flags used in DeviceChangedEvent to signal whether the event was a
|
---|
150 | * pointer event or a keyboard event */
|
---|
151 | #define DEVCHANGE_POINTER_EVENT 0x4
|
---|
152 | #define DEVCHANGE_KEYBOARD_EVENT 0x8
|
---|
153 | /* device capabilities changed */
|
---|
154 | #define DEVCHANGE_DEVICE_CHANGE 0x10
|
---|
155 |
|
---|
156 | /**
|
---|
157 | * Sent whenever a device's capabilities have changed.
|
---|
158 | */
|
---|
159 | struct _DeviceChangedEvent {
|
---|
160 | unsigned char header; /**< Always ET_Internal */
|
---|
161 | enum EventType type; /**< ET_DeviceChanged */
|
---|
162 | int length; /**< Length in bytes */
|
---|
163 | Time time; /**< Time in ms */
|
---|
164 | int deviceid; /**< Device whose capabilities have changed */
|
---|
165 | int flags; /**< Mask of ::HAS_NEW_SLAVE,
|
---|
166 | ::POINTER_EVENT, ::KEYBOARD_EVENT */
|
---|
167 | int masterid; /**< MD when event was generated */
|
---|
168 | int sourceid; /**< The device that caused the change */
|
---|
169 |
|
---|
170 | struct {
|
---|
171 | int num_buttons; /**< Number of buttons */
|
---|
172 | Atom names[MAX_BUTTONS];/**< Button names */
|
---|
173 | } buttons;
|
---|
174 |
|
---|
175 | int num_valuators; /**< Number of axes */
|
---|
176 | struct {
|
---|
177 | uint32_t min; /**< Minimum value */
|
---|
178 | uint32_t max; /**< Maximum value */
|
---|
179 | double value; /**< Current value */
|
---|
180 | /* FIXME: frac parts of min/max */
|
---|
181 | uint32_t resolution; /**< Resolution counts/m */
|
---|
182 | uint8_t mode; /**< Relative or Absolute */
|
---|
183 | Atom name; /**< Axis name */
|
---|
184 | ScrollInfo scroll; /**< Smooth scrolling info */
|
---|
185 | } valuators[MAX_VALUATORS];
|
---|
186 |
|
---|
187 | struct {
|
---|
188 | int min_keycode;
|
---|
189 | int max_keycode;
|
---|
190 | } keys;
|
---|
191 | };
|
---|
192 |
|
---|
193 | #if XFreeXDGA
|
---|
194 | /**
|
---|
195 | * DGAEvent, used by DGA to intercept and emulate input events.
|
---|
196 | */
|
---|
197 | struct _DGAEvent {
|
---|
198 | unsigned char header; /**< Always ET_Internal */
|
---|
199 | enum EventType type; /**< ET_DGAEvent */
|
---|
200 | int length; /**< Length in bytes */
|
---|
201 | Time time; /**< Time in ms */
|
---|
202 | int subtype; /**< KeyPress, KeyRelease, ButtonPress,
|
---|
203 | ButtonRelease, MotionNotify */
|
---|
204 | int detail; /**< Button number or key code */
|
---|
205 | int dx; /**< Relative x coordinate */
|
---|
206 | int dy; /**< Relative y coordinate */
|
---|
207 | int screen; /**< Screen number this event applies to */
|
---|
208 | uint16_t state; /**< Core modifier/button state */
|
---|
209 | };
|
---|
210 | #endif
|
---|
211 |
|
---|
212 | /**
|
---|
213 | * Raw event, contains the data as posted by the device.
|
---|
214 | */
|
---|
215 | struct _RawDeviceEvent {
|
---|
216 | unsigned char header; /**< Always ET_Internal */
|
---|
217 | enum EventType type; /**< ET_Raw */
|
---|
218 | int length; /**< Length in bytes */
|
---|
219 | Time time; /**< Time in ms */
|
---|
220 | int deviceid; /**< Device to post this event for */
|
---|
221 | int sourceid; /**< The physical source device */
|
---|
222 | union {
|
---|
223 | uint32_t button; /**< Button number */
|
---|
224 | uint32_t key; /**< Key code */
|
---|
225 | } detail;
|
---|
226 | struct {
|
---|
227 | uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
|
---|
228 | double data[MAX_VALUATORS]; /**< Valuator data */
|
---|
229 | double data_raw[MAX_VALUATORS]; /**< Valuator data as posted */
|
---|
230 | } valuators;
|
---|
231 | uint32_t flags; /**< Flags to be copied into the generated event */
|
---|
232 | };
|
---|
233 |
|
---|
234 | struct _BarrierEvent {
|
---|
235 | unsigned char header; /**< Always ET_Internal */
|
---|
236 | enum EventType type; /**< ET_BarrierHit, ET_BarrierLeave */
|
---|
237 | int length; /**< Length in bytes */
|
---|
238 | Time time; /**< Time in ms */
|
---|
239 | int deviceid; /**< Device to post this event for */
|
---|
240 | int sourceid; /**< The physical source device */
|
---|
241 | int barrierid;
|
---|
242 | Window window;
|
---|
243 | Window root;
|
---|
244 | double dx;
|
---|
245 | double dy;
|
---|
246 | double root_x;
|
---|
247 | double root_y;
|
---|
248 | int16_t dt;
|
---|
249 | int32_t event_id;
|
---|
250 | uint32_t flags;
|
---|
251 | };
|
---|
252 |
|
---|
253 | #ifdef XQUARTZ
|
---|
254 | #define XQUARTZ_EVENT_MAXARGS 5
|
---|
255 | struct _XQuartzEvent {
|
---|
256 | unsigned char header; /**< Always ET_Internal */
|
---|
257 | enum EventType type; /**< Always ET_XQuartz */
|
---|
258 | int length; /**< Length in bytes */
|
---|
259 | Time time; /**< Time in ms. */
|
---|
260 | int subtype; /**< Subtype defined by XQuartz DDX */
|
---|
261 | uint32_t data[XQUARTZ_EVENT_MAXARGS]; /**< Up to 5 32bit values passed to handler */
|
---|
262 | };
|
---|
263 | #endif
|
---|
264 |
|
---|
265 | /**
|
---|
266 | * Event type used inside the X server for input event
|
---|
267 | * processing.
|
---|
268 | */
|
---|
269 | union _InternalEvent {
|
---|
270 | struct {
|
---|
271 | unsigned char header; /**< Always ET_Internal */
|
---|
272 | enum EventType type; /**< One of ET_* */
|
---|
273 | int length; /**< Length in bytes */
|
---|
274 | Time time; /**< Time in ms. */
|
---|
275 | } any;
|
---|
276 | DeviceEvent device_event;
|
---|
277 | DeviceChangedEvent changed_event;
|
---|
278 | TouchOwnershipEvent touch_ownership_event;
|
---|
279 | BarrierEvent barrier_event;
|
---|
280 | #if XFreeXDGA
|
---|
281 | DGAEvent dga_event;
|
---|
282 | #endif
|
---|
283 | RawDeviceEvent raw_event;
|
---|
284 | #ifdef XQUARTZ
|
---|
285 | XQuartzEvent xquartz_event;
|
---|
286 | #endif
|
---|
287 | };
|
---|
288 |
|
---|
289 | #endif
|
---|