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 *)§ionWire[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,§ion->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