Xkb provides a number of convenience functions to help use a keyboard geometry. These include
functions to return the bounding box of a shape's top surface and to update the bounding box
of a shape row or section.
A shape is made up of a number of outlines. Each outline is a polygon made up of a number of
points. The bounding box of a shape is a rectangle that contains all the outlines of that
shape.
A ShapeRec contains a BoundsRec that describes the bounds of the shape. If you add or delete
an outline to or from a shape, the bounding box must be updated.
.IXkbComputeShapeBounds
updates the BoundsRec contained in the
.Ishape
by examining all the outlines of the shape and setting the BoundsRec to the minimum x and
minimum y, and maximum x and maximum y values found in those outlines.
.IXkbComputeShapeBounds
returns False if
.Ishape
is NULL or if there are no outlines for the shape; otherwise, it returns True.
If you add or delete a key to or from a row, or if you update the shape of one of the keys in that row, you may need to update the bounding box of that row. To update the bounding box of a row, use
.IXkbComputeRowBounds.
.SHSTRUCTURES
.LP
.nf
typedef struct _XkbShape {
Atom name; /\(** shape's name */
unsigned short num_outlines; /\(** number of outlines for the shape */
unsigned short sz_outlines; /\(** size of the outlines array */
XkbOutlinePtr outlines; /\(** array of outlines for the shape */
XkbOutlinePtr approx; /\(** pointer into the array to the approximating outline */
XkbOutlinePtr primary; /\(** pointer into the array to the primary outline */
XkbBoundsRec bounds; /\(** bounding box for the shape; encompasses all outlines */
} XkbShapeRec, *XkbShapePtr;
typedef struct _XkbBounds {
short x1,y1; /\(** upper left corner of the bounds, in mm/10 */
short x2,y2; /\(** lower right corner of the bounds, in mm/10 */