[PATCH x11proto-fixes (v2)] fixesproto v6: Pointer barrier thresholds

Christopher James Halse Rogers christopher.halse.rogers at canonical.com
Sun May 20 23:18:49 PDT 2012


v2: Use a GenericEvent for BarrierNotify
    Add PointerReleased event type
    Clarify scope of barrier event-id
    Release multiple barriers in a single ReleasePointer call.
---
 configure.ac   |    2 +-
 fixesproto.txt |  132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 xfixesproto.h  |   64 +++++++++++++++++++++++++++
 xfixeswire.h   |   20 ++++++++-
 4 files changed, 214 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..6035f1d 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
@@ -650,6 +650,136 @@ 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
+		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
+
+		window:			WINDOW
+		event-mask:		SETofBarrierEvent
+
+	This request directs barrier events to the named window.
+
+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.  
+
+	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..bb1949b 100644
--- a/xfixesproto.h
+++ b/xfixesproto.h
@@ -532,6 +532,70 @@ typedef struct {
 
 #define sz_xXFixesDestroyPointerBarrierReq 8
 
+/*************** Version 6.0 ******************/
+
+#define BarrierEventID CARD32
+
+typedef struct
+{
+    CARD8     type;                   /* Always GenericEvent */
+    CARD8     extension;              /* XFIXES extension offset */
+    CARD16    sequenceNumber;
+    CARD32    length;                 /* Length in 4 byte units */
+    CARD16    evtype;                 /* Always BarrierNotify  */
+    WINDOW    window;
+    INT16     x;
+    INT16     y;
+    FP3232    dx;
+    FP3232    dy;
+    FP3232    raw-dx;
+    FP3232    raw-dy;
+    INT16     dt;
+    INT16     deviceid;
+    INT16     num_eventdetails;
+    /* 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;
+    Window  window B32;
+    CARD32  eventMask B32;
+} xXFixesSelectBarrierInputReq;
+
+#define sz_xXFixesSelectBarrierInputReq	12
+
+typedef struct {
+    CARD8   reqType;
+    CARD8   xfixesReqType;
+    CARD16  length B16;
+    CARD16  num_barriers;
+    /* array of BARRIER, BarrierEventID */
+} 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



More information about the xorg-devel mailing list