v2: Use a GenericEvent for BarrierNotify Add PointerReleased event type Clarify scope of barrier event-id Release multiple barriers in a single ReleasePointer call. v3: Fix trailing whitespace Remove window parameter from SelectBarrierInput Align structs to 4-byte boundaries Clarify when PointerBarriers generate BarrierEvent events
Signed-off-by: Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> --- configure.ac | 2 +- fixesproto.txt | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- xfixesproto.h | 76 ++++++++++++++++++++++++++++++ xfixeswire.h | 20 +++++++- 4 files changed, 238 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index f85b802..07dd29a 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ([2.60]) -AC_INIT([FixesProto], [5.0], +AC_INIT([FixesProto], [6.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE diff --git a/fixesproto.txt b/fixesproto.txt index 5903ac9..8b9cd42 100644 --- a/fixesproto.txt +++ b/fixesproto.txt @@ -1,5 +1,5 @@ The XFIXES Extension - Version 5.0 + Version 6.0 Document Revision 1 2010-11-15 Keith Packard @@ -628,6 +628,13 @@ CreatePointerBarrier axis travel through a vertical barrier, for example) and excess set bits are ignored. + A pointer hitting the barrier results in a BarrierNotify event. A + barrier that allows pointer motion due to the bits set in directions + is not considered to have been hit and will not generate a + BarrierNotify. For example, a barrier with BarrierPositiveX set + will not send a BarrierNotify when the pointer passes through it + in the positive X direction. + If the server supports the X Input Extension version 2 or higher, the devices element names a set of master device to apply the barrier to. If XIAllDevices or XIAllMasterDevices are given, the @@ -650,6 +657,141 @@ DestroyPointerBarrier Errors: Barrier +************* XFIXES VERSION 6 OR BETTER *********** + +13. Pointer Barriers Expansion + +This update extends pointer barriers to optionally allow the pointer through +when a threshold is reached. This can be useful for desktop environments that +wish to use a large region of the screen, such as an entire edge, to provide a +casual target while allowing determined movement to pass through. + +13.1 Types + + BarrierEvent: {Hit, ThresholdExceeded, PointerReleased} + BarrierEventID: CARD32 + BarrierEventDetails: { barrier: BARRIER, + type: BarrierEvent, + event-id: BarrierEventID } + +13.2 Events + +BarrierNotify + + type: BYTE + extension: CARD8 + sequenceNumber: CARD16 + length: CARD32 + evtype: CARD16 + window: WINDOW + x, y: INT16 + dx, dy: FP3232 + raw-dx, raw-dy: FP3232 + dt: INT16 + deviceid: DEVICEID + num-details: CARD16 + details: LISTofBarrierEventDetails + + BarrierNotify uses the X Generic Event extension. Type is thus always + GenericEvent (35), extension is the major opcode of this extension, + sequenceNumber is the low 16 bits of the request sequence number, + length is how much bigger than 32 bytes the event is, in units of + 4 bytes. Evtype is the type of this event, which is always + BarrierNotify (0). + + (x, y) contain the coordinates of the pointer after restriction by + any applicable barriers or server-side clamping (such as to screen + edges). + + (dx, dy) and (raw-dx, raw-dy) are the valuators for the input event + which caused the BarrierNotify to be emitted, before any clamping + (such as to the screen edge, or by a barrier) is applied. + (dx, dy) are the values after acceleration, (raw-dx, raw-dy) are the + raw values before any acceleration is applied. dt is the server time + in milliseconds since the last input event, and deviceid is the id of + the input device which triggered the barrier. + + Each item in the details list contains the information for a barrier + triggered by this input event. If there are multiple overlapping + barriers blocking pointer motion each one will be represented in + this list. + + barrier is the ID of the barrier hit. + + Type indicates the trigger of the event: + Hit when the barrier has prevented pointer movement. + ThresholdExceeded when the barrier has been hit but has not + prevented pointer movement due to the threshold being exceeded. + PointerReleased when the barrier would have blocked motion but + has been rendered permeable by a BarrierReleasePointer request. + + event-id is an identifier for this barrier event. A barrier event + begins when the pointer is first restricted by the barrier and remains + valid until the first input event from deviceid which is not + restricted by the barrier. The event-id is unique per-barrier. + + Since a barrier event is associated with a deviceid there can be more + than one event active for a given barrier simultaneously. + + +13.3 Requests + +SelectBarrierInput + + event-mask: SETofBarrierEvent + + This request directs barrier events to the client which issued the + request. + +CreatePointerBarrierVelocity + + barrier: BARRIER + drawable: DRAWABLE + x1, y2, x2, y2: INT16 + directions: CARD32 + velocity: CARD32 + devices: LISTofDEVICEID + + Creates a pointer barrier along the line specified by the given + coordinates on the screen associated with the given drawable. This + has identical semantics to CreatePointerBarrier, except that the + barrier created will not initially block the pointer if the threshold + velocity is exceeded. The velocity is measured in px/sec perpendicular + to the barrier. + + A pointer hitting the barrier results in a BarrierNotify event in the + same way as a regular PointerBarrier. This event is sent whether or not + the threshold velocity was exceeded. + + Once the pointer has been stopped by the barrier it will remain blocked + for the duration of the barrier event unless released by a + BarrierReleasePointer request. + + Errors: IDChoice, Window, Value, Device + +BarrierReleasePointer + + barriers: LISTof{ BARRIER, + BarrierEventID} + + Temporarily allow the pointer to pass through a set of pointer + barriers. For each barrier in barriers this allows the pointer to pass + through for as long as the corresponding event-id is valid. + + A single barrier may appear in barriers more than once with a + different associated event-id each time. In this way a client can + release a barrier for multiple input devices in one request. + + If a requested event-id is not current for its associated barrier + then that, and only that, part of the request is silently ignored. + + If the same (barrier, event-id) pair appears more than once in + barriers then the request behaves as if that pair appeared exactly + once. + + Errors: Barrier + + 99. Future compatibility This extension is not expected to remain fixed. Future changes will diff --git a/xfixesproto.h b/xfixesproto.h index fcf409a..2df8211 100644 --- a/xfixesproto.h +++ b/xfixesproto.h @@ -532,6 +532,82 @@ typedef struct { #define sz_xXFixesDestroyPointerBarrierReq 8 +/*************** Version 6.0 ******************/ + +#define BarrierEventID CARD32 + +typedef struct +{ + Barrier barrier B32; + CARD32 type B32; + BarrierEventID event_id B32; +} xXFixesBarrierEventDetails; + +typedef struct +{ + CARD8 type; /* Always GenericEvent */ + CARD8 extension; /* XFIXES extension offset */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* Length in 4 byte units */ + CARD16 evtype B16; /* Always BarrierNotify */ + INT16 deviceid B16; + WINDOW window B32; + INT16 x B16; + INT16 y B16; + FP3232 dx; + FP3232 dy; + FP3232 raw-dx; + FP3232 raw-dy; + INT16 dt B16; + INT16 num_eventdetails B16; + /* Array of BarrierEventDetails */ +} xXFixesBarrierNotifyEvent; + +typedef struct { + CARD8 reqType; + CARD8 xfixesReqType; + CARD16 length B16; + Barrier barrier B32; + Window window B32; + INT16 x1 B16; + INT16 y1 B16; + INT16 x2 B16; + INT16 y2 B16; + CARD32 directions; + CARD32 velocity; + CARD16 pad B16; + CARD16 num_devices B16; + /* array of CARD16 devices */ +} xXFixesCreatePointerBarrierVelocityReq; + +#define sz_xXFixesCreatePointerBarrierVelocityReq 32 + +typedef struct { + CARD8 reqType; + CARD8 xfixesReqType; + CARD16 length B16; + CARD32 eventMask B32; +} xXFixesSelectBarrierInputReq; + +#define sz_xXFixesSelectBarrierInputReq 8 + +typedef struct { + Barrier barrier B32; + BarrierEventID event_id B32; +} xXFixesBarrierReleaseDetails; + +typedef struct { + CARD8 reqType; + CARD8 xfixesReqType; + CARD16 length B16; + CARD16 num_barriers B16; + /* array of BarrierReleaseDetails + */ +} xXFixesBarrierReleasePointerReq; + +#define sz_xXFixesBarrierReleasePointerReq 6 + +#undef BarrierEventID #undef Barrier #undef Region #undef Picture diff --git a/xfixeswire.h b/xfixeswire.h index 432349a..e3a23c7 100644 --- a/xfixeswire.h +++ b/xfixeswire.h @@ -48,7 +48,7 @@ #define _XFIXESWIRE_H_ #define XFIXES_NAME "XFIXES" -#define XFIXES_MAJOR 5 +#define XFIXES_MAJOR 6 #define XFIXES_MINOR 0 /*************** Version 1 ******************/ @@ -89,8 +89,12 @@ /*************** Version 5 ******************/ #define X_XFixesCreatePointerBarrier 31 #define X_XFixesDestroyPointerBarrier 32 +/*************** Version 6 ******************/ +#define X_XFixesCreatePointerBarrierVelocity 33 +#define X_XFixesSelectBarrierInput 34 +#define X_XFixesBarrierReleasePointer 35 -#define XFixesNumberRequests (X_XFixesDestroyPointerBarrier+1) +#define XFixesNumberRequests (X_XFixesBarrierReleasePointer+1) /* Selection events share one event number */ #define XFixesSelectionNotify 0 @@ -136,4 +140,16 @@ #define BarrierNegativeX (1L << 2) #define BarrierNegativeY (1L << 3) +/*************** Version 6 ******************/ + +#define XFixesBarrierNotify 0 + +#define XFixesBarrierHitNotify 0 +#define XFixesBarrierThresholdExceededNotify 1 +#define XFixesBarrierPointerReleasedNotify 2 + +#define XFixesBarrierHitNotifyMask (1L << 0) +#define XFixesBarrierThresholdExceededNotifyMask (1L << 1) +#define XFixesBarrierPointerReleasedNotifyMask (1L << 2) + #endif /* _XFIXESWIRE_H_ */ -- 1.7.10.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel