On Tue, Apr 03, 2012 at 01:42:38PM +1000, Christopher James Halse Rogers wrote: > --- > > I've got a corresponding xserver patch, but it needs updating for the > Great Reindent of '12. Might as well get support for the protocol additions > before fixing it up. > > A slightly different variant of this (it's gone through a number of iterations > in conjunction with the Unity team) is used by the Unity shell as > infrastructure > for the one-launcher-per-display support, so there's evidence that it's a > usable > protocol.
looks good, a few minor clarifications are needed below. The main change I'd like to see is a change to use generic events instead of a standard event. we've hit the maximum event number in the past, adding another non-generic event can cause us to stretch over the limit. http://lists.x.org/archives/xorg-devel/2010-March/006716.html > configure.ac | 2 +- > fixesproto.txt | 94 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > xfixesproto.h | 59 +++++++++++++++++++++++++++++++++++ > xfixeswire.h | 23 +++++++++++-- > 4 files changed, 173 insertions(+), 5 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..6f8c705 100644 > --- a/fixesproto.txt > +++ b/fixesproto.txt > @@ -650,6 +650,100 @@ 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} > + BarrierEventID: CARD32 > + > +13.2 Events > + > +BarrierNotify > + > + subtype: BarrierEvent > + window: WINDOW > + event-id: BarrierEventID > + barrier: BARRIER > + velocity: CARD32 > + x, y: INT16 > + raw-displacement: FP1616 > + delta-t: INT16 > + deviceid: INT16 > + > +13.3 Requests > + > +SelectBarrierInput > + > + window: WINDOW > + event-mask: SETofBarrierEvent > + > + > + This request directs barrier events to the named window. Subtype > + indicates the trigger of the event, which is Hit when the barrier has > + prevented pointer movement and ThresholdExceeded when the barrier has > + been hit but has not prevented pointer movement due to the threshold > + being exceeded. > + > + Barrier is the barrier on which the event was triggered. (x,y) contain > + the coordinates of the pointer after restriction by any applicable > + barriers, and velocity is the unrestricted instantaneous velocity > + of the pointer, perpendicular to the barrier. how is velocity defined? (edit: found it below, this should be either in some common section or everywhere. You could just define a VELOCITY type and explain it there) > + > + deviceid is the identifier of the device which caused the barrier > + event, raw-displacement and delta-t are the raw valuator (purpendicular I'm not sure what you raw-displacement here is, can you clarify? s/valuator/valuators typo: purpendicular > + to the barrier) and time-since-last-input-event for deviceid > + respectively. > + > + event-id is an identifier for this barrier event. A barrier event > + begins when the pointer is first restricted by the barrier, and ends > + with the first mouse event that is not restricted by the barrier. event-id is unique per-device? per-server? per-something? I assume the second, given that device id isn't required to release the pointer, might be worth pointing out. > + > + In the case of multiple overlapping barriers an event is sent for each. > + > +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 block the pointer if the threshold > + velocity is exceeded. The velocity is measured in px/sec perpendicular > + to the barrier. should state that px/sec is after acceleration is applied (i suspect that's the case) just to make sure that's clear > + > + Once the pointer has been stopped by the barrier it will remain blocked > + for the duration of the barrier event. > + > + Errors: IDChoice, Window, Value, Device > + > +BarrierReleasePointer > + > + barrier: BARRIER > + event-id: BarrierEventID > + > + Temporarily allow the pointer to pass through a pointer barrier. > + This disables the barrier for as long as event-id is valid - that is, > + as long as the pointer remains in contact with the barrier. > + > + Requests to release the pointer for an event-id which is not current > + are silently ignored. > + > + Errors: Barrier > + > + is there a need for this to take a number of event-ids? corner-case, certainly, I admit. > 99. Future compatibility > > This extension is not expected to remain fixed. Future changes will > diff --git a/xfixesproto.h b/xfixesproto.h > index fcf409a..4e2d3d6 100644 > --- a/xfixesproto.h > +++ b/xfixesproto.h > @@ -532,6 +532,65 @@ typedef struct { > > #define sz_xXFixesDestroyPointerBarrierReq 8 > > +/*************** Version 6.0 ******************/ > + > +#define BarrierEventID CARD32 > + > +typedef struct { > + CARD8 type; > + CARD8 subtype; > + CARD16 sequenceNumber B16; > + Window window; B32; > + BarrierEventID event_id B32; > + Barrier barrier; > + CARD32 velocity B32; > + INT16 x B16; > + INT16 y B16; > + CARD32 raw_displacement B32; > + CARD16 delta_t B16; > + CARD16 deviceid B16; > +} xXFixesBarrierNotifyEvent; see generic event comment > +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 it'd be great to shoehorn this into the existing request but I suspect that has a potential to break things. so reluctantly ack Cheers, Peter > + > +typedef struct { > + CARD8 reqType; > + CARD8 xfixesReqType; > + CARD16 length B16; > + Window window B32; > + CARD32 eventMask B32; > +} xXFixesSelectBarrierInputReq; > + > +#define sz_xXFixesSelectBarrierInputReq 12 > + > +typedef struct { > + CARD8 reqType; > + CARD8 xfixesReqType; > + CARD16 length B16; > + Barrier barrier B32; > + BarrierEventID event_id B32; > +} xXFixesBarrierReleasePointerReq; > + > +#define sz_xXFixesBarrierReleasePointerReq 12 > + > +#undef BarrierEventID > #undef Barrier > #undef Region > #undef Picture > diff --git a/xfixeswire.h b/xfixeswire.h > index 432349a..0230595 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 > @@ -111,8 +115,6 @@ > > #define XFixesDisplayCursorNotifyMask (1L << 0) > > -#define XFixesNumberEvents (2) > - > /* errors */ > #define BadRegion 0 > #define BadBarrier 1 > @@ -136,4 +138,17 @@ > #define BarrierNegativeX (1L << 2) > #define BarrierNegativeY (1L << 3) > > +/*************** Version 6 ******************/ > + > +#define XFixesBarrierNotify 2 > + > +#define XFixesBarrierHitNotify 0 > +#define XFixesBarrierThresholdExceededNotify 1 > + > +#define XFixesBarrierHitNotifyMask (1L << 0) > +#define XFixesBarrierThresholdExceededNotifyMask (1L << 1) > + > +#define XFixesNumberEvents (XFixesBarrierNotify+1) > + > + > #endif /* _XFIXESWIRE_H_ */ > -- > 1.7.9.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
