cout.c revision 4e411241
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; 1354e411241Smrgchar * prefix = NULL; 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++) { 1414e411241Smrg if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { 1424e411241Smrg _XkbLibError(_XkbErrBadAlloc,"WriteTypeInitFunc",0); 1434e411241Smrg fprintf(file,"#error XkbErrBadAlloc WriteTypeInitFunc\n"); 1444e411241Smrg break; 1454e411241Smrg } 1468c9fbc29Smrg if (type->name!=None) 1478c9fbc29Smrg fprintf(file," dflt_types[%d].name= GET_ATOM(dpy,\"%s\");\n",i, 1488c9fbc29Smrg XkbAtomText(dpy,type->name,XkbCFile)); 1498c9fbc29Smrg names= type->level_names; 1508c9fbc29Smrg if (names!=NULL) { 1518c9fbc29Smrg char *tmp; 1528c9fbc29Smrg for (n=0;n<type->num_levels;n++) { 1538c9fbc29Smrg if (names[n]==None) 1548c9fbc29Smrg continue; 1558c9fbc29Smrg tmp= XkbAtomText(dpy,names[n],XkbCFile); 1568c9fbc29Smrg if (tmp==NULL) 1578c9fbc29Smrg continue; 1588c9fbc29Smrg fprintf(file," lnames_%s[%d]= ",prefix,n); 1598c9fbc29Smrg fprintf(file,"GET_ATOM(dpy,\"%s\");\n",tmp); 1608c9fbc29Smrg } 1618c9fbc29Smrg } 1624e411241Smrg free(prefix); 1634e411241Smrg prefix = NULL; 1648c9fbc29Smrg } 1658c9fbc29Smrg fprintf(file,"}\n"); 1668c9fbc29Smrg return; 1678c9fbc29Smrg} 1688c9fbc29Smrg 1698c9fbc29Smrgstatic Bool 1708c9fbc29SmrgWriteCHdrKeyTypes(FILE *file,Display *dpy,XkbDescPtr xkb) 1718c9fbc29Smrg{ 1728c9fbc29Smrgregister unsigned i,n; 1738c9fbc29SmrgXkbClientMapPtr map; 1748c9fbc29SmrgXkbKeyTypePtr type; 1754e411241Smrgchar * prefix = NULL; 1768c9fbc29Smrg 1778c9fbc29Smrg if ((!xkb)||(!xkb->map)||(!xkb->map->types)) { 1788c9fbc29Smrg _XkbLibError(_XkbErrMissingTypes,"WriteCHdrKeyTypes",0); 1798c9fbc29Smrg return False; 1808c9fbc29Smrg } 1818c9fbc29Smrg if (xkb->map->num_types<XkbNumRequiredTypes) { 1828c9fbc29Smrg _XkbLibError(_XkbErrMissingReqTypes,"WriteCHdrKeyTypes",0); 1838c9fbc29Smrg return 0; 1848c9fbc29Smrg } 1858c9fbc29Smrg map= xkb->map; 1868c9fbc29Smrg if ((xkb->names!=NULL)&&(xkb->names->types!=None)) { 1878c9fbc29Smrg fprintf(file,"/* types name is \"%s\" */\n", 1888c9fbc29Smrg XkbAtomText(dpy,xkb->names->types,XkbCFile)); 1898c9fbc29Smrg } 1908c9fbc29Smrg for (i=0,type=map->types;i<map->num_types;i++,type++) { 1914e411241Smrg if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { 1924e411241Smrg _XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0); 1934e411241Smrg return False; 1944e411241Smrg } 1958c9fbc29Smrg 1968c9fbc29Smrg if (type->map_count>0) { 1978c9fbc29Smrg XkbKTMapEntryPtr entry; 1988c9fbc29Smrg entry= type->map; 1998c9fbc29Smrg fprintf(file,"static XkbKTMapEntryRec map_%s[%d]= {\n",prefix, 2008c9fbc29Smrg type->map_count); 2018c9fbc29Smrg for (n=0;n<(unsigned)type->map_count;n++,entry++) { 2028c9fbc29Smrg if (n!=0) 2038c9fbc29Smrg fprintf(file,",\n"); 2048c9fbc29Smrg fprintf(file," { %d, %6d, { %15s, %15s, %15s } }", 2058c9fbc29Smrg entry->active, 2068c9fbc29Smrg entry->level, 2078c9fbc29Smrg XkbModMaskText(entry->mods.mask,XkbCFile), 2088c9fbc29Smrg XkbModMaskText(entry->mods.real_mods,XkbCFile), 2098c9fbc29Smrg XkbVModMaskText(dpy,xkb,0,entry->mods.vmods,XkbCFile)); 2108c9fbc29Smrg } 2118c9fbc29Smrg fprintf(file,"\n};\n"); 2128c9fbc29Smrg 2138c9fbc29Smrg if (type->preserve) 2148c9fbc29Smrg WriteTypePreserve(file,dpy,prefix,xkb,type); 2158c9fbc29Smrg } 2168c9fbc29Smrg if (type->level_names!=NULL) { 2178c9fbc29Smrg fprintf(file,"static Atom lnames_%s[%d];\n",prefix, 2188c9fbc29Smrg type->num_levels); 2198c9fbc29Smrg } 2208c9fbc29Smrg fprintf(file,"\n"); 2214e411241Smrg free(prefix); 2224e411241Smrg prefix = NULL; 2238c9fbc29Smrg } 2248c9fbc29Smrg fprintf(file,"static XkbKeyTypeRec dflt_types[]= {\n"); 2258c9fbc29Smrg for (i=0,type=map->types;i<(unsigned)map->num_types;i++,type++) { 2264e411241Smrg if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { 2274e411241Smrg _XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0); 2284e411241Smrg return False; 2294e411241Smrg } 2308c9fbc29Smrg if (i!=0) fprintf(file,",\n"); 2318c9fbc29Smrg fprintf(file," {\n { %15s, %15s, %15s },\n", 2328c9fbc29Smrg XkbModMaskText(type->mods.mask,XkbCFile), 2338c9fbc29Smrg XkbModMaskText(type->mods.real_mods,XkbCFile), 2348c9fbc29Smrg XkbVModMaskText(dpy,xkb,0,type->mods.vmods,XkbCFile)); 2358c9fbc29Smrg fprintf(file," %d,\n",type->num_levels); 2368c9fbc29Smrg fprintf(file," %d,",type->map_count); 2378c9fbc29Smrg if (type->map_count>0) 2388c9fbc29Smrg fprintf(file," map_%s,",prefix); 2398c9fbc29Smrg else fprintf(file," NULL,"); 2408c9fbc29Smrg if (type->preserve) 2418c9fbc29Smrg fprintf(file," preserve_%s,\n",prefix); 2428c9fbc29Smrg else fprintf(file," NULL,\n"); 2438c9fbc29Smrg if (type->level_names!=NULL) 2448c9fbc29Smrg fprintf(file," None, lnames_%s\n }",prefix); 2458c9fbc29Smrg else fprintf(file," None, NULL\n }"); 2464e411241Smrg free(prefix); 2474e411241Smrg prefix = NULL; 2488c9fbc29Smrg } 2498c9fbc29Smrg fprintf(file,"\n};\n"); 2508c9fbc29Smrg fprintf(file,"#define num_dflt_types (sizeof(dflt_types)/sizeof(XkbKeyTypeRec))\n"); 2518c9fbc29Smrg WriteTypeInitFunc(file,dpy,xkb); 2528c9fbc29Smrg return True; 2538c9fbc29Smrg} 2548c9fbc29Smrg 2558c9fbc29Smrgstatic Bool 2568c9fbc29SmrgWriteCHdrCompatMap(FILE *file,Display *dpy,XkbDescPtr xkb) 2578c9fbc29Smrg{ 2588c9fbc29Smrgregister unsigned i; 2598c9fbc29SmrgXkbCompatMapPtr compat; 2608c9fbc29SmrgXkbSymInterpretPtr interp; 2618c9fbc29Smrg 2628c9fbc29Smrg if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) { 2638c9fbc29Smrg _XkbLibError(_XkbErrMissingSymInterps,"WriteCHdrInterp",0); 2648c9fbc29Smrg return False; 2658c9fbc29Smrg } 2668c9fbc29Smrg compat= xkb->compat; 2678c9fbc29Smrg if ((xkb->names!=NULL)&&(xkb->names->compat!=None)) { 2688c9fbc29Smrg fprintf(file,"/* compat name is \"%s\" */\n", 2698c9fbc29Smrg XkbAtomText(dpy,xkb->names->compat,XkbCFile)); 2708c9fbc29Smrg } 2718c9fbc29Smrg fprintf(file,"static XkbSymInterpretRec dfltSI[%d]= {\n", 2728c9fbc29Smrg compat->num_si); 2738c9fbc29Smrg interp= compat->sym_interpret; 2748c9fbc29Smrg for (i=0;i<compat->num_si;i++,interp++) { 2758c9fbc29Smrg XkbAction *act; 2768c9fbc29Smrg act= (XkbAction *)&interp->act; 2778c9fbc29Smrg if (i!=0) fprintf(file,",\n"); 2788c9fbc29Smrg fprintf(file," { %s, ",XkbKeysymText(interp->sym,XkbCFile)); 2798c9fbc29Smrg fprintf(file,"0x%04x,\n",interp->flags); 2808c9fbc29Smrg fprintf(file," %s, ",XkbSIMatchText(interp->match,XkbCFile)); 2818c9fbc29Smrg fprintf(file,"%s,\n",XkbModMaskText(interp->mods,XkbCFile)); 2828c9fbc29Smrg fprintf(file," %d,\n",interp->virtual_mod); 2838c9fbc29Smrg fprintf(file," %s }",XkbActionText(dpy,xkb,act,XkbCFile)); 2848c9fbc29Smrg } 2858c9fbc29Smrg fprintf(file,"\n};\n"); 2868c9fbc29Smrg fprintf(file, 2878c9fbc29Smrg "#define num_dfltSI (sizeof(dfltSI)/sizeof(XkbSymInterpretRec))\n"); 2888c9fbc29Smrg fprintf(file,"\nstatic XkbCompatMapRec compatMap= {\n"); 2898c9fbc29Smrg fprintf(file," dfltSI,\n"); 2908c9fbc29Smrg fprintf(file," { /* group compatibility */\n "); 2918c9fbc29Smrg for (i=0;i<XkbNumKbdGroups;i++) { 2928c9fbc29Smrg XkbModsPtr gc; 2938c9fbc29Smrg gc= &xkb->compat->groups[i]; 2948c9fbc29Smrg fprintf(file,"%s{ %12s, %12s, %12s }", 2958c9fbc29Smrg ((i==0)?"":",\n "), 2968c9fbc29Smrg XkbModMaskText(gc->mask,XkbCFile), 2978c9fbc29Smrg XkbModMaskText(gc->real_mods,XkbCFile), 2988c9fbc29Smrg XkbVModMaskText(xkb->dpy,xkb,0,gc->vmods,XkbCFile)); 2998c9fbc29Smrg } 3008c9fbc29Smrg fprintf(file,"\n },\n"); 3018c9fbc29Smrg fprintf(file," num_dfltSI, num_dfltSI\n"); 3028c9fbc29Smrg fprintf(file,"};\n\n"); 3038c9fbc29Smrg return True; 3048c9fbc29Smrg} 3058c9fbc29Smrg 3068c9fbc29Smrgstatic Bool 3078c9fbc29SmrgWriteCHdrSymbols(FILE *file,XkbDescPtr xkb) 3088c9fbc29Smrg{ 3098c9fbc29Smrgregister unsigned i; 3108c9fbc29Smrg 3118c9fbc29Smrg if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { 3128c9fbc29Smrg _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrSymbols",0); 3138c9fbc29Smrg return False; 3148c9fbc29Smrg } 3158c9fbc29Smrg fprintf(file,"#define NUM_SYMBOLS %d\n",xkb->map->num_syms); 3168c9fbc29Smrg if (xkb->map->num_syms>0) { 3178c9fbc29Smrg register KeySym *sym; 3188c9fbc29Smrg sym= xkb->map->syms; 3198c9fbc29Smrg fprintf(file,"static KeySym symCache[NUM_SYMBOLS]= {\n"); 3208c9fbc29Smrg for (i=0;i<xkb->map->num_syms;i++,sym++) { 3218c9fbc29Smrg if (i==0) fprintf(file," "); 3228c9fbc29Smrg else if (i%4==0) fprintf(file,",\n "); 3238c9fbc29Smrg else fprintf(file,", "); 3248c9fbc29Smrg fprintf(file,"%15s",XkbKeysymText(*sym,XkbCFile)); 3258c9fbc29Smrg } 3268c9fbc29Smrg fprintf(file,"\n};\n"); 3278c9fbc29Smrg } 3288c9fbc29Smrg if (xkb->max_key_code>0) { 3298c9fbc29Smrg register XkbSymMapPtr map; 3308c9fbc29Smrg map= xkb->map->key_sym_map; 3318c9fbc29Smrg fprintf(file,"static XkbSymMapRec symMap[NUM_KEYS]= {\n"); 3328c9fbc29Smrg for (i=0;i<=xkb->max_key_code;i++,map++) { 3338c9fbc29Smrg if (i==0) fprintf(file," "); 3348c9fbc29Smrg else if ((i&3)==0) fprintf(file,",\n "); 3358c9fbc29Smrg else fprintf(file,", "); 3368c9fbc29Smrg fprintf(file, "{ %2d, 0x%x, %3d }", 3378c9fbc29Smrg map->kt_index[0], map->group_info, map->offset); 3388c9fbc29Smrg } 3398c9fbc29Smrg fprintf(file,"\n};\n"); 3408c9fbc29Smrg } 3418c9fbc29Smrg return True; 3428c9fbc29Smrg} 3438c9fbc29Smrg 3448c9fbc29Smrgstatic Bool 3458c9fbc29SmrgWriteCHdrClientMap(FILE *file,Display *dpy,XkbDescPtr xkb) 3468c9fbc29Smrg{ 3478c9fbc29Smrg if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { 3488c9fbc29Smrg _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrClientMap",0); 3498c9fbc29Smrg return False; 3508c9fbc29Smrg } 3518c9fbc29Smrg if (!WriteCHdrKeyTypes(file,dpy,xkb)) 3528c9fbc29Smrg return False; 3538c9fbc29Smrg if (!WriteCHdrSymbols(file,xkb)) 3548c9fbc29Smrg return False; 3558c9fbc29Smrg fprintf(file,"static XkbClientMapRec clientMap= {\n"); 3568c9fbc29Smrg fprintf(file," NUM_TYPES, NUM_TYPES, types, \n"); 3578c9fbc29Smrg fprintf(file," NUM_SYMBOLS, NUM_SYMBOLS, symCache, symMap\n"); 3588c9fbc29Smrg fprintf(file,"};\n\n"); 3598c9fbc29Smrg return True; 3608c9fbc29Smrg} 3618c9fbc29Smrg 3628c9fbc29Smrgstatic Bool 3638c9fbc29SmrgWriteCHdrServerMap(FILE *file,Display *dpy,XkbDescPtr xkb) 3648c9fbc29Smrg{ 3658c9fbc29Smrgregister unsigned i; 3668c9fbc29Smrg 3678c9fbc29Smrg if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { 3688c9fbc29Smrg _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrServerMap",0); 3698c9fbc29Smrg return False; 3708c9fbc29Smrg } 3718c9fbc29Smrg if (xkb->server->num_acts>0) { 3728c9fbc29Smrg register XkbAnyAction *act; 3738c9fbc29Smrg act= (XkbAnyAction *)xkb->server->acts; 3748c9fbc29Smrg fprintf(file,"#define NUM_ACTIONS %d\n",xkb->server->num_acts); 3758c9fbc29Smrg fprintf(file,"static XkbAnyAction actionCache[NUM_ACTIONS]= {\n"); 3768c9fbc29Smrg for (i=0;i<xkb->server->num_acts;i++,act++) { 3778c9fbc29Smrg if (i==0) fprintf(file," "); 3788c9fbc29Smrg else fprintf(file,",\n "); 3798c9fbc29Smrg fprintf(file,"%s",XkbActionText(dpy,xkb,(XkbAction *)act,XkbCFile)); 3808c9fbc29Smrg } 3818c9fbc29Smrg fprintf(file,"\n};\n"); 3828c9fbc29Smrg } 3838c9fbc29Smrg fprintf(file,"static unsigned short keyActions[NUM_KEYS]= {\n"); 3848c9fbc29Smrg for (i=0;i<=xkb->max_key_code;i++) { 3858c9fbc29Smrg if (i==0) fprintf(file," "); 3868c9fbc29Smrg else if ((i&0xf)==0) fprintf(file,",\n "); 3878c9fbc29Smrg else fprintf(file,", "); 3888c9fbc29Smrg fprintf(file,"%2d",xkb->server->key_acts[i]); 3898c9fbc29Smrg } 3908c9fbc29Smrg fprintf(file,"\n};\n"); 3918c9fbc29Smrg fprintf(file,"static XkbBehavior behaviors[NUM_KEYS]= {\n"); 3928c9fbc29Smrg for (i=0;i<=xkb->max_key_code;i++) { 3938c9fbc29Smrg if (i==0) fprintf(file," "); 3948c9fbc29Smrg else if ((i&0x3)==0) fprintf(file,",\n "); 3958c9fbc29Smrg else fprintf(file,", "); 3968c9fbc29Smrg if (xkb->server->behaviors) { 3978c9fbc29Smrg fprintf(file,"%s", 3988c9fbc29Smrg XkbBehaviorText(xkb,&xkb->server->behaviors[i],XkbCFile)); 3998c9fbc29Smrg } 4008c9fbc29Smrg else fprintf(file,"{ 0, 0 }"); 4018c9fbc29Smrg } 4028c9fbc29Smrg fprintf(file,"\n};\n"); 4038c9fbc29Smrg fprintf(file,"static unsigned char explicit_parts[NUM_KEYS]= {\n"); 4048c9fbc29Smrg for (i=0;i<=xkb->max_key_code;i++) { 4058c9fbc29Smrg if (i==0) fprintf(file," "); 4068c9fbc29Smrg else if ((i&0x7)==0) fprintf(file,",\n "); 4078c9fbc29Smrg else fprintf(file,", "); 4088c9fbc29Smrg if ((xkb->server->explicit==NULL)||(xkb->server->explicit[i]==0)) 4098c9fbc29Smrg fprintf(file," 0"); 4108c9fbc29Smrg else fprintf(file,"0x%02x",xkb->server->explicit[i]); 4118c9fbc29Smrg } 4128c9fbc29Smrg fprintf(file,"\n};\n"); 4138c9fbc29Smrg fprintf(file,"static unsigned short vmodmap[NUM_KEYS]= {\n"); 4148c9fbc29Smrg for (i=0;i<xkb->max_key_code;i++) { 4158c9fbc29Smrg if (i==0) fprintf(file," "); 4168c9fbc29Smrg else if ((i&0x7)==0) fprintf(file,",\n "); 4178c9fbc29Smrg else fprintf(file,", "); 4188c9fbc29Smrg if ((xkb->server->vmodmap==NULL)||(xkb->server->vmodmap[i]==0)) 4198c9fbc29Smrg fprintf(file," 0"); 4208c9fbc29Smrg else fprintf(file,"0x%04x",xkb->server->vmodmap[i]); 4218c9fbc29Smrg } 4228c9fbc29Smrg fprintf(file,"};\n"); 4238c9fbc29Smrg fprintf(file,"static XkbServerMapRec serverMap= {\n"); 4248c9fbc29Smrg fprintf(file," %d, %d, (XkbAction *)actionCache,\n", 4258c9fbc29Smrg xkb->server->num_acts,xkb->server->num_acts); 4268c9fbc29Smrg fprintf(file," behaviors, keyActions, explicit_parts,\n"); 4278c9fbc29Smrg for (i=0;i<XkbNumVirtualMods;i++) { 4288c9fbc29Smrg if (i==0) fprintf(file," { "); 4298c9fbc29Smrg else if (i==8) fprintf(file,",\n "); 4308c9fbc29Smrg else fprintf(file,", "); 4318c9fbc29Smrg fprintf(file,"%3d",xkb->server->vmods[i]); 4328c9fbc29Smrg } 4338c9fbc29Smrg fprintf(file," },\n"); 4348c9fbc29Smrg fprintf(file," vmodmap\n"); 4358c9fbc29Smrg fprintf(file,"};\n\n"); 4368c9fbc29Smrg return True; 4378c9fbc29Smrg} 4388c9fbc29Smrg 4398c9fbc29Smrgstatic Bool 4408c9fbc29SmrgWriteCHdrIndicators(FILE *file,Display *dpy,XkbDescPtr xkb) 4418c9fbc29Smrg{ 4428c9fbc29Smrgregister int i,nNames; 4438c9fbc29SmrgXkbIndicatorMapPtr imap; 4448c9fbc29Smrg 4458c9fbc29Smrg if (xkb->indicators==NULL) 4468c9fbc29Smrg return True; 4478c9fbc29Smrg fprintf(file, "static XkbIndicatorRec indicators= {\n"); 4488c9fbc29Smrg fprintf(file, " 0x%lx,\n {\n", 4498c9fbc29Smrg (long)xkb->indicators->phys_indicators); 4508c9fbc29Smrg for (imap=xkb->indicators->maps,i=nNames=0;i<XkbNumIndicators;i++,imap++) { 4518c9fbc29Smrg fprintf(file,"%s { 0x%02x, %s, 0x%02x, %s, { %s, ", 4528c9fbc29Smrg (i!=0?",\n":""), 4538c9fbc29Smrg imap->flags, 4548c9fbc29Smrg XkbIMWhichStateMaskText(imap->which_groups,XkbCFile), 4558c9fbc29Smrg imap->groups, 4568c9fbc29Smrg XkbIMWhichStateMaskText(imap->which_mods,XkbCFile), 4578c9fbc29Smrg XkbModMaskText(imap->mods.mask,XkbCFile)); 4588c9fbc29Smrg fprintf(file," %s, %s }, %s }", 4598c9fbc29Smrg XkbModMaskText(imap->mods.real_mods,XkbCFile), 4608c9fbc29Smrg XkbVModMaskText(dpy,xkb,0,imap->mods.vmods,XkbCFile), 4618c9fbc29Smrg XkbControlsMaskText(imap->ctrls,XkbCFile)); 4628c9fbc29Smrg if (xkb->names && (xkb->names->indicators[i]!=None)) 4638c9fbc29Smrg nNames++; 4648c9fbc29Smrg } 4658c9fbc29Smrg fprintf(file,"\n }\n};\n"); 4668c9fbc29Smrg if (nNames>0) { 4678c9fbc29Smrg fprintf(file,"static void\n"); 4688c9fbc29Smrg fprintf(file,"initIndicatorNames(DPYTYPE dpy,XkbDescPtr xkb)\n"); 4698c9fbc29Smrg fprintf(file,"{\n"); 4708c9fbc29Smrg for (i=0;i<XkbNumIndicators;i++) { 4718c9fbc29Smrg Atom name; 4728c9fbc29Smrg if (xkb->names->indicators[i]==None) 4738c9fbc29Smrg continue; 4748c9fbc29Smrg name= xkb->names->indicators[i]; 4758c9fbc29Smrg fprintf(file," xkb->names->indicators[%2d]= ",i); 4768c9fbc29Smrg fprintf(file,"GET_ATOM(dpy,\"%s\");\n", 4778c9fbc29Smrg XkbAtomText(dpy,name,XkbCFile)); 4788c9fbc29Smrg } 4798c9fbc29Smrg fprintf(file,"}\n"); 4808c9fbc29Smrg } 4818c9fbc29Smrg return True; 4828c9fbc29Smrg} 4838c9fbc29Smrg 4848c9fbc29Smrgstatic Bool 4858c9fbc29SmrgWriteCHdrGeomProps(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) 4868c9fbc29Smrg{ 4878c9fbc29Smrg if (geom->num_properties>0) { 4888c9fbc29Smrg register int i; 4898c9fbc29Smrg fprintf(file,"\nstatic XkbPropertyRec g_props[%d]= {\n", 4908c9fbc29Smrg geom->num_properties); 4918c9fbc29Smrg for (i=0;i<geom->num_properties;i++) { 4928c9fbc29Smrg fprintf(file,"%s { \"%s\", \"%s\" }",(i==0?"":",\n"), 4938c9fbc29Smrg XkbStringText(geom->properties[i].name,XkbCFile), 4948c9fbc29Smrg XkbStringText(geom->properties[i].value,XkbCFile)); 4958c9fbc29Smrg } 4968c9fbc29Smrg fprintf(file,"\n};\n"); 4978c9fbc29Smrg } 4988c9fbc29Smrg return True; 4998c9fbc29Smrg} 5008c9fbc29Smrg 5018c9fbc29Smrgstatic Bool 5028c9fbc29SmrgWriteCHdrGeomColors(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) 5038c9fbc29Smrg{ 5048c9fbc29Smrg if (geom->num_colors>0) { 5058c9fbc29Smrg register int i; 5068c9fbc29Smrg fprintf(file,"\nstatic XkbColorRec g_colors[%d]= {\n",geom->num_colors); 5078c9fbc29Smrg for (i=0;i<geom->num_colors;i++) { 5088c9fbc29Smrg fprintf(file,"%s { %3d, \"%s\" }",(i==0?"":",\n"), 5098c9fbc29Smrg geom->colors[i].pixel, 5108c9fbc29Smrg XkbStringText(geom->colors[i].spec,XkbCFile)); 5118c9fbc29Smrg } 5128c9fbc29Smrg fprintf(file,"\n};\n"); 5138c9fbc29Smrg } 5148c9fbc29Smrg return True; 5158c9fbc29Smrg} 5168c9fbc29Smrg 5178c9fbc29Smrgstatic Bool 5188c9fbc29SmrgWriteCHdrGeomOutlines(FILE *file,int nOL,XkbOutlinePtr ol,int shapeNdx) 5198c9fbc29Smrg{ 5208c9fbc29Smrgregister int o,p; 5218c9fbc29Smrg 5228c9fbc29Smrg 5238c9fbc29Smrg for (o=0;o<nOL;o++) { 5248c9fbc29Smrg fprintf(file,"\nstatic XkbPointRec pts_sh%02do%02d[]= {\n",shapeNdx,o); 5258c9fbc29Smrg for (p=0;p<ol[o].num_points;p++) { 5268c9fbc29Smrg if (p==0) fprintf(file," "); 5278c9fbc29Smrg else if ((p&0x3)==0) fprintf(file,",\n "); 5288c9fbc29Smrg else fprintf(file,", "); 5298c9fbc29Smrg fprintf(file,"{ %4d, %4d }", 5308c9fbc29Smrg ol[o].points[p].x,ol[o].points[p].y); 5318c9fbc29Smrg } 5328c9fbc29Smrg fprintf(file,"\n};"); 5338c9fbc29Smrg } 5348c9fbc29Smrg fprintf(file,"\n\nstatic XkbOutlineRec ol_sh%02d[]= {\n",shapeNdx); 5358c9fbc29Smrg for (o=0;o<nOL;o++) { 5368c9fbc29Smrg fprintf(file,"%s { %d, %d, %d, pts_sh%02do%02d }", 5378c9fbc29Smrg (o==0?"":",\n"), 5388c9fbc29Smrg ol[o].num_points,ol[o].num_points, 5398c9fbc29Smrg ol[o].corner_radius,shapeNdx,o); 5408c9fbc29Smrg } 5418c9fbc29Smrg fprintf(file,"\n};\n"); 5428c9fbc29Smrg return True; 5438c9fbc29Smrg} 5448c9fbc29Smrg 5458c9fbc29Smrgstatic Bool 5468c9fbc29SmrgWriteCHdrGeomShapes(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) 5478c9fbc29Smrg{ 5488c9fbc29Smrgregister int s; 5498c9fbc29Smrgregister XkbShapePtr shape; 5508c9fbc29Smrg 5518c9fbc29Smrg for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) { 5528c9fbc29Smrg WriteCHdrGeomOutlines(file,shape->num_outlines,shape->outlines,s); 5538c9fbc29Smrg } 5548c9fbc29Smrg fprintf(file,"\n\nstatic XkbShapeRec g_shapes[%d]= {\n",geom->num_shapes); 5558c9fbc29Smrg for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) { 5568c9fbc29Smrg fprintf(file,"%s { None, %3d, %3d, ol_sh%02d, ", 5578c9fbc29Smrg (s==0?"":",\n"),shape->num_outlines, 5588c9fbc29Smrg shape->num_outlines,s); 5598c9fbc29Smrg if (shape->approx) { 5608c9fbc29Smrg fprintf(file,"&ol_sh%02d[%2d], ",s, 5618c9fbc29Smrg XkbOutlineIndex(shape,shape->approx)); 5628c9fbc29Smrg } 5638c9fbc29Smrg else fprintf(file," NULL, "); 5648c9fbc29Smrg if (shape->primary) { 5658c9fbc29Smrg fprintf(file,"&ol_sh%02d[%2d],\n",s, 5668c9fbc29Smrg XkbOutlineIndex(shape,shape->primary)); 5678c9fbc29Smrg } 5688c9fbc29Smrg else fprintf(file," NULL,\n"); 5698c9fbc29Smrg fprintf(file," { %4d, %4d, %4d, %4d } }", 5708c9fbc29Smrg shape->bounds.x1,shape->bounds.y1, 5718c9fbc29Smrg shape->bounds.x2,shape->bounds.y2); 5728c9fbc29Smrg } 5738c9fbc29Smrg fprintf(file,"\n};\n"); 5748c9fbc29Smrg return True; 5758c9fbc29Smrg} 5768c9fbc29Smrg 5778c9fbc29Smrgstatic Bool 5788c9fbc29SmrgWriteCHdrGeomDoodads( FILE * file, 5798c9fbc29Smrg XkbDescPtr xkb, 5808c9fbc29Smrg XkbGeometryPtr geom, 5818c9fbc29Smrg XkbSectionPtr section, 5828c9fbc29Smrg int section_num) 5838c9fbc29Smrg{ 5848c9fbc29Smrgint nd,d; 5858c9fbc29SmrgXkbDoodadPtr doodad; 5868c9fbc29SmrgDisplay * dpy; 5878c9fbc29Smrg 5888c9fbc29Smrg dpy= xkb->dpy; 5898c9fbc29Smrg if (section==NULL) { 5908c9fbc29Smrg if (geom->num_doodads>0) { 5918c9fbc29Smrg fprintf(file,"static XkbDoodadRec g_doodads[%d];\n", 5928c9fbc29Smrg geom->num_doodads); 5938c9fbc29Smrg } 5948c9fbc29Smrg fprintf(file,"static void\n"); 5958c9fbc29Smrg fprintf(file,"_InitGeomDoodads(DPYTYPE dpy,XkbGeometryPtr geom)\n"); 5968c9fbc29Smrg fprintf(file,"{\n"); 5978c9fbc29Smrg fprintf(file,"register XkbDoodadPtr doodads;\n\n"); 5988c9fbc29Smrg fprintf(file," doodads= geom->doodads;\n"); 5998c9fbc29Smrg nd= geom->num_doodads; 6008c9fbc29Smrg doodad= geom->doodads; 6018c9fbc29Smrg } 6028c9fbc29Smrg else { 6038c9fbc29Smrg if (section->num_doodads>0) { 6048c9fbc29Smrg fprintf(file,"static XkbDoodadRec doodads_s%02d[%d];\n", 6058c9fbc29Smrg section_num,section->num_doodads); 6068c9fbc29Smrg } 6078c9fbc29Smrg fprintf(file,"static void\n"); 6088c9fbc29Smrg fprintf(file,"_InitS%02dDoodads(",section_num); 6098c9fbc29Smrg fprintf(file," DPYTYPE dpy,\n"); 6108c9fbc29Smrg fprintf(file," XkbGeometryPtr geom,\n"); 6118c9fbc29Smrg fprintf(file," XkbSectionPtr section)\n"); 6128c9fbc29Smrg fprintf(file,"{\n"); 6138c9fbc29Smrg fprintf(file,"register XkbDoodadPtr doodads;\n\n"); 6148c9fbc29Smrg fprintf(file," doodads= section->doodads;\n"); 6158c9fbc29Smrg nd= geom->num_doodads; 6168c9fbc29Smrg doodad= geom->doodads; 6178c9fbc29Smrg } 6188c9fbc29Smrg for (d=0;d<nd;d++,doodad++) { 6198c9fbc29Smrg if (d!=0) fprintf(file,"\n"); 6208c9fbc29Smrg fprintf(file," doodads[%d].any.name= GET_ATOM(dpy,\"%s\");\n",d, 6218c9fbc29Smrg XkbAtomText(dpy,doodad->any.name,XkbCFile)); 6228c9fbc29Smrg fprintf(file," doodads[%d].any.type= %s;\n",d, 6238c9fbc29Smrg XkbDoodadTypeText(doodad->any.type,XkbCFile)); 6248c9fbc29Smrg fprintf(file," doodads[%d].any.priority= %d;\n",d, 6258c9fbc29Smrg doodad->any.priority); 6268c9fbc29Smrg fprintf(file," doodads[%d].any.top= %d;\n",d,doodad->any.top); 6278c9fbc29Smrg fprintf(file," doodads[%d].any.left= %d;\n",d,doodad->any.left); 6288c9fbc29Smrg fprintf(file," doodads[%d].any.angle= %d;\n",d,doodad->any.angle); 6298c9fbc29Smrg switch (doodad->any.type) { 6308c9fbc29Smrg case XkbOutlineDoodad: 6318c9fbc29Smrg case XkbSolidDoodad: 6328c9fbc29Smrg fprintf(file," doodads[%d].shape.color_ndx= %d;\n",d, 6338c9fbc29Smrg doodad->shape.color_ndx); 6348c9fbc29Smrg fprintf(file," doodads[%d].shape.shape_ndx= %d;\n",d, 6358c9fbc29Smrg doodad->shape.shape_ndx); 6368c9fbc29Smrg break; 6378c9fbc29Smrg case XkbTextDoodad: 6388c9fbc29Smrg fprintf(file," doodads[%d].text.width= %d;\n",d, 6398c9fbc29Smrg doodad->text.width); 6408c9fbc29Smrg fprintf(file," doodads[%d].text.height= %d;\n",d, 6418c9fbc29Smrg doodad->text.height); 6428c9fbc29Smrg fprintf(file," doodads[%d].text.color_ndx= %d;\n",d, 6438c9fbc29Smrg doodad->text.color_ndx); 6448c9fbc29Smrg fprintf(file," doodads[%d].text.text= \"%s\";\n",d, 6458c9fbc29Smrg XkbStringText(doodad->text.text,XkbCFile)); 6468c9fbc29Smrg fprintf(file," doodads[%d].text.font= \"%s\";\n",d, 6478c9fbc29Smrg XkbStringText(doodad->text.font,XkbCFile)); 6488c9fbc29Smrg break; 6498c9fbc29Smrg case XkbIndicatorDoodad: 6508c9fbc29Smrg fprintf(file," doodads[%d].indicator.shape_ndx= %d;\n",d, 6518c9fbc29Smrg doodad->indicator.shape_ndx); 6528c9fbc29Smrg fprintf(file," doodads[%d].indicator.on_color_ndx= %d;\n",d, 6538c9fbc29Smrg doodad->indicator.on_color_ndx); 6548c9fbc29Smrg fprintf(file," doodads[%d].indicator.off_color_ndx= %d;\n",d, 6558c9fbc29Smrg doodad->indicator.off_color_ndx); 6568c9fbc29Smrg break; 6578c9fbc29Smrg case XkbLogoDoodad: 6588c9fbc29Smrg fprintf(file," doodads[%d].logo.color_ndx= %d;\n",d, 6598c9fbc29Smrg doodad->logo.color_ndx); 6608c9fbc29Smrg fprintf(file," doodads[%d].logo.shape_ndx= %d;\n",d, 6618c9fbc29Smrg doodad->logo.shape_ndx); 6628c9fbc29Smrg fprintf(file," doodads[%d].logo.logo_name= \"%s\";\n",d, 6638c9fbc29Smrg XkbStringText(doodad->logo.logo_name,XkbCFile)); 6648c9fbc29Smrg break; 6658c9fbc29Smrg } 6668c9fbc29Smrg } 6678c9fbc29Smrg fprintf(file,"}\n"); 6688c9fbc29Smrg return True; 6698c9fbc29Smrg} 6708c9fbc29Smrg 6718c9fbc29Smrgstatic Bool 6728c9fbc29SmrgWriteCHdrGeomOverlays( FILE * file, 6738c9fbc29Smrg XkbDescPtr xkb, 6748c9fbc29Smrg XkbSectionPtr section, 6758c9fbc29Smrg int section_num) 6768c9fbc29Smrg{ 6778c9fbc29Smrgregister int o,r,k; 6788c9fbc29SmrgXkbOverlayPtr ol; 6798c9fbc29SmrgXkbOverlayRowPtr row; 6808c9fbc29SmrgXkbOverlayKeyPtr key; 6818c9fbc29Smrg 6828c9fbc29Smrg if (section->num_overlays<1) 6838c9fbc29Smrg return True; 6848c9fbc29Smrg for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { 6858c9fbc29Smrg for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { 6868c9fbc29Smrg fprintf(file,"static XkbOverlayKeyRec olkeys_s%02dr%02d[%d]= {\n", 6878c9fbc29Smrg section_num,r,row->num_keys); 6888c9fbc29Smrg for (k=0,key=row->keys;k<row->num_keys;k++,key++) { 6898c9fbc29Smrg fprintf(file,"%s { {\"%s\"}, {\"%s\"} }", 6908c9fbc29Smrg (k==0?"":",\n"), 6918c9fbc29Smrg XkbKeyNameText(key->over.name,XkbCFile), 6928c9fbc29Smrg XkbKeyNameText(key->under.name,XkbCFile)); 6938c9fbc29Smrg } 6948c9fbc29Smrg fprintf(file,"\n};\n"); 6958c9fbc29Smrg } 6968c9fbc29Smrg fprintf(file,"static XkbOverlayRowRec olrows_s%02d[%d]= {\n", 6978c9fbc29Smrg section_num,section->num_rows); 6988c9fbc29Smrg for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { 6998c9fbc29Smrg fprintf(file,"%s { %4d, %4d, %4d, olkeys_s%02dr%02d }", 7008c9fbc29Smrg (r==0?"":",\n"), 7018c9fbc29Smrg row->row_under,row->num_keys,row->num_keys, 7028c9fbc29Smrg section_num,r); 7038c9fbc29Smrg } 7048c9fbc29Smrg fprintf(file,"\n};\n"); 7058c9fbc29Smrg } 7068c9fbc29Smrg fprintf(file,"static XkbOverlayRec overlays_s%02d[%d]= {\n",section_num, 7078c9fbc29Smrg section->num_overlays); 7088c9fbc29Smrg for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { 7098c9fbc29Smrg fprintf(file,"%s {\n",(o==0?"":",\n")); 7108c9fbc29Smrg fprintf(file," None, /* name */\n"); 7118c9fbc29Smrg fprintf(file," NULL, /* section_under */\n"); 7128c9fbc29Smrg fprintf(file," %4d, /* num_rows */\n",ol->num_rows); 7138c9fbc29Smrg fprintf(file," %4d, /* sz_rows */\n",ol->num_rows); 7148c9fbc29Smrg fprintf(file," olrows_s%02d,\n",section_num); 7158c9fbc29Smrg fprintf(file," NULL /* bounds */\n"); 7168c9fbc29Smrg fprintf(file," }"); 7178c9fbc29Smrg } 7188c9fbc29Smrg fprintf(file,"\n};\n"); 7198c9fbc29Smrg fprintf(file,"static void\n"); 7208c9fbc29Smrg fprintf(file,"_InitS%02dOverlay(",section_num); 7218c9fbc29Smrg fprintf(file," DPYTYPE dpy,\n"); 7228c9fbc29Smrg fprintf(file," XkbGeometryPtr geom,\n"); 7238c9fbc29Smrg fprintf(file," XkbSectionPtr section)\n"); 7248c9fbc29Smrg fprintf(file,"{\n"); 7258c9fbc29Smrg fprintf(file,"XkbOverlayPtr ol;\n\n"); 7268c9fbc29Smrg fprintf(file," ol= section->overlays;\n"); 7278c9fbc29Smrg for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { 7288c9fbc29Smrg fprintf(file," ol[%2d].name= GET_ATOM(dpy,\"%s\");\n",o, 7298c9fbc29Smrg XkbAtomText(xkb->dpy,ol->name,XkbCFile)); 7308c9fbc29Smrg fprintf(file," ol[%2d].section_under= section;\n",o); 7318c9fbc29Smrg } 7328c9fbc29Smrg fprintf(file,"}\n"); 7338c9fbc29Smrg return True; 7348c9fbc29Smrg} 7358c9fbc29Smrg 7368c9fbc29Smrgstatic Bool 7378c9fbc29SmrgWriteCHdrGeomRows( FILE * file, 7388c9fbc29Smrg XkbDescPtr xkb, 7398c9fbc29Smrg XkbSectionPtr section, 7408c9fbc29Smrg int section_num) 7418c9fbc29Smrg{ 7428c9fbc29Smrgregister int k,r; 7438c9fbc29Smrgregister XkbRowPtr row; 7448c9fbc29Smrgregister XkbKeyPtr key; 7458c9fbc29Smrg 7468c9fbc29Smrg for (r=0,row=section->rows;r<section->num_rows;r++,row++) { 7478c9fbc29Smrg fprintf(file,"static XkbKeyRec keys_s%02dr%02d[]= {\n",section_num,r); 7488c9fbc29Smrg for (k=0,key=row->keys;k<row->num_keys;k++,key++) { 7498c9fbc29Smrg fprintf(file,"%s { { \"%s\" }, %4d, %4d, %4d }", 7508c9fbc29Smrg (k==0?"":",\n"), 7518c9fbc29Smrg XkbKeyNameText(key->name.name,XkbCFile), 7528c9fbc29Smrg key->gap,key->shape_ndx,key->color_ndx); 7538c9fbc29Smrg } 7548c9fbc29Smrg fprintf(file,"\n};\n"); 7558c9fbc29Smrg } 7568c9fbc29Smrg fprintf(file,"static XkbRowRec rows_s%02d[]= {\n",section_num); 7578c9fbc29Smrg for (r=0,row=section->rows;r<section->num_rows;r++,row++) { 7588c9fbc29Smrg fprintf(file,"%s { %4d, %4d, %2d, %2d, %1d, keys_s%02dr%02d, ", 7598c9fbc29Smrg (r==0?"":",\n"), 7608c9fbc29Smrg row->top,row->left,row->num_keys,row->num_keys, 7618c9fbc29Smrg (row->vertical!=0), 7628c9fbc29Smrg section_num,r); 7638c9fbc29Smrg fprintf(file," { %4d, %4d, %4d, %4d } }", 7648c9fbc29Smrg row->bounds.x1,row->bounds.y1, 7658c9fbc29Smrg row->bounds.x2,row->bounds.y2); 7668c9fbc29Smrg } 7678c9fbc29Smrg fprintf(file,"\n};\n"); 7688c9fbc29Smrg return True; 7698c9fbc29Smrg} 7708c9fbc29Smrg 7718c9fbc29Smrgstatic Bool 7728c9fbc29SmrgWriteCHdrGeomSections(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) 7738c9fbc29Smrg{ 7748c9fbc29Smrgregister int s; 7758c9fbc29Smrgregister XkbSectionPtr section; 7768c9fbc29Smrg 7778c9fbc29Smrg for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { 7788c9fbc29Smrg WriteCHdrGeomRows(file,xkb,section,s); 7798c9fbc29Smrg#ifdef NOTYET 7808c9fbc29Smrg if (section->num_doodads>0) 7818c9fbc29Smrg WriteCHdrGeomDoodads(file,xkb,geom,section,s); 7828c9fbc29Smrg#endif 7838c9fbc29Smrg if (section->num_overlays>0) 7848c9fbc29Smrg WriteCHdrGeomOverlays(file,xkb,section,s); 7858c9fbc29Smrg } 7868c9fbc29Smrg fprintf(file,"\nstatic XkbSectionRec g_sections[%d]= {\n", 7878c9fbc29Smrg geom->num_sections); 7888c9fbc29Smrg for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { 7898c9fbc29Smrg if (s!=0) fprintf(file,",\n"); 7908c9fbc29Smrg fprintf(file," {\n None, /* name */\n"); 7918c9fbc29Smrg fprintf(file," %4d, /* priority */\n",section->priority); 7928c9fbc29Smrg fprintf(file," %4d, /* top */\n",section->top); 7938c9fbc29Smrg fprintf(file," %4d, /* left */\n",section->left); 7948c9fbc29Smrg fprintf(file," %4d, /* width */\n",section->width); 7958c9fbc29Smrg fprintf(file," %4d, /* height */\n",section->height); 7968c9fbc29Smrg fprintf(file," %4d, /* angle */\n",section->angle); 7978c9fbc29Smrg fprintf(file," %4d, /* num_rows */\n",section->num_rows); 7988c9fbc29Smrg fprintf(file," %4d, /* num_doodads */\n",section->num_doodads); 7998c9fbc29Smrg fprintf(file," %4d, /* num_overlays */\n",section->num_overlays); 8008c9fbc29Smrg fprintf(file," %4d, /* sz_rows */\n",section->num_rows); 8018c9fbc29Smrg fprintf(file," %4d, /* sz_doodads */\n",section->num_doodads); 8028c9fbc29Smrg fprintf(file," %4d, /* sz_overlays */\n",section->num_overlays); 8038c9fbc29Smrg if (section->num_rows>0) 8048c9fbc29Smrg fprintf(file," rows_s%02d,\n",s); 8058c9fbc29Smrg else fprintf(file," NULL, /* rows */\n"); 8068c9fbc29Smrg if (section->num_doodads>0) 8078c9fbc29Smrg fprintf(file," doodads_s%02d,\n",s); 8088c9fbc29Smrg else fprintf(file," NULL, /* doodads */\n"); 8098c9fbc29Smrg fprintf(file," { %4d, %4d, %4d, %4d }, /* bounds */\n", 8108c9fbc29Smrg section->bounds.x1,section->bounds.y1, 8118c9fbc29Smrg section->bounds.x2,section->bounds.y2); 8128c9fbc29Smrg if (section->num_overlays>0) 8138c9fbc29Smrg fprintf(file," overlays_s%02d\n",s); 8148c9fbc29Smrg else fprintf(file," NULL /* overlays */\n"); 8158c9fbc29Smrg fprintf(file," }"); 8168c9fbc29Smrg } 8178c9fbc29Smrg fprintf(file,"\n};\n"); 8188c9fbc29Smrg fprintf(file,"\nstatic Bool\n"); 8198c9fbc29Smrg fprintf(file,"_InitSections(DPYTYPE dpy,XkbGeometryPtr geom)\n"); 8208c9fbc29Smrg fprintf(file,"{\nXkbSectionPtr sections;\n\n"); 8218c9fbc29Smrg fprintf(file," sections= geom->sections;\n"); 8228c9fbc29Smrg for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { 8238c9fbc29Smrg if (section->num_doodads>0) { 8248c9fbc29Smrg fprintf(file," _InitS%02dDoodads(dpy,geom,§ions[%d]);\n", 8258c9fbc29Smrg s,s); 8268c9fbc29Smrg } 8278c9fbc29Smrg if (section->num_overlays>0) { 8288c9fbc29Smrg fprintf(file," _InitS%02dOverlays(dpy,geom,§ions[%d]);\n", 8298c9fbc29Smrg s,s); 8308c9fbc29Smrg } 8318c9fbc29Smrg } 8328c9fbc29Smrg fprintf(file,"}\n"); 8338c9fbc29Smrg return True; 8348c9fbc29Smrg} 8358c9fbc29Smrg 8368c9fbc29Smrgstatic Bool 8378c9fbc29SmrgWriteCHdrGeomAliases(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) 8388c9fbc29Smrg{ 8398c9fbc29Smrg if (geom->num_key_aliases>0) { 8408c9fbc29Smrg register int i; 8418c9fbc29Smrg fprintf(file,"\nstatic XkbKeyAliasRec g_aliases[%d]= {\n", 8428c9fbc29Smrg geom->num_key_aliases); 8438c9fbc29Smrg for (i=0;i<geom->num_key_aliases;i++) { 8448c9fbc29Smrg fprintf(file,"%s { \"%s\", \"%s\" }",(i==0?"":",\n"), 8458c9fbc29Smrg XkbKeyNameText(geom->key_aliases[i].real,XkbCFile), 8468c9fbc29Smrg XkbKeyNameText(geom->key_aliases[i].alias,XkbCFile)); 8478c9fbc29Smrg } 8488c9fbc29Smrg fprintf(file,"\n};\n"); 8498c9fbc29Smrg } 8508c9fbc29Smrg return True; 8518c9fbc29Smrg} 8528c9fbc29Smrg 8538c9fbc29Smrgstatic Bool 8548c9fbc29SmrgWriteCHdrGeometry(FILE *file,XkbDescPtr xkb) 8558c9fbc29Smrg{ 8568c9fbc29SmrgXkbGeometryPtr geom; 8578c9fbc29Smrgregister int i; 8588c9fbc29Smrg 8598c9fbc29Smrg if ((!xkb)||(!xkb->geom)) { 8608c9fbc29Smrg _XkbLibError(_XkbErrMissingGeometry,"WriteCHdrGeometry",0); 8618c9fbc29Smrg return False; 8628c9fbc29Smrg } 8638c9fbc29Smrg geom= xkb->geom; 8648c9fbc29Smrg WriteCHdrGeomProps(file,xkb,geom); 8658c9fbc29Smrg WriteCHdrGeomColors(file,xkb,geom); 8668c9fbc29Smrg WriteCHdrGeomShapes(file,xkb,geom); 8678c9fbc29Smrg WriteCHdrGeomSections(file,xkb,geom); 8688c9fbc29Smrg WriteCHdrGeomDoodads(file,xkb,geom,NULL,0); 8698c9fbc29Smrg WriteCHdrGeomAliases(file,xkb,geom); 8708c9fbc29Smrg fprintf(file,"\nstatic XkbGeometryRec geom= {\n"); 8718c9fbc29Smrg fprintf(file," None, /* name */\n"); 8728c9fbc29Smrg fprintf(file," %d, %d, /* width, height */\n",geom->width_mm, 8738c9fbc29Smrg geom->height_mm); 8748c9fbc29Smrg if (geom->label_font) { 8758c9fbc29Smrg fprintf(file," \"%s\",/* label font */\n", 8768c9fbc29Smrg XkbStringText(geom->label_font,XkbCFile)); 8778c9fbc29Smrg } 8788c9fbc29Smrg else fprintf(file," NULL, /* label font */\n"); 8798c9fbc29Smrg if (geom->label_color) { 8808c9fbc29Smrg fprintf(file," &g_colors[%d], /* label color */\n", 8818c9fbc29Smrg XkbGeomColorIndex(geom,geom->label_color)); 8828c9fbc29Smrg } 8838c9fbc29Smrg else fprintf(file," NULL, /* label color */\n"); 8848c9fbc29Smrg if (geom->base_color) { 8858c9fbc29Smrg fprintf(file," &g_colors[%d], /* base color */\n", 8868c9fbc29Smrg XkbGeomColorIndex(geom,geom->base_color)); 8878c9fbc29Smrg } 8888c9fbc29Smrg else fprintf(file," NULL, /* base color */\n"); 8898c9fbc29Smrg fprintf(file," %d, %d, %d, /* sz: props, colors, shapes */\n", 8908c9fbc29Smrg geom->num_properties,geom->num_colors, 8918c9fbc29Smrg geom->num_shapes); 8928c9fbc29Smrg fprintf(file," %d, %d, %d, /* sz: sections, doodads, aliases */\n", 8938c9fbc29Smrg geom->num_sections,geom->num_doodads, 8948c9fbc29Smrg geom->num_key_aliases); 8958c9fbc29Smrg fprintf(file," %d, %d, %d, /* num: props, colors, shapes */\n", 8968c9fbc29Smrg geom->num_properties,geom->num_colors, 8978c9fbc29Smrg geom->num_shapes); 8988c9fbc29Smrg fprintf(file," %d, %d, %d, /* num: sections, doodads, aliases */\n", 8998c9fbc29Smrg geom->num_sections,geom->num_doodads, 9008c9fbc29Smrg geom->num_key_aliases); 9018c9fbc29Smrg fprintf(file," %s, %s, %s,\n", 9028c9fbc29Smrg (geom->num_properties>0?"g_props":"NULL"), 9038c9fbc29Smrg (geom->num_colors>0?"g_colors":"NULL"), 9048c9fbc29Smrg (geom->num_shapes>0?"g_shapes":"NULL")); 9058c9fbc29Smrg fprintf(file," %s, %s, %s\n", 9068c9fbc29Smrg (geom->num_sections>0?"g_sections":"NULL"), 9078c9fbc29Smrg (geom->num_doodads>0?"g_doodads":"NULL"), 9088c9fbc29Smrg (geom->num_key_aliases>0?"g_aliases":"NULL")); 9098c9fbc29Smrg fprintf(file,"};\n\n"); 9108c9fbc29Smrg fprintf(file,"static Bool\n"); 9118c9fbc29Smrg fprintf(file,"_InitHdrGeom(DPYTYPE dpy,XkbGeometryPtr geom)\n"); 9128c9fbc29Smrg fprintf(file,"{\n"); 9138c9fbc29Smrg if (geom->name!=None) { 9148c9fbc29Smrg fprintf(file," geom->name= GET_ATOM(dpy,\"%s\");\n", 9158c9fbc29Smrg XkbAtomText(xkb->dpy,geom->name,XkbCFile)); 9168c9fbc29Smrg } 9178c9fbc29Smrg for (i=0;i<geom->num_shapes;i++) { 9188c9fbc29Smrg fprintf(file," geom->shapes[%2d].name= GET_ATOM(dpy,\"%s\");\n",i, 9198c9fbc29Smrg XkbAtomText(xkb->dpy,geom->shapes[i].name,XkbCFile)); 9208c9fbc29Smrg } 9218c9fbc29Smrg if (geom->num_doodads>0) 9228c9fbc29Smrg fprintf(file," _InitGeomDoodads(dpy,geom);\n"); 9238c9fbc29Smrg fprintf(file," _InitSections(dpy,geom);\n"); 9248c9fbc29Smrg fprintf(file,"}\n\n"); 9258c9fbc29Smrg return True; 9268c9fbc29Smrg} 9278c9fbc29Smrg 9288c9fbc29Smrgstatic Bool 9298c9fbc29SmrgWriteCHdrGeomFile(FILE *file,XkbFileInfo *result) 9308c9fbc29Smrg{ 9318c9fbc29SmrgBool ok; 9328c9fbc29Smrg 9338c9fbc29Smrg ok= WriteCHdrGeometry(file,result->xkb); 9348c9fbc29Smrg return ok; 9358c9fbc29Smrg} 9368c9fbc29Smrg 9378c9fbc29Smrgstatic Bool 9388c9fbc29SmrgWriteCHdrLayout(FILE *file,XkbFileInfo *result) 9398c9fbc29Smrg{ 9408c9fbc29SmrgBool ok; 9418c9fbc29SmrgXkbDescPtr xkb; 9428c9fbc29Smrg 9438c9fbc29Smrg xkb= result->xkb; 9448c9fbc29Smrg ok= WriteCHdrVMods(file,xkb->dpy,xkb); 9458c9fbc29Smrg ok= WriteCHdrKeycodes(file,xkb)&&ok; 9468c9fbc29Smrg ok= WriteCHdrSymbols(file,xkb)&&ok; 9478c9fbc29Smrg ok= WriteCHdrGeometry(file,xkb)&&ok; 9488c9fbc29Smrg return ok; 9498c9fbc29Smrg} 9508c9fbc29Smrg 9518c9fbc29Smrgstatic Bool 9528c9fbc29SmrgWriteCHdrSemantics(FILE *file,XkbFileInfo *result) 9538c9fbc29Smrg{ 9548c9fbc29SmrgBool ok; 9558c9fbc29SmrgXkbDescPtr xkb; 9568c9fbc29Smrg 9578c9fbc29Smrg xkb= result->xkb; 9588c9fbc29Smrg ok= WriteCHdrVMods(file,xkb->dpy,xkb); 9598c9fbc29Smrg ok= WriteCHdrKeyTypes(file,xkb->dpy,xkb)&&ok; 9608c9fbc29Smrg ok= WriteCHdrCompatMap(file,xkb->dpy,xkb)&&ok; 9618c9fbc29Smrg ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok; 9628c9fbc29Smrg return ok; 9638c9fbc29Smrg} 9648c9fbc29Smrg 9658c9fbc29Smrgstatic Bool 9668c9fbc29SmrgWriteCHdrKeymap(FILE *file,XkbFileInfo *result) 9678c9fbc29Smrg{ 9688c9fbc29SmrgBool ok; 9698c9fbc29SmrgXkbDescPtr xkb; 9708c9fbc29Smrg 9718c9fbc29Smrg xkb= result->xkb; 9728c9fbc29Smrg ok= WriteCHdrVMods(file,xkb->dpy,xkb); 9738c9fbc29Smrg ok= ok&&WriteCHdrKeycodes(file,xkb); 9748c9fbc29Smrg ok= ok&&WriteCHdrClientMap(file,xkb->dpy,xkb); 9758c9fbc29Smrg ok= ok&&WriteCHdrServerMap(file,xkb->dpy,xkb); 9768c9fbc29Smrg ok= ok&&WriteCHdrCompatMap(file,xkb->dpy,xkb); 9778c9fbc29Smrg ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok; 9788c9fbc29Smrg ok= ok&&WriteCHdrGeometry(file,xkb); 9798c9fbc29Smrg return ok; 9808c9fbc29Smrg} 9818c9fbc29Smrg 9828c9fbc29SmrgBool 9838c9fbc29SmrgXkbWriteCFile(FILE *out,char *name,XkbFileInfo *result) 9848c9fbc29Smrg{ 9858c9fbc29SmrgBool ok; 9868c9fbc29SmrgXkbDescPtr xkb; 9878c9fbc29SmrgBool (*func)( 9888c9fbc29Smrg FILE * /* file*/, 9898c9fbc29Smrg XkbFileInfo * /* result */ 9908c9fbc29Smrg); 9918c9fbc29Smrg 9928c9fbc29Smrg switch (result->type) { 9938c9fbc29Smrg case XkmSemanticsFile: 9948c9fbc29Smrg func= WriteCHdrSemantics; 9958c9fbc29Smrg break; 9968c9fbc29Smrg case XkmLayoutFile: 9978c9fbc29Smrg func= WriteCHdrLayout; 9988c9fbc29Smrg break; 9998c9fbc29Smrg case XkmKeymapFile: 10008c9fbc29Smrg func= WriteCHdrKeymap; 10018c9fbc29Smrg break; 10028c9fbc29Smrg case XkmGeometryIndex: 10038c9fbc29Smrg case XkmGeometryFile: 10048c9fbc29Smrg func= WriteCHdrGeomFile; 10058c9fbc29Smrg break; 10068c9fbc29Smrg default: 10078c9fbc29Smrg _XkbLibError(_XkbErrIllegalContents,"XkbWriteCFile",result->type); 10088c9fbc29Smrg return False; 10098c9fbc29Smrg } 10108c9fbc29Smrg xkb= result->xkb; 10118c9fbc29Smrg if (out==NULL) { 10128c9fbc29Smrg _XkbLibError(_XkbErrFileCannotOpen,"XkbWriteCFile",0); 10138c9fbc29Smrg ok= False; 10148c9fbc29Smrg } 10158c9fbc29Smrg else { 10168c9fbc29Smrg char *tmp,*hdrdef; 10178c9fbc29Smrg tmp= (char *)strrchr(name,'/'); 10188c9fbc29Smrg if (tmp==NULL) 10198c9fbc29Smrg tmp= name; 10208c9fbc29Smrg else tmp++; 10218c9fbc29Smrg hdrdef= (char *)_XkbCalloc(strlen(tmp)+1,sizeof(char)); 10228c9fbc29Smrg if (hdrdef) { 10238c9fbc29Smrg strcpy(hdrdef,tmp); 10248c9fbc29Smrg tmp= hdrdef; 10258c9fbc29Smrg while (*tmp) { 10268c9fbc29Smrg if (islower(*tmp)) *tmp= toupper(*tmp); 10278c9fbc29Smrg else if (!isalnum(*tmp)) *tmp= '_'; 10288c9fbc29Smrg tmp++; 10298c9fbc29Smrg } 10308c9fbc29Smrg fprintf(out,"/* This file generated automatically by xkbcomp */\n"); 10318c9fbc29Smrg fprintf(out,"/* DO NOT EDIT */\n"); 10328c9fbc29Smrg fprintf(out,"#ifndef %s\n",hdrdef); 10338c9fbc29Smrg fprintf(out,"#define %s 1\n\n",hdrdef); 10348c9fbc29Smrg } 10358c9fbc29Smrg fprintf(out,"#ifndef XKB_IN_SERVER\n"); 10368c9fbc29Smrg fprintf(out,"#define GET_ATOM(d,s) XInternAtom(d,s,0)\n"); 10378c9fbc29Smrg fprintf(out,"#define DPYTYPE Display *\n"); 10388c9fbc29Smrg fprintf(out,"#else\n"); 10398c9fbc29Smrg fprintf(out,"#define GET_ATOM(d,s) MakeAtom(s,strlen(s),1)\n"); 10408c9fbc29Smrg fprintf(out,"#define DPYTYPE char *\n"); 10418c9fbc29Smrg fprintf(out,"#endif\n"); 10428c9fbc29Smrg fprintf(out,"#define NUM_KEYS %d\n",xkb->max_key_code+1); 10438c9fbc29Smrg ok= (*func)(out,result); 10448c9fbc29Smrg if (hdrdef) 10458c9fbc29Smrg fprintf(out,"#endif /* %s */\n",hdrdef); 10468c9fbc29Smrg } 10478c9fbc29Smrg 10488c9fbc29Smrg if (!ok) { 10498c9fbc29Smrg return False; 10508c9fbc29Smrg } 10518c9fbc29Smrg return True; 10528c9fbc29Smrg} 1053