[PATCH] Fixes v5: Pointer barriers

Peter Hutterer peter.hutterer at who-t.net
Wed Dec 8 16:20:34 PST 2010


On Wed, Dec 08, 2010 at 05:35:06PM -0500, Adam Jackson wrote:
> v2: Review fixes:
> - Take any drawable to name the screen, don't require a window
> - Pointer barriers, not Cursor barriers
> - Elaborate on the interaction with XI2 and with absolute devices
> - Elaborate on the coordinate rules
> 
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>  COPYING        |    1 +
>  fixesproto.txt |   92 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  xfixesproto.h  |   32 +++++++++++++++++++
>  xfixeswire.h   |   18 +++++++++--
>  4 files changed, 136 insertions(+), 7 deletions(-)
> 
> diff --git a/COPYING b/COPYING
> index cdcb1ad..c8114fe 100644
> --- a/COPYING
> +++ b/COPYING
> @@ -1,4 +1,5 @@
>  Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
> +Copyright 2010 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"),
> diff --git a/fixesproto.txt b/fixesproto.txt
> index 5ef8153..e060e93 100644
> --- a/fixesproto.txt
> +++ b/fixesproto.txt
> @@ -1,7 +1,7 @@
>                          The XFIXES Extension
> -			    Version 4.0
> -			 Document Revision 2
> -			     2006-12-14
> +			    Version 5.0
> +			 Document Revision 1
> +			     2010-11-15
>  			    Keith Packard
>  			  keithp at keithp.com
>  
> @@ -19,7 +19,7 @@ developers, in particular,
>  
>   +	Owen Taylor for describing the issues raised with the XEMBED
>   	mechanisms and SaveSet processing and his initial extension
> -	to handle this issue.
> +	to handle this issue, and for pointer barriers
>  
>   +	Bill Haneman for the design for cursor image tracking.
>  
> @@ -566,6 +566,90 @@ ShowCursor
>  	Servers supporting the X Input Extension Version 2.0 or higher show
>  	all visible cursors in response to a ShowCursor request.
>  
> +************* XFIXES VERSION 5 OR BETTER ***********
> +
> +12. Pointer Barriers
> +
> +Compositing managers and desktop environments may have UI elements in
> +particular screen locations such that for a single-headed display they
> +correspond to easy targets according to Fitt's Law, for example, the top
> +left corner.  For a multi-headed environment these corners should still be
> +semi-impermeable.  Pointer barriers allow the application to define
> +additional constraint on cursor motion so that these areas behave as
> +expected even in the face of multiple displays.
> +
> +Absolute positioning devices like touchscreens do not obey pointer barriers.
> +There's no advantage to target acquisition to do so, since on a touchscreen
> +all points are in some sense equally large, whereas for a relative
> +positioning device the edges and corners are infinitely large.
> +
> +WarpPointer and similar requests do not obey pointer barriers, for
> +essentially the same reason.
> +
> +12.1 Types
> +
> +	BARRIER:	XID
> +
> +	BarrierDirections
> +
> +		BarrierPositiveX:	    1 << 0
> +		BarrierPositiveY:	    1 << 1
> +		BarrierNegativeX:	    1 << 2
> +		BarrierNegativeY:	    1 << 3
> +
> +12.2 Errors
> +
> +	Barrier
> +
> +12.3 Requests
> +
> +CreatePointerBarrier
> +
> +		barrier:		    BARRIER
> +		drawable:		    DRAWABLE
> +		x1, y2, x2, y2:		    CARD16
> +		directions:		    CARD32
> +		devices:		    LISTofDEVICEID
> +
> +	Creates a pointer barrier along the line specified by the given
> +	coordinates on the screen associated with the given drawable.  The
> +	barrier has no spatial extent; it is simply a line along the left
> +	or top edge of the specified pixels.  Barrier coordinates are in
> +	screen space.
> +
> +	The coordinates must be axis aligned, either x1 == x2, or
> +	y1 == y2, but not both.  The varying coordinates may be specified
> +	in any order.  For x1 == x2, either y1 > y2 or y1 < y2 is valid.
> +	If the coordinates are not valid BadValue is generated.
> +
> +	Motion is allowed through the barrier in the directions specified:
> +	setting the BarrierPositiveX bit allows travel through the barrier
> +	in the positive X direction, etc.  Nonsensical values (forbidding Y
> +	axis travel through a vertical barrier, for example) and excess set
> +	bits are ignored.
> +
> +	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
> +	barrier applies to all master devices.  If a slave device is named,
> +	BadMatch is generated; this does not apply to slave devices named
> +	implicitly by XIAllDevices.  Naming a device multiple times is
> +	legal, and is treated as though it were named only once.  If a
> +	device is removed, the barrier continues to apply to the remaining
> +	devices, but will not apply to any future device with the same ID
> +	as the removed device.  Nothing special happens when all matching
> +	devices are removed; barriers must be explicitly destroyed.
> +
> +	Errors: IDChoice, Window, Value, Match

BadDevice for invalid device IDs?

> +
> +DestroyPointerBarrier
> +
> +		barrier:		    BARRIER
> +
> +	Destroys the named barrier.
> +
> +	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 ed872d1..22e963d 100644
> --- a/xfixesproto.h
> +++ b/xfixesproto.h
> @@ -1,5 +1,6 @@
>  /*
>   * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
> + * Copyright 2010 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"),
> @@ -500,6 +501,37 @@ typedef struct {
>  
>  #define sz_xXFixesShowCursorReq	sizeof(xXFixesShowCursorReq)
>  
> +/*************** Version 5.0 ******************/
> +
> +#define Barrier CARD32
> +
> +typedef struct {
> +    CARD8   reqType;
> +    CARD8   xfixesReqType;
> +    CARD16  length B16;
> +    Barrier barrier B32;
> +    Window  window B32;
> +    CARD16  x1 B16;
> +    CARD16  y1 B16;
> +    CARD16  x2 B16;
> +    CARD16  y2 B16;
> +    CARD32  directions;
> +    CARD32  num_devices;

XI2 uses CARD16 num_devices everywhere iirc. also allows you to have a 16
byte pad for later use without having to extend the request length.

any comments on the INT16/CARD16 for x/y coordinates?

those minor things aside
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
  Peter

> +    /* array of CARD16 devices */
> +} xXFixesCreatePointerBarrierReq;
> +
> +#define sz_xXFixesCreatePointerBarrierReq 28
> +
> +typedef struct {
> +    CARD8   reqType;
> +    CARD8   xfixesReqType;
> +    CARD16  length B16;
> +    Barrier barrier B32;
> +} xXFixesDestroyPointerBarrierReq;
> +
> +#define sz_xXFixesDestroyPointerBarrierReq 8
> +
> +#undef Barrier
>  #undef Region
>  #undef Picture
>  #undef Window
> diff --git a/xfixeswire.h b/xfixeswire.h
> index 7b43f09..432349a 100644
> --- a/xfixeswire.h
> +++ b/xfixeswire.h
> @@ -1,5 +1,6 @@
>  /*
>   * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
> + * Copyright 2010 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"),
> @@ -47,7 +48,7 @@
>  #define _XFIXESWIRE_H_
>  
>  #define XFIXES_NAME	"XFIXES"
> -#define XFIXES_MAJOR	4
> +#define XFIXES_MAJOR	5
>  #define XFIXES_MINOR	0
>  
>  /*************** Version 1 ******************/
> @@ -85,8 +86,11 @@
>  /*************** Version 4 ******************/
>  #define X_XFixesHideCursor		    29
>  #define X_XFixesShowCursor		    30
> +/*************** Version 5 ******************/
> +#define X_XFixesCreatePointerBarrier	    31
> +#define X_XFixesDestroyPointerBarrier	    32
>  
> -#define XFixesNumberRequests		    (X_XFixesShowCursor+1)
> +#define XFixesNumberRequests		    (X_XFixesDestroyPointerBarrier+1)
>  
>  /* Selection events share one event number */
>  #define XFixesSelectionNotify		    0
> @@ -111,7 +115,8 @@
>  
>  /* errors */
>  #define BadRegion			    0
> -#define XFixesNumberErrors		    (BadRegion+1)
> +#define BadBarrier			    1
> +#define XFixesNumberErrors		    (BadBarrier+1)
>  
>  #define SaveSetNearest			    0
>  #define SaveSetRoot			    1
> @@ -124,4 +129,11 @@
>  #define WindowRegionBounding		    0
>  #define WindowRegionClip		    1
>  
> +/*************** Version 5 ******************/
> +
> +#define BarrierPositiveX		    (1L << 0)
> +#define BarrierPositiveY		    (1L << 1)
> +#define BarrierNegativeX		    (1L << 2)
> +#define BarrierNegativeY		    (1L << 3)
> +
>  #endif	/* _XFIXESWIRE_H_ */
> -- 
> 1.7.3.2
 


More information about the xorg-devel mailing list