eventstr.h revision 35c4bbdf
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_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 */ 87struct _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 */ 134struct _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 */ 159struct _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 */ 197struct _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 */ 215struct _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 234struct _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 255struct _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 */ 269union _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 290