X Generic Event Extension

Peter Hutterer

<peter.hutterer@who-t.net>

X Version 11, Release 7.7

Version 1.0

Copyright © 2007 Peter Hutterer

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.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Table of Contents

1. Introduction
2. Extension Initialization
3. Events
4. Notes

Chapter 1. Introduction

X was designed to provide 64 event opcodes for all extensions. These events are
limited to 32 bytes.

The Generic Event Extension provides a template event for extensions to re-use
a single event opcode. GE only provide headers and the most basic
functionality, leaving the extensions to interpret the events in their specific
context.

GenericEvents may be longer than 32 bytes. If so, the number of 4 byte units
following the initial 32 bytes must be specified in the length field of the
event.

Chapter 2. Extension Initialization

The name of this extension is "Generic Event Extension"

GEQueryVersion
    client-major-version: CARD16
    client-minor-version: CARD16
==>
    major-version:        CARD16
    minor-version:        CARD16

The client sends the highest supported version to the server and the server
sends the highest version it supports, but no higher than the requested
version. Major versions changes can introduce incompatibilities in existing
functionality, minor version changes introduce only backward compatible
changes. It is the clients responsibility to ensure that the server supports a
version which is compatible with its expectations.

As of version 1.0, no other requests are provided by this extension.

Chapter 3. Events

GE defines a single event, to be used by all extensions. The event's structure
is similar to a reply. This is a core protocol event, ID 35, and is not itself
an extension event.

GenericEvent
    type:           BYTE       always GenericEvent (35)
    extension:      CARD8      extension offset
    sequenceNumber: CARD16     low 16 bits of request seq. number
    length:         CARD32     length
    evtype:         CARD16     event type

The field 'extension' is to be set to the major opcode of the extension. The
'evtype' field is the actual opcode of the event. The length field specifies
the number of 4-byte blocks after the initial 32 bytes. If length is 0, the
event is 32 bytes long.

Chapter 4. Notes

Although the wire event is of arbitrary length, the actual size of an XEvent is
restricted to sizeof(XEvent) [96 bytes, see Xlib.h]. If an extension converts a
wire event to an XEvent > 96 bytes, it will overwrite the space allocated for
the event. See struct _XSQEvent in Xlibint.h for details.

Extensions need to malloc additional data and fill the XEvent structure with
pointers to the malloc'd data. The client then needs to free the data, only the
XEvent structure will be released by Xlib.

The server must not send GenericEvents longer than 32 bytes until it has
verified that the client is able to interpret these events. If a long event is
sent to a client unable to process GenericEvents, future interpretation of
replies and events by this client will fail.

