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,§ions[%d]);\n", 8098c9fbc29Smrg s,s); 8108c9fbc29Smrg } 8118c9fbc29Smrg if (section->num_overlays>0) { 8128c9fbc29Smrg fprintf(file," _InitS%02dOverlays(dpy,geom,§ions[%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