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