xserver-multidpi/include/events.h
Peter Hutterer 6fe4c28bf4 Add agressive event type checking.
Best to FatalError if a wrong event comes in. At least that forces me to fix
it really quickly.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-03-20 15:17:53 +10:00

176 lines
5.9 KiB
C

/*
* Copyright © 2009 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
#ifndef EVENTS_H
#define EVENTS_H
/**
* @file events.h
* This file describes the event structures used internally by the X
* server during event generation and event processing.
*
* When are internal events used?
* Events from input devices are stored as internal events in the EQ and
* processed as internal events until late in the processing cycle. Only then
* do they switch to their respective wire events.
*/
/**
* Event types. Used exclusively internal to the server, not visible on the
* protocol.
*
* Note: Keep KeyPress to Motion aligned with the core events.
*/
enum {
ET_KeyPress = 2,
ET_KeyRelease,
ET_ButtonPress,
ET_ButtonRelease,
ET_Motion,
ET_Enter,
ET_Leave,
ET_FocusIn,
ET_FocusOut,
ET_ProximityIn,
ET_ProximityOut,
ET_DeviceChanged,
ET_Hierarchy,
#if XFreeXDGA
ET_DGAEvent,
#endif
ET_Internal = 0xFF /* First byte */
} EventType;
#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->u.any.header != 0xFF) \
FatalError("Wrong event type %d.\n", \
((InternalEvent*)(ev))->u.any.header);
/**
* Used for ALL input device events internal in the server until
* copied into the matching protocol event.
*
* Note: We only use the device id because the DeviceIntPtr may become invalid while
* the event is in the EQ.
*/
typedef struct
{
unsigned char header; /**< Always ET_Internal */
int type; /**< One of EventType */
int length; /**< Length in bytes */
Time time; /**< Time in ms */
int deviceid; /**< Device to post this event for */
int sourceid; /**< The physical source device */
union {
uint32_t button; /**< Button number */
uint32_t key; /**< Key code */
} detail;
uint32_t root_x; /**< Pos relative to root window in 16.16 fixed pt */
uint32_t root_y; /**< Pos relative to root window in 16.16 fixed pt */
uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
struct {
uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
uint32_t data[MAX_VALUATORS]; /**< Valuator data */
} valuators;
struct {
uint32_t base; /**< XKB base modifiers */
uint32_t latched; /**< XKB latched modifiers */
uint32_t locked; /**< XKB locked modifiers */
} mods;
struct {
uint8_t base; /**< XKB base group */
uint8_t latched; /**< XKB latched group */
uint8_t locked; /**< XKB locked group */
} group;
Window root; /**< Root window of the event */
int corestate; /**< Core key/button state BEFORE the event */
} DeviceEvent;
/* Flags used in DeviceChangedEvent to signal if new/old slave is present */
#define HAS_OLD_SLAVE 0x1
#define HAS_NEW_SLAVE 0x2
/**
* Sent whenever a device's capabilities have changed.
*/
typedef struct
{
unsigned char header; /**< Always ET_Internal */
int type; /**< ET_DeviceChanged */
int length; /**< Length in bytes */
Time time; /**< Time in ms */
int flags; /**< Mask of ::HAS_OLD_SLAVE or ::HAS_NEW_SLAVE */
/** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously
* attached to this device. */
int old_slaveid;
/** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies device now
* attached to this device. */
int new_slaveid;
/* FIXME: add the new capabilities here */
} DeviceChangedEvent;
#if XFreeXDGA
/**
* DGAEvent, used by DGA to intercept and emulate input events.
*/
typedef struct
{
unsigned char header; /**< Always ET_Internal */
int type; /**< ET_DGAEvent */
int length; /**< Length in bytes */
Time time; /**< Time in ms */
int subtype; /**< KeyPress, KeyRelease, ButtonPress,
ButtonRelease, MotionNotify */
int detail; /**< Relative x coordinate */
int dx; /**< Relative x coordinate */
int dy; /**< Relative y coordinate */
int screen; /**< Screen number this event applies to */
uint16_t state; /**< Core modifier/button state */
} DGAEvent;
#endif
/**
* Event type used inside the X server for input event
* processing.
*/
typedef struct
{
union {
struct {
unsigned char header; /**< Always ET_Internal */
int type; /**< One of ET_* */
int length; /**< Length in bytes */
Time time; /**< Time in ms. */
} any;
DeviceEvent device;
DeviceChangedEvent changed;
#if XFreeXDGA
DGAEvent dga;
#endif
} u;
} InternalEvent;
#endif