XKBSetGeom.c revision 61b2299d
11ab64890Smrg/* $Xorg: XKBSetGeom.c,v 1.3 2000/08/17 19:45:03 cpqbld Exp $ */
21ab64890Smrg/* $XdotOrg: lib/X11/src/xkb/XKBSetGeom.c,v 1.5 2005-07-03 07:00:55 daniels Exp $ */
31ab64890Smrg/************************************************************
41ab64890SmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
51ab64890Smrg
61ab64890SmrgPermission to use, copy, modify, and distribute this
71ab64890Smrgsoftware and its documentation for any purpose and without
81ab64890Smrgfee is hereby granted, provided that the above copyright
91ab64890Smrgnotice appear in all copies and that both that copyright
101ab64890Smrgnotice and this permission notice appear in supporting
1161b2299dSmrgdocumentation, and that the name of Silicon Graphics not be
1261b2299dSmrgused in advertising or publicity pertaining to distribution
131ab64890Smrgof the software without specific prior written permission.
1461b2299dSmrgSilicon Graphics makes no representation about the suitability
151ab64890Smrgof this software for any purpose. It is provided "as is"
161ab64890Smrgwithout any express or implied warranty.
171ab64890Smrg
1861b2299dSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
1961b2299dSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
201ab64890SmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
2161b2299dSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
2261b2299dSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
2361b2299dSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
241ab64890SmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
251ab64890SmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE.
261ab64890Smrg
271ab64890Smrg********************************************************/
281ab64890Smrg/* $XFree86: xc/lib/X11/XKBSetGeom.c,v 3.5 2003/05/27 22:26:25 tsi Exp $ */
291ab64890Smrg
301ab64890Smrg#ifdef DEBUG
311ab64890Smrg#ifdef HAVE_CONFIG_H
321ab64890Smrg#include <config.h>
331ab64890Smrg#endif
341ab64890Smrg#include <stdio.h>
351ab64890Smrg#endif
361ab64890Smrg
371ab64890Smrg#define NEED_EVENTS
381ab64890Smrg#define NEED_REPLIES
391ab64890Smrg#include "Xlibint.h"
401ab64890Smrg#include "XKBlibint.h"
411ab64890Smrg#include <X11/extensions/XKBgeom.h>
421ab64890Smrg#include <X11/extensions/XKBproto.h>
431ab64890Smrg
441ab64890Smrg#ifndef MINSHORT
451ab64890Smrg#define	MINSHORT	-32768
461ab64890Smrg#endif
471ab64890Smrg#ifndef MAXSHORT
481ab64890Smrg#define	MAXSHORT	32767
491ab64890Smrg#endif
501ab64890Smrg
511ab64890Smrg/***====================================================================***/
521ab64890Smrg
531ab64890Smrg#define	_SizeCountedString(s)  ((s)?XkbPaddedSize(2+strlen(s)):4)
541ab64890Smrg
551ab64890Smrgstatic char *
561ab64890Smrg_WriteCountedString(char *wire,char *str)
571ab64890Smrg{
581ab64890SmrgCARD16	len,*pLen;
591ab64890Smrg
601ab64890Smrg    len= (str?strlen(str):0);
611ab64890Smrg    pLen= (CARD16 *)wire;
621ab64890Smrg    *pLen= len;
631ab64890Smrg    if (len && str)
641ab64890Smrg	memcpy(&wire[2],str,len);
651ab64890Smrg    wire+= XkbPaddedSize(len+2);
661ab64890Smrg    return wire;
671ab64890Smrg}
681ab64890Smrg
691ab64890Smrgstatic int
701ab64890Smrg_SizeGeomProperties(XkbGeometryPtr geom)
711ab64890Smrg{
721ab64890Smrgregister int 	i,size;
731ab64890SmrgXkbPropertyPtr	prop;
7461b2299dSmrg
751ab64890Smrg    for (size=i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
761ab64890Smrg	size+= _SizeCountedString(prop->name);
771ab64890Smrg	size+= _SizeCountedString(prop->value);
781ab64890Smrg    }
791ab64890Smrg    return size;
801ab64890Smrg}
811ab64890Smrg
821ab64890Smrgstatic int
831ab64890Smrg_SizeGeomColors(XkbGeometryPtr geom)
841ab64890Smrg{
851ab64890Smrgregister int 		i,size;
861ab64890Smrgregister XkbColorPtr	color;
871ab64890Smrg
881ab64890Smrg    for (i=size=0,color=geom->colors;i<geom->num_colors;i++,color++) {
891ab64890Smrg	size+= _SizeCountedString(color->spec);
901ab64890Smrg    }
911ab64890Smrg    return size;
921ab64890Smrg}
931ab64890Smrg
941ab64890Smrgstatic int
951ab64890Smrg_SizeGeomShapes(XkbGeometryPtr geom)
961ab64890Smrg{
971ab64890Smrgregister int		i,size;
981ab64890Smrgregister XkbShapePtr	shape;
991ab64890Smrg
1001ab64890Smrg    for (i=size=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
1011ab64890Smrg	register int		n;
1021ab64890Smrg	register XkbOutlinePtr	ol;
1031ab64890Smrg	size+= SIZEOF(xkbShapeWireDesc);
1041ab64890Smrg	for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
1051ab64890Smrg	    size+= SIZEOF(xkbOutlineWireDesc);
1061ab64890Smrg	    size+= ol->num_points*SIZEOF(xkbPointWireDesc);
1071ab64890Smrg	}
1081ab64890Smrg    }
1091ab64890Smrg    return size;
1101ab64890Smrg}
1111ab64890Smrg
1121ab64890Smrgstatic int
1131ab64890Smrg_SizeGeomDoodads(int num_doodads,XkbDoodadPtr doodad)
1141ab64890Smrg{
1151ab64890Smrgregister int	i,size;
1161ab64890Smrg
1171ab64890Smrg    for (i=size=0;i<num_doodads;i++,doodad++) {
1181ab64890Smrg	size+= SIZEOF(xkbAnyDoodadWireDesc);
1191ab64890Smrg	if (doodad->any.type==XkbTextDoodad) {
1201ab64890Smrg	    size+= _SizeCountedString(doodad->text.text);
1211ab64890Smrg	    size+= _SizeCountedString(doodad->text.font);
1221ab64890Smrg	}
1231ab64890Smrg	else if (doodad->any.type==XkbLogoDoodad) {
1241ab64890Smrg	    size+= _SizeCountedString(doodad->logo.logo_name);
1251ab64890Smrg	}
1261ab64890Smrg    }
1271ab64890Smrg    return size;
1281ab64890Smrg}
1291ab64890Smrg
1301ab64890Smrgstatic int
1311ab64890Smrg_SizeGeomSections(XkbGeometryPtr geom)
1321ab64890Smrg{
1331ab64890Smrgregister int 	i,size;
1341ab64890SmrgXkbSectionPtr	section;
1351ab64890Smrg
1361ab64890Smrg    for (i=size=0,section=geom->sections;i<geom->num_sections;i++,section++) {
1371ab64890Smrg	size+= SIZEOF(xkbSectionWireDesc);
1381ab64890Smrg	if (section->rows) {
1391ab64890Smrg	    int		r;
1401ab64890Smrg	    XkbRowPtr	row;
1411ab64890Smrg	    for (r=0,row=section->rows;r<section->num_rows;row++,r++) {
1421ab64890Smrg		size+= SIZEOF(xkbRowWireDesc);
1431ab64890Smrg		size+= row->num_keys*SIZEOF(xkbKeyWireDesc);
1441ab64890Smrg	    }
1451ab64890Smrg	}
1461ab64890Smrg	if (section->doodads)
1471ab64890Smrg	    size+= _SizeGeomDoodads(section->num_doodads,section->doodads);
1481ab64890Smrg	if (section->overlays) {
1491ab64890Smrg	    int			o;
1501ab64890Smrg	    XkbOverlayPtr	ol;
1511ab64890Smrg	    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
1521ab64890Smrg		int			r;
1531ab64890Smrg		XkbOverlayRowPtr	row;
1541ab64890Smrg		size+= SIZEOF(xkbOverlayWireDesc);
1551ab64890Smrg		for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
1561ab64890Smrg		   size+= SIZEOF(xkbOverlayRowWireDesc);
1571ab64890Smrg		   size+= row->num_keys*SIZEOF(xkbOverlayKeyWireDesc);
1581ab64890Smrg		}
1591ab64890Smrg	    }
1601ab64890Smrg	}
1611ab64890Smrg    }
1621ab64890Smrg    return size;
1631ab64890Smrg}
1641ab64890Smrg
1651ab64890Smrgstatic int
1661ab64890Smrg_SizeGeomKeyAliases(XkbGeometryPtr geom)
1671ab64890Smrg{
1681ab64890Smrg    return geom->num_key_aliases*(2*XkbKeyNameLength);
1691ab64890Smrg}
1701ab64890Smrg
1711ab64890Smrg/***====================================================================***/
1721ab64890Smrg
1731ab64890Smrgstatic char *
1741ab64890Smrg_WriteGeomProperties(char *wire,XkbGeometryPtr geom)
1751ab64890Smrg{
1761ab64890Smrgregister int 	i;
1771ab64890Smrgregister XkbPropertyPtr	prop;
17861b2299dSmrg
1791ab64890Smrg    for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
1801ab64890Smrg	wire= _WriteCountedString(wire,prop->name);
1811ab64890Smrg	wire= _WriteCountedString(wire,prop->value);
1821ab64890Smrg    }
1831ab64890Smrg    return wire;
1841ab64890Smrg}
1851ab64890Smrg
1861ab64890Smrgstatic char *
1871ab64890Smrg_WriteGeomColors(char *wire,XkbGeometryPtr geom)
1881ab64890Smrg{
1891ab64890Smrgregister int		i;
1901ab64890Smrgregister XkbColorPtr	color;
1911ab64890Smrg
1921ab64890Smrg    for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
1931ab64890Smrg	wire= _WriteCountedString(wire,color->spec);
1941ab64890Smrg    }
1951ab64890Smrg    return wire;
1961ab64890Smrg}
1971ab64890Smrg
1981ab64890Smrgstatic char *
1991ab64890Smrg_WriteGeomShapes(char *wire,XkbGeometryPtr geom)
2001ab64890Smrg{
2011ab64890Smrgint			i;
2021ab64890SmrgXkbShapePtr		shape;
2031ab64890SmrgxkbShapeWireDesc *	shapeWire;
2041ab64890Smrg
2051ab64890Smrg    for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
2061ab64890Smrg	register int 		o;
2071ab64890Smrg	XkbOutlinePtr		ol;
2081ab64890Smrg	xkbOutlineWireDesc *	olWire;
2091ab64890Smrg	shapeWire= (xkbShapeWireDesc *)wire;
2101ab64890Smrg	shapeWire->name= shape->name;
2111ab64890Smrg	shapeWire->nOutlines= shape->num_outlines;
2121ab64890Smrg	if (shape->primary!=NULL)
2131ab64890Smrg	     shapeWire->primaryNdx= XkbOutlineIndex(shape,shape->primary);
2141ab64890Smrg	else shapeWire->primaryNdx= XkbNoShape;
2151ab64890Smrg	if (shape->approx!=NULL)
2161ab64890Smrg	     shapeWire->approxNdx= XkbOutlineIndex(shape,shape->approx);
2171ab64890Smrg	else shapeWire->approxNdx= XkbNoShape;
2181ab64890Smrg	wire= (char *)&shapeWire[1];
2191ab64890Smrg	for (o=0,ol=shape->outlines;o<shape->num_outlines;o++,ol++) {
2201ab64890Smrg	    register int	p;
2211ab64890Smrg	    XkbPointPtr		pt;
2221ab64890Smrg	    xkbPointWireDesc *	ptWire;
2231ab64890Smrg	    olWire= (xkbOutlineWireDesc *)wire;
2241ab64890Smrg	    olWire->nPoints= ol->num_points;
2251ab64890Smrg	    olWire->cornerRadius= ol->corner_radius;
2261ab64890Smrg	    wire= (char *)&olWire[1];
2271ab64890Smrg	    ptWire= (xkbPointWireDesc *)wire;
2281ab64890Smrg	    for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) {
2291ab64890Smrg		ptWire[p].x= pt->x;
2301ab64890Smrg		ptWire[p].y= pt->y;
2311ab64890Smrg	    }
2321ab64890Smrg	    wire= (char *)&ptWire[ol->num_points];
2331ab64890Smrg	}
2341ab64890Smrg    }
2351ab64890Smrg    return wire;
2361ab64890Smrg}
2371ab64890Smrg
2381ab64890Smrgstatic char *
2391ab64890Smrg_WriteGeomDoodads(char *wire,int num_doodads,XkbDoodadPtr doodad)
2401ab64890Smrg{
2411ab64890Smrgregister int		i;
2421ab64890SmrgxkbDoodadWireDesc *	doodadWire;
2431ab64890Smrg
2441ab64890Smrg    for (i=0;i<num_doodads;i++,doodad++) {
2451ab64890Smrg	doodadWire= (xkbDoodadWireDesc *)wire;
2461ab64890Smrg	wire= (char *)&doodadWire[1];
2471ab64890Smrg	bzero(doodadWire,SIZEOF(xkbDoodadWireDesc));
2481ab64890Smrg	doodadWire->any.name= doodad->any.name;
2491ab64890Smrg	doodadWire->any.type= doodad->any.type;
2501ab64890Smrg	doodadWire->any.priority= doodad->any.priority;
2511ab64890Smrg	doodadWire->any.top= doodad->any.top;
2521ab64890Smrg	doodadWire->any.left= doodad->any.left;
2531ab64890Smrg	doodadWire->any.angle= doodad->any.angle;
2541ab64890Smrg	switch (doodad->any.type) {
2551ab64890Smrg	    case XkbOutlineDoodad:
2561ab64890Smrg	    case XkbSolidDoodad:
2571ab64890Smrg		doodadWire->shape.colorNdx= doodad->shape.color_ndx;
2581ab64890Smrg		doodadWire->shape.shapeNdx= doodad->shape.shape_ndx;
2591ab64890Smrg		break;
2601ab64890Smrg	    case XkbTextDoodad:
2611ab64890Smrg		doodadWire->text.width= doodad->text.width;
2621ab64890Smrg		doodadWire->text.height= doodad->text.height;
2631ab64890Smrg		doodadWire->text.colorNdx= doodad->text.color_ndx;
2641ab64890Smrg		wire= _WriteCountedString(wire,doodad->text.text);
2651ab64890Smrg		wire= _WriteCountedString(wire,doodad->text.font);
2661ab64890Smrg		break;
2671ab64890Smrg	    case XkbIndicatorDoodad:
2681ab64890Smrg		doodadWire->indicator.shapeNdx= doodad->indicator.shape_ndx;
2691ab64890Smrg		doodadWire->indicator.onColorNdx=doodad->indicator.on_color_ndx;
2701ab64890Smrg		doodadWire->indicator.offColorNdx=
2711ab64890Smrg						doodad->indicator.off_color_ndx;
2721ab64890Smrg		break;
2731ab64890Smrg	    case XkbLogoDoodad:
2741ab64890Smrg		doodadWire->logo.colorNdx= doodad->logo.color_ndx;
2751ab64890Smrg		doodadWire->logo.shapeNdx= doodad->logo.shape_ndx;
2761ab64890Smrg		wire= _WriteCountedString(wire,doodad->logo.logo_name);
2771ab64890Smrg		break;
2781ab64890Smrg	    default:
2791ab64890Smrg		break;
2801ab64890Smrg	}
2811ab64890Smrg    }
2821ab64890Smrg    return wire;
2831ab64890Smrg}
2841ab64890Smrg
2851ab64890Smrgstatic char *
2861ab64890Smrg_WriteGeomOverlay(char *wire,XkbOverlayPtr ol)
2871ab64890Smrg{
2881ab64890Smrgregister int		r;
2891ab64890SmrgXkbOverlayRowPtr	row;
2901ab64890SmrgxkbOverlayWireDesc *	olWire;
2911ab64890Smrg
2921ab64890Smrg   olWire= (xkbOverlayWireDesc *)wire;
2931ab64890Smrg   olWire->name= ol->name;
2941ab64890Smrg   olWire->nRows= ol->num_rows;
2951ab64890Smrg   wire= (char *)&olWire[1];
2961ab64890Smrg   for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
2971ab64890Smrg   	unsigned int		k;
2981ab64890Smrg	XkbOverlayKeyPtr	key;
2991ab64890Smrg	xkbOverlayRowWireDesc *	rowWire;
3001ab64890Smrg	rowWire= (xkbOverlayRowWireDesc *)wire;
3011ab64890Smrg	rowWire->rowUnder= row->row_under;
3021ab64890Smrg	rowWire->nKeys= row->num_keys;
3031ab64890Smrg	wire= (char *)&rowWire[1];
3041ab64890Smrg	for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
3051ab64890Smrg	    xkbOverlayKeyWireDesc *	keyWire;
3061ab64890Smrg	    keyWire= (xkbOverlayKeyWireDesc *)wire;
3071ab64890Smrg	    memcpy(keyWire->over,key->over.name,XkbKeyNameLength);
3081ab64890Smrg	    memcpy(keyWire->under,key->under.name,XkbKeyNameLength);
3091ab64890Smrg	    wire= (char *)&keyWire[1];
3101ab64890Smrg	}
3111ab64890Smrg   }
3121ab64890Smrg   return wire;
3131ab64890Smrg}
3141ab64890Smrg
3151ab64890Smrgstatic char *
3161ab64890Smrg_WriteGeomSections(char *wire,XkbGeometryPtr geom)
3171ab64890Smrg{
3181ab64890Smrgregister int		i;
3191ab64890SmrgXkbSectionPtr		section;
3201ab64890SmrgxkbSectionWireDesc *	sectionWire;
3211ab64890Smrg
3221ab64890Smrg    for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
3231ab64890Smrg	sectionWire= (xkbSectionWireDesc *)wire;
3241ab64890Smrg	sectionWire->name= section->name;
3251ab64890Smrg	sectionWire->top= section->top;
3261ab64890Smrg	sectionWire->left= section->left;
3271ab64890Smrg	sectionWire->width= section->width;
3281ab64890Smrg	sectionWire->height= section->height;
3291ab64890Smrg	sectionWire->angle= section->angle;
3301ab64890Smrg	sectionWire->priority= section->priority;
3311ab64890Smrg	sectionWire->nRows= section->num_rows;
3321ab64890Smrg	sectionWire->nDoodads= section->num_doodads;
3331ab64890Smrg	sectionWire->nOverlays= section->num_overlays;
3341ab64890Smrg	sectionWire->pad= 0;
3351ab64890Smrg	wire= (char *)&sectionWire[1];
3361ab64890Smrg	if (section->rows) {
3371ab64890Smrg	    int			r;
3381ab64890Smrg	    XkbRowPtr		row;
3391ab64890Smrg	    xkbRowWireDesc *	rowWire;
3401ab64890Smrg	    for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
3411ab64890Smrg		rowWire= (xkbRowWireDesc *)wire;
3421ab64890Smrg		rowWire->top= row->top;
3431ab64890Smrg		rowWire->left= row->left;
3441ab64890Smrg		rowWire->nKeys= row->num_keys;
3451ab64890Smrg		rowWire->vertical= row->vertical;
3461ab64890Smrg		rowWire->pad= 0;
3471ab64890Smrg		wire= (char *)&rowWire[1];
3481ab64890Smrg		if (row->keys) {
3491ab64890Smrg		    int			k;
3501ab64890Smrg		    XkbKeyPtr		key;
3511ab64890Smrg		    xkbKeyWireDesc *	keyWire;
3521ab64890Smrg		    keyWire= (xkbKeyWireDesc *)wire;
3531ab64890Smrg		    for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
3541ab64890Smrg			memcpy(keyWire[k].name,key->name.name,XkbKeyNameLength);
3551ab64890Smrg			keyWire[k].gap= key->gap;
3561ab64890Smrg			keyWire[k].shapeNdx= key->shape_ndx;
3571ab64890Smrg			keyWire[k].colorNdx= key->color_ndx;
3581ab64890Smrg		    }
3591ab64890Smrg		    wire= (char *)&keyWire[row->num_keys];
3601ab64890Smrg		}
3611ab64890Smrg	    }
3621ab64890Smrg	}
3631ab64890Smrg	if (section->doodads) {
3641ab64890Smrg	    wire= _WriteGeomDoodads(wire,
3651ab64890Smrg	    			      section->num_doodads,section->doodads);
3661ab64890Smrg	}
3671ab64890Smrg	if (section->overlays) {
3681ab64890Smrg	    register int o;
3691ab64890Smrg	    for (o=0;o<section->num_overlays;o++) {
3701ab64890Smrg		wire= _WriteGeomOverlay(wire,&section->overlays[o]);
3711ab64890Smrg	    }
3721ab64890Smrg	}
3731ab64890Smrg    }
3741ab64890Smrg    return wire;
3751ab64890Smrg}
3761ab64890Smrg
3771ab64890Smrgstatic char *
3781ab64890Smrg_WriteGeomKeyAliases(char *wire,XkbGeometryPtr geom)
3791ab64890Smrg{
3801ab64890Smrgregister int sz;
38161b2299dSmrg
3821ab64890Smrg    sz= geom->num_key_aliases*(XkbKeyNameLength*2);
3831ab64890Smrg    if (sz>0) {
3841ab64890Smrg	memcpy(wire,(char *)geom->key_aliases,sz);
3851ab64890Smrg	wire+= sz;
3861ab64890Smrg    }
3871ab64890Smrg    return wire;
3881ab64890Smrg}
3891ab64890Smrg
3901ab64890Smrg/***====================================================================***/
3911ab64890Smrg
3921ab64890Smrgstatic Status
3931ab64890Smrg_SendSetGeometry(Display *dpy,XkbGeometryPtr geom,xkbSetGeometryReq *req)
3941ab64890Smrg{
3951ab64890Smrgint			sz;
3961ab64890Smrgchar *			wire,*tbuf;
3971ab64890Smrg
3981ab64890Smrg    sz= 0;
3991ab64890Smrg    sz+= _SizeCountedString(geom->label_font);
4001ab64890Smrg    sz+= _SizeGeomProperties(geom);
4011ab64890Smrg    sz+= _SizeGeomColors(geom);
4021ab64890Smrg    sz+= _SizeGeomShapes(geom);
4031ab64890Smrg    sz+= _SizeGeomSections(geom);
4041ab64890Smrg    sz+= _SizeGeomDoodads(geom->num_doodads,geom->doodads);
4051ab64890Smrg    sz+= _SizeGeomKeyAliases(geom);
4061ab64890Smrg    req->length+= (sz/4);
4071ab64890Smrg    if (sz < (dpy->bufmax - dpy->buffer)) {
4081ab64890Smrg	BufAlloc(char *,wire,sz);
4091ab64890Smrg	tbuf= NULL;
4101ab64890Smrg    }
4111ab64890Smrg    else {
4121ab64890Smrg	tbuf= _XAllocTemp(dpy,sz);
4131ab64890Smrg	if (!tbuf)
4141ab64890Smrg	    return BadAlloc;
4151ab64890Smrg	wire= tbuf;
4161ab64890Smrg    }
4171ab64890Smrg    wire= _WriteCountedString(wire,geom->label_font);
4181ab64890Smrg    if (geom->num_properties>0)
4191ab64890Smrg	wire= _WriteGeomProperties(wire,geom);
4201ab64890Smrg    if (geom->num_colors>0)
4211ab64890Smrg	wire= _WriteGeomColors(wire,geom);
4221ab64890Smrg    if (geom->num_shapes>0)
4231ab64890Smrg	wire= _WriteGeomShapes(wire,geom);
4241ab64890Smrg    if (geom->num_sections>0)
4251ab64890Smrg	wire= _WriteGeomSections(wire,geom);
4261ab64890Smrg    if (geom->num_doodads>0)
4271ab64890Smrg	wire= _WriteGeomDoodads(wire,geom->num_doodads,geom->doodads);
4281ab64890Smrg    if (geom->num_key_aliases>0)
4291ab64890Smrg	wire= _WriteGeomKeyAliases(wire,geom);
4301ab64890Smrg    if (tbuf!=NULL) {
4311ab64890Smrg	Data(dpy,tbuf,sz);
4321ab64890Smrg	_XFreeTemp(dpy,tbuf,sz);
4331ab64890Smrg    }
4341ab64890Smrg    return Success;
4351ab64890Smrg}
4361ab64890Smrg
4371ab64890Smrg/***====================================================================***/
4381ab64890Smrg
4391ab64890SmrgStatus
4401ab64890SmrgXkbSetGeometry(Display *dpy,unsigned deviceSpec,XkbGeometryPtr geom)
4411ab64890Smrg{
4421ab64890SmrgxkbSetGeometryReq	*req;
4431ab64890SmrgStatus ret;
4441ab64890Smrg
4451ab64890Smrg    if ( (!geom) || (dpy->flags & XlibDisplayNoXkb) ||
4461ab64890Smrg	(!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
4471ab64890Smrg	return BadAccess;
44861b2299dSmrg
4491ab64890Smrg    LockDisplay(dpy);
4501ab64890Smrg    GetReq(kbSetGeometry, req);
4511ab64890Smrg    req->reqType = dpy->xkb_info->codes->major_opcode;
4521ab64890Smrg    req->xkbReqType = X_kbSetGeometry;
4531ab64890Smrg    req->deviceSpec = deviceSpec;
4541ab64890Smrg    req->nShapes= geom->num_shapes;
4551ab64890Smrg    req->nSections= geom->num_sections;
4561ab64890Smrg    req->name= geom->name;
4571ab64890Smrg    req->widthMM= geom->width_mm;
4581ab64890Smrg    req->heightMM= geom->height_mm;
4591ab64890Smrg    req->nProperties= geom->num_properties;
4601ab64890Smrg    req->nColors= geom->num_colors;
4611ab64890Smrg    req->nDoodads= geom->num_doodads;
4621ab64890Smrg    req->nKeyAliases= geom->num_key_aliases;
4631ab64890Smrg    req->baseColorNdx= (geom->base_color-geom->colors);
4641ab64890Smrg    req->labelColorNdx= (geom->label_color-geom->colors);
4651ab64890Smrg
4661ab64890Smrg    ret = _SendSetGeometry(dpy,geom,req);
4671ab64890Smrg    UnlockDisplay(dpy);
4681ab64890Smrg    SyncHandle();
4691ab64890Smrg    return ret;
4701ab64890Smrg}
4711ab64890Smrg
472