cout.c revision 8c9fbc29
18c9fbc29Smrg/* $Xorg: cout.c,v 1.3 2000/08/17 19:46:43 cpqbld Exp $ */
28c9fbc29Smrg/************************************************************
38c9fbc29Smrg Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
48c9fbc29Smrg
58c9fbc29Smrg Permission to use, copy, modify, and distribute this
68c9fbc29Smrg software and its documentation for any purpose and without
78c9fbc29Smrg fee is hereby granted, provided that the above copyright
88c9fbc29Smrg notice appear in all copies and that both that copyright
98c9fbc29Smrg notice and this permission notice appear in supporting
108c9fbc29Smrg documentation, and that the name of Silicon Graphics not be
118c9fbc29Smrg used in advertising or publicity pertaining to distribution
128c9fbc29Smrg of the software without specific prior written permission.
138c9fbc29Smrg Silicon Graphics makes no representation about the suitability
148c9fbc29Smrg of this software for any purpose. It is provided "as is"
158c9fbc29Smrg without any express or implied warranty.
168c9fbc29Smrg
178c9fbc29Smrg SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
188c9fbc29Smrg SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
198c9fbc29Smrg AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
208c9fbc29Smrg GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
218c9fbc29Smrg DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
228c9fbc29Smrg DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
238c9fbc29Smrg OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
248c9fbc29Smrg THE USE OR PERFORMANCE OF THIS SOFTWARE.
258c9fbc29Smrg
268c9fbc29Smrg ********************************************************/
278c9fbc29Smrg /* $XFree86: xc/lib/xkbfile/cout.c,v 3.8 2003/02/03 20:12:00 paulo Exp $ */
288c9fbc29Smrg
298c9fbc29Smrg#ifdef HAVE_CONFIG_H
308c9fbc29Smrg#include <config.h>
318c9fbc29Smrg#endif
328c9fbc29Smrg#include <stdio.h>
338c9fbc29Smrg#include <ctype.h>
348c9fbc29Smrg#include <stdlib.h>
358c9fbc29Smrg#include <X11/Xos.h>
368c9fbc29Smrg#include <X11/Xlib.h>
378c9fbc29Smrg#include <X11/XKBlib.h>
388c9fbc29Smrg#include <X11/extensions/XKBgeom.h>
398c9fbc29Smrg
408c9fbc29Smrg#include "XKMformat.h"
418c9fbc29Smrg#include "XKBfileInt.h"
428c9fbc29Smrg
438c9fbc29Smrg#define	lowbit(x)	((x) & (-(x)))
448c9fbc29Smrg
458c9fbc29Smrgstatic Bool
468c9fbc29SmrgWriteCHdrVMods(FILE *file,Display *dpy,XkbDescPtr xkb)
478c9fbc29Smrg{
488c9fbc29Smrgregister int i,nOut;
498c9fbc29Smrg
508c9fbc29Smrg    if ((!xkb)||(!xkb->names)||(!xkb->names->vmods))
518c9fbc29Smrg	return False;
528c9fbc29Smrg    for (i=nOut=0;i<XkbNumVirtualMods;i++) {
538c9fbc29Smrg	if (xkb->names->vmods[i]!=None) {
548c9fbc29Smrg	    fprintf(file,"%s#define	vmod_%s	%d\n",(nOut<1?"\n":""),
558c9fbc29Smrg				XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile),
568c9fbc29Smrg				i);
578c9fbc29Smrg	    nOut++;
588c9fbc29Smrg	}
598c9fbc29Smrg    }
608c9fbc29Smrg    for (i=nOut=0;i<XkbNumVirtualMods;i++) {
618c9fbc29Smrg	if (xkb->names->vmods[i]!=None) {
628c9fbc29Smrg	    fprintf(file,"%s#define	vmod_%sMask	(1<<%d)\n",
638c9fbc29Smrg				(nOut<1?"\n":""),
648c9fbc29Smrg				XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile)
658c9fbc29Smrg				,i);
668c9fbc29Smrg	    nOut++;
678c9fbc29Smrg	}
688c9fbc29Smrg    }
698c9fbc29Smrg    if (nOut>0)
708c9fbc29Smrg	fprintf(file,"\n");
718c9fbc29Smrg    return True;
728c9fbc29Smrg}
738c9fbc29Smrg
748c9fbc29Smrgstatic Bool
758c9fbc29SmrgWriteCHdrKeycodes(FILE *file,XkbDescPtr xkb)
768c9fbc29Smrg{
778c9fbc29SmrgAtom			kcName;
788c9fbc29Smrgregister unsigned 	i;
798c9fbc29Smrgchar 			buf[8];
808c9fbc29Smrg
818c9fbc29Smrg    if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) {
828c9fbc29Smrg	_XkbLibError(_XkbErrMissingNames,"WriteCHdrKeycodes",0);
838c9fbc29Smrg	return False;
848c9fbc29Smrg    }
858c9fbc29Smrg    kcName= xkb->names->keycodes;
868c9fbc29Smrg    buf[4]= '\0';
878c9fbc29Smrg    if (xkb->names->keycodes!=None)
888c9fbc29Smrg	 fprintf(file,"/* keycodes name is \"%s\" */\n",
898c9fbc29Smrg 				XkbAtomText(xkb->dpy,kcName,XkbMessage));
908c9fbc29Smrg    fprintf(file,"static XkbKeyNameRec	keyNames[NUM_KEYS]= {\n");
918c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
928c9fbc29Smrg	sprintf(buf,"\"%s\"",XkbKeyNameText(xkb->names->keys[i].name,XkbCFile));
938c9fbc29Smrg	if (i!=xkb->max_key_code)  {
948c9fbc29Smrg	    fprintf(file,"    {  %6s  },",buf);
958c9fbc29Smrg	    if ((i&3)==3)
968c9fbc29Smrg		fprintf(file,"\n");
978c9fbc29Smrg	}
988c9fbc29Smrg	else {
998c9fbc29Smrg	    fprintf(file,"    {  %6s  }\n",buf);
1008c9fbc29Smrg	}
1018c9fbc29Smrg    }
1028c9fbc29Smrg    fprintf(file,"};\n");
1038c9fbc29Smrg    return True;
1048c9fbc29Smrg}
1058c9fbc29Smrg
1068c9fbc29Smrgstatic void
1078c9fbc29SmrgWriteTypePreserve(	FILE *		file,
1088c9fbc29Smrg			Display *	dpy,
1098c9fbc29Smrg			char *		prefix,
1108c9fbc29Smrg			XkbDescPtr	xkb,
1118c9fbc29Smrg			XkbKeyTypePtr	type)
1128c9fbc29Smrg{
1138c9fbc29Smrgregister unsigned	i;
1148c9fbc29SmrgXkbModsPtr		pre;
1158c9fbc29Smrg
1168c9fbc29Smrg    fprintf(file,"static XkbModsRec preserve_%s[%d]= {\n",prefix,
1178c9fbc29Smrg							type->map_count);
1188c9fbc29Smrg    for (i=0,pre=type->preserve;i<type->map_count;i++,pre++) {
1198c9fbc29Smrg	if (i!=0)
1208c9fbc29Smrg	    fprintf(file,",\n");
1218c9fbc29Smrg	fprintf(file,"    {   %15s, ",XkbModMaskText(pre->mask,XkbCFile));
1228c9fbc29Smrg	fprintf(file,"%15s, ",XkbModMaskText(pre->real_mods,XkbCFile));
1238c9fbc29Smrg	fprintf(file,"%15s }",XkbVModMaskText(dpy,xkb,0,pre->vmods,XkbCFile));
1248c9fbc29Smrg    }
1258c9fbc29Smrg    fprintf(file,"\n};\n");
1268c9fbc29Smrg    return;
1278c9fbc29Smrg}
1288c9fbc29Smrg
1298c9fbc29Smrgstatic void
1308c9fbc29SmrgWriteTypeInitFunc(FILE *file,Display *dpy,XkbDescPtr xkb)
1318c9fbc29Smrg{
1328c9fbc29Smrgregister unsigned 	i,n;
1338c9fbc29SmrgXkbKeyTypePtr		type;
1348c9fbc29SmrgAtom *			names;
1358c9fbc29Smrgchar			prefix[32];
1368c9fbc29Smrg
1378c9fbc29Smrg    fprintf(file,"\n\nstatic void\n");
1388c9fbc29Smrg    fprintf(file,"initTypeNames(DPYTYPE dpy)\n");
1398c9fbc29Smrg    fprintf(file,"{\n");
1408c9fbc29Smrg    for (i=0,type=xkb->map->types;i<xkb->map->num_types;i++,type++) {
1418c9fbc29Smrg	strcpy(prefix,XkbAtomText(dpy,type->name,XkbCFile));
1428c9fbc29Smrg	if (type->name!=None)
1438c9fbc29Smrg	    fprintf(file,"    dflt_types[%d].name= GET_ATOM(dpy,\"%s\");\n",i,
1448c9fbc29Smrg					XkbAtomText(dpy,type->name,XkbCFile));
1458c9fbc29Smrg	names= type->level_names;
1468c9fbc29Smrg	if (names!=NULL) {
1478c9fbc29Smrg	    char *tmp;
1488c9fbc29Smrg	    for (n=0;n<type->num_levels;n++) {
1498c9fbc29Smrg		if (names[n]==None)
1508c9fbc29Smrg		    continue;
1518c9fbc29Smrg		tmp= XkbAtomText(dpy,names[n],XkbCFile);
1528c9fbc29Smrg		if (tmp==NULL)
1538c9fbc29Smrg		    continue;
1548c9fbc29Smrg		fprintf(file,"    lnames_%s[%d]=	",prefix,n);
1558c9fbc29Smrg		fprintf(file,"GET_ATOM(dpy,\"%s\");\n",tmp);
1568c9fbc29Smrg	    }
1578c9fbc29Smrg	}
1588c9fbc29Smrg    }
1598c9fbc29Smrg    fprintf(file,"}\n");
1608c9fbc29Smrg    return;
1618c9fbc29Smrg}
1628c9fbc29Smrg
1638c9fbc29Smrgstatic Bool
1648c9fbc29SmrgWriteCHdrKeyTypes(FILE *file,Display *dpy,XkbDescPtr xkb)
1658c9fbc29Smrg{
1668c9fbc29Smrgregister unsigned	i,n;
1678c9fbc29SmrgXkbClientMapPtr		map;
1688c9fbc29SmrgXkbKeyTypePtr		type;
1698c9fbc29Smrgchar 			prefix[32];
1708c9fbc29Smrg
1718c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->types)) {
1728c9fbc29Smrg	_XkbLibError(_XkbErrMissingTypes,"WriteCHdrKeyTypes",0);
1738c9fbc29Smrg	return False;
1748c9fbc29Smrg    }
1758c9fbc29Smrg    if (xkb->map->num_types<XkbNumRequiredTypes) {
1768c9fbc29Smrg	_XkbLibError(_XkbErrMissingReqTypes,"WriteCHdrKeyTypes",0);
1778c9fbc29Smrg	return 0;
1788c9fbc29Smrg    }
1798c9fbc29Smrg    map= xkb->map;
1808c9fbc29Smrg    if ((xkb->names!=NULL)&&(xkb->names->types!=None)) {
1818c9fbc29Smrg	fprintf(file,"/* types name is \"%s\" */\n",
1828c9fbc29Smrg				XkbAtomText(dpy,xkb->names->types,XkbCFile));
1838c9fbc29Smrg    }
1848c9fbc29Smrg    for (i=0,type=map->types;i<map->num_types;i++,type++) {
1858c9fbc29Smrg	strcpy(prefix,XkbAtomText(dpy,type->name,XkbCFile));
1868c9fbc29Smrg
1878c9fbc29Smrg	if (type->map_count>0) {
1888c9fbc29Smrg	    XkbKTMapEntryPtr	entry;
1898c9fbc29Smrg	    entry= type->map;
1908c9fbc29Smrg	    fprintf(file,"static XkbKTMapEntryRec map_%s[%d]= {\n",prefix,
1918c9fbc29Smrg							type->map_count);
1928c9fbc29Smrg	    for (n=0;n<(unsigned)type->map_count;n++,entry++) {
1938c9fbc29Smrg		if (n!=0)
1948c9fbc29Smrg		    fprintf(file,",\n");
1958c9fbc29Smrg		fprintf(file,"    { %d, %6d, { %15s, %15s, %15s } }",
1968c9fbc29Smrg			entry->active,
1978c9fbc29Smrg			entry->level,
1988c9fbc29Smrg			XkbModMaskText(entry->mods.mask,XkbCFile),
1998c9fbc29Smrg			XkbModMaskText(entry->mods.real_mods,XkbCFile),
2008c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,entry->mods.vmods,XkbCFile));
2018c9fbc29Smrg	    }
2028c9fbc29Smrg	    fprintf(file,"\n};\n");
2038c9fbc29Smrg
2048c9fbc29Smrg	    if (type->preserve)
2058c9fbc29Smrg		WriteTypePreserve(file,dpy,prefix,xkb,type);
2068c9fbc29Smrg	}
2078c9fbc29Smrg	if (type->level_names!=NULL) {
2088c9fbc29Smrg	    fprintf(file,"static Atom lnames_%s[%d];\n",prefix,
2098c9fbc29Smrg							 type->num_levels);
2108c9fbc29Smrg	}
2118c9fbc29Smrg	fprintf(file,"\n");
2128c9fbc29Smrg    }
2138c9fbc29Smrg    fprintf(file,"static XkbKeyTypeRec dflt_types[]= {\n");
2148c9fbc29Smrg    for (i=0,type=map->types;i<(unsigned)map->num_types;i++,type++) {
2158c9fbc29Smrg	strcpy(prefix,XkbAtomText(dpy,type->name,XkbCFile));
2168c9fbc29Smrg	if (i!=0)	fprintf(file,",\n");
2178c9fbc29Smrg	fprintf(file,"    {\n	{ %15s, %15s, %15s },\n",
2188c9fbc29Smrg			XkbModMaskText(type->mods.mask,XkbCFile),
2198c9fbc29Smrg			XkbModMaskText(type->mods.real_mods,XkbCFile),
2208c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,type->mods.vmods,XkbCFile));
2218c9fbc29Smrg	fprintf(file,"	%d,\n",type->num_levels);
2228c9fbc29Smrg	fprintf(file,"	%d,",type->map_count);
2238c9fbc29Smrg	if (type->map_count>0)
2248c9fbc29Smrg	     fprintf(file,"	map_%s,",prefix);
2258c9fbc29Smrg	else fprintf(file,"	NULL,");
2268c9fbc29Smrg	if (type->preserve)
2278c9fbc29Smrg	     fprintf(file,"	preserve_%s,\n",prefix);
2288c9fbc29Smrg	else fprintf(file,"	NULL,\n");
2298c9fbc29Smrg	if (type->level_names!=NULL)
2308c9fbc29Smrg	     fprintf(file,"	None,	lnames_%s\n    }",prefix);
2318c9fbc29Smrg	else fprintf(file,"	None,	NULL\n    }");
2328c9fbc29Smrg    }
2338c9fbc29Smrg    fprintf(file,"\n};\n");
2348c9fbc29Smrg    fprintf(file,"#define num_dflt_types (sizeof(dflt_types)/sizeof(XkbKeyTypeRec))\n");
2358c9fbc29Smrg    WriteTypeInitFunc(file,dpy,xkb);
2368c9fbc29Smrg    return True;
2378c9fbc29Smrg}
2388c9fbc29Smrg
2398c9fbc29Smrgstatic Bool
2408c9fbc29SmrgWriteCHdrCompatMap(FILE *file,Display *dpy,XkbDescPtr xkb)
2418c9fbc29Smrg{
2428c9fbc29Smrgregister unsigned	i;
2438c9fbc29SmrgXkbCompatMapPtr		compat;
2448c9fbc29SmrgXkbSymInterpretPtr	interp;
2458c9fbc29Smrg
2468c9fbc29Smrg    if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) {
2478c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymInterps,"WriteCHdrInterp",0);
2488c9fbc29Smrg	return False;
2498c9fbc29Smrg    }
2508c9fbc29Smrg    compat= xkb->compat;
2518c9fbc29Smrg    if ((xkb->names!=NULL)&&(xkb->names->compat!=None)) {
2528c9fbc29Smrg	fprintf(file,"/* compat name is \"%s\" */\n",
2538c9fbc29Smrg				XkbAtomText(dpy,xkb->names->compat,XkbCFile));
2548c9fbc29Smrg    }
2558c9fbc29Smrg    fprintf(file,"static XkbSymInterpretRec dfltSI[%d]= {\n",
2568c9fbc29Smrg						compat->num_si);
2578c9fbc29Smrg    interp= compat->sym_interpret;
2588c9fbc29Smrg    for (i=0;i<compat->num_si;i++,interp++) {
2598c9fbc29Smrg	XkbAction *act;
2608c9fbc29Smrg	act= (XkbAction *)&interp->act;
2618c9fbc29Smrg	if (i!=0)	fprintf(file,",\n");
2628c9fbc29Smrg	fprintf(file,"    {    %s, ",XkbKeysymText(interp->sym,XkbCFile));
2638c9fbc29Smrg	fprintf(file,"0x%04x,\n",interp->flags);
2648c9fbc29Smrg	fprintf(file,"         %s, ",XkbSIMatchText(interp->match,XkbCFile));
2658c9fbc29Smrg	fprintf(file,"%s,\n",XkbModMaskText(interp->mods,XkbCFile));
2668c9fbc29Smrg	fprintf(file,"         %d,\n",interp->virtual_mod);
2678c9fbc29Smrg	fprintf(file,"       %s }",XkbActionText(dpy,xkb,act,XkbCFile));
2688c9fbc29Smrg    }
2698c9fbc29Smrg    fprintf(file,"\n};\n");
2708c9fbc29Smrg    fprintf(file,
2718c9fbc29Smrg	   "#define num_dfltSI (sizeof(dfltSI)/sizeof(XkbSymInterpretRec))\n");
2728c9fbc29Smrg    fprintf(file,"\nstatic XkbCompatMapRec compatMap= {\n");
2738c9fbc29Smrg    fprintf(file,"    dfltSI,\n");
2748c9fbc29Smrg    fprintf(file,"    {   /* group compatibility */\n        ");
2758c9fbc29Smrg    for (i=0;i<XkbNumKbdGroups;i++) {
2768c9fbc29Smrg	XkbModsPtr gc;
2778c9fbc29Smrg	gc= &xkb->compat->groups[i];
2788c9fbc29Smrg	fprintf(file,"%s{ %12s, %12s, %12s }",
2798c9fbc29Smrg			((i==0)?"":",\n        "),
2808c9fbc29Smrg			XkbModMaskText(gc->mask,XkbCFile),
2818c9fbc29Smrg			XkbModMaskText(gc->real_mods,XkbCFile),
2828c9fbc29Smrg			XkbVModMaskText(xkb->dpy,xkb,0,gc->vmods,XkbCFile));
2838c9fbc29Smrg    }
2848c9fbc29Smrg    fprintf(file,"\n    },\n");
2858c9fbc29Smrg    fprintf(file,"    num_dfltSI, num_dfltSI\n");
2868c9fbc29Smrg    fprintf(file,"};\n\n");
2878c9fbc29Smrg    return True;
2888c9fbc29Smrg}
2898c9fbc29Smrg
2908c9fbc29Smrgstatic Bool
2918c9fbc29SmrgWriteCHdrSymbols(FILE *file,XkbDescPtr xkb)
2928c9fbc29Smrg{
2938c9fbc29Smrgregister unsigned i;
2948c9fbc29Smrg
2958c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
2968c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrSymbols",0);
2978c9fbc29Smrg	return False;
2988c9fbc29Smrg    }
2998c9fbc29Smrg    fprintf(file,"#define NUM_SYMBOLS	%d\n",xkb->map->num_syms);
3008c9fbc29Smrg    if (xkb->map->num_syms>0) {
3018c9fbc29Smrg	register KeySym *sym;
3028c9fbc29Smrg	sym= xkb->map->syms;
3038c9fbc29Smrg	fprintf(file,"static KeySym	symCache[NUM_SYMBOLS]= {\n");
3048c9fbc29Smrg	for (i=0;i<xkb->map->num_syms;i++,sym++) {
3058c9fbc29Smrg	    if (i==0)		fprintf(file,"    ");
3068c9fbc29Smrg	    else if (i%4==0)	fprintf(file,",\n    ");
3078c9fbc29Smrg	    else		fprintf(file,", ");
3088c9fbc29Smrg	    fprintf(file,"%15s",XkbKeysymText(*sym,XkbCFile));
3098c9fbc29Smrg	}
3108c9fbc29Smrg	fprintf(file,"\n};\n");
3118c9fbc29Smrg    }
3128c9fbc29Smrg    if (xkb->max_key_code>0) {
3138c9fbc29Smrg	register XkbSymMapPtr	map;
3148c9fbc29Smrg	map= xkb->map->key_sym_map;
3158c9fbc29Smrg	fprintf(file,"static XkbSymMapRec	symMap[NUM_KEYS]= {\n");
3168c9fbc29Smrg	for (i=0;i<=xkb->max_key_code;i++,map++) {
3178c9fbc29Smrg	    if (i==0)		fprintf(file,"    ");
3188c9fbc29Smrg	    else if ((i&3)==0)	fprintf(file,",\n    ");
3198c9fbc29Smrg	    else			fprintf(file,", ");
3208c9fbc29Smrg	    fprintf(file, "{ %2d, 0x%x, %3d }",
3218c9fbc29Smrg		    map->kt_index[0], map->group_info, map->offset);
3228c9fbc29Smrg	}
3238c9fbc29Smrg	fprintf(file,"\n};\n");
3248c9fbc29Smrg    }
3258c9fbc29Smrg    return True;
3268c9fbc29Smrg}
3278c9fbc29Smrg
3288c9fbc29Smrgstatic Bool
3298c9fbc29SmrgWriteCHdrClientMap(FILE *file,Display *dpy,XkbDescPtr xkb)
3308c9fbc29Smrg{
3318c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
3328c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrClientMap",0);
3338c9fbc29Smrg	return False;
3348c9fbc29Smrg    }
3358c9fbc29Smrg    if (!WriteCHdrKeyTypes(file,dpy,xkb))
3368c9fbc29Smrg	return False;
3378c9fbc29Smrg    if (!WriteCHdrSymbols(file,xkb))
3388c9fbc29Smrg	return False;
3398c9fbc29Smrg    fprintf(file,"static XkbClientMapRec clientMap= {\n");
3408c9fbc29Smrg    fprintf(file,"    NUM_TYPES,   NUM_TYPES,   types, \n");
3418c9fbc29Smrg    fprintf(file,"    NUM_SYMBOLS, NUM_SYMBOLS, symCache, symMap\n");
3428c9fbc29Smrg    fprintf(file,"};\n\n");
3438c9fbc29Smrg    return True;
3448c9fbc29Smrg}
3458c9fbc29Smrg
3468c9fbc29Smrgstatic Bool
3478c9fbc29SmrgWriteCHdrServerMap(FILE *file,Display *dpy,XkbDescPtr xkb)
3488c9fbc29Smrg{
3498c9fbc29Smrgregister unsigned i;
3508c9fbc29Smrg
3518c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
3528c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrServerMap",0);
3538c9fbc29Smrg	return False;
3548c9fbc29Smrg    }
3558c9fbc29Smrg    if (xkb->server->num_acts>0) {
3568c9fbc29Smrg	register XkbAnyAction *act;
3578c9fbc29Smrg	act= (XkbAnyAction *)xkb->server->acts;
3588c9fbc29Smrg	fprintf(file,"#define NUM_ACTIONS	%d\n",xkb->server->num_acts);
3598c9fbc29Smrg	fprintf(file,"static XkbAnyAction 	actionCache[NUM_ACTIONS]= {\n");
3608c9fbc29Smrg	for (i=0;i<xkb->server->num_acts;i++,act++) {
3618c9fbc29Smrg	    if (i==0)	fprintf(file,"    ");
3628c9fbc29Smrg	    else	fprintf(file,",\n    ");
3638c9fbc29Smrg	    fprintf(file,"%s",XkbActionText(dpy,xkb,(XkbAction *)act,XkbCFile));
3648c9fbc29Smrg	}
3658c9fbc29Smrg	fprintf(file,"\n};\n");
3668c9fbc29Smrg    }
3678c9fbc29Smrg    fprintf(file,"static unsigned short	keyActions[NUM_KEYS]= {\n");
3688c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
3698c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
3708c9fbc29Smrg	else if ((i&0xf)==0)	fprintf(file,",\n    ");
3718c9fbc29Smrg	else			fprintf(file,", ");
3728c9fbc29Smrg	fprintf(file,"%2d",xkb->server->key_acts[i]);
3738c9fbc29Smrg    }
3748c9fbc29Smrg    fprintf(file,"\n};\n");
3758c9fbc29Smrg    fprintf(file,"static XkbBehavior behaviors[NUM_KEYS]= {\n");
3768c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
3778c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
3788c9fbc29Smrg	else if ((i&0x3)==0)	fprintf(file,",\n    ");
3798c9fbc29Smrg	else			fprintf(file,", ");
3808c9fbc29Smrg	if (xkb->server->behaviors) {
3818c9fbc29Smrg	     fprintf(file,"%s",
3828c9fbc29Smrg		XkbBehaviorText(xkb,&xkb->server->behaviors[i],XkbCFile));
3838c9fbc29Smrg	}
3848c9fbc29Smrg	else fprintf(file,"{    0,    0 }");
3858c9fbc29Smrg    }
3868c9fbc29Smrg    fprintf(file,"\n};\n");
3878c9fbc29Smrg    fprintf(file,"static unsigned char explicit_parts[NUM_KEYS]= {\n");
3888c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
3898c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
3908c9fbc29Smrg	else if ((i&0x7)==0)	fprintf(file,",\n    ");
3918c9fbc29Smrg	else			fprintf(file,", ");
3928c9fbc29Smrg	if ((xkb->server->explicit==NULL)||(xkb->server->explicit[i]==0))
3938c9fbc29Smrg	     fprintf(file,"   0");
3948c9fbc29Smrg	else fprintf(file,"0x%02x",xkb->server->explicit[i]);
3958c9fbc29Smrg    }
3968c9fbc29Smrg    fprintf(file,"\n};\n");
3978c9fbc29Smrg    fprintf(file,"static unsigned short vmodmap[NUM_KEYS]= {\n");
3988c9fbc29Smrg    for (i=0;i<xkb->max_key_code;i++) {
3998c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
4008c9fbc29Smrg	else if ((i&0x7)==0)	fprintf(file,",\n    ");
4018c9fbc29Smrg	else			fprintf(file,", ");
4028c9fbc29Smrg	if ((xkb->server->vmodmap==NULL)||(xkb->server->vmodmap[i]==0))
4038c9fbc29Smrg	     fprintf(file,"     0");
4048c9fbc29Smrg	else fprintf(file,"0x%04x",xkb->server->vmodmap[i]);
4058c9fbc29Smrg    }
4068c9fbc29Smrg    fprintf(file,"};\n");
4078c9fbc29Smrg    fprintf(file,"static XkbServerMapRec serverMap= {\n");
4088c9fbc29Smrg    fprintf(file,"    %d, %d, (XkbAction *)actionCache,\n",
4098c9fbc29Smrg				xkb->server->num_acts,xkb->server->num_acts);
4108c9fbc29Smrg    fprintf(file,"    behaviors, keyActions, explicit_parts,\n");
4118c9fbc29Smrg    for (i=0;i<XkbNumVirtualMods;i++) {
4128c9fbc29Smrg	if (i==0)	fprintf(file,"    { ");
4138c9fbc29Smrg	else if (i==8)	fprintf(file,",\n      ");
4148c9fbc29Smrg	else		fprintf(file,", ");
4158c9fbc29Smrg	fprintf(file,"%3d",xkb->server->vmods[i]);
4168c9fbc29Smrg    }
4178c9fbc29Smrg    fprintf(file," },\n");
4188c9fbc29Smrg    fprintf(file,"    vmodmap\n");
4198c9fbc29Smrg    fprintf(file,"};\n\n");
4208c9fbc29Smrg    return True;
4218c9fbc29Smrg}
4228c9fbc29Smrg
4238c9fbc29Smrgstatic Bool
4248c9fbc29SmrgWriteCHdrIndicators(FILE *file,Display *dpy,XkbDescPtr xkb)
4258c9fbc29Smrg{
4268c9fbc29Smrgregister int 		i,nNames;
4278c9fbc29SmrgXkbIndicatorMapPtr	imap;
4288c9fbc29Smrg
4298c9fbc29Smrg    if (xkb->indicators==NULL)
4308c9fbc29Smrg	return True;
4318c9fbc29Smrg    fprintf(file, "static XkbIndicatorRec indicators= {\n");
4328c9fbc29Smrg    fprintf(file, "    0x%lx,\n    {\n",
4338c9fbc29Smrg	    (long)xkb->indicators->phys_indicators);
4348c9fbc29Smrg    for (imap=xkb->indicators->maps,i=nNames=0;i<XkbNumIndicators;i++,imap++) {
4358c9fbc29Smrg	fprintf(file,"%s        { 0x%02x, %s, 0x%02x, %s, { %s, ",
4368c9fbc29Smrg			(i!=0?",\n":""),
4378c9fbc29Smrg			imap->flags,
4388c9fbc29Smrg			XkbIMWhichStateMaskText(imap->which_groups,XkbCFile),
4398c9fbc29Smrg			imap->groups,
4408c9fbc29Smrg			XkbIMWhichStateMaskText(imap->which_mods,XkbCFile),
4418c9fbc29Smrg			XkbModMaskText(imap->mods.mask,XkbCFile));
4428c9fbc29Smrg	fprintf(file," %s, %s }, %s }",
4438c9fbc29Smrg			XkbModMaskText(imap->mods.real_mods,XkbCFile),
4448c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,imap->mods.vmods,XkbCFile),
4458c9fbc29Smrg			XkbControlsMaskText(imap->ctrls,XkbCFile));
4468c9fbc29Smrg	if (xkb->names && (xkb->names->indicators[i]!=None))
4478c9fbc29Smrg	    nNames++;
4488c9fbc29Smrg    }
4498c9fbc29Smrg    fprintf(file,"\n    }\n};\n");
4508c9fbc29Smrg    if (nNames>0) {
4518c9fbc29Smrg	fprintf(file,"static void\n");
4528c9fbc29Smrg	fprintf(file,"initIndicatorNames(DPYTYPE dpy,XkbDescPtr xkb)\n");
4538c9fbc29Smrg	fprintf(file,"{\n");
4548c9fbc29Smrg	for (i=0;i<XkbNumIndicators;i++) {
4558c9fbc29Smrg	    Atom name;
4568c9fbc29Smrg	    if (xkb->names->indicators[i]==None)
4578c9fbc29Smrg		continue;
4588c9fbc29Smrg	    name= xkb->names->indicators[i];
4598c9fbc29Smrg	    fprintf(file,"    xkb->names->indicators[%2d]=	",i);
4608c9fbc29Smrg	    fprintf(file,"GET_ATOM(dpy,\"%s\");\n",
4618c9fbc29Smrg						XkbAtomText(dpy,name,XkbCFile));
4628c9fbc29Smrg	}
4638c9fbc29Smrg	fprintf(file,"}\n");
4648c9fbc29Smrg    }
4658c9fbc29Smrg    return True;
4668c9fbc29Smrg}
4678c9fbc29Smrg
4688c9fbc29Smrgstatic Bool
4698c9fbc29SmrgWriteCHdrGeomProps(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
4708c9fbc29Smrg{
4718c9fbc29Smrg    if (geom->num_properties>0) {
4728c9fbc29Smrg	register int i;
4738c9fbc29Smrg	fprintf(file,"\nstatic XkbPropertyRec g_props[%d]= {\n",
4748c9fbc29Smrg							geom->num_properties);
4758c9fbc29Smrg	for (i=0;i<geom->num_properties;i++) {
4768c9fbc29Smrg	    fprintf(file,"%s	{	\"%s\", \"%s\"	}",(i==0?"":",\n"),
4778c9fbc29Smrg			XkbStringText(geom->properties[i].name,XkbCFile),
4788c9fbc29Smrg			XkbStringText(geom->properties[i].value,XkbCFile));
4798c9fbc29Smrg	}
4808c9fbc29Smrg	fprintf(file,"\n};\n");
4818c9fbc29Smrg    }
4828c9fbc29Smrg    return True;
4838c9fbc29Smrg}
4848c9fbc29Smrg
4858c9fbc29Smrgstatic Bool
4868c9fbc29SmrgWriteCHdrGeomColors(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
4878c9fbc29Smrg{
4888c9fbc29Smrg    if (geom->num_colors>0) {
4898c9fbc29Smrg	register int i;
4908c9fbc29Smrg	fprintf(file,"\nstatic XkbColorRec g_colors[%d]= {\n",geom->num_colors);
4918c9fbc29Smrg	for (i=0;i<geom->num_colors;i++) {
4928c9fbc29Smrg	    fprintf(file,"%s	{	%3d, \"%s\"	}",(i==0?"":",\n"),
4938c9fbc29Smrg			geom->colors[i].pixel,
4948c9fbc29Smrg			XkbStringText(geom->colors[i].spec,XkbCFile));
4958c9fbc29Smrg	}
4968c9fbc29Smrg	fprintf(file,"\n};\n");
4978c9fbc29Smrg    }
4988c9fbc29Smrg    return True;
4998c9fbc29Smrg}
5008c9fbc29Smrg
5018c9fbc29Smrgstatic Bool
5028c9fbc29SmrgWriteCHdrGeomOutlines(FILE *file,int nOL,XkbOutlinePtr ol,int shapeNdx)
5038c9fbc29Smrg{
5048c9fbc29Smrgregister int o,p;
5058c9fbc29Smrg
5068c9fbc29Smrg
5078c9fbc29Smrg    for (o=0;o<nOL;o++) {
5088c9fbc29Smrg	fprintf(file,"\nstatic XkbPointRec pts_sh%02do%02d[]= {\n",shapeNdx,o);
5098c9fbc29Smrg	for (p=0;p<ol[o].num_points;p++) {
5108c9fbc29Smrg	    if (p==0)			fprintf(file,"	");
5118c9fbc29Smrg	    else if ((p&0x3)==0)	fprintf(file,",\n	");
5128c9fbc29Smrg	    else 			fprintf(file,", ");
5138c9fbc29Smrg	    fprintf(file,"{ %4d, %4d }",
5148c9fbc29Smrg				ol[o].points[p].x,ol[o].points[p].y);
5158c9fbc29Smrg	}
5168c9fbc29Smrg	fprintf(file,"\n};");
5178c9fbc29Smrg    }
5188c9fbc29Smrg    fprintf(file,"\n\nstatic XkbOutlineRec ol_sh%02d[]= {\n",shapeNdx);
5198c9fbc29Smrg    for (o=0;o<nOL;o++) {
5208c9fbc29Smrg	fprintf(file,"%s	{ %d,	%d,	%d,	pts_sh%02do%02d	}",
5218c9fbc29Smrg					(o==0?"":",\n"),
5228c9fbc29Smrg					ol[o].num_points,ol[o].num_points,
5238c9fbc29Smrg					ol[o].corner_radius,shapeNdx,o);
5248c9fbc29Smrg    }
5258c9fbc29Smrg    fprintf(file,"\n};\n");
5268c9fbc29Smrg    return True;
5278c9fbc29Smrg}
5288c9fbc29Smrg
5298c9fbc29Smrgstatic Bool
5308c9fbc29SmrgWriteCHdrGeomShapes(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
5318c9fbc29Smrg{
5328c9fbc29Smrgregister int 		s;
5338c9fbc29Smrgregister XkbShapePtr	shape;
5348c9fbc29Smrg
5358c9fbc29Smrg    for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) {
5368c9fbc29Smrg	WriteCHdrGeomOutlines(file,shape->num_outlines,shape->outlines,s);
5378c9fbc29Smrg    }
5388c9fbc29Smrg    fprintf(file,"\n\nstatic XkbShapeRec g_shapes[%d]= {\n",geom->num_shapes);
5398c9fbc29Smrg    for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) {
5408c9fbc29Smrg	fprintf(file,"%s	{ None, %3d, %3d, ol_sh%02d, ",
5418c9fbc29Smrg					(s==0?"":",\n"),shape->num_outlines,
5428c9fbc29Smrg					shape->num_outlines,s);
5438c9fbc29Smrg	if (shape->approx) {
5448c9fbc29Smrg	    fprintf(file,"&ol_sh%02d[%2d],	",s,
5458c9fbc29Smrg					XkbOutlineIndex(shape,shape->approx));
5468c9fbc29Smrg	}
5478c9fbc29Smrg	else fprintf(file,"        NULL,	");
5488c9fbc29Smrg	if (shape->primary) {
5498c9fbc29Smrg	    fprintf(file,"&ol_sh%02d[%2d],\n",s,
5508c9fbc29Smrg					XkbOutlineIndex(shape,shape->primary));
5518c9fbc29Smrg	}
5528c9fbc29Smrg	else fprintf(file,"        NULL,\n");
5538c9fbc29Smrg	fprintf(file,"					{ %4d, %4d, %4d, %4d } }",
5548c9fbc29Smrg					shape->bounds.x1,shape->bounds.y1,
5558c9fbc29Smrg					shape->bounds.x2,shape->bounds.y2);
5568c9fbc29Smrg    }
5578c9fbc29Smrg    fprintf(file,"\n};\n");
5588c9fbc29Smrg    return True;
5598c9fbc29Smrg}
5608c9fbc29Smrg
5618c9fbc29Smrgstatic Bool
5628c9fbc29SmrgWriteCHdrGeomDoodads(	FILE *		file,
5638c9fbc29Smrg			XkbDescPtr	xkb,
5648c9fbc29Smrg			XkbGeometryPtr	geom,
5658c9fbc29Smrg			XkbSectionPtr	section,
5668c9fbc29Smrg			int		section_num)
5678c9fbc29Smrg{
5688c9fbc29Smrgint		nd,d;
5698c9fbc29SmrgXkbDoodadPtr	doodad;
5708c9fbc29SmrgDisplay *	dpy;
5718c9fbc29Smrg
5728c9fbc29Smrg    dpy= xkb->dpy;
5738c9fbc29Smrg    if (section==NULL) {
5748c9fbc29Smrg	if (geom->num_doodads>0) {
5758c9fbc29Smrg	    fprintf(file,"static XkbDoodadRec g_doodads[%d];\n",
5768c9fbc29Smrg							geom->num_doodads);
5778c9fbc29Smrg	}
5788c9fbc29Smrg	fprintf(file,"static void\n");
5798c9fbc29Smrg	fprintf(file,"_InitGeomDoodads(DPYTYPE dpy,XkbGeometryPtr geom)\n");
5808c9fbc29Smrg	fprintf(file,"{\n");
5818c9fbc29Smrg	fprintf(file,"register XkbDoodadPtr doodads;\n\n");
5828c9fbc29Smrg	fprintf(file,"    doodads= geom->doodads;\n");
5838c9fbc29Smrg	nd= geom->num_doodads;
5848c9fbc29Smrg	doodad= geom->doodads;
5858c9fbc29Smrg    }
5868c9fbc29Smrg    else {
5878c9fbc29Smrg	if (section->num_doodads>0) {
5888c9fbc29Smrg	    fprintf(file,"static XkbDoodadRec doodads_s%02d[%d];\n",
5898c9fbc29Smrg					section_num,section->num_doodads);
5908c9fbc29Smrg	}
5918c9fbc29Smrg	fprintf(file,"static void\n");
5928c9fbc29Smrg	fprintf(file,"_InitS%02dDoodads(",section_num);
5938c9fbc29Smrg	fprintf(file,"    DPYTYPE		dpy,\n");
5948c9fbc29Smrg	fprintf(file,"    XkbGeometryPtr 	geom,\n");
5958c9fbc29Smrg	fprintf(file,"    XkbSectionPtr 	section)\n");
5968c9fbc29Smrg	fprintf(file,"{\n");
5978c9fbc29Smrg	fprintf(file,"register XkbDoodadPtr doodads;\n\n");
5988c9fbc29Smrg	fprintf(file,"    doodads= section->doodads;\n");
5998c9fbc29Smrg	nd= geom->num_doodads;
6008c9fbc29Smrg	doodad= geom->doodads;
6018c9fbc29Smrg    }
6028c9fbc29Smrg    for (d=0;d<nd;d++,doodad++) {
6038c9fbc29Smrg	if (d!=0)	fprintf(file,"\n");
6048c9fbc29Smrg	fprintf(file,"    doodads[%d].any.name= GET_ATOM(dpy,\"%s\");\n",d,
6058c9fbc29Smrg			XkbAtomText(dpy,doodad->any.name,XkbCFile));
6068c9fbc29Smrg	fprintf(file,"    doodads[%d].any.type= %s;\n",d,
6078c9fbc29Smrg			XkbDoodadTypeText(doodad->any.type,XkbCFile));
6088c9fbc29Smrg	fprintf(file,"    doodads[%d].any.priority= %d;\n",d,
6098c9fbc29Smrg			doodad->any.priority);
6108c9fbc29Smrg	fprintf(file,"    doodads[%d].any.top= %d;\n",d,doodad->any.top);
6118c9fbc29Smrg	fprintf(file,"    doodads[%d].any.left= %d;\n",d,doodad->any.left);
6128c9fbc29Smrg	fprintf(file,"    doodads[%d].any.angle= %d;\n",d,doodad->any.angle);
6138c9fbc29Smrg	switch (doodad->any.type) {
6148c9fbc29Smrg	    case XkbOutlineDoodad:
6158c9fbc29Smrg	    case XkbSolidDoodad:
6168c9fbc29Smrg		fprintf(file,"    doodads[%d].shape.color_ndx= %d;\n",d,
6178c9fbc29Smrg					doodad->shape.color_ndx);
6188c9fbc29Smrg		fprintf(file,"    doodads[%d].shape.shape_ndx= %d;\n",d,
6198c9fbc29Smrg					doodad->shape.shape_ndx);
6208c9fbc29Smrg		break;
6218c9fbc29Smrg	    case XkbTextDoodad:
6228c9fbc29Smrg		fprintf(file,"    doodads[%d].text.width= %d;\n",d,
6238c9fbc29Smrg					doodad->text.width);
6248c9fbc29Smrg		fprintf(file,"    doodads[%d].text.height= %d;\n",d,
6258c9fbc29Smrg					doodad->text.height);
6268c9fbc29Smrg		fprintf(file,"    doodads[%d].text.color_ndx= %d;\n",d,
6278c9fbc29Smrg					doodad->text.color_ndx);
6288c9fbc29Smrg		fprintf(file,"    doodads[%d].text.text= \"%s\";\n",d,
6298c9fbc29Smrg				XkbStringText(doodad->text.text,XkbCFile));
6308c9fbc29Smrg		fprintf(file,"    doodads[%d].text.font= \"%s\";\n",d,
6318c9fbc29Smrg				XkbStringText(doodad->text.font,XkbCFile));
6328c9fbc29Smrg		break;
6338c9fbc29Smrg	    case XkbIndicatorDoodad:
6348c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.shape_ndx= %d;\n",d,
6358c9fbc29Smrg					doodad->indicator.shape_ndx);
6368c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.on_color_ndx= %d;\n",d,
6378c9fbc29Smrg					doodad->indicator.on_color_ndx);
6388c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.off_color_ndx= %d;\n",d,
6398c9fbc29Smrg					doodad->indicator.off_color_ndx);
6408c9fbc29Smrg		break;
6418c9fbc29Smrg	    case XkbLogoDoodad:
6428c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.color_ndx= %d;\n",d,
6438c9fbc29Smrg					doodad->logo.color_ndx);
6448c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.shape_ndx= %d;\n",d,
6458c9fbc29Smrg					doodad->logo.shape_ndx);
6468c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.logo_name= \"%s\";\n",d,
6478c9fbc29Smrg				XkbStringText(doodad->logo.logo_name,XkbCFile));
6488c9fbc29Smrg		break;
6498c9fbc29Smrg	}
6508c9fbc29Smrg    }
6518c9fbc29Smrg    fprintf(file,"}\n");
6528c9fbc29Smrg    return True;
6538c9fbc29Smrg}
6548c9fbc29Smrg
6558c9fbc29Smrgstatic Bool
6568c9fbc29SmrgWriteCHdrGeomOverlays(	FILE *		file,
6578c9fbc29Smrg			XkbDescPtr	xkb,
6588c9fbc29Smrg			XkbSectionPtr	section,
6598c9fbc29Smrg			int		section_num)
6608c9fbc29Smrg{
6618c9fbc29Smrgregister int		o,r,k;
6628c9fbc29SmrgXkbOverlayPtr		ol;
6638c9fbc29SmrgXkbOverlayRowPtr	row;
6648c9fbc29SmrgXkbOverlayKeyPtr	key;
6658c9fbc29Smrg
6668c9fbc29Smrg    if (section->num_overlays<1)
6678c9fbc29Smrg	return True;
6688c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
6698c9fbc29Smrg	for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
6708c9fbc29Smrg	    fprintf(file,"static XkbOverlayKeyRec olkeys_s%02dr%02d[%d]= {\n",
6718c9fbc29Smrg						section_num,r,row->num_keys);
6728c9fbc29Smrg	    for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
6738c9fbc29Smrg		fprintf(file,"%s	{ {\"%s\"},	{\"%s\"}	}",
6748c9fbc29Smrg				(k==0?"":",\n"),
6758c9fbc29Smrg				XkbKeyNameText(key->over.name,XkbCFile),
6768c9fbc29Smrg				XkbKeyNameText(key->under.name,XkbCFile));
6778c9fbc29Smrg	    }
6788c9fbc29Smrg	    fprintf(file,"\n};\n");
6798c9fbc29Smrg	}
6808c9fbc29Smrg	fprintf(file,"static XkbOverlayRowRec olrows_s%02d[%d]= {\n",
6818c9fbc29Smrg						section_num,section->num_rows);
6828c9fbc29Smrg	for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
6838c9fbc29Smrg	    fprintf(file,"%s	{ %4d, %4d, %4d, olkeys_s%02dr%02d }",
6848c9fbc29Smrg				(r==0?"":",\n"),
6858c9fbc29Smrg				row->row_under,row->num_keys,row->num_keys,
6868c9fbc29Smrg				section_num,r);
6878c9fbc29Smrg	}
6888c9fbc29Smrg	fprintf(file,"\n};\n");
6898c9fbc29Smrg    }
6908c9fbc29Smrg    fprintf(file,"static XkbOverlayRec overlays_s%02d[%d]= {\n",section_num,
6918c9fbc29Smrg							section->num_overlays);
6928c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
6938c9fbc29Smrg	fprintf(file,"%s	{\n",(o==0?"":",\n"));
6948c9fbc29Smrg	fprintf(file,"	    None, 	/* name */\n");
6958c9fbc29Smrg	fprintf(file,"	    NULL,	/* section_under */\n");
6968c9fbc29Smrg	fprintf(file,"	    %4d,	/* num_rows */\n",ol->num_rows);
6978c9fbc29Smrg	fprintf(file,"	    %4d,	/* sz_rows */\n",ol->num_rows);
6988c9fbc29Smrg	fprintf(file,"	    olrows_s%02d,\n",section_num);
6998c9fbc29Smrg	fprintf(file,"	    NULL	/* bounds */\n");
7008c9fbc29Smrg	fprintf(file,"	}");
7018c9fbc29Smrg    }
7028c9fbc29Smrg    fprintf(file,"\n};\n");
7038c9fbc29Smrg    fprintf(file,"static void\n");
7048c9fbc29Smrg    fprintf(file,"_InitS%02dOverlay(",section_num);
7058c9fbc29Smrg    fprintf(file,"    DPYTYPE		dpy,\n");
7068c9fbc29Smrg    fprintf(file,"    XkbGeometryPtr 	geom,\n");
7078c9fbc29Smrg    fprintf(file,"    XkbSectionPtr 	section)\n");
7088c9fbc29Smrg    fprintf(file,"{\n");
7098c9fbc29Smrg    fprintf(file,"XkbOverlayPtr	ol;\n\n");
7108c9fbc29Smrg    fprintf(file,"    ol= section->overlays;\n");
7118c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
7128c9fbc29Smrg	fprintf(file,"    ol[%2d].name= GET_ATOM(dpy,\"%s\");\n",o,
7138c9fbc29Smrg				XkbAtomText(xkb->dpy,ol->name,XkbCFile));
7148c9fbc29Smrg	fprintf(file,"    ol[%2d].section_under= section;\n",o);
7158c9fbc29Smrg    }
7168c9fbc29Smrg    fprintf(file,"}\n");
7178c9fbc29Smrg    return True;
7188c9fbc29Smrg}
7198c9fbc29Smrg
7208c9fbc29Smrgstatic Bool
7218c9fbc29SmrgWriteCHdrGeomRows(	FILE *		file,
7228c9fbc29Smrg			XkbDescPtr	xkb,
7238c9fbc29Smrg			XkbSectionPtr	section,
7248c9fbc29Smrg			int		section_num)
7258c9fbc29Smrg{
7268c9fbc29Smrgregister int 		k,r;
7278c9fbc29Smrgregister XkbRowPtr	row;
7288c9fbc29Smrgregister XkbKeyPtr	key;
7298c9fbc29Smrg
7308c9fbc29Smrg    for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
7318c9fbc29Smrg	fprintf(file,"static XkbKeyRec keys_s%02dr%02d[]= {\n",section_num,r);
7328c9fbc29Smrg	for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
7338c9fbc29Smrg	    fprintf(file,"%s	{ { \"%s\" },	%4d, %4d, %4d }",
7348c9fbc29Smrg				(k==0?"":",\n"),
7358c9fbc29Smrg				XkbKeyNameText(key->name.name,XkbCFile),
7368c9fbc29Smrg				key->gap,key->shape_ndx,key->color_ndx);
7378c9fbc29Smrg	}
7388c9fbc29Smrg	fprintf(file,"\n};\n");
7398c9fbc29Smrg    }
7408c9fbc29Smrg    fprintf(file,"static XkbRowRec rows_s%02d[]= {\n",section_num);
7418c9fbc29Smrg    for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
7428c9fbc29Smrg	fprintf(file,"%s	{ %4d, %4d, %2d, %2d, %1d, keys_s%02dr%02d, ",
7438c9fbc29Smrg				(r==0?"":",\n"),
7448c9fbc29Smrg				row->top,row->left,row->num_keys,row->num_keys,
7458c9fbc29Smrg				(row->vertical!=0),
7468c9fbc29Smrg				section_num,r);
7478c9fbc29Smrg	fprintf(file," { %4d, %4d, %4d, %4d } }",
7488c9fbc29Smrg				row->bounds.x1,row->bounds.y1,
7498c9fbc29Smrg				row->bounds.x2,row->bounds.y2);
7508c9fbc29Smrg    }
7518c9fbc29Smrg    fprintf(file,"\n};\n");
7528c9fbc29Smrg    return True;
7538c9fbc29Smrg}
7548c9fbc29Smrg
7558c9fbc29Smrgstatic Bool
7568c9fbc29SmrgWriteCHdrGeomSections(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
7578c9fbc29Smrg{
7588c9fbc29Smrgregister int		s;
7598c9fbc29Smrgregister XkbSectionPtr	section;
7608c9fbc29Smrg
7618c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
7628c9fbc29Smrg	WriteCHdrGeomRows(file,xkb,section,s);
7638c9fbc29Smrg#ifdef NOTYET
7648c9fbc29Smrg	if (section->num_doodads>0)
7658c9fbc29Smrg	    WriteCHdrGeomDoodads(file,xkb,geom,section,s);
7668c9fbc29Smrg#endif
7678c9fbc29Smrg	if (section->num_overlays>0)
7688c9fbc29Smrg	    WriteCHdrGeomOverlays(file,xkb,section,s);
7698c9fbc29Smrg    }
7708c9fbc29Smrg    fprintf(file,"\nstatic XkbSectionRec g_sections[%d]= {\n",
7718c9fbc29Smrg							geom->num_sections);
7728c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
7738c9fbc29Smrg	if (s!=0) fprintf(file,",\n");
7748c9fbc29Smrg	fprintf(file,"	{\n	    None, /* name */\n");
7758c9fbc29Smrg	fprintf(file,"	    %4d, /* priority */\n",section->priority);
7768c9fbc29Smrg	fprintf(file,"	    %4d, /* top */\n",section->top);
7778c9fbc29Smrg	fprintf(file,"	    %4d, /* left */\n",section->left);
7788c9fbc29Smrg	fprintf(file,"	    %4d, /* width */\n",section->width);
7798c9fbc29Smrg	fprintf(file,"	    %4d, /* height */\n",section->height);
7808c9fbc29Smrg	fprintf(file,"	    %4d, /* angle */\n",section->angle);
7818c9fbc29Smrg	fprintf(file,"	    %4d, /* num_rows */\n",section->num_rows);
7828c9fbc29Smrg	fprintf(file,"	    %4d, /* num_doodads */\n",section->num_doodads);
7838c9fbc29Smrg	fprintf(file,"	    %4d, /* num_overlays */\n",section->num_overlays);
7848c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_rows */\n",section->num_rows);
7858c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_doodads */\n",section->num_doodads);
7868c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_overlays */\n",section->num_overlays);
7878c9fbc29Smrg	if (section->num_rows>0)
7888c9fbc29Smrg	     fprintf(file,"	    rows_s%02d,\n",s);
7898c9fbc29Smrg	else fprintf(file,"	    NULL, /* rows */\n");
7908c9fbc29Smrg	if (section->num_doodads>0)
7918c9fbc29Smrg	     fprintf(file,"	    doodads_s%02d,\n",s);
7928c9fbc29Smrg	else fprintf(file,"	    NULL, /* doodads */\n");
7938c9fbc29Smrg	fprintf(file,"	    { %4d, %4d, %4d, %4d }, /* bounds */\n",
7948c9fbc29Smrg					section->bounds.x1,section->bounds.y1,
7958c9fbc29Smrg					section->bounds.x2,section->bounds.y2);
7968c9fbc29Smrg	if (section->num_overlays>0)
7978c9fbc29Smrg	     fprintf(file,"	    overlays_s%02d\n",s);
7988c9fbc29Smrg	else fprintf(file,"	    NULL /* overlays */\n");
7998c9fbc29Smrg	fprintf(file,"	}");
8008c9fbc29Smrg    }
8018c9fbc29Smrg    fprintf(file,"\n};\n");
8028c9fbc29Smrg    fprintf(file,"\nstatic Bool\n");
8038c9fbc29Smrg    fprintf(file,"_InitSections(DPYTYPE dpy,XkbGeometryPtr geom)\n");
8048c9fbc29Smrg    fprintf(file,"{\nXkbSectionPtr	sections;\n\n");
8058c9fbc29Smrg    fprintf(file,"    sections= geom->sections;\n");
8068c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
8078c9fbc29Smrg	if (section->num_doodads>0) {
8088c9fbc29Smrg	    fprintf(file,"    _InitS%02dDoodads(dpy,geom,&sections[%d]);\n",
8098c9fbc29Smrg									s,s);
8108c9fbc29Smrg	}
8118c9fbc29Smrg	if (section->num_overlays>0) {
8128c9fbc29Smrg	    fprintf(file,"    _InitS%02dOverlays(dpy,geom,&sections[%d]);\n",
8138c9fbc29Smrg									s,s);
8148c9fbc29Smrg	}
8158c9fbc29Smrg    }
8168c9fbc29Smrg    fprintf(file,"}\n");
8178c9fbc29Smrg    return True;
8188c9fbc29Smrg}
8198c9fbc29Smrg
8208c9fbc29Smrgstatic Bool
8218c9fbc29SmrgWriteCHdrGeomAliases(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
8228c9fbc29Smrg{
8238c9fbc29Smrg    if (geom->num_key_aliases>0) {
8248c9fbc29Smrg	register int i;
8258c9fbc29Smrg	fprintf(file,"\nstatic XkbKeyAliasRec g_aliases[%d]= {\n",
8268c9fbc29Smrg						geom->num_key_aliases);
8278c9fbc29Smrg	for (i=0;i<geom->num_key_aliases;i++) {
8288c9fbc29Smrg	    fprintf(file,"%s	{	\"%s\", \"%s\"	}",(i==0?"":",\n"),
8298c9fbc29Smrg			XkbKeyNameText(geom->key_aliases[i].real,XkbCFile),
8308c9fbc29Smrg			XkbKeyNameText(geom->key_aliases[i].alias,XkbCFile));
8318c9fbc29Smrg	}
8328c9fbc29Smrg	fprintf(file,"\n};\n");
8338c9fbc29Smrg    }
8348c9fbc29Smrg    return True;
8358c9fbc29Smrg}
8368c9fbc29Smrg
8378c9fbc29Smrgstatic Bool
8388c9fbc29SmrgWriteCHdrGeometry(FILE *file,XkbDescPtr xkb)
8398c9fbc29Smrg{
8408c9fbc29SmrgXkbGeometryPtr	geom;
8418c9fbc29Smrgregister int	i;
8428c9fbc29Smrg
8438c9fbc29Smrg    if ((!xkb)||(!xkb->geom)) {
8448c9fbc29Smrg	_XkbLibError(_XkbErrMissingGeometry,"WriteCHdrGeometry",0);
8458c9fbc29Smrg	return False;
8468c9fbc29Smrg    }
8478c9fbc29Smrg    geom= xkb->geom;
8488c9fbc29Smrg    WriteCHdrGeomProps(file,xkb,geom);
8498c9fbc29Smrg    WriteCHdrGeomColors(file,xkb,geom);
8508c9fbc29Smrg    WriteCHdrGeomShapes(file,xkb,geom);
8518c9fbc29Smrg    WriteCHdrGeomSections(file,xkb,geom);
8528c9fbc29Smrg    WriteCHdrGeomDoodads(file,xkb,geom,NULL,0);
8538c9fbc29Smrg    WriteCHdrGeomAliases(file,xkb,geom);
8548c9fbc29Smrg    fprintf(file,"\nstatic XkbGeometryRec	geom= {\n");
8558c9fbc29Smrg    fprintf(file,"	None,			/* name */\n");
8568c9fbc29Smrg    fprintf(file,"	%d, %d,		/* width, height */\n",geom->width_mm,
8578c9fbc29Smrg							geom->height_mm);
8588c9fbc29Smrg    if (geom->label_font) {
8598c9fbc29Smrg	 fprintf(file,"	\"%s\",/* label font */\n",
8608c9fbc29Smrg				XkbStringText(geom->label_font,XkbCFile));
8618c9fbc29Smrg    }
8628c9fbc29Smrg    else fprintf(file,"	NULL,		/* label font */\n");
8638c9fbc29Smrg    if (geom->label_color) {
8648c9fbc29Smrg	fprintf(file,"	&g_colors[%d],		/* label color */\n",
8658c9fbc29Smrg				XkbGeomColorIndex(geom,geom->label_color));
8668c9fbc29Smrg    }
8678c9fbc29Smrg    else fprintf(file,"	NULL,			/* label color */\n");
8688c9fbc29Smrg    if (geom->base_color) {
8698c9fbc29Smrg	fprintf(file,"	&g_colors[%d],		/* base color */\n",
8708c9fbc29Smrg				XkbGeomColorIndex(geom,geom->base_color));
8718c9fbc29Smrg    }
8728c9fbc29Smrg    else fprintf(file,"	NULL,			/* base color */\n");
8738c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/*  sz: props, colors, shapes */\n",
8748c9fbc29Smrg				geom->num_properties,geom->num_colors,
8758c9fbc29Smrg				geom->num_shapes);
8768c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/*  sz: sections, doodads, aliases */\n",
8778c9fbc29Smrg				geom->num_sections,geom->num_doodads,
8788c9fbc29Smrg				geom->num_key_aliases);
8798c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/* num: props, colors, shapes */\n",
8808c9fbc29Smrg				geom->num_properties,geom->num_colors,
8818c9fbc29Smrg				geom->num_shapes);
8828c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/* num: sections, doodads, aliases */\n",
8838c9fbc29Smrg				geom->num_sections,geom->num_doodads,
8848c9fbc29Smrg				geom->num_key_aliases);
8858c9fbc29Smrg    fprintf(file,"	%s,	%s,	%s,\n",
8868c9fbc29Smrg				(geom->num_properties>0?"g_props":"NULL"),
8878c9fbc29Smrg				(geom->num_colors>0?"g_colors":"NULL"),
8888c9fbc29Smrg				(geom->num_shapes>0?"g_shapes":"NULL"));
8898c9fbc29Smrg    fprintf(file,"	%s,	%s,	%s\n",
8908c9fbc29Smrg				(geom->num_sections>0?"g_sections":"NULL"),
8918c9fbc29Smrg				(geom->num_doodads>0?"g_doodads":"NULL"),
8928c9fbc29Smrg				(geom->num_key_aliases>0?"g_aliases":"NULL"));
8938c9fbc29Smrg    fprintf(file,"};\n\n");
8948c9fbc29Smrg    fprintf(file,"static Bool\n");
8958c9fbc29Smrg    fprintf(file,"_InitHdrGeom(DPYTYPE dpy,XkbGeometryPtr geom)\n");
8968c9fbc29Smrg    fprintf(file,"{\n");
8978c9fbc29Smrg    if (geom->name!=None) {
8988c9fbc29Smrg	fprintf(file,"    geom->name= GET_ATOM(dpy,\"%s\");\n",
8998c9fbc29Smrg				XkbAtomText(xkb->dpy,geom->name,XkbCFile));
9008c9fbc29Smrg    }
9018c9fbc29Smrg    for (i=0;i<geom->num_shapes;i++) {
9028c9fbc29Smrg	fprintf(file,"    geom->shapes[%2d].name= GET_ATOM(dpy,\"%s\");\n",i,
9038c9fbc29Smrg			XkbAtomText(xkb->dpy,geom->shapes[i].name,XkbCFile));
9048c9fbc29Smrg    }
9058c9fbc29Smrg    if (geom->num_doodads>0)
9068c9fbc29Smrg	fprintf(file,"    _InitGeomDoodads(dpy,geom);\n");
9078c9fbc29Smrg    fprintf(file,"    _InitSections(dpy,geom);\n");
9088c9fbc29Smrg    fprintf(file,"}\n\n");
9098c9fbc29Smrg    return True;
9108c9fbc29Smrg}
9118c9fbc29Smrg
9128c9fbc29Smrgstatic Bool
9138c9fbc29SmrgWriteCHdrGeomFile(FILE *file,XkbFileInfo *result)
9148c9fbc29Smrg{
9158c9fbc29SmrgBool		ok;
9168c9fbc29Smrg
9178c9fbc29Smrg    ok= WriteCHdrGeometry(file,result->xkb);
9188c9fbc29Smrg    return ok;
9198c9fbc29Smrg}
9208c9fbc29Smrg
9218c9fbc29Smrgstatic Bool
9228c9fbc29SmrgWriteCHdrLayout(FILE *file,XkbFileInfo *result)
9238c9fbc29Smrg{
9248c9fbc29SmrgBool		ok;
9258c9fbc29SmrgXkbDescPtr	xkb;
9268c9fbc29Smrg
9278c9fbc29Smrg    xkb= result->xkb;
9288c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9298c9fbc29Smrg    ok= WriteCHdrKeycodes(file,xkb)&&ok;
9308c9fbc29Smrg    ok= WriteCHdrSymbols(file,xkb)&&ok;
9318c9fbc29Smrg    ok= WriteCHdrGeometry(file,xkb)&&ok;
9328c9fbc29Smrg    return ok;
9338c9fbc29Smrg}
9348c9fbc29Smrg
9358c9fbc29Smrgstatic Bool
9368c9fbc29SmrgWriteCHdrSemantics(FILE *file,XkbFileInfo *result)
9378c9fbc29Smrg{
9388c9fbc29SmrgBool		ok;
9398c9fbc29SmrgXkbDescPtr	xkb;
9408c9fbc29Smrg
9418c9fbc29Smrg    xkb= result->xkb;
9428c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9438c9fbc29Smrg    ok= WriteCHdrKeyTypes(file,xkb->dpy,xkb)&&ok;
9448c9fbc29Smrg    ok= WriteCHdrCompatMap(file,xkb->dpy,xkb)&&ok;
9458c9fbc29Smrg    ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok;
9468c9fbc29Smrg    return ok;
9478c9fbc29Smrg}
9488c9fbc29Smrg
9498c9fbc29Smrgstatic Bool
9508c9fbc29SmrgWriteCHdrKeymap(FILE *file,XkbFileInfo *result)
9518c9fbc29Smrg{
9528c9fbc29SmrgBool		ok;
9538c9fbc29SmrgXkbDescPtr	xkb;
9548c9fbc29Smrg
9558c9fbc29Smrg    xkb= result->xkb;
9568c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9578c9fbc29Smrg    ok= ok&&WriteCHdrKeycodes(file,xkb);
9588c9fbc29Smrg    ok= ok&&WriteCHdrClientMap(file,xkb->dpy,xkb);
9598c9fbc29Smrg    ok= ok&&WriteCHdrServerMap(file,xkb->dpy,xkb);
9608c9fbc29Smrg    ok= ok&&WriteCHdrCompatMap(file,xkb->dpy,xkb);
9618c9fbc29Smrg    ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok;
9628c9fbc29Smrg    ok= ok&&WriteCHdrGeometry(file,xkb);
9638c9fbc29Smrg    return ok;
9648c9fbc29Smrg}
9658c9fbc29Smrg
9668c9fbc29SmrgBool
9678c9fbc29SmrgXkbWriteCFile(FILE *out,char *name,XkbFileInfo *result)
9688c9fbc29Smrg{
9698c9fbc29SmrgBool	 		ok;
9708c9fbc29SmrgXkbDescPtr		xkb;
9718c9fbc29SmrgBool			(*func)(
9728c9fbc29Smrg	FILE *		/* file*/,
9738c9fbc29Smrg	XkbFileInfo *	/* result */
9748c9fbc29Smrg);
9758c9fbc29Smrg
9768c9fbc29Smrg    switch (result->type) {
9778c9fbc29Smrg	case XkmSemanticsFile:
9788c9fbc29Smrg	    func= WriteCHdrSemantics;
9798c9fbc29Smrg	    break;
9808c9fbc29Smrg	case XkmLayoutFile:
9818c9fbc29Smrg	    func= WriteCHdrLayout;
9828c9fbc29Smrg	    break;
9838c9fbc29Smrg	case XkmKeymapFile:
9848c9fbc29Smrg	    func= WriteCHdrKeymap;
9858c9fbc29Smrg	    break;
9868c9fbc29Smrg        case XkmGeometryIndex:
9878c9fbc29Smrg        case XkmGeometryFile:
9888c9fbc29Smrg	    func= WriteCHdrGeomFile;
9898c9fbc29Smrg	    break;
9908c9fbc29Smrg	default:
9918c9fbc29Smrg	    _XkbLibError(_XkbErrIllegalContents,"XkbWriteCFile",result->type);
9928c9fbc29Smrg	    return False;
9938c9fbc29Smrg    }
9948c9fbc29Smrg    xkb= result->xkb;
9958c9fbc29Smrg    if (out==NULL) {
9968c9fbc29Smrg	_XkbLibError(_XkbErrFileCannotOpen,"XkbWriteCFile",0);
9978c9fbc29Smrg	ok= False;
9988c9fbc29Smrg    }
9998c9fbc29Smrg    else {
10008c9fbc29Smrg	char *tmp,*hdrdef;
10018c9fbc29Smrg	tmp= (char *)strrchr(name,'/');
10028c9fbc29Smrg	if (tmp==NULL)
10038c9fbc29Smrg	     tmp= name;
10048c9fbc29Smrg	else tmp++;
10058c9fbc29Smrg	hdrdef= (char *)_XkbCalloc(strlen(tmp)+1,sizeof(char));
10068c9fbc29Smrg	if (hdrdef) {
10078c9fbc29Smrg	    strcpy(hdrdef,tmp);
10088c9fbc29Smrg	    tmp= hdrdef;
10098c9fbc29Smrg	    while (*tmp) {
10108c9fbc29Smrg		if (islower(*tmp))		*tmp= toupper(*tmp);
10118c9fbc29Smrg		else if (!isalnum(*tmp))	*tmp= '_';
10128c9fbc29Smrg		tmp++;
10138c9fbc29Smrg	    }
10148c9fbc29Smrg	    fprintf(out,"/* This file generated automatically by xkbcomp */\n");
10158c9fbc29Smrg	    fprintf(out,"/* DO  NOT EDIT */\n");
10168c9fbc29Smrg	    fprintf(out,"#ifndef %s\n",hdrdef);
10178c9fbc29Smrg	    fprintf(out,"#define %s 1\n\n",hdrdef);
10188c9fbc29Smrg	}
10198c9fbc29Smrg	fprintf(out,"#ifndef XKB_IN_SERVER\n");
10208c9fbc29Smrg	fprintf(out,"#define GET_ATOM(d,s)	XInternAtom(d,s,0)\n");
10218c9fbc29Smrg	fprintf(out,"#define DPYTYPE	Display *\n");
10228c9fbc29Smrg	fprintf(out,"#else\n");
10238c9fbc29Smrg	fprintf(out,"#define GET_ATOM(d,s)	MakeAtom(s,strlen(s),1)\n");
10248c9fbc29Smrg	fprintf(out,"#define DPYTYPE	char *\n");
10258c9fbc29Smrg	fprintf(out,"#endif\n");
10268c9fbc29Smrg	fprintf(out,"#define NUM_KEYS	%d\n",xkb->max_key_code+1);
10278c9fbc29Smrg	ok= (*func)(out,result);
10288c9fbc29Smrg	if (hdrdef)
10298c9fbc29Smrg	    fprintf(out,"#endif /* %s */\n",hdrdef);
10308c9fbc29Smrg    }
10318c9fbc29Smrg
10328c9fbc29Smrg    if (!ok) {
10338c9fbc29Smrg	return False;
10348c9fbc29Smrg    }
10358c9fbc29Smrg    return True;
10368c9fbc29Smrg}
1037