diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-10-20 00:56:20 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-10-20 14:46:57 -0700 |
commit | a945540e6eea9b9303c8f611412ecb58129180e7 (patch) | |
tree | 455c88ad4c7b97886d47ae292b2829c31408eeea | |
parent | 7381c2f9013ef7784c78091fa671e652a62ca706 (diff) |
Convert to X.Org standard indentation style
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r-- | src/XKBfileInt.h | 7 | ||||
-rw-r--r-- | src/cout.c | 1688 | ||||
-rw-r--r-- | src/maprules.c | 1925 | ||||
-rw-r--r-- | src/srvmisc.c | 299 | ||||
-rw-r--r-- | src/xkbatom.c | 177 | ||||
-rw-r--r-- | src/xkbbells.c | 116 | ||||
-rw-r--r-- | src/xkbconfig.c | 2086 | ||||
-rw-r--r-- | src/xkbdraw.c | 140 | ||||
-rw-r--r-- | src/xkberrs.c | 63 | ||||
-rw-r--r-- | src/xkbmisc.c | 961 | ||||
-rw-r--r-- | src/xkbout.c | 1765 | ||||
-rw-r--r-- | src/xkbtext.c | 2243 | ||||
-rw-r--r-- | src/xkmout.c | 2161 | ||||
-rw-r--r-- | src/xkmread.c | 2129 |
14 files changed, 8130 insertions, 7630 deletions
diff --git a/src/XKBfileInt.h b/src/XKBfileInt.h index e810e61..dbaf825 100644 --- a/src/XKBfileInt.h +++ b/src/XKBfileInt.h @@ -63,8 +63,8 @@ _XFUNCPROTOBEGIN -static inline -char *_XkbDupString(const char *s) +static inline char * +_XkbDupString(const char *s) { return s ? strdup(s) : NULL; } @@ -79,5 +79,4 @@ extern int _XkbStrCaseCmp(char *s1, char *s2); #endif _XFUNCPROTOEND - -#endif /* _XKBFILEINT_H_ */ +#endif /* _XKBFILEINT_H_ */ @@ -38,1013 +38,1077 @@ #include "XKMformat.h" #include "XKBfileInt.h" -#define lowbit(x) ((x) & (-(x))) +#define lowbit(x) ((x) & (-(x))) static Bool -WriteCHdrVMods(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrVMods(FILE *file, Display *dpy, XkbDescPtr xkb) { -register int i,nOut; - - if ((!xkb)||(!xkb->names)||(!xkb->names->vmods)) - return False; - for (i=nOut=0;i<XkbNumVirtualMods;i++) { - if (xkb->names->vmods[i]!=None) { - fprintf(file,"%s#define vmod_%s %d\n",(nOut<1?"\n":""), - XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile), - i); - nOut++; - } + register int i, nOut; + + if ((!xkb) || (!xkb->names) || (!xkb->names->vmods)) + return False; + for (i = nOut = 0; i < XkbNumVirtualMods; i++) { + if (xkb->names->vmods[i] != None) { + fprintf(file, "%s#define vmod_%s %d\n", + (nOut < 1 ? "\n" : ""), + XkbAtomText(dpy, xkb->names->vmods[i], XkbCFile), i); + nOut++; + } } - for (i=nOut=0;i<XkbNumVirtualMods;i++) { - if (xkb->names->vmods[i]!=None) { - fprintf(file,"%s#define vmod_%sMask (1<<%d)\n", - (nOut<1?"\n":""), - XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile) - ,i); - nOut++; - } + for (i = nOut = 0; i < XkbNumVirtualMods; i++) { + if (xkb->names->vmods[i] != None) { + fprintf(file, "%s#define vmod_%sMask (1<<%d)\n", + (nOut < 1 ? "\n" : ""), + XkbAtomText(dpy, xkb->names->vmods[i], XkbCFile), i); + nOut++; + } } - if (nOut>0) - fprintf(file,"\n"); + if (nOut > 0) + fprintf(file, "\n"); return True; } static Bool -WriteCHdrKeycodes(FILE *file,XkbDescPtr xkb) +WriteCHdrKeycodes(FILE * file, XkbDescPtr xkb) { -Atom kcName; -register unsigned i; -char buf[8]; + Atom kcName; + register unsigned i; + char buf[8]; - if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) { - _XkbLibError(_XkbErrMissingNames,"WriteCHdrKeycodes",0); - return False; + if ((!xkb) || (!xkb->names) || (!xkb->names->keys)) { + _XkbLibError(_XkbErrMissingNames, "WriteCHdrKeycodes", 0); + return False; } - kcName= xkb->names->keycodes; - buf[4]= '\0'; - if (xkb->names->keycodes!=None) - fprintf(file,"/* keycodes name is \"%s\" */\n", - XkbAtomText(xkb->dpy,kcName,XkbMessage)); - fprintf(file,"static XkbKeyNameRec keyNames[NUM_KEYS]= {\n"); - for (i=0;i<=xkb->max_key_code;i++) { - sprintf(buf,"\"%s\"",XkbKeyNameText(xkb->names->keys[i].name,XkbCFile)); - if (i!=xkb->max_key_code) { - fprintf(file," { %6s },",buf); - if ((i&3)==3) - fprintf(file,"\n"); - } - else { - fprintf(file," { %6s }\n",buf); - } + kcName = xkb->names->keycodes; + buf[4] = '\0'; + if (xkb->names->keycodes != None) + fprintf(file, "/* keycodes name is \"%s\" */\n", + XkbAtomText(xkb->dpy, kcName, XkbMessage)); + fprintf(file, "static XkbKeyNameRec keyNames[NUM_KEYS]= {\n"); + for (i = 0; i <= xkb->max_key_code; i++) { + sprintf(buf, "\"%s\"", + XkbKeyNameText(xkb->names->keys[i].name, XkbCFile)); + if (i != xkb->max_key_code) { + fprintf(file, " { %6s },", buf); + if ((i & 3) == 3) + fprintf(file, "\n"); + } + else { + fprintf(file, " { %6s }\n", buf); + } } - fprintf(file,"};\n"); + fprintf(file, "};\n"); return True; } static void -WriteTypePreserve( FILE * file, - Display * dpy, - char * prefix, - XkbDescPtr xkb, - XkbKeyTypePtr type) +WriteTypePreserve(FILE * file, + Display * dpy, + char * prefix, + XkbDescPtr xkb, + XkbKeyTypePtr type) { -register unsigned i; -XkbModsPtr pre; - - fprintf(file,"static XkbModsRec preserve_%s[%d]= {\n",prefix, - type->map_count); - for (i=0,pre=type->preserve;i<type->map_count;i++,pre++) { - if (i!=0) - fprintf(file,",\n"); - fprintf(file," { %15s, ",XkbModMaskText(pre->mask,XkbCFile)); - fprintf(file,"%15s, ",XkbModMaskText(pre->real_mods,XkbCFile)); - fprintf(file,"%15s }",XkbVModMaskText(dpy,xkb,0,pre->vmods,XkbCFile)); + register unsigned i; + XkbModsPtr pre; + + fprintf(file, "static XkbModsRec preserve_%s[%d]= {\n", prefix, + type->map_count); + for (i = 0, pre = type->preserve; i < type->map_count; i++, pre++) { + if (i != 0) + fprintf(file, ",\n"); + fprintf(file, " { %15s, ", XkbModMaskText(pre->mask, XkbCFile)); + fprintf(file, "%15s, ", XkbModMaskText(pre->real_mods, XkbCFile)); + fprintf(file, "%15s }", + XkbVModMaskText(dpy, xkb, 0, pre->vmods, XkbCFile)); } - fprintf(file,"\n};\n"); + fprintf(file, "\n};\n"); return; } static void -WriteTypeInitFunc(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteTypeInitFunc(FILE *file, Display *dpy, XkbDescPtr xkb) { -register unsigned i,n; -XkbKeyTypePtr type; -Atom * names; -char * prefix = NULL; - - fprintf(file,"\n\nstatic void\n"); - fprintf(file,"initTypeNames(DPYTYPE dpy)\n"); - fprintf(file,"{\n"); - for (i=0,type=xkb->map->types;i<xkb->map->num_types;i++,type++) { - if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { - _XkbLibError(_XkbErrBadAlloc,"WriteTypeInitFunc",0); - fprintf(file,"#error XkbErrBadAlloc WriteTypeInitFunc\n"); - break; - } - if (type->name!=None) - fprintf(file," dflt_types[%d].name= GET_ATOM(dpy,\"%s\");\n",i, - XkbAtomText(dpy,type->name,XkbCFile)); - names= type->level_names; - if (names!=NULL) { - char *tmp; - for (n=0;n<type->num_levels;n++) { - if (names[n]==None) - continue; - tmp= XkbAtomText(dpy,names[n],XkbCFile); - if (tmp==NULL) - continue; - fprintf(file," lnames_%s[%d]= ",prefix,n); - fprintf(file,"GET_ATOM(dpy,\"%s\");\n",tmp); - } - } - free(prefix); - prefix = NULL; + register unsigned i, n; + XkbKeyTypePtr type; + Atom * names; + char * prefix = NULL; + + fprintf(file, "\n\nstatic void\n"); + fprintf(file, "initTypeNames(DPYTYPE dpy)\n"); + fprintf(file, "{\n"); + for (i = 0, type = xkb->map->types; i < xkb->map->num_types; i++, type++) { + if (!(prefix = strdup(XkbAtomText(dpy, type->name, XkbCFile)))) { + _XkbLibError(_XkbErrBadAlloc, "WriteTypeInitFunc", 0); + fprintf(file, "#error XkbErrBadAlloc WriteTypeInitFunc\n"); + break; + } + if (type->name != None) + fprintf(file, " dflt_types[%d].name= GET_ATOM(dpy,\"%s\");\n", + i, XkbAtomText(dpy, type->name, XkbCFile)); + names = type->level_names; + if (names != NULL) { + char *tmp; + + for (n = 0; n < type->num_levels; n++) { + if (names[n] == None) + continue; + tmp = XkbAtomText(dpy, names[n], XkbCFile); + if (tmp == NULL) + continue; + fprintf(file, " lnames_%s[%d]= ", prefix, n); + fprintf(file, "GET_ATOM(dpy,\"%s\");\n", tmp); + } + } + free(prefix); + prefix = NULL; } - fprintf(file,"}\n"); + fprintf(file, "}\n"); return; } static Bool -WriteCHdrKeyTypes(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrKeyTypes(FILE *file, Display *dpy, XkbDescPtr xkb) { -register unsigned i,n; -XkbClientMapPtr map; -XkbKeyTypePtr type; -char * prefix = NULL; - - if ((!xkb)||(!xkb->map)||(!xkb->map->types)) { - _XkbLibError(_XkbErrMissingTypes,"WriteCHdrKeyTypes",0); - return False; + register unsigned i, n; + XkbClientMapPtr map; + XkbKeyTypePtr type; + char * prefix = NULL; + + if ((!xkb) || (!xkb->map) || (!xkb->map->types)) { + _XkbLibError(_XkbErrMissingTypes, "WriteCHdrKeyTypes", 0); + return False; } - if (xkb->map->num_types<XkbNumRequiredTypes) { - _XkbLibError(_XkbErrMissingReqTypes,"WriteCHdrKeyTypes",0); - return 0; + if (xkb->map->num_types < XkbNumRequiredTypes) { + _XkbLibError(_XkbErrMissingReqTypes, "WriteCHdrKeyTypes", 0); + return 0; } - map= xkb->map; - if ((xkb->names!=NULL)&&(xkb->names->types!=None)) { - fprintf(file,"/* types name is \"%s\" */\n", - XkbAtomText(dpy,xkb->names->types,XkbCFile)); + map = xkb->map; + if ((xkb->names != NULL) && (xkb->names->types != None)) { + fprintf(file, "/* types name is \"%s\" */\n", + XkbAtomText(dpy, xkb->names->types, XkbCFile)); } - for (i=0,type=map->types;i<map->num_types;i++,type++) { - if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { - _XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0); - return False; - } - - if (type->map_count>0) { - XkbKTMapEntryPtr entry; - entry= type->map; - fprintf(file,"static XkbKTMapEntryRec map_%s[%d]= {\n",prefix, - type->map_count); - for (n=0;n<(unsigned)type->map_count;n++,entry++) { - if (n!=0) - fprintf(file,",\n"); - fprintf(file," { %d, %6d, { %15s, %15s, %15s } }", - entry->active, - entry->level, - XkbModMaskText(entry->mods.mask,XkbCFile), - XkbModMaskText(entry->mods.real_mods,XkbCFile), - XkbVModMaskText(dpy,xkb,0,entry->mods.vmods,XkbCFile)); - } - fprintf(file,"\n};\n"); - - if (type->preserve) - WriteTypePreserve(file,dpy,prefix,xkb,type); - } - if (type->level_names!=NULL) { - fprintf(file,"static Atom lnames_%s[%d];\n",prefix, - type->num_levels); - } - fprintf(file,"\n"); - free(prefix); - prefix = NULL; + for (i = 0, type = map->types; i < map->num_types; i++, type++) { + if (!(prefix = strdup(XkbAtomText(dpy, type->name, XkbCFile)))) { + _XkbLibError(_XkbErrBadAlloc, "WriteCHdrKeyTypes", 0); + return False; + } + + if (type->map_count > 0) { + XkbKTMapEntryPtr entry; + + entry = type->map; + fprintf(file, "static XkbKTMapEntryRec map_%s[%d]= {\n", prefix, + type->map_count); + for (n = 0; n < (unsigned) type->map_count; n++, entry++) { + if (n != 0) + fprintf(file, ",\n"); + fprintf(file, " { %d, %6d, { %15s, %15s, %15s } }", + entry->active, + entry->level, + XkbModMaskText(entry->mods.mask, XkbCFile), + XkbModMaskText(entry->mods.real_mods, XkbCFile), + XkbVModMaskText(dpy, xkb, 0, entry->mods.vmods, + XkbCFile)); + } + fprintf(file, "\n};\n"); + + if (type->preserve) + WriteTypePreserve(file, dpy, prefix, xkb, type); + } + if (type->level_names != NULL) { + fprintf(file, "static Atom lnames_%s[%d];\n", prefix, + type->num_levels); + } + fprintf(file, "\n"); + free(prefix); + prefix = NULL; } - fprintf(file,"static XkbKeyTypeRec dflt_types[]= {\n"); - for (i=0,type=map->types;i<(unsigned)map->num_types;i++,type++) { - if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) { - _XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0); - return False; - } - if (i!=0) fprintf(file,",\n"); - fprintf(file," {\n { %15s, %15s, %15s },\n", - XkbModMaskText(type->mods.mask,XkbCFile), - XkbModMaskText(type->mods.real_mods,XkbCFile), - XkbVModMaskText(dpy,xkb,0,type->mods.vmods,XkbCFile)); - fprintf(file," %d,\n",type->num_levels); - fprintf(file," %d,",type->map_count); - if (type->map_count>0) - fprintf(file," map_%s,",prefix); - else fprintf(file," NULL,"); - if (type->preserve) - fprintf(file," preserve_%s,\n",prefix); - else fprintf(file," NULL,\n"); - if (type->level_names!=NULL) - fprintf(file," None, lnames_%s\n }",prefix); - else fprintf(file," None, NULL\n }"); - free(prefix); - prefix = NULL; + fprintf(file, "static XkbKeyTypeRec dflt_types[]= {\n"); + for (i = 0, type = map->types; i < (unsigned) map->num_types; i++, type++) { + if (!(prefix = strdup(XkbAtomText(dpy, type->name, XkbCFile)))) { + _XkbLibError(_XkbErrBadAlloc, "WriteCHdrKeyTypes", 0); + return False; + } + if (i != 0) + fprintf(file, ",\n"); + fprintf(file, " {\n { %15s, %15s, %15s },\n", + XkbModMaskText(type->mods.mask, XkbCFile), + XkbModMaskText(type->mods.real_mods, XkbCFile), + XkbVModMaskText(dpy, xkb, 0, type->mods.vmods, XkbCFile)); + fprintf(file, " %d,\n", type->num_levels); + fprintf(file, " %d,", type->map_count); + if (type->map_count > 0) + fprintf(file, " map_%s,", prefix); + else + fprintf(file, " NULL,"); + if (type->preserve) + fprintf(file, " preserve_%s,\n", prefix); + else + fprintf(file, " NULL,\n"); + if (type->level_names != NULL) + fprintf(file, " None, lnames_%s\n }", prefix); + else + fprintf(file, " None, NULL\n }"); + free(prefix); + prefix = NULL; } - fprintf(file,"\n};\n"); - fprintf(file,"#define num_dflt_types (sizeof(dflt_types)/sizeof(XkbKeyTypeRec))\n"); - WriteTypeInitFunc(file,dpy,xkb); + fprintf(file, "\n};\n"); + fprintf(file, + "#define num_dflt_types (sizeof(dflt_types)/sizeof(XkbKeyTypeRec))\n"); + WriteTypeInitFunc(file, dpy, xkb); return True; } static Bool -WriteCHdrCompatMap(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrCompatMap(FILE *file, Display *dpy, XkbDescPtr xkb) { -register unsigned i; -XkbCompatMapPtr compat; -XkbSymInterpretPtr interp; + register unsigned i; + XkbCompatMapPtr compat; + XkbSymInterpretPtr interp; - if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) { - _XkbLibError(_XkbErrMissingSymInterps,"WriteCHdrInterp",0); - return False; + if ((!xkb) || (!xkb->compat) || (!xkb->compat->sym_interpret)) { + _XkbLibError(_XkbErrMissingSymInterps, "WriteCHdrInterp", 0); + return False; } - compat= xkb->compat; - if ((xkb->names!=NULL)&&(xkb->names->compat!=None)) { - fprintf(file,"/* compat name is \"%s\" */\n", - XkbAtomText(dpy,xkb->names->compat,XkbCFile)); + compat = xkb->compat; + if ((xkb->names != NULL) && (xkb->names->compat != None)) { + fprintf(file, "/* compat name is \"%s\" */\n", + XkbAtomText(dpy, xkb->names->compat, XkbCFile)); } - fprintf(file,"static XkbSymInterpretRec dfltSI[%d]= {\n", - compat->num_si); - interp= compat->sym_interpret; - for (i=0;i<compat->num_si;i++,interp++) { - XkbAction *act; - act= (XkbAction *)&interp->act; - if (i!=0) fprintf(file,",\n"); - fprintf(file," { %s, ",XkbKeysymText(interp->sym,XkbCFile)); - fprintf(file,"0x%04x,\n",interp->flags); - fprintf(file," %s, ",XkbSIMatchText(interp->match,XkbCFile)); - fprintf(file,"%s,\n",XkbModMaskText(interp->mods,XkbCFile)); - fprintf(file," %d,\n",interp->virtual_mod); - fprintf(file," %s }",XkbActionText(dpy,xkb,act,XkbCFile)); + fprintf(file, "static XkbSymInterpretRec dfltSI[%d]= {\n", compat->num_si); + interp = compat->sym_interpret; + for (i = 0; i < compat->num_si; i++, interp++) { + XkbAction *act; + + act = (XkbAction *) &interp->act; + if (i != 0) + fprintf(file, ",\n"); + fprintf(file, " { %s, ", XkbKeysymText(interp->sym, XkbCFile)); + fprintf(file, "0x%04x,\n", interp->flags); + fprintf(file, " %s, ", XkbSIMatchText(interp->match, XkbCFile)); + fprintf(file, "%s,\n", XkbModMaskText(interp->mods, XkbCFile)); + fprintf(file, " %d,\n", interp->virtual_mod); + fprintf(file, " %s }", XkbActionText(dpy, xkb, act, XkbCFile)); } - fprintf(file,"\n};\n"); + fprintf(file, "\n};\n"); fprintf(file, - "#define num_dfltSI (sizeof(dfltSI)/sizeof(XkbSymInterpretRec))\n"); - fprintf(file,"\nstatic XkbCompatMapRec compatMap= {\n"); - fprintf(file," dfltSI,\n"); - fprintf(file," { /* group compatibility */\n "); - for (i=0;i<XkbNumKbdGroups;i++) { - XkbModsPtr gc; - gc= &xkb->compat->groups[i]; - fprintf(file,"%s{ %12s, %12s, %12s }", - ((i==0)?"":",\n "), - XkbModMaskText(gc->mask,XkbCFile), - XkbModMaskText(gc->real_mods,XkbCFile), - XkbVModMaskText(xkb->dpy,xkb,0,gc->vmods,XkbCFile)); + "#define num_dfltSI (sizeof(dfltSI)/sizeof(XkbSymInterpretRec))\n"); + fprintf(file, "\nstatic XkbCompatMapRec compatMap= {\n"); + fprintf(file, " dfltSI,\n"); + fprintf(file, " { /* group compatibility */\n "); + for (i = 0; i < XkbNumKbdGroups; i++) { + XkbModsPtr gc; + + gc = &xkb->compat->groups[i]; + fprintf(file, "%s{ %12s, %12s, %12s }", + ((i == 0) ? "" : ",\n "), + XkbModMaskText(gc->mask, XkbCFile), + XkbModMaskText(gc->real_mods, XkbCFile), + XkbVModMaskText(xkb->dpy, xkb, 0, gc->vmods, XkbCFile)); } - fprintf(file,"\n },\n"); - fprintf(file," num_dfltSI, num_dfltSI\n"); - fprintf(file,"};\n\n"); + fprintf(file, "\n },\n"); + fprintf(file, " num_dfltSI, num_dfltSI\n"); + fprintf(file, "};\n\n"); return True; } static Bool -WriteCHdrSymbols(FILE *file,XkbDescPtr xkb) +WriteCHdrSymbols(FILE *file, XkbDescPtr xkb) { -register unsigned i; + register unsigned i; - if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { - _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrSymbols",0); - return False; + if ((!xkb) || (!xkb->map) || (!xkb->map->syms) || (!xkb->map->key_sym_map)) { + _XkbLibError(_XkbErrMissingSymbols, "WriteCHdrSymbols", 0); + return False; } - fprintf(file,"#define NUM_SYMBOLS %d\n",xkb->map->num_syms); - if (xkb->map->num_syms>0) { - register KeySym *sym; - sym= xkb->map->syms; - fprintf(file,"static KeySym symCache[NUM_SYMBOLS]= {\n"); - for (i=0;i<xkb->map->num_syms;i++,sym++) { - if (i==0) fprintf(file," "); - else if (i%4==0) fprintf(file,",\n "); - else fprintf(file,", "); - fprintf(file,"%15s",XkbKeysymText(*sym,XkbCFile)); - } - fprintf(file,"\n};\n"); + fprintf(file, "#define NUM_SYMBOLS %d\n", xkb->map->num_syms); + if (xkb->map->num_syms > 0) { + register KeySym *sym; + + sym = xkb->map->syms; + fprintf(file, "static KeySym symCache[NUM_SYMBOLS]= {\n"); + for (i = 0; i < xkb->map->num_syms; i++, sym++) { + if (i == 0) + fprintf(file, " "); + else if (i % 4 == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + fprintf(file, "%15s", XkbKeysymText(*sym, XkbCFile)); + } + fprintf(file, "\n};\n"); } - if (xkb->max_key_code>0) { - register XkbSymMapPtr map; - map= xkb->map->key_sym_map; - fprintf(file,"static XkbSymMapRec symMap[NUM_KEYS]= {\n"); - for (i=0;i<=xkb->max_key_code;i++,map++) { - if (i==0) fprintf(file," "); - else if ((i&3)==0) fprintf(file,",\n "); - else fprintf(file,", "); - fprintf(file, "{ %2d, 0x%x, %3d }", - map->kt_index[0], map->group_info, map->offset); - } - fprintf(file,"\n};\n"); + if (xkb->max_key_code > 0) { + register XkbSymMapPtr map; + + map = xkb->map->key_sym_map; + fprintf(file, "static XkbSymMapRec symMap[NUM_KEYS]= {\n"); + for (i = 0; i <= xkb->max_key_code; i++, map++) { + if (i == 0) + fprintf(file, " "); + else if ((i & 3) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + fprintf(file, "{ %2d, 0x%x, %3d }", + map->kt_index[0], map->group_info, map->offset); + } + fprintf(file, "\n};\n"); } return True; } static Bool -WriteCHdrClientMap(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrClientMap(FILE *file, Display *dpy, XkbDescPtr xkb) { - if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { - _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrClientMap",0); - return False; + if ((!xkb) || (!xkb->map) || (!xkb->map->syms) || (!xkb->map->key_sym_map)) { + _XkbLibError(_XkbErrMissingSymbols, "WriteCHdrClientMap", 0); + return False; } - if (!WriteCHdrKeyTypes(file,dpy,xkb)) - return False; - if (!WriteCHdrSymbols(file,xkb)) - return False; - fprintf(file,"static XkbClientMapRec clientMap= {\n"); - fprintf(file," NUM_TYPES, NUM_TYPES, types, \n"); - fprintf(file," NUM_SYMBOLS, NUM_SYMBOLS, symCache, symMap\n"); - fprintf(file,"};\n\n"); + if (!WriteCHdrKeyTypes(file, dpy, xkb)) + return False; + if (!WriteCHdrSymbols(file, xkb)) + return False; + fprintf(file, "static XkbClientMapRec clientMap= {\n"); + fprintf(file, " NUM_TYPES, NUM_TYPES, types, \n"); + fprintf(file, " NUM_SYMBOLS, NUM_SYMBOLS, symCache, symMap\n"); + fprintf(file, "};\n\n"); return True; } static Bool -WriteCHdrServerMap(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrServerMap(FILE *file, Display *dpy, XkbDescPtr xkb) { -register unsigned i; + register unsigned i; - if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { - _XkbLibError(_XkbErrMissingSymbols,"WriteCHdrServerMap",0); - return False; + if ((!xkb) || (!xkb->map) || (!xkb->map->syms) || (!xkb->map->key_sym_map)) { + _XkbLibError(_XkbErrMissingSymbols, "WriteCHdrServerMap", 0); + return False; } - if (xkb->server->num_acts>0) { - register XkbAnyAction *act; - act= (XkbAnyAction *)xkb->server->acts; - fprintf(file,"#define NUM_ACTIONS %d\n",xkb->server->num_acts); - fprintf(file,"static XkbAnyAction actionCache[NUM_ACTIONS]= {\n"); - for (i=0;i<xkb->server->num_acts;i++,act++) { - if (i==0) fprintf(file," "); - else fprintf(file,",\n "); - fprintf(file,"%s",XkbActionText(dpy,xkb,(XkbAction *)act,XkbCFile)); - } - fprintf(file,"\n};\n"); + if (xkb->server->num_acts > 0) { + register XkbAnyAction *act; + + act = (XkbAnyAction *) xkb->server->acts; + fprintf(file, "#define NUM_ACTIONS %d\n", xkb->server->num_acts); + fprintf(file, "static XkbAnyAction actionCache[NUM_ACTIONS]= {\n"); + for (i = 0; i < xkb->server->num_acts; i++, act++) { + if (i == 0) + fprintf(file, " "); + else + fprintf(file, ",\n "); + fprintf(file, "%s", + XkbActionText(dpy, xkb, (XkbAction *) act, XkbCFile)); + } + fprintf(file, "\n};\n"); } - fprintf(file,"static unsigned short keyActions[NUM_KEYS]= {\n"); - for (i=0;i<=xkb->max_key_code;i++) { - if (i==0) fprintf(file," "); - else if ((i&0xf)==0) fprintf(file,",\n "); - else fprintf(file,", "); - fprintf(file,"%2d",xkb->server->key_acts[i]); + fprintf(file, "static unsigned short keyActions[NUM_KEYS]= {\n"); + for (i = 0; i <= xkb->max_key_code; i++) { + if (i == 0) + fprintf(file, " "); + else if ((i & 0xf) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + fprintf(file, "%2d", xkb->server->key_acts[i]); } - fprintf(file,"\n};\n"); - fprintf(file,"static XkbBehavior behaviors[NUM_KEYS]= {\n"); - for (i=0;i<=xkb->max_key_code;i++) { - if (i==0) fprintf(file," "); - else if ((i&0x3)==0) fprintf(file,",\n "); - else fprintf(file,", "); - if (xkb->server->behaviors) { - fprintf(file,"%s", - XkbBehaviorText(xkb,&xkb->server->behaviors[i],XkbCFile)); - } - else fprintf(file,"{ 0, 0 }"); + fprintf(file, "\n};\n"); + fprintf(file, "static XkbBehavior behaviors[NUM_KEYS]= {\n"); + for (i = 0; i <= xkb->max_key_code; i++) { + if (i == 0) + fprintf(file, " "); + else if ((i & 0x3) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + if (xkb->server->behaviors) { + fprintf(file, "%s", + XkbBehaviorText(xkb, &xkb->server->behaviors[i], XkbCFile)); + } + else + fprintf(file, "{ 0, 0 }"); } - fprintf(file,"\n};\n"); - fprintf(file,"static unsigned char explicit_parts[NUM_KEYS]= {\n"); - for (i=0;i<=xkb->max_key_code;i++) { - if (i==0) fprintf(file," "); - else if ((i&0x7)==0) fprintf(file,",\n "); - else fprintf(file,", "); - if ((xkb->server->explicit==NULL)||(xkb->server->explicit[i]==0)) - fprintf(file," 0"); - else fprintf(file,"0x%02x",xkb->server->explicit[i]); + fprintf(file, "\n};\n"); + fprintf(file, "static unsigned char explicit_parts[NUM_KEYS]= {\n"); + for (i = 0; i <= xkb->max_key_code; i++) { + if (i == 0) + fprintf(file, " "); + else if ((i & 0x7) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + if ((xkb->server->explicit == NULL) || (xkb->server->explicit[i] == 0)) + fprintf(file, " 0"); + else + fprintf(file, "0x%02x", xkb->server->explicit[i]); } - fprintf(file,"\n};\n"); - fprintf(file,"static unsigned short vmodmap[NUM_KEYS]= {\n"); - for (i=0;i<xkb->max_key_code;i++) { - if (i==0) fprintf(file," "); - else if ((i&0x7)==0) fprintf(file,",\n "); - else fprintf(file,", "); - if ((xkb->server->vmodmap==NULL)||(xkb->server->vmodmap[i]==0)) - fprintf(file," 0"); - else fprintf(file,"0x%04x",xkb->server->vmodmap[i]); + fprintf(file, "\n};\n"); + fprintf(file, "static unsigned short vmodmap[NUM_KEYS]= {\n"); + for (i = 0; i < xkb->max_key_code; i++) { + if (i == 0) + fprintf(file, " "); + else if ((i & 0x7) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + if ((xkb->server->vmodmap == NULL) || (xkb->server->vmodmap[i] == 0)) + fprintf(file, " 0"); + else + fprintf(file, "0x%04x", xkb->server->vmodmap[i]); } - fprintf(file,"};\n"); - fprintf(file,"static XkbServerMapRec serverMap= {\n"); - fprintf(file," %d, %d, (XkbAction *)actionCache,\n", - xkb->server->num_acts,xkb->server->num_acts); - fprintf(file," behaviors, keyActions, explicit_parts,\n"); - for (i=0;i<XkbNumVirtualMods;i++) { - if (i==0) fprintf(file," { "); - else if (i==8) fprintf(file,",\n "); - else fprintf(file,", "); - fprintf(file,"%3d",xkb->server->vmods[i]); + fprintf(file, "};\n"); + fprintf(file, "static XkbServerMapRec serverMap= {\n"); + fprintf(file, " %d, %d, (XkbAction *)actionCache,\n", + xkb->server->num_acts, xkb->server->num_acts); + fprintf(file, " behaviors, keyActions, explicit_parts,\n"); + for (i = 0; i < XkbNumVirtualMods; i++) { + if (i == 0) + fprintf(file, " { "); + else if (i == 8) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + fprintf(file, "%3d", xkb->server->vmods[i]); } - fprintf(file," },\n"); - fprintf(file," vmodmap\n"); - fprintf(file,"};\n\n"); + fprintf(file, " },\n"); + fprintf(file, " vmodmap\n"); + fprintf(file, "};\n\n"); return True; } static Bool -WriteCHdrIndicators(FILE *file,Display *dpy,XkbDescPtr xkb) +WriteCHdrIndicators(FILE *file, Display *dpy, XkbDescPtr xkb) { -register int i,nNames; -XkbIndicatorMapPtr imap; + register int i, nNames; + XkbIndicatorMapPtr imap; - if (xkb->indicators==NULL) - return True; + if (xkb->indicators == NULL) + return True; fprintf(file, "static XkbIndicatorRec indicators= {\n"); fprintf(file, " 0x%lx,\n {\n", - (long)xkb->indicators->phys_indicators); - for (imap=xkb->indicators->maps,i=nNames=0;i<XkbNumIndicators;i++,imap++) { - fprintf(file,"%s { 0x%02x, %s, 0x%02x, %s, { %s, ", - (i!=0?",\n":""), - imap->flags, - XkbIMWhichStateMaskText(imap->which_groups,XkbCFile), - imap->groups, - XkbIMWhichStateMaskText(imap->which_mods,XkbCFile), - XkbModMaskText(imap->mods.mask,XkbCFile)); - fprintf(file," %s, %s }, %s }", - XkbModMaskText(imap->mods.real_mods,XkbCFile), - XkbVModMaskText(dpy,xkb,0,imap->mods.vmods,XkbCFile), - XkbControlsMaskText(imap->ctrls,XkbCFile)); - if (xkb->names && (xkb->names->indicators[i]!=None)) - nNames++; + (long) xkb->indicators->phys_indicators); + for (imap = xkb->indicators->maps, i = nNames = 0; i < XkbNumIndicators; + i++, imap++) { + fprintf(file, "%s { 0x%02x, %s, 0x%02x, %s, { %s, ", + (i != 0 ? ",\n" : ""), imap->flags, + XkbIMWhichStateMaskText(imap->which_groups, XkbCFile), + imap->groups, XkbIMWhichStateMaskText(imap->which_mods, + XkbCFile), + XkbModMaskText(imap->mods.mask, XkbCFile)); + fprintf(file, " %s, %s }, %s }", + XkbModMaskText(imap->mods.real_mods, XkbCFile), + XkbVModMaskText(dpy, xkb, 0, imap->mods.vmods, XkbCFile), + XkbControlsMaskText(imap->ctrls, XkbCFile)); + if (xkb->names && (xkb->names->indicators[i] != None)) + nNames++; } - fprintf(file,"\n }\n};\n"); - if (nNames>0) { - fprintf(file,"static void\n"); - fprintf(file,"initIndicatorNames(DPYTYPE dpy,XkbDescPtr xkb)\n"); - fprintf(file,"{\n"); - for (i=0;i<XkbNumIndicators;i++) { - Atom name; - if (xkb->names->indicators[i]==None) - continue; - name= xkb->names->indicators[i]; - fprintf(file," xkb->names->indicators[%2d]= ",i); - fprintf(file,"GET_ATOM(dpy,\"%s\");\n", - XkbAtomText(dpy,name,XkbCFile)); - } - fprintf(file,"}\n"); + fprintf(file, "\n }\n};\n"); + if (nNames > 0) { + fprintf(file, "static void\n"); + fprintf(file, "initIndicatorNames(DPYTYPE dpy,XkbDescPtr xkb)\n"); + fprintf(file, "{\n"); + for (i = 0; i < XkbNumIndicators; i++) { + Atom name; + + if (xkb->names->indicators[i] == None) + continue; + name = xkb->names->indicators[i]; + fprintf(file, " xkb->names->indicators[%2d]= ", i); + fprintf(file, "GET_ATOM(dpy,\"%s\");\n", + XkbAtomText(dpy, name, XkbCFile)); + } + fprintf(file, "}\n"); } return True; } static Bool -WriteCHdrGeomProps(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) +WriteCHdrGeomProps(FILE *file, XkbDescPtr xkb, XkbGeometryPtr geom) { - if (geom->num_properties>0) { - register int i; - fprintf(file,"\nstatic XkbPropertyRec g_props[%d]= {\n", - geom->num_properties); - for (i=0;i<geom->num_properties;i++) { - fprintf(file,"%s { \"%s\", \"%s\" }",(i==0?"":",\n"), - XkbStringText(geom->properties[i].name,XkbCFile), - XkbStringText(geom->properties[i].value,XkbCFile)); - } - fprintf(file,"\n};\n"); + if (geom->num_properties > 0) { + register int i; + + fprintf(file, "\nstatic XkbPropertyRec g_props[%d]= {\n", + geom->num_properties); + for (i = 0; i < geom->num_properties; i++) { + fprintf(file, "%s { \"%s\", \"%s\" }", + (i == 0 ? "" : ",\n"), + XkbStringText(geom->properties[i].name, XkbCFile), + XkbStringText(geom->properties[i].value, XkbCFile)); + } + fprintf(file, "\n};\n"); } return True; } static Bool -WriteCHdrGeomColors(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) +WriteCHdrGeomColors(FILE *file, XkbDescPtr xkb, XkbGeometryPtr geom) { - if (geom->num_colors>0) { - register int i; - fprintf(file,"\nstatic XkbColorRec g_colors[%d]= {\n",geom->num_colors); - for (i=0;i<geom->num_colors;i++) { - fprintf(file,"%s { %3d, \"%s\" }",(i==0?"":",\n"), - geom->colors[i].pixel, - XkbStringText(geom->colors[i].spec,XkbCFile)); - } - fprintf(file,"\n};\n"); + if (geom->num_colors > 0) { + register int i; + + fprintf(file, "\nstatic XkbColorRec g_colors[%d]= {\n", + geom->num_colors); + for (i = 0; i < geom->num_colors; i++) { + fprintf(file, "%s { %3d, \"%s\" }", + (i == 0 ? "" : ",\n"), geom->colors[i].pixel, + XkbStringText(geom->colors[i].spec, XkbCFile)); + } + fprintf(file, "\n};\n"); } return True; } static Bool -WriteCHdrGeomOutlines(FILE *file,int nOL,XkbOutlinePtr ol,int shapeNdx) +WriteCHdrGeomOutlines(FILE *file, int nOL, XkbOutlinePtr ol, int shapeNdx) { -register int o,p; - - - for (o=0;o<nOL;o++) { - fprintf(file,"\nstatic XkbPointRec pts_sh%02do%02d[]= {\n",shapeNdx,o); - for (p=0;p<ol[o].num_points;p++) { - if (p==0) fprintf(file," "); - else if ((p&0x3)==0) fprintf(file,",\n "); - else fprintf(file,", "); - fprintf(file,"{ %4d, %4d }", - ol[o].points[p].x,ol[o].points[p].y); - } - fprintf(file,"\n};"); + register int o, p; + + for (o = 0; o < nOL; o++) { + fprintf(file, "\nstatic XkbPointRec pts_sh%02do%02d[]= {\n", shapeNdx, + o); + for (p = 0; p < ol[o].num_points; p++) { + if (p == 0) + fprintf(file, " "); + else if ((p & 0x3) == 0) + fprintf(file, ",\n "); + else + fprintf(file, ", "); + fprintf(file, "{ %4d, %4d }", ol[o].points[p].x, ol[o].points[p].y); + } + fprintf(file, "\n};"); } - fprintf(file,"\n\nstatic XkbOutlineRec ol_sh%02d[]= {\n",shapeNdx); - for (o=0;o<nOL;o++) { - fprintf(file,"%s { %d, %d, %d, pts_sh%02do%02d }", - (o==0?"":",\n"), - ol[o].num_points,ol[o].num_points, - ol[o].corner_radius,shapeNdx,o); + fprintf(file, "\n\nstatic XkbOutlineRec ol_sh%02d[]= {\n", shapeNdx); + for (o = 0; o < nOL; o++) { + fprintf(file, "%s { %d, %d, %d, pts_sh%02do%02d }", + (o == 0 ? "" : ",\n"), + ol[o].num_points, ol[o].num_points, + ol[o].corner_radius, shapeNdx, o); } - fprintf(file,"\n};\n"); + fprintf(file, "\n};\n"); return True; } static Bool -WriteCHdrGeomShapes(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) +WriteCHdrGeomShapes(FILE *file, XkbDescPtr xkb, XkbGeometryPtr geom) { -register int s; -register XkbShapePtr shape; + register int s; + register XkbShapePtr shape; - for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) { - WriteCHdrGeomOutlines(file,shape->num_outlines,shape->outlines,s); + for (s = 0, shape = geom->shapes; s < geom->num_shapes; s++, shape++) { + WriteCHdrGeomOutlines(file, shape->num_outlines, shape->outlines, s); } - fprintf(file,"\n\nstatic XkbShapeRec g_shapes[%d]= {\n",geom->num_shapes); - for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) { - fprintf(file,"%s { None, %3d, %3d, ol_sh%02d, ", - (s==0?"":",\n"),shape->num_outlines, - shape->num_outlines,s); - if (shape->approx) { - fprintf(file,"&ol_sh%02d[%2d], ",s, - XkbOutlineIndex(shape,shape->approx)); - } - else fprintf(file," NULL, "); - if (shape->primary) { - fprintf(file,"&ol_sh%02d[%2d],\n",s, - XkbOutlineIndex(shape,shape->primary)); - } - else fprintf(file," NULL,\n"); - fprintf(file," { %4d, %4d, %4d, %4d } }", - shape->bounds.x1,shape->bounds.y1, - shape->bounds.x2,shape->bounds.y2); + fprintf(file, "\n\nstatic XkbShapeRec g_shapes[%d]= {\n", geom->num_shapes); + for (s = 0, shape = geom->shapes; s < geom->num_shapes; s++, shape++) { + fprintf(file, "%s { None, %3d, %3d, ol_sh%02d, ", + (s == 0 ? "" : ",\n"), shape->num_outlines, + shape->num_outlines, s); + if (shape->approx) { + fprintf(file, "&ol_sh%02d[%2d], ", s, + XkbOutlineIndex(shape, shape->approx)); + } + else + fprintf(file, " NULL, "); + if (shape->primary) { + fprintf(file, "&ol_sh%02d[%2d],\n", s, + XkbOutlineIndex(shape, shape->primary)); + } + else + fprintf(file, " NULL,\n"); + fprintf(file, + " { %4d, %4d, %4d, %4d } }", + shape->bounds.x1, shape->bounds.y1, + shape->bounds.x2, shape->bounds.y2); } - fprintf(file,"\n};\n"); + fprintf(file, "\n};\n"); return True; } static Bool -WriteCHdrGeomDoodads( FILE * file, - XkbDescPtr xkb, - XkbGeometryPtr geom, - XkbSectionPtr section, - int section_num) +WriteCHdrGeomDoodads(FILE * file, + XkbDescPtr xkb, + XkbGeometryPtr geom, + XkbSectionPtr section, + int section_num) { -int nd,d; -XkbDoodadPtr doodad; -Display * dpy; - - dpy= xkb->dpy; - if (section==NULL) { - if (geom->num_doodads>0) { - fprintf(file,"static XkbDoodadRec g_doodads[%d];\n", - geom->num_doodads); - } - fprintf(file,"static void\n"); - fprintf(file,"_InitGeomDoodads(DPYTYPE dpy,XkbGeometryPtr geom)\n"); - fprintf(file,"{\n"); - fprintf(file,"register XkbDoodadPtr doodads;\n\n"); - fprintf(file," doodads= geom->doodads;\n"); - nd= geom->num_doodads; - doodad= geom->doodads; + int nd, d; + XkbDoodadPtr doodad; + Display * dpy; + + dpy = xkb->dpy; + if (section == NULL) { + if (geom->num_doodads > 0) { + fprintf(file, "static XkbDoodadRec g_doodads[%d];\n", + geom->num_doodads); + } + fprintf(file, "static void\n"); + fprintf(file, "_InitGeomDoodads(DPYTYPE dpy,XkbGeometryPtr geom)\n"); + fprintf(file, "{\n"); + fprintf(file, "register XkbDoodadPtr doodads;\n\n"); + fprintf(file, " doodads= geom->doodads;\n"); + nd = geom->num_doodads; + doodad = geom->doodads; } else { - if (section->num_doodads>0) { - fprintf(file,"static XkbDoodadRec doodads_s%02d[%d];\n", - section_num,section->num_doodads); - } - fprintf(file,"static void\n"); - fprintf(file,"_InitS%02dDoodads(",section_num); - fprintf(file," DPYTYPE dpy,\n"); - fprintf(file," XkbGeometryPtr geom,\n"); - fprintf(file," XkbSectionPtr section)\n"); - fprintf(file,"{\n"); - fprintf(file,"register XkbDoodadPtr doodads;\n\n"); - fprintf(file," doodads= section->doodads;\n"); - nd= geom->num_doodads; - doodad= geom->doodads; + if (section->num_doodads > 0) { + fprintf(file, "static XkbDoodadRec doodads_s%02d[%d];\n", + section_num, section->num_doodads); + } + fprintf(file, "static void\n"); + fprintf(file, "_InitS%02dDoodads(", section_num); + fprintf(file, " DPYTYPE dpy,\n"); + fprintf(file, " XkbGeometryPtr geom,\n"); + fprintf(file, " XkbSectionPtr section)\n"); + fprintf(file, "{\n"); + fprintf(file, "register XkbDoodadPtr doodads;\n\n"); + fprintf(file, " doodads= section->doodads;\n"); + nd = geom->num_doodads; + doodad = geom->doodads; } - for (d=0;d<nd;d++,doodad++) { - if (d!=0) fprintf(file,"\n"); - fprintf(file," doodads[%d].any.name= GET_ATOM(dpy,\"%s\");\n",d, - XkbAtomText(dpy,doodad->any.name,XkbCFile)); - fprintf(file," doodads[%d].any.type= %s;\n",d, - XkbDoodadTypeText(doodad->any.type,XkbCFile)); - fprintf(file," doodads[%d].any.priority= %d;\n",d, - doodad->any.priority); - fprintf(file," doodads[%d].any.top= %d;\n",d,doodad->any.top); - fprintf(file," doodads[%d].any.left= %d;\n",d,doodad->any.left); - fprintf(file," doodads[%d].any.angle= %d;\n",d,doodad->any.angle); - switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - fprintf(file," doodads[%d].shape.color_ndx= %d;\n",d, - doodad->shape.color_ndx); - fprintf(file," doodads[%d].shape.shape_ndx= %d;\n",d, - doodad->shape.shape_ndx); - break; - case XkbTextDoodad: - fprintf(file," doodads[%d].text.width= %d;\n",d, - doodad->text.width); - fprintf(file," doodads[%d].text.height= %d;\n",d, - doodad->text.height); - fprintf(file," doodads[%d].text.color_ndx= %d;\n",d, - doodad->text.color_ndx); - fprintf(file," doodads[%d].text.text= \"%s\";\n",d, - XkbStringText(doodad->text.text,XkbCFile)); - fprintf(file," doodads[%d].text.font= \"%s\";\n",d, - XkbStringText(doodad->text.font,XkbCFile)); - break; - case XkbIndicatorDoodad: - fprintf(file," doodads[%d].indicator.shape_ndx= %d;\n",d, - doodad->indicator.shape_ndx); - fprintf(file," doodads[%d].indicator.on_color_ndx= %d;\n",d, - doodad->indicator.on_color_ndx); - fprintf(file," doodads[%d].indicator.off_color_ndx= %d;\n",d, - doodad->indicator.off_color_ndx); - break; - case XkbLogoDoodad: - fprintf(file," doodads[%d].logo.color_ndx= %d;\n",d, - doodad->logo.color_ndx); - fprintf(file," doodads[%d].logo.shape_ndx= %d;\n",d, - doodad->logo.shape_ndx); - fprintf(file," doodads[%d].logo.logo_name= \"%s\";\n",d, - XkbStringText(doodad->logo.logo_name,XkbCFile)); - break; - } + for (d = 0; d < nd; d++, doodad++) { + if (d != 0) + fprintf(file, "\n"); + fprintf(file, " doodads[%d].any.name= GET_ATOM(dpy,\"%s\");\n", + d, XkbAtomText(dpy, doodad->any.name, XkbCFile)); + fprintf(file, " doodads[%d].any.type= %s;\n", + d, XkbDoodadTypeText(doodad->any.type, XkbCFile)); + fprintf(file, " doodads[%d].any.priority= %d;\n", + d, doodad->any.priority); + fprintf(file, " doodads[%d].any.top= %d;\n", d, doodad->any.top); + fprintf(file, " doodads[%d].any.left= %d;\n", d, doodad->any.left); + fprintf(file, " doodads[%d].any.angle= %d;\n", d, doodad->any.angle); + switch (doodad->any.type) { + case XkbOutlineDoodad: + case XkbSolidDoodad: + fprintf(file, " doodads[%d].shape.color_ndx= %d;\n", + d, doodad->shape.color_ndx); + fprintf(file, " doodads[%d].shape.shape_ndx= %d;\n", + d, doodad->shape.shape_ndx); + break; + case XkbTextDoodad: + fprintf(file, " doodads[%d].text.width= %d;\n", + d, doodad->text.width); + fprintf(file, " doodads[%d].text.height= %d;\n", + d, doodad->text.height); + fprintf(file, " doodads[%d].text.color_ndx= %d;\n", + d, doodad->text.color_ndx); + fprintf(file, " doodads[%d].text.text= \"%s\";\n", + d, XkbStringText(doodad->text.text, XkbCFile)); + fprintf(file, " doodads[%d].text.font= \"%s\";\n", + d, XkbStringText(doodad->text.font, XkbCFile)); + break; + case XkbIndicatorDoodad: + fprintf(file, " doodads[%d].indicator.shape_ndx= %d;\n", + d, doodad->indicator.shape_ndx); + fprintf(file, " doodads[%d].indicator.on_color_ndx= %d;\n", + d, doodad->indicator.on_color_ndx); + fprintf(file, " doodads[%d].indicator.off_color_ndx= %d;\n", + d, doodad->indicator.off_color_ndx); + break; + case XkbLogoDoodad: + fprintf(file, " doodads[%d].logo.color_ndx= %d;\n", + d, doodad->logo.color_ndx); + fprintf(file, " doodads[%d].logo.shape_ndx= %d;\n", + d, doodad->logo.shape_ndx); + fprintf(file, " doodads[%d].logo.logo_name= \"%s\";\n", + d, XkbStringText(doodad->logo.logo_name, XkbCFile)); + break; + } } - fprintf(file,"}\n"); + fprintf(file, "}\n"); return True; } static Bool -WriteCHdrGeomOverlays( FILE * file, - XkbDescPtr xkb, - XkbSectionPtr section, - int section_num) +WriteCHdrGeomOverlays(FILE * file, + XkbDescPtr xkb, + XkbSectionPtr section, + int section_num) { -register int o,r,k; -XkbOverlayPtr ol; -XkbOverlayRowPtr row; -XkbOverlayKeyPtr key; - - if (section->num_overlays<1) - return True; - for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { - for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { - fprintf(file,"static XkbOverlayKeyRec olkeys_s%02dr%02d[%d]= {\n", - section_num,r,row->num_keys); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - fprintf(file,"%s { {\"%s\"}, {\"%s\"} }", - (k==0?"":",\n"), - XkbKeyNameText(key->over.name,XkbCFile), - XkbKeyNameText(key->under.name,XkbCFile)); - } - fprintf(file,"\n};\n"); - } - fprintf(file,"static XkbOverlayRowRec olrows_s%02d[%d]= {\n", - section_num,section->num_rows); - for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { - fprintf(file,"%s { %4d, %4d, %4d, olkeys_s%02dr%02d }", - (r==0?"":",\n"), - row->row_under,row->num_keys,row->num_keys, - section_num,r); - } - fprintf(file,"\n};\n"); + register int o, r, k; + XkbOverlayPtr ol; + XkbOverlayRowPtr row; + XkbOverlayKeyPtr key; + + if (section->num_overlays < 1) + return True; + for (o = 0, ol = section->overlays; o < section->num_overlays; o++, ol++) { + for (r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { + fprintf(file, "static XkbOverlayKeyRec olkeys_s%02dr%02d[%d]= {\n", + section_num, r, row->num_keys); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + fprintf(file, "%s { {\"%s\"}, {\"%s\"} }", + (k == 0 ? "" : ",\n"), + XkbKeyNameText(key->over.name, XkbCFile), + XkbKeyNameText(key->under.name, XkbCFile)); + } + fprintf(file, "\n};\n"); + } + fprintf(file, "static XkbOverlayRowRec olrows_s%02d[%d]= {\n", + section_num, section->num_rows); + for (r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { + fprintf(file, "%s { %4d, %4d, %4d, olkeys_s%02dr%02d }", + (r == 0 ? "" : ",\n"), + row->row_under, row->num_keys, row->num_keys, + section_num, r); + } + fprintf(file, "\n};\n"); } - fprintf(file,"static XkbOverlayRec overlays_s%02d[%d]= {\n",section_num, - section->num_overlays); - for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { - fprintf(file,"%s {\n",(o==0?"":",\n")); - fprintf(file," None, /* name */\n"); - fprintf(file," NULL, /* section_under */\n"); - fprintf(file," %4d, /* num_rows */\n",ol->num_rows); - fprintf(file," %4d, /* sz_rows */\n",ol->num_rows); - fprintf(file," olrows_s%02d,\n",section_num); - fprintf(file," NULL /* bounds */\n"); - fprintf(file," }"); + fprintf(file, "static XkbOverlayRec overlays_s%02d[%d]= {\n", section_num, + section->num_overlays); + for (o = 0, ol = section->overlays; o < section->num_overlays; o++, ol++) { + fprintf(file, "%s {\n", (o == 0 ? "" : ",\n")); + fprintf(file, " None, /* name */\n"); + fprintf(file, " NULL, /* section_under */\n"); + fprintf(file, " %4d, /* num_rows */\n", ol->num_rows); + fprintf(file, " %4d, /* sz_rows */\n", ol->num_rows); + fprintf(file, " olrows_s%02d,\n", section_num); + fprintf(file, " NULL /* bounds */\n"); + fprintf(file, " }"); } - fprintf(file,"\n};\n"); - fprintf(file,"static void\n"); - fprintf(file,"_InitS%02dOverlay(",section_num); - fprintf(file," DPYTYPE dpy,\n"); - fprintf(file," XkbGeometryPtr geom,\n"); - fprintf(file," XkbSectionPtr section)\n"); - fprintf(file,"{\n"); - fprintf(file,"XkbOverlayPtr ol;\n\n"); - fprintf(file," ol= section->overlays;\n"); - for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) { - fprintf(file," ol[%2d].name= GET_ATOM(dpy,\"%s\");\n",o, - XkbAtomText(xkb->dpy,ol->name,XkbCFile)); - fprintf(file," ol[%2d].section_under= section;\n",o); + fprintf(file, "\n};\n"); + fprintf(file, "static void\n"); + fprintf(file, "_InitS%02dOverlay(", section_num); + fprintf(file, " DPYTYPE dpy,\n"); + fprintf(file, " XkbGeometryPtr geom,\n"); + fprintf(file, " XkbSectionPtr section)\n"); + fprintf(file, "{\n"); + fprintf(file, "XkbOverlayPtr ol;\n\n"); + fprintf(file, " ol= section->overlays;\n"); + for (o = 0, ol = section->overlays; o < section->num_overlays; o++, ol++) { + fprintf(file, " ol[%2d].name= GET_ATOM(dpy,\"%s\");\n", + o, XkbAtomText(xkb->dpy, ol->name, XkbCFile)); + fprintf(file, " ol[%2d].section_under= section;\n", o); } - fprintf(file,"}\n"); + fprintf(file, "}\n"); return True; } static Bool -WriteCHdrGeomRows( FILE * file, - XkbDescPtr xkb, - XkbSectionPtr section, - int section_num) +WriteCHdrGeomRows(FILE * file, + XkbDescPtr xkb, + XkbSectionPtr section, + int section_num) { -register int k,r; -register XkbRowPtr row; -register XkbKeyPtr key; - - for (r=0,row=section->rows;r<section->num_rows;r++,row++) { - fprintf(file,"static XkbKeyRec keys_s%02dr%02d[]= {\n",section_num,r); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - fprintf(file,"%s { { \"%s\" }, %4d, %4d, %4d }", - (k==0?"":",\n"), - XkbKeyNameText(key->name.name,XkbCFile), - key->gap,key->shape_ndx,key->color_ndx); - } - fprintf(file,"\n};\n"); + register int k, r; + register XkbRowPtr row; + register XkbKeyPtr key; + + for (r = 0, row = section->rows; r < section->num_rows; r++, row++) { + fprintf(file, "static XkbKeyRec keys_s%02dr%02d[]= {\n", + section_num, r); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + fprintf(file, "%s { { \"%s\" }, %4d, %4d, %4d }", + (k == 0 ? "" : ",\n"), + XkbKeyNameText(key->name.name, XkbCFile), + key->gap, key->shape_ndx, key->color_ndx); + } + fprintf(file, "\n};\n"); } - fprintf(file,"static XkbRowRec rows_s%02d[]= {\n",section_num); - for (r=0,row=section->rows;r<section->num_rows;r++,row++) { - fprintf(file,"%s { %4d, %4d, %2d, %2d, %1d, keys_s%02dr%02d, ", - (r==0?"":",\n"), - row->top,row->left,row->num_keys,row->num_keys, - (row->vertical!=0), - section_num,r); - fprintf(file," { %4d, %4d, %4d, %4d } }", - row->bounds.x1,row->bounds.y1, - row->bounds.x2,row->bounds.y2); + fprintf(file, "static XkbRowRec rows_s%02d[]= {\n", section_num); + for (r = 0, row = section->rows; r < section->num_rows; r++, row++) { + fprintf(file, "%s { %4d, %4d, %2d, %2d, %1d, keys_s%02dr%02d, ", + (r == 0 ? "" : ",\n"), + row->top, row->left, row->num_keys, row->num_keys, + (row->vertical != 0), section_num, r); + fprintf(file, " { %4d, %4d, %4d, %4d } }", + row->bounds.x1, row->bounds.y1, row->bounds.x2, row->bounds.y2); } - fprintf(file,"\n};\n"); + fprintf(file, "\n};\n"); return True; } static Bool -WriteCHdrGeomSections(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) +WriteCHdrGeomSections(FILE *file, XkbDescPtr xkb, XkbGeometryPtr geom) { -register int s; -register XkbSectionPtr section; + register int s; + register XkbSectionPtr section; - for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { - WriteCHdrGeomRows(file,xkb,section,s); + for (s = 0, section = geom->sections; s < geom->num_sections; + s++, section++) { + WriteCHdrGeomRows(file, xkb, section, s); #ifdef NOTYET - if (section->num_doodads>0) - WriteCHdrGeomDoodads(file,xkb,geom,section,s); + if (section->num_doodads > 0) + WriteCHdrGeomDoodads(file, xkb, geom, section, s); #endif - if (section->num_overlays>0) - WriteCHdrGeomOverlays(file,xkb,section,s); + if (section->num_overlays > 0) + WriteCHdrGeomOverlays(file, xkb, section, s); } - fprintf(file,"\nstatic XkbSectionRec g_sections[%d]= {\n", - geom->num_sections); - for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { - if (s!=0) fprintf(file,",\n"); - fprintf(file," {\n None, /* name */\n"); - fprintf(file," %4d, /* priority */\n",section->priority); - fprintf(file," %4d, /* top */\n",section->top); - fprintf(file," %4d, /* left */\n",section->left); - fprintf(file," %4d, /* width */\n",section->width); - fprintf(file," %4d, /* height */\n",section->height); - fprintf(file," %4d, /* angle */\n",section->angle); - fprintf(file," %4d, /* num_rows */\n",section->num_rows); - fprintf(file," %4d, /* num_doodads */\n",section->num_doodads); - fprintf(file," %4d, /* num_overlays */\n",section->num_overlays); - fprintf(file," %4d, /* sz_rows */\n",section->num_rows); - fprintf(file," %4d, /* sz_doodads */\n",section->num_doodads); - fprintf(file," %4d, /* sz_overlays */\n",section->num_overlays); - if (section->num_rows>0) - fprintf(file," rows_s%02d,\n",s); - else fprintf(file," NULL, /* rows */\n"); - if (section->num_doodads>0) - fprintf(file," doodads_s%02d,\n",s); - else fprintf(file," NULL, /* doodads */\n"); - fprintf(file," { %4d, %4d, %4d, %4d }, /* bounds */\n", - section->bounds.x1,section->bounds.y1, - section->bounds.x2,section->bounds.y2); - if (section->num_overlays>0) - fprintf(file," overlays_s%02d\n",s); - else fprintf(file," NULL /* overlays */\n"); - fprintf(file," }"); + fprintf(file, "\nstatic XkbSectionRec g_sections[%d]= {\n", + geom->num_sections); + for (s = 0, section = geom->sections; s < geom->num_sections; + s++, section++) { + if (s != 0) + fprintf(file, ",\n"); + fprintf(file, " {\n None, /* name */\n"); + fprintf(file, " %4d, /* priority */\n", section->priority); + fprintf(file, " %4d, /* top */\n", section->top); + fprintf(file, " %4d, /* left */\n", section->left); + fprintf(file, " %4d, /* width */\n", section->width); + fprintf(file, " %4d, /* height */\n", section->height); + fprintf(file, " %4d, /* angle */\n", section->angle); + fprintf(file, " %4d, /* num_rows */\n", section->num_rows); + fprintf(file, " %4d, /* num_doodads */\n", section->num_doodads); + fprintf(file, " %4d, /* num_overlays */\n", section->num_overlays); + fprintf(file, " %4d, /* sz_rows */\n", section->num_rows); + fprintf(file, " %4d, /* sz_doodads */\n", section->num_doodads); + fprintf(file, " %4d, /* sz_overlays */\n", section->num_overlays); + if (section->num_rows > 0) + fprintf(file, " rows_s%02d,\n", s); + else + fprintf(file, " NULL, /* rows */\n"); + if (section->num_doodads > 0) + fprintf(file, " doodads_s%02d,\n", s); + else + fprintf(file, " NULL, /* doodads */\n"); + fprintf(file, " { %4d, %4d, %4d, %4d }, /* bounds */\n", + section->bounds.x1, section->bounds.y1, + section->bounds.x2, section->bounds.y2); + if (section->num_overlays > 0) + fprintf(file, " overlays_s%02d\n", s); + else + fprintf(file, " NULL /* overlays */\n"); + fprintf(file, " }"); } - fprintf(file,"\n};\n"); - fprintf(file,"\nstatic Bool\n"); - fprintf(file,"_InitSections(DPYTYPE dpy,XkbGeometryPtr geom)\n"); - fprintf(file,"{\nXkbSectionPtr sections;\n\n"); - fprintf(file," sections= geom->sections;\n"); - for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) { - if (section->num_doodads>0) { - fprintf(file," _InitS%02dDoodads(dpy,geom,§ions[%d]);\n", - s,s); - } - if (section->num_overlays>0) { - fprintf(file," _InitS%02dOverlays(dpy,geom,§ions[%d]);\n", - s,s); - } + fprintf(file, "\n};\n"); + fprintf(file, "\nstatic Bool\n"); + fprintf(file, "_InitSections(DPYTYPE dpy,XkbGeometryPtr geom)\n"); + fprintf(file, "{\nXkbSectionPtr sections;\n\n"); + fprintf(file, " sections= geom->sections;\n"); + for (s = 0, section = geom->sections; s < geom->num_sections; + s++, section++) { + if (section->num_doodads > 0) { + fprintf(file, " _InitS%02dDoodads(dpy,geom,§ions[%d]);\n", + s, s); + } + if (section->num_overlays > 0) { + fprintf(file, " _InitS%02dOverlays(dpy,geom,§ions[%d]);\n", + s, s); + } } - fprintf(file,"}\n"); + fprintf(file, "}\n"); return True; } static Bool -WriteCHdrGeomAliases(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom) +WriteCHdrGeomAliases(FILE *file, XkbDescPtr xkb, XkbGeometryPtr geom) { - if (geom->num_key_aliases>0) { - register int i; - fprintf(file,"\nstatic XkbKeyAliasRec g_aliases[%d]= {\n", - geom->num_key_aliases); - for (i=0;i<geom->num_key_aliases;i++) { - fprintf(file,"%s { \"%s\", \"%s\" }",(i==0?"":",\n"), - XkbKeyNameText(geom->key_aliases[i].real,XkbCFile), - XkbKeyNameText(geom->key_aliases[i].alias,XkbCFile)); - } - fprintf(file,"\n};\n"); + if (geom->num_key_aliases > 0) { + register int i; + + fprintf(file, "\nstatic XkbKeyAliasRec g_aliases[%d]= {\n", + geom->num_key_aliases); + for (i = 0; i < geom->num_key_aliases; i++) { + fprintf(file, "%s { \"%s\", \"%s\" }", + (i == 0 ? "" : ",\n"), + XkbKeyNameText(geom->key_aliases[i].real, XkbCFile), + XkbKeyNameText(geom->key_aliases[i].alias, XkbCFile)); + } + fprintf(file, "\n};\n"); } return True; } static Bool -WriteCHdrGeometry(FILE *file,XkbDescPtr xkb) +WriteCHdrGeometry(FILE *file, XkbDescPtr xkb) { -XkbGeometryPtr geom; -register int i; + XkbGeometryPtr geom; + register int i; - if ((!xkb)||(!xkb->geom)) { - _XkbLibError(_XkbErrMissingGeometry,"WriteCHdrGeometry",0); - return False; + if ((!xkb) || (!xkb->geom)) { + _XkbLibError(_XkbErrMissingGeometry, "WriteCHdrGeometry", 0); + return False; } - geom= xkb->geom; - WriteCHdrGeomProps(file,xkb,geom); - WriteCHdrGeomColors(file,xkb,geom); - WriteCHdrGeomShapes(file,xkb,geom); - WriteCHdrGeomSections(file,xkb,geom); - WriteCHdrGeomDoodads(file,xkb,geom,NULL,0); - WriteCHdrGeomAliases(file,xkb,geom); - fprintf(file,"\nstatic XkbGeometryRec geom= {\n"); - fprintf(file," None, /* name */\n"); - fprintf(file," %d, %d, /* width, height */\n",geom->width_mm, - geom->height_mm); - if (geom->label_font) { - fprintf(file," \"%s\",/* label font */\n", - XkbStringText(geom->label_font,XkbCFile)); - } - else fprintf(file," NULL, /* label font */\n"); - if (geom->label_color) { - fprintf(file," &g_colors[%d], /* label color */\n", - XkbGeomColorIndex(geom,geom->label_color)); - } - else fprintf(file," NULL, /* label color */\n"); - if (geom->base_color) { - fprintf(file," &g_colors[%d], /* base color */\n", - XkbGeomColorIndex(geom,geom->base_color)); - } - else fprintf(file," NULL, /* base color */\n"); - fprintf(file," %d, %d, %d, /* sz: props, colors, shapes */\n", - geom->num_properties,geom->num_colors, - geom->num_shapes); - fprintf(file," %d, %d, %d, /* sz: sections, doodads, aliases */\n", - geom->num_sections,geom->num_doodads, - geom->num_key_aliases); - fprintf(file," %d, %d, %d, /* num: props, colors, shapes */\n", - geom->num_properties,geom->num_colors, - geom->num_shapes); - fprintf(file," %d, %d, %d, /* num: sections, doodads, aliases */\n", - geom->num_sections,geom->num_doodads, - geom->num_key_aliases); - fprintf(file," %s, %s, %s,\n", - (geom->num_properties>0?"g_props":"NULL"), - (geom->num_colors>0?"g_colors":"NULL"), - (geom->num_shapes>0?"g_shapes":"NULL")); - fprintf(file," %s, %s, %s\n", - (geom->num_sections>0?"g_sections":"NULL"), - (geom->num_doodads>0?"g_doodads":"NULL"), - (geom->num_key_aliases>0?"g_aliases":"NULL")); - fprintf(file,"};\n\n"); - fprintf(file,"static Bool\n"); - fprintf(file,"_InitHdrGeom(DPYTYPE dpy,XkbGeometryPtr geom)\n"); - fprintf(file,"{\n"); - if (geom->name!=None) { - fprintf(file," geom->name= GET_ATOM(dpy,\"%s\");\n", - XkbAtomText(xkb->dpy,geom->name,XkbCFile)); + geom = xkb->geom; + WriteCHdrGeomProps(file, xkb, geom); + WriteCHdrGeomColors(file, xkb, geom); + WriteCHdrGeomShapes(file, xkb, geom); + WriteCHdrGeomSections(file, xkb, geom); + WriteCHdrGeomDoodads(file, xkb, geom, NULL, 0); + WriteCHdrGeomAliases(file, xkb, geom); + fprintf(file, "\nstatic XkbGeometryRec geom= {\n"); + fprintf(file, " None, /* name */\n"); + fprintf(file, " %d, %d, /* width, height */\n", + geom->width_mm, geom->height_mm); + if (geom->label_font) + fprintf(file, " \"%s\",/* label font */\n", + XkbStringText(geom->label_font, XkbCFile)); + else + fprintf(file, " NULL, /* label font */\n"); + if (geom->label_color) + fprintf(file, " &g_colors[%d], /* label color */\n", + XkbGeomColorIndex(geom, geom->label_color)); + else + fprintf(file, " NULL, /* label color */\n"); + if (geom->base_color) + fprintf(file, " &g_colors[%d], /* base color */\n", + XkbGeomColorIndex(geom, geom->base_color)); + else + fprintf(file, " NULL, /* base color */\n"); + fprintf(file, + " %d, %d, %d, /* sz: props, colors, shapes */\n", + geom->num_properties, geom->num_colors, geom->num_shapes); + fprintf(file, + " %d, %d, %d, /* sz: sections, doodads, aliases */\n", + geom->num_sections, geom->num_doodads, geom->num_key_aliases); + fprintf(file, + " %d, %d, %d, /* num: props, colors, shapes */\n", + geom->num_properties, geom->num_colors, geom->num_shapes); + fprintf(file, + " %d, %d, %d, /* num: sections, doodads, aliases */\n", + geom->num_sections, geom->num_doodads, geom->num_key_aliases); + fprintf(file, " %s, %s, %s,\n", + (geom->num_properties > 0 ? "g_props" : "NULL"), + (geom->num_colors > 0 ? "g_colors" : "NULL"), + (geom->num_shapes > 0 ? "g_shapes" : "NULL")); + fprintf(file, " %s, %s, %s\n", + (geom->num_sections > 0 ? "g_sections" : "NULL"), + (geom->num_doodads > 0 ? "g_doodads" : "NULL"), + (geom->num_key_aliases > 0 ? "g_aliases" : "NULL")); + fprintf(file, "};\n\n"); + fprintf(file, "static Bool\n"); + fprintf(file, "_InitHdrGeom(DPYTYPE dpy,XkbGeometryPtr geom)\n"); + fprintf(file, "{\n"); + if (geom->name != None) { + fprintf(file, " geom->name= GET_ATOM(dpy,\"%s\");\n", + XkbAtomText(xkb->dpy, geom->name, XkbCFile)); } - for (i=0;i<geom->num_shapes;i++) { - fprintf(file," geom->shapes[%2d].name= GET_ATOM(dpy,\"%s\");\n",i, - XkbAtomText(xkb->dpy,geom->shapes[i].name,XkbCFile)); + for (i = 0; i < geom->num_shapes; i++) { + fprintf(file, " geom->shapes[%2d].name= GET_ATOM(dpy,\"%s\");\n", i, + XkbAtomText(xkb->dpy, geom->shapes[i].name, XkbCFile)); } - if (geom->num_doodads>0) - fprintf(file," _InitGeomDoodads(dpy,geom);\n"); - fprintf(file," _InitSections(dpy,geom);\n"); - fprintf(file,"}\n\n"); + if (geom->num_doodads > 0) + fprintf(file, " _InitGeomDoodads(dpy,geom);\n"); + fprintf(file, " _InitSections(dpy,geom);\n"); + fprintf(file, "}\n\n"); return True; } static Bool -WriteCHdrGeomFile(FILE *file,XkbFileInfo *result) +WriteCHdrGeomFile(FILE *file, XkbFileInfo *result) { -Bool ok; + Bool ok; - ok= WriteCHdrGeometry(file,result->xkb); + ok = WriteCHdrGeometry(file, result->xkb); return ok; } static Bool -WriteCHdrLayout(FILE *file,XkbFileInfo *result) +WriteCHdrLayout(FILE *file, XkbFileInfo *result) { -Bool ok; -XkbDescPtr xkb; - - xkb= result->xkb; - ok= WriteCHdrVMods(file,xkb->dpy,xkb); - ok= WriteCHdrKeycodes(file,xkb)&&ok; - ok= WriteCHdrSymbols(file,xkb)&&ok; - ok= WriteCHdrGeometry(file,xkb)&&ok; + Bool ok; + XkbDescPtr xkb; + + xkb = result->xkb; + ok = WriteCHdrVMods(file, xkb->dpy, xkb); + ok = WriteCHdrKeycodes(file, xkb) && ok; + ok = WriteCHdrSymbols(file, xkb) && ok; + ok = WriteCHdrGeometry(file, xkb) && ok; return ok; } static Bool -WriteCHdrSemantics(FILE *file,XkbFileInfo *result) +WriteCHdrSemantics(FILE *file, XkbFileInfo *result) { -Bool ok; -XkbDescPtr xkb; - - xkb= result->xkb; - ok= WriteCHdrVMods(file,xkb->dpy,xkb); - ok= WriteCHdrKeyTypes(file,xkb->dpy,xkb)&&ok; - ok= WriteCHdrCompatMap(file,xkb->dpy,xkb)&&ok; - ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok; + Bool ok; + XkbDescPtr xkb; + + xkb = result->xkb; + ok = WriteCHdrVMods(file, xkb->dpy, xkb); + ok = WriteCHdrKeyTypes(file, xkb->dpy, xkb) && ok; + ok = WriteCHdrCompatMap(file, xkb->dpy, xkb) && ok; + ok = WriteCHdrIndicators(file, xkb->dpy, xkb) && ok; return ok; } static Bool -WriteCHdrKeymap(FILE *file,XkbFileInfo *result) +WriteCHdrKeymap(FILE *file, XkbFileInfo *result) { -Bool ok; -XkbDescPtr xkb; - - xkb= result->xkb; - ok= WriteCHdrVMods(file,xkb->dpy,xkb); - ok= ok&&WriteCHdrKeycodes(file,xkb); - ok= ok&&WriteCHdrClientMap(file,xkb->dpy,xkb); - ok= ok&&WriteCHdrServerMap(file,xkb->dpy,xkb); - ok= ok&&WriteCHdrCompatMap(file,xkb->dpy,xkb); - ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok; - ok= ok&&WriteCHdrGeometry(file,xkb); + Bool ok; + XkbDescPtr xkb; + + xkb = result->xkb; + ok = WriteCHdrVMods(file, xkb->dpy, xkb); + ok = ok && WriteCHdrKeycodes(file, xkb); + ok = ok && WriteCHdrClientMap(file, xkb->dpy, xkb); + ok = ok && WriteCHdrServerMap(file, xkb->dpy, xkb); + ok = ok && WriteCHdrCompatMap(file, xkb->dpy, xkb); + ok = WriteCHdrIndicators(file, xkb->dpy, xkb) && ok; + ok = ok && WriteCHdrGeometry(file, xkb); return ok; } Bool -XkbWriteCFile(FILE *out,char *name,XkbFileInfo *result) +XkbWriteCFile(FILE *out, char *name, XkbFileInfo *result) { -Bool ok; -XkbDescPtr xkb; -Bool (*func)( - FILE * /* file*/, - XkbFileInfo * /* result */ -); + Bool ok; + XkbDescPtr xkb; + + Bool (*func) (FILE * /* file */, + XkbFileInfo * /* result */ + ); switch (result->type) { - case XkmSemanticsFile: - func= WriteCHdrSemantics; - break; - case XkmLayoutFile: - func= WriteCHdrLayout; - break; - case XkmKeymapFile: - func= WriteCHdrKeymap; - break; - case XkmGeometryIndex: - case XkmGeometryFile: - func= WriteCHdrGeomFile; - break; - default: - _XkbLibError(_XkbErrIllegalContents,"XkbWriteCFile",result->type); - return False; + case XkmSemanticsFile: + func = WriteCHdrSemantics; + break; + case XkmLayoutFile: + func = WriteCHdrLayout; + break; + case XkmKeymapFile: + func = WriteCHdrKeymap; + break; + case XkmGeometryIndex: + case XkmGeometryFile: + func = WriteCHdrGeomFile; + break; + default: + _XkbLibError(_XkbErrIllegalContents, "XkbWriteCFile", result->type); + return False; } - xkb= result->xkb; - if (out==NULL) { - _XkbLibError(_XkbErrFileCannotOpen,"XkbWriteCFile",0); - ok= False; + xkb = result->xkb; + if (out == NULL) { + _XkbLibError(_XkbErrFileCannotOpen, "XkbWriteCFile", 0); + ok = False; } else { - char *tmp,*hdrdef; - tmp= (char *)strrchr(name,'/'); - if (tmp==NULL) - tmp= name; - else tmp++; - hdrdef= (char *)_XkbCalloc(strlen(tmp)+1,sizeof(char)); - if (hdrdef) { - strcpy(hdrdef,tmp); - tmp= hdrdef; - while (*tmp) { - if (islower(*tmp)) *tmp= toupper(*tmp); - else if (!isalnum(*tmp)) *tmp= '_'; - tmp++; - } - fprintf(out,"/* This file generated automatically by xkbcomp */\n"); - fprintf(out,"/* DO NOT EDIT */\n"); - fprintf(out,"#ifndef %s\n",hdrdef); - fprintf(out,"#define %s 1\n\n",hdrdef); - } - fprintf(out,"#ifndef XKB_IN_SERVER\n"); - fprintf(out,"#define GET_ATOM(d,s) XInternAtom(d,s,0)\n"); - fprintf(out,"#define DPYTYPE Display *\n"); - fprintf(out,"#else\n"); - fprintf(out,"#define GET_ATOM(d,s) MakeAtom(s,strlen(s),1)\n"); - fprintf(out,"#define DPYTYPE char *\n"); - fprintf(out,"#endif\n"); - fprintf(out,"#define NUM_KEYS %d\n",xkb->max_key_code+1); - ok= (*func)(out,result); - if (hdrdef) - fprintf(out,"#endif /* %s */\n",hdrdef); + char *tmp, *hdrdef; + + tmp = (char *) strrchr(name, '/'); + if (tmp == NULL) + tmp = name; + else + tmp++; + hdrdef = (char *) _XkbCalloc(strlen(tmp) + 1, sizeof(char)); + if (hdrdef) { + strcpy(hdrdef, tmp); + tmp = hdrdef; + while (*tmp) { + if (islower(*tmp)) + *tmp = toupper(*tmp); + else if (!isalnum(*tmp)) + *tmp = '_'; + tmp++; + } + fprintf(out, "/* This file generated automatically by xkbcomp */\n"); + fprintf(out, "/* DO NOT EDIT */\n"); + fprintf(out, "#ifndef %s\n", hdrdef); + fprintf(out, "#define %s 1\n\n", hdrdef); + } + fprintf(out, "#ifndef XKB_IN_SERVER\n"); + fprintf(out, "#define GET_ATOM(d,s) XInternAtom(d,s,0)\n"); + fprintf(out, "#define DPYTYPE Display *\n"); + fprintf(out, "#else\n"); + fprintf(out, "#define GET_ATOM(d,s) MakeAtom(s,strlen(s),1)\n"); + fprintf(out, "#define DPYTYPE char *\n"); + fprintf(out, "#endif\n"); + fprintf(out, "#define NUM_KEYS %d\n", xkb->max_key_code + 1); + ok = (*func) (out, result); + if (hdrdef) + fprintf(out, "#endif /* %s */\n", hdrdef); } if (!ok) { - return False; + return False; } return True; } diff --git a/src/maprules.c b/src/maprules.c index 81102a3..49f4695 100644 --- a/src/maprules.c +++ b/src/maprules.c @@ -84,49 +84,50 @@ #define DFLT_LINE_SIZE 128 typedef struct { - int line_num; - int sz_line; - int num_line; - char buf[DFLT_LINE_SIZE]; - char * line; + int line_num; + int sz_line; + int num_line; + char buf[DFLT_LINE_SIZE]; + char * line; } InputLine; static void InitInputLine(InputLine *line) { - line->line_num= 1; - line->num_line= 0; - line->sz_line= DFLT_LINE_SIZE; - line->line= line->buf; + line->line_num = 1; + line->num_line = 0; + line->sz_line = DFLT_LINE_SIZE; + line->line = line->buf; return; } static void FreeInputLine(InputLine *line) { - if (line->line!=line->buf) - _XkbFree(line->line); - line->line_num= 1; - line->num_line= 0; - line->sz_line= DFLT_LINE_SIZE; - line->line= line->buf; + if (line->line != line->buf) + _XkbFree(line->line); + line->line_num = 1; + line->num_line = 0; + line->sz_line = DFLT_LINE_SIZE; + line->line = line->buf; return; } static int -InputLineAddChar(InputLine *line,int ch) +InputLineAddChar(InputLine *line, int ch) { - if (line->num_line>=line->sz_line) { - if (line->line==line->buf) { - line->line= (char *)_XkbAlloc(line->sz_line*2); - memcpy(line->line,line->buf,line->sz_line); - } - else { - line->line=(char *)_XkbRealloc((char *)line->line,line->sz_line*2); - } - line->sz_line*= 2; - } - line->line[line->num_line++]= ch; + if (line->num_line >= line->sz_line) { + if (line->line == line->buf) { + line->line = (char *) _XkbAlloc(line->sz_line * 2); + memcpy(line->line, line->buf, line->sz_line); + } + else { + line->line = + (char *) _XkbRealloc((char *) line->line, line->sz_line * 2); + } + line->sz_line *= 2; + } + line->line[line->num_line++] = ch; return ch; } @@ -143,82 +144,82 @@ InputLineAddChar(InputLine *line,int ch) #endif static Bool -GetInputLine(FILE *file,InputLine *line,Bool checkbang) +GetInputLine(FILE *file, InputLine *line, Bool checkbang) { -int ch; -Bool endOfFile,spacePending,slashPending,inComment; - - endOfFile= False; - flockfile(file); - while ((!endOfFile)&&(line->num_line==0)) { - spacePending= slashPending= inComment= False; - while (((ch=getc(file))!='\n')&&(ch!=EOF)) { - if (ch=='\\') { - if ((ch=getc(file))==EOF) - break; - if (ch=='\n') { - inComment= False; - ch= ' '; - line->line_num++; - } - } - if (inComment) - continue; - if (ch=='/') { - if (slashPending) { - inComment= True; - slashPending= False; - } - else { - slashPending= True; - } - continue; - } - else if (slashPending) { - if (spacePending) { - ADD_CHAR(line,' '); - spacePending= False; - } - ADD_CHAR(line,'/'); - slashPending= False; - } - if (isspace(ch)) { - while (isspace(ch)&&(ch!='\n')&&(ch!=EOF)) { - ch= getc(file); - } - if (ch==EOF) - break; - if ((ch!='\n')&&(line->num_line>0)) - spacePending= True; - ungetc(ch,file); - } - else { - if (spacePending) { - ADD_CHAR(line,' '); - spacePending= False; - } - if (checkbang && ch=='!') { - if (line->num_line!=0) { - PR_DEBUG("The '!' legal only at start of line\n"); - PR_DEBUG("Line containing '!' ignored\n"); - line->num_line= 0; - inComment= 0; - break; - } - - } - ADD_CHAR(line,ch); - } - } - if (ch==EOF) - endOfFile= True; + int ch; + Bool endOfFile, spacePending, slashPending, inComment; + + endOfFile = False; + flockfile(file); + while ((!endOfFile) && (line->num_line == 0)) { + spacePending = slashPending = inComment = False; + while (((ch = getc(file)) != '\n') && (ch != EOF)) { + if (ch == '\\') { + if ((ch = getc(file)) == EOF) + break; + if (ch == '\n') { + inComment = False; + ch = ' '; + line->line_num++; + } + } + if (inComment) + continue; + if (ch == '/') { + if (slashPending) { + inComment = True; + slashPending = False; + } + else { + slashPending = True; + } + continue; + } + else if (slashPending) { + if (spacePending) { + ADD_CHAR(line, ' '); + spacePending = False; + } + ADD_CHAR(line, '/'); + slashPending = False; + } + if (isspace(ch)) { + while (isspace(ch) && (ch != '\n') && (ch != EOF)) { + ch = getc(file); + } + if (ch == EOF) + break; + if ((ch != '\n') && (line->num_line > 0)) + spacePending = True; + ungetc(ch, file); + } + else { + if (spacePending) { + ADD_CHAR(line, ' '); + spacePending = False; + } + if (checkbang && ch == '!') { + if (line->num_line != 0) { + PR_DEBUG("The '!' legal only at start of line\n"); + PR_DEBUG("Line containing '!' ignored\n"); + line->num_line = 0; + inComment = 0; + break; + } + + } + ADD_CHAR(line, ch); + } + } + if (ch == EOF) + endOfFile = True; /* else line->num_line++;*/ - } - funlockfile(file); - if ((line->num_line==0)&&(endOfFile)) - return False; - ADD_CHAR(line,'\0'); - return True; + } + funlockfile(file); + if ((line->num_line == 0) && (endOfFile)) + return False; + ADD_CHAR(line, '\0'); + return True; } /***====================================================================***/ @@ -238,182 +239,189 @@ Bool endOfFile,spacePending,slashPending,inComment; #define PART_MASK 0x000F #define COMPONENT_MASK 0x03F0 -static const char * cname[MAX_WORDS] = { - "model", "layout", "variant", "option", - "keycodes", "symbols", "types", "compat", "geometry", "keymap" +static const char *cname[MAX_WORDS] = { + "model", "layout", "variant", "option", + "keycodes", "symbols", "types", "compat", "geometry", "keymap" }; -typedef struct _RemapSpec { - int number; - int num_remap; - struct { - int word; - int index; - } remap[MAX_WORDS]; +typedef struct _RemapSpec { + int number; + int num_remap; + struct { + int word; + int index; + } remap[MAX_WORDS]; } RemapSpec; typedef struct _FileSpec { - char * name[MAX_WORDS]; - struct _FileSpec * pending; + char *name[MAX_WORDS]; + struct _FileSpec *pending; } FileSpec; typedef struct { - char * model; - char * layout[XkbNumKbdGroups+1]; - char * variant[XkbNumKbdGroups+1]; - char * options; + char *model; + char *layout[XkbNumKbdGroups + 1]; + char *variant[XkbNumKbdGroups + 1]; + char *options; } XkbRF_MultiDefsRec, *XkbRF_MultiDefsPtr; #define NDX_BUFF_SIZE 4 /***====================================================================***/ -static char* +static char * get_index(char *str, int *ndx) { - char ndx_buf[NDX_BUFF_SIZE]; - char *end; - - if (*str != '[') { - *ndx = 0; - return str; - } - str++; - end = strchr(str, ']'); - if (end == NULL) { - *ndx = -1; - return str - 1; - } - if ( (end - str) >= NDX_BUFF_SIZE) { - *ndx = -1; - return end + 1; - } - strncpy(ndx_buf, str, end - str); - ndx_buf[end - str] = '\0'; - *ndx = atoi(ndx_buf); - return end + 1; + char ndx_buf[NDX_BUFF_SIZE]; + + char *end; + + if (*str != '[') { + *ndx = 0; + return str; + } + str++; + end = strchr(str, ']'); + if (end == NULL) { + *ndx = -1; + return str - 1; + } + if ((end - str) >= NDX_BUFF_SIZE) { + *ndx = -1; + return end + 1; + } + strncpy(ndx_buf, str, end - str); + ndx_buf[end - str] = '\0'; + *ndx = atoi(ndx_buf); + return end + 1; } static void -SetUpRemap(InputLine *line,RemapSpec *remap) +SetUpRemap(InputLine *line, RemapSpec *remap) { -char * tok,*str; -unsigned present, l_ndx_present, v_ndx_present; -register int i; -int len, ndx; -_Xstrtokparams strtok_buf; + char *tok, *str; + unsigned present, l_ndx_present, v_ndx_present; + register int i; + int len, ndx; + _Xstrtokparams strtok_buf; + #ifdef DEBUG -Bool found; + Bool found; #endif - - l_ndx_present = v_ndx_present = present= 0; - str= &line->line[1]; - len = remap->number; - bzero((char *)remap,sizeof(RemapSpec)); - remap->number = len; - while ((tok=_XStrtok(str," ",strtok_buf))!=NULL) { + l_ndx_present = v_ndx_present = present = 0; + str = &line->line[1]; + len = remap->number; + bzero((char *) remap, sizeof(RemapSpec)); + remap->number = len; + while ((tok = _XStrtok(str, " ", strtok_buf)) != NULL) { #ifdef DEBUG - found= False; + found = False; #endif - str= NULL; - if (strcmp(tok,"=")==0) - continue; - for (i=0;i<MAX_WORDS;i++) { + str = NULL; + if (strcmp(tok, "=") == 0) + continue; + for (i = 0; i < MAX_WORDS; i++) { len = strlen(cname[i]); - if (strncmp(cname[i],tok,len)==0) { - if(strlen(tok) > len) { - char *end = get_index(tok+len, &ndx); - if ((i != LAYOUT && i != VARIANT) || - *end != '\0' || ndx == -1) - break; - if (ndx < 1 || ndx > XkbNumKbdGroups) { - PR_DEBUG2("Illegal %s index: %d\n", cname[i], ndx); - PR_DEBUG1("Index must be in range 1..%d\n", - XkbNumKbdGroups); - break; - } - } else { - ndx = 0; + if (strncmp(cname[i], tok, len) == 0) { + if (strlen(tok) > len) { + char *end = get_index(tok + len, &ndx); + + if ((i != LAYOUT && i != VARIANT) || + *end != '\0' || ndx == -1) + break; + if (ndx < 1 || ndx > XkbNumKbdGroups) { + PR_DEBUG2("Illegal %s index: %d\n", cname[i], ndx); + PR_DEBUG1("Index must be in range 1..%d\n", + XkbNumKbdGroups); + break; + } + } + else { + ndx = 0; } #ifdef DEBUG - found= True; + found = True; #endif - if (present&(1<<i)) { - if ((i == LAYOUT && l_ndx_present&(1<<ndx)) || - (i == VARIANT && v_ndx_present&(1<<ndx)) ) { - PR_DEBUG1("Component \"%s\" listed twice\n",tok); - PR_DEBUG("Second definition ignored\n"); - break; - } - } - present |= (1<<i); + if (present & (1 << i)) { + if ((i == LAYOUT && l_ndx_present & (1 << ndx)) || + (i == VARIANT && v_ndx_present & (1 << ndx))) { + PR_DEBUG1("Component \"%s\" listed twice\n", tok); + PR_DEBUG("Second definition ignored\n"); + break; + } + } + present |= (1 << i); if (i == LAYOUT) l_ndx_present |= 1 << ndx; if (i == VARIANT) v_ndx_present |= 1 << ndx; - remap->remap[remap->num_remap].word= i; - remap->remap[remap->num_remap++].index= ndx; - break; - } - } + remap->remap[remap->num_remap].word = i; + remap->remap[remap->num_remap++].index = ndx; + break; + } + } #ifdef DEBUG - if (!found) { - fprintf(stderr,"Unknown component \"%s\" ignored\n",tok); - } + if (!found) { + fprintf(stderr, "Unknown component \"%s\" ignored\n", tok); + } #endif - } - if ((present&PART_MASK)==0) { + } + if ((present & PART_MASK) == 0) { #ifdef DEBUG - unsigned mask= PART_MASK; - fprintf(stderr,"Mapping needs at least one of "); - for (i=0; (i<MAX_WORDS); i++) { - if ((1L<<i)&mask) { - mask&= ~(1L<<i); - if (mask) fprintf(stderr,"\"%s,\" ",cname[i]); - else fprintf(stderr,"or \"%s\"\n",cname[i]); - } - } - fprintf(stderr,"Illegal mapping ignored\n"); + unsigned mask = PART_MASK; + + fprintf(stderr, "Mapping needs at least one of "); + for (i = 0; (i < MAX_WORDS); i++) { + if ((1L << i) & mask) { + mask &= ~(1L << i); + if (mask) + fprintf(stderr, "\"%s,\" ", cname[i]); + else + fprintf(stderr, "or \"%s\"\n", cname[i]); + } + } + fprintf(stderr, "Illegal mapping ignored\n"); #endif - remap->num_remap= 0; - return; - } - if ((present&COMPONENT_MASK)==0) { - PR_DEBUG("Mapping needs at least one component\n"); - PR_DEBUG("Illegal mapping ignored\n"); - remap->num_remap= 0; - return; - } - if (((present&COMPONENT_MASK)&(1<<KEYMAP))&& - ((present&COMPONENT_MASK)!=(1<<KEYMAP))) { - PR_DEBUG("Keymap cannot appear with other components\n"); - PR_DEBUG("Illegal mapping ignored\n"); - remap->num_remap= 0; - return; - } - remap->number++; - return; + remap->num_remap = 0; + return; + } + if ((present & COMPONENT_MASK) == 0) { + PR_DEBUG("Mapping needs at least one component\n"); + PR_DEBUG("Illegal mapping ignored\n"); + remap->num_remap = 0; + return; + } + if (((present & COMPONENT_MASK) & (1 << KEYMAP)) && + ((present & COMPONENT_MASK) != (1 << KEYMAP))) { + PR_DEBUG("Keymap cannot appear with other components\n"); + PR_DEBUG("Illegal mapping ignored\n"); + remap->num_remap = 0; + return; + } + remap->number++; + return; } static Bool -MatchOneOf(char *wanted,char *vals_defined) +MatchOneOf(char *wanted, char *vals_defined) { -char *str,*next; -int want_len= strlen(wanted); - - for (str=vals_defined,next=NULL;str!=NULL;str=next) { - int len; - next= strchr(str,','); - if (next) { - len= next-str; - next++; - } - else { - len= strlen(str); - } - if ((len==want_len)&&(strncmp(wanted,str,len)==0)) - return True; + char *str, *next; + int want_len = strlen(wanted); + + for (str = vals_defined, next = NULL; str != NULL; str = next) { + int len; + + next = strchr(str, ','); + if (next) { + len = next - str; + next++; + } + else { + len = strlen(str); + } + if ((len == want_len) && (strncmp(wanted, str, len) == 0)) + return True; } return False; } @@ -421,23 +429,24 @@ int want_len= strlen(wanted); /***====================================================================***/ static Bool -CheckLine( InputLine * line, - RemapSpec * remap, - XkbRF_RulePtr rule, - XkbRF_GroupPtr group) +CheckLine(InputLine * line, + RemapSpec * remap, + XkbRF_RulePtr rule, + XkbRF_GroupPtr group) { -char * str,*tok; -register int nread, i; -FileSpec tmp; -_Xstrtokparams strtok_buf; -Bool append = False; + char *str, *tok; + register int nread, i; + FileSpec tmp; + _Xstrtokparams strtok_buf; + Bool append = False; - if (line->line[0]=='!') { + if (line->line[0] == '!') { if (line->line[1] == '$' || (line->line[1] == ' ' && line->line[2] == '$')) { char *gname = strchr(line->line, '$'); char *words = strchr(gname, ' '); - if(!words) + + if (!words) return False; *words++ = '\0'; for (; *words; words++) { @@ -449,169 +458,184 @@ Bool append = False; group->name = _XkbDupString(gname); group->words = _XkbDupString(words); for (i = 1, words = group->words; *words; words++) { - if ( *words == ' ') { - *words++ = '\0'; - i++; - } + if (*words == ' ') { + *words++ = '\0'; + i++; + } } group->number = i; return True; - } else { - SetUpRemap(line,remap); - return False; + } + else { + SetUpRemap(line, remap); + return False; } } - if (remap->num_remap==0) { - PR_DEBUG("Must have a mapping before first line of data\n"); - PR_DEBUG("Illegal line of data ignored\n"); - return False; - } - bzero((char *)&tmp,sizeof(FileSpec)); - str= line->line; - for (nread= 0;(tok=_XStrtok(str," ",strtok_buf))!=NULL;nread++) { - str= NULL; - if (strcmp(tok,"=")==0) { - nread--; - continue; - } - if (nread>remap->num_remap) { - PR_DEBUG("Too many words on a line\n"); - PR_DEBUG1("Extra word \"%s\" ignored\n",tok); - continue; - } - tmp.name[remap->remap[nread].word]= tok; - if (*tok == '+' || *tok == '|') - append = True; - } - if (nread<remap->num_remap) { - PR_DEBUG1("Too few words on a line: %s\n", line->line); - PR_DEBUG("line ignored\n"); - return False; - } - - rule->flags= 0; + if (remap->num_remap == 0) { + PR_DEBUG("Must have a mapping before first line of data\n"); + PR_DEBUG("Illegal line of data ignored\n"); + return False; + } + bzero((char *) &tmp, sizeof(FileSpec)); + str = line->line; + for (nread = 0; (tok = _XStrtok(str, " ", strtok_buf)) != NULL; nread++) { + str = NULL; + if (strcmp(tok, "=") == 0) { + nread--; + continue; + } + if (nread > remap->num_remap) { + PR_DEBUG("Too many words on a line\n"); + PR_DEBUG1("Extra word \"%s\" ignored\n", tok); + continue; + } + tmp.name[remap->remap[nread].word] = tok; + if (*tok == '+' || *tok == '|') + append = True; + } + if (nread < remap->num_remap) { + PR_DEBUG1("Too few words on a line: %s\n", line->line); + PR_DEBUG("line ignored\n"); + return False; + } + + rule->flags = 0; rule->number = remap->number; if (tmp.name[OPTION]) - rule->flags|= XkbRF_Option; + rule->flags |= XkbRF_Option; else if (append) - rule->flags|= XkbRF_Append; + rule->flags |= XkbRF_Append; else - rule->flags|= XkbRF_Normal; - rule->model= _XkbDupString(tmp.name[MODEL]); - rule->layout= _XkbDupString(tmp.name[LAYOUT]); - rule->variant= _XkbDupString(tmp.name[VARIANT]); - rule->option= _XkbDupString(tmp.name[OPTION]); - - rule->keycodes= _XkbDupString(tmp.name[KEYCODES]); - rule->symbols= _XkbDupString(tmp.name[SYMBOLS]); - rule->types= _XkbDupString(tmp.name[TYPES]); - rule->compat= _XkbDupString(tmp.name[COMPAT]); - rule->geometry= _XkbDupString(tmp.name[GEOMETRY]); - rule->keymap= _XkbDupString(tmp.name[KEYMAP]); + rule->flags |= XkbRF_Normal; + rule->model = _XkbDupString(tmp.name[MODEL]); + rule->layout = _XkbDupString(tmp.name[LAYOUT]); + rule->variant = _XkbDupString(tmp.name[VARIANT]); + rule->option = _XkbDupString(tmp.name[OPTION]); + + rule->keycodes = _XkbDupString(tmp.name[KEYCODES]); + rule->symbols = _XkbDupString(tmp.name[SYMBOLS]); + rule->types = _XkbDupString(tmp.name[TYPES]); + rule->compat = _XkbDupString(tmp.name[COMPAT]); + rule->geometry = _XkbDupString(tmp.name[GEOMETRY]); + rule->keymap = _XkbDupString(tmp.name[KEYMAP]); rule->layout_num = rule->variant_num = 0; for (i = 0; i < nread; i++) { if (remap->remap[i].index) { - if (remap->remap[i].word == LAYOUT) - rule->layout_num = remap->remap[i].index; - if (remap->remap[i].word == VARIANT) - rule->variant_num = remap->remap[i].index; + if (remap->remap[i].word == LAYOUT) + rule->layout_num = remap->remap[i].index; + if (remap->remap[i].word == VARIANT) + rule->variant_num = remap->remap[i].index; } } return True; } static char * -_Concat(char *str1,char *str2) +_Concat(char *str1, char *str2) { -int len; + int len; - if ((!str1)||(!str2)) - return str1; - len= strlen(str1)+strlen(str2)+1; - str1= _XkbTypedRealloc(str1,len,char); + if ((!str1) || (!str2)) + return str1; + len = strlen(str1) + strlen(str2) + 1; + str1 = _XkbTypedRealloc(str1, len, char); if (str1) - strcat(str1,str2); + strcat(str1, str2); return str1; } static void squeeze_spaces(char *p1) { - char *p2; - for (p2 = p1; *p2; p2++) { - *p1 = *p2; - if (*p1 != ' ') p1++; - } - *p1 = '\0'; + char *p2; + + for (p2 = p1; *p2; p2++) { + *p1 = *p2; + if (*p1 != ' ') + p1++; + } + *p1 = '\0'; } static Bool MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) { - bzero((char *)mdefs,sizeof(XkbRF_MultiDefsRec)); - mdefs->model = defs->model; - mdefs->options = _XkbDupString(defs->options); - if (mdefs->options) squeeze_spaces(mdefs->options); - - if (defs->layout) { - if (!strchr(defs->layout, ',')) { - mdefs->layout[0] = defs->layout; - } else { - char *p; - int i; - mdefs->layout[1] = _XkbDupString(defs->layout); - if (mdefs->layout[1] == NULL) - return False; - squeeze_spaces(mdefs->layout[1]); - p = mdefs->layout[1]; - for (i = 2; i <= XkbNumKbdGroups; i++) { - if ((p = strchr(p, ','))) { - *p++ = '\0'; - mdefs->layout[i] = p; - } else { - break; - } - } - if (p && (p = strchr(p, ','))) - *p = '\0'; - } - } - - if (defs->variant) { - if (!strchr(defs->variant, ',')) { - mdefs->variant[0] = defs->variant; - } else { - char *p; - int i; - mdefs->variant[1] = _XkbDupString(defs->variant); - if (mdefs->variant[1] == NULL) - return False; - squeeze_spaces(mdefs->variant[1]); - p = mdefs->variant[1]; - for (i = 2; i <= XkbNumKbdGroups; i++) { - if ((p = strchr(p, ','))) { - *p++ = '\0'; - mdefs->variant[i] = p; - } else { - break; - } - } - if (p && (p = strchr(p, ','))) - *p = '\0'; - } - } - return True; + bzero((char *) mdefs, sizeof(XkbRF_MultiDefsRec)); + mdefs->model = defs->model; + mdefs->options = _XkbDupString(defs->options); + if (mdefs->options) + squeeze_spaces(mdefs->options); + + if (defs->layout) { + if (!strchr(defs->layout, ',')) { + mdefs->layout[0] = defs->layout; + } + else { + char *p; + + int i; + + mdefs->layout[1] = _XkbDupString(defs->layout); + if (mdefs->layout[1] == NULL) + return False; + squeeze_spaces(mdefs->layout[1]); + p = mdefs->layout[1]; + for (i = 2; i <= XkbNumKbdGroups; i++) { + if ((p = strchr(p, ','))) { + *p++ = '\0'; + mdefs->layout[i] = p; + } + else { + break; + } + } + if (p && (p = strchr(p, ','))) + *p = '\0'; + } + } + + if (defs->variant) { + if (!strchr(defs->variant, ',')) { + mdefs->variant[0] = defs->variant; + } + else { + char *p; + + int i; + + mdefs->variant[1] = _XkbDupString(defs->variant); + if (mdefs->variant[1] == NULL) + return False; + squeeze_spaces(mdefs->variant[1]); + p = mdefs->variant[1]; + for (i = 2; i <= XkbNumKbdGroups; i++) { + if ((p = strchr(p, ','))) { + *p++ = '\0'; + mdefs->variant[i] = p; + } + else { + break; + } + } + if (p && (p = strchr(p, ','))) + *p = '\0'; + } + } + return True; } static void FreeMultiDefs(XkbRF_MultiDefsPtr defs) { - if (defs->options) _XkbFree(defs->options); - if (defs->layout[1]) _XkbFree(defs->layout[1]); - if (defs->variant[1]) _XkbFree(defs->variant[1]); + if (defs->options) + _XkbFree(defs->options); + if (defs->layout[1]) + _XkbFree(defs->layout[1]); + if (defs->variant[1]) + _XkbFree(defs->variant[1]); } static void @@ -619,19 +643,19 @@ Apply(char *src, char **dst) { if (src) { if (*src == '+' || *src == '!') { - *dst= _Concat(*dst, src); - } else { + *dst = _Concat(*dst, src); + } + else { if (*dst == NULL) - *dst= _XkbDupString(src); + *dst = _XkbDupString(src); } } } static void -XkbRF_ApplyRule( XkbRF_RulePtr rule, - XkbComponentNamesPtr names) +XkbRF_ApplyRule(XkbRF_RulePtr rule, XkbComponentNamesPtr names) { - rule->flags&= ~XkbRF_PendingMatch; /* clear the flag because it's applied */ + rule->flags &= ~XkbRF_PendingMatch; /* clear the flag because it's applied */ Apply(rule->keycodes, &names->keycodes); Apply(rule->symbols, &names->symbols); @@ -642,146 +666,151 @@ XkbRF_ApplyRule( XkbRF_RulePtr rule, } static Bool -CheckGroup( XkbRF_RulesPtr rules, - char * group_name, - char * name) +CheckGroup(XkbRF_RulesPtr rules, char *group_name, char *name) { - int i; - char *p; - XkbRF_GroupPtr group; - - for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) { - if (! strcmp(group->name, group_name)) { - break; - } - } - if (i == rules->num_groups) - return False; - for (i = 0, p = group->words; i < group->number; i++, p += strlen(p)+1) { - if (! strcmp(p, name)) { - return True; - } - } - return False; + int i; + char *p; + XkbRF_GroupPtr group; + + for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) { + if (!strcmp(group->name, group_name)) { + break; + } + } + if (i == rules->num_groups) + return False; + for (i = 0, p = group->words; i < group->number; i++, p += strlen(p) + 1) { + if (!strcmp(p, name)) { + return True; + } + } + return False; } static int -XkbRF_CheckApplyRule( XkbRF_RulePtr rule, - XkbRF_MultiDefsPtr mdefs, - XkbComponentNamesPtr names, - XkbRF_RulesPtr rules) +XkbRF_CheckApplyRule(XkbRF_RulePtr rule, + XkbRF_MultiDefsPtr mdefs, + XkbComponentNamesPtr names, + XkbRF_RulesPtr rules) { Bool pending = False; if (rule->model != NULL) { - if(mdefs->model == NULL) + if (mdefs->model == NULL) return 0; if (strcmp(rule->model, "*") == 0) { pending = True; - } else { + } + else { if (rule->model[0] == '$') { - if (!CheckGroup(rules, rule->model, mdefs->model)) - return 0; - } else { - if (strcmp(rule->model, mdefs->model) != 0) - return 0; - } - } + if (!CheckGroup(rules, rule->model, mdefs->model)) + return 0; + } + else { + if (strcmp(rule->model, mdefs->model) != 0) + return 0; + } + } } if (rule->option != NULL) { - if (mdefs->options == NULL) - return 0; - if ((!MatchOneOf(rule->option,mdefs->options))) - return 0; + if (mdefs->options == NULL) + return 0; + if ((!MatchOneOf(rule->option, mdefs->options))) + return 0; } if (rule->layout != NULL) { - if(mdefs->layout[rule->layout_num] == NULL || - *mdefs->layout[rule->layout_num] == '\0') - return 0; + if (mdefs->layout[rule->layout_num] == NULL || + *mdefs->layout[rule->layout_num] == '\0') + return 0; if (strcmp(rule->layout, "*") == 0) { pending = True; - } else { + } + else { if (rule->layout[0] == '$') { - if (!CheckGroup(rules, rule->layout, - mdefs->layout[rule->layout_num])) - return 0; - } else { - if (strcmp(rule->layout, mdefs->layout[rule->layout_num]) != 0) - return 0; - } - } + if (!CheckGroup(rules, rule->layout, + mdefs->layout[rule->layout_num])) + return 0; + } + else { + if (strcmp(rule->layout, mdefs->layout[rule->layout_num]) != 0) + return 0; + } + } } if (rule->variant != NULL) { - if (mdefs->variant[rule->variant_num] == NULL || - *mdefs->variant[rule->variant_num] == '\0') - return 0; + if (mdefs->variant[rule->variant_num] == NULL || + *mdefs->variant[rule->variant_num] == '\0') + return 0; if (strcmp(rule->variant, "*") == 0) { pending = True; - } else { + } + else { if (rule->variant[0] == '$') { - if (!CheckGroup(rules, rule->variant, - mdefs->variant[rule->variant_num])) - return 0; - } else { - if (strcmp(rule->variant, - mdefs->variant[rule->variant_num]) != 0) - return 0; - } - } + if (!CheckGroup(rules, rule->variant, + mdefs->variant[rule->variant_num])) + return 0; + } + else { + if (strcmp(rule->variant, + mdefs->variant[rule->variant_num]) != 0) + return 0; + } + } } if (pending) { - rule->flags|= XkbRF_PendingMatch; - return rule->number; + rule->flags |= XkbRF_PendingMatch; + return rule->number; } /* exact match, apply it now */ - XkbRF_ApplyRule(rule,names); + XkbRF_ApplyRule(rule, names); return rule->number; } static void XkbRF_ClearPartialMatches(XkbRF_RulesPtr rules) { -register int i; -XkbRF_RulePtr rule; + register int i; + XkbRF_RulePtr rule; - for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) { - rule->flags&= ~XkbRF_PendingMatch; + for (i = 0, rule = rules->rules; i < rules->num_rules; i++, rule++) { + rule->flags &= ~XkbRF_PendingMatch; } } static void -XkbRF_ApplyPartialMatches(XkbRF_RulesPtr rules,XkbComponentNamesPtr names) +XkbRF_ApplyPartialMatches(XkbRF_RulesPtr rules, XkbComponentNamesPtr names) { -int i; -XkbRF_RulePtr rule; + int i; + XkbRF_RulePtr rule; for (rule = rules->rules, i = 0; i < rules->num_rules; i++, rule++) { - if ((rule->flags&XkbRF_PendingMatch)==0) - continue; - XkbRF_ApplyRule(rule,names); + if ((rule->flags & XkbRF_PendingMatch) == 0) + continue; + XkbRF_ApplyRule(rule, names); } } static void -XkbRF_CheckApplyRules( XkbRF_RulesPtr rules, - XkbRF_MultiDefsPtr mdefs, - XkbComponentNamesPtr names, - int flags) +XkbRF_CheckApplyRules(XkbRF_RulesPtr rules, + XkbRF_MultiDefsPtr mdefs, + XkbComponentNamesPtr names, + int flags) { -int i; -XkbRF_RulePtr rule; -int skip; - - for (rule = rules->rules, i=0; i < rules->num_rules; rule++, i++) { - if ((rule->flags & flags) != flags) - continue; - skip = XkbRF_CheckApplyRule(rule, mdefs, names, rules); - if (skip && !(flags & XkbRF_Option)) { - for ( ;(i < rules->num_rules) && (rule->number == skip); - rule++, i++); - rule--; i--; - } + int i; + XkbRF_RulePtr rule; + int skip; + + for (rule = rules->rules, i = 0; i < rules->num_rules; rule++, i++) { + if ((rule->flags & flags) != flags) + continue; + skip = XkbRF_CheckApplyRule(rule, mdefs, names, rules); + if (skip && !(flags & XkbRF_Option)) { + for (; (i < rules->num_rules) && (rule->number == skip); + rule++, i++); + rule--; + i--; + } } } @@ -790,108 +819,118 @@ int skip; static char * XkbRF_SubstituteVars(char *name, XkbRF_MultiDefsPtr mdefs) { -char *str, *outstr, *orig, *var; -int len, ndx; - - orig= name; - str= index(name,'%'); - if (str==NULL) - return name; - len= strlen(name); - while (str!=NULL) { - char pfx= str[1]; - int extra_len= 0; - if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { - extra_len= 1; - str++; - } - else if (pfx=='(') { - extra_len= 2; - str++; - } - var = str + 1; - str = get_index(var + 1, &ndx); - if (ndx == -1) { - str = index(str,'%'); - continue; + char *str, *outstr, *orig, *var; + int len, ndx; + + orig = name; + str = index(name, '%'); + if (str == NULL) + return name; + len = strlen(name); + while (str != NULL) { + char pfx = str[1]; + int extra_len = 0; + + if ((pfx == '+') || (pfx == '|') || (pfx == '_') || (pfx == '-')) { + extra_len = 1; + str++; + } + else if (pfx == '(') { + extra_len = 2; + str++; } - if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) - len+= strlen(mdefs->layout[ndx])+extra_len; - else if ((*var=='m')&&mdefs->model) - len+= strlen(mdefs->model)+extra_len; - else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) - len+= strlen(mdefs->variant[ndx])+extra_len; - if ((pfx=='(')&&(*str==')')) { - str++; - } - str= index(&str[0],'%'); - } - name= (char *)_XkbAlloc(len+1); - str= orig; - outstr= name; - while (*str!='\0') { - if (str[0]=='%') { - char pfx,sfx; - str++; - pfx= str[0]; - sfx= '\0'; - if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { - str++; - } - else if (pfx=='(') { - sfx= ')'; - str++; - } - else pfx= '\0'; - - var = str; - str = get_index(var + 1, &ndx); - if (ndx == -1) { - continue; + var = str + 1; + str = get_index(var + 1, &ndx); + if (ndx == -1) { + str = index(str, '%'); + continue; + } + if ((*var == 'l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) + len += strlen(mdefs->layout[ndx]) + extra_len; + else if ((*var == 'm') && mdefs->model) + len += strlen(mdefs->model) + extra_len; + else if ((*var == 'v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) + len += strlen(mdefs->variant[ndx]) + extra_len; + if ((pfx == '(') && (*str == ')')) { + str++; + } + str = index(&str[0], '%'); + } + name = (char *) _XkbAlloc(len + 1); + str = orig; + outstr = name; + while (*str != '\0') { + if (str[0] == '%') { + char pfx, sfx; + + str++; + pfx = str[0]; + sfx = '\0'; + if ((pfx == '+') || (pfx == '|') || (pfx == '_') || (pfx == '-')) { + str++; + } + else if (pfx == '(') { + sfx = ')'; + str++; + } + else + pfx = '\0'; + + var = str; + str = get_index(var + 1, &ndx); + if (ndx == -1) { + continue; + } + if ((*var == 'l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) { + if (pfx) + *outstr++ = pfx; + strcpy(outstr, mdefs->layout[ndx]); + outstr += strlen(mdefs->layout[ndx]); + if (sfx) + *outstr++ = sfx; + } + else if ((*var == 'm') && (mdefs->model)) { + if (pfx) + *outstr++ = pfx; + strcpy(outstr, mdefs->model); + outstr += strlen(mdefs->model); + if (sfx) + *outstr++ = sfx; } - if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->layout[ndx]); - outstr+= strlen(mdefs->layout[ndx]); - if (sfx) *outstr++= sfx; - } - else if ((*var=='m')&&(mdefs->model)) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->model); - outstr+= strlen(mdefs->model); - if (sfx) *outstr++= sfx; - } - else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->variant[ndx]); - outstr+= strlen(mdefs->variant[ndx]); - if (sfx) *outstr++= sfx; - } - if ((pfx=='(')&&(*str==')')) - str++; - } - else { - *outstr++= *str++; - } - } - *outstr++= '\0'; - if (orig!=name) - _XkbFree(orig); + else if ((*var == 'v') && mdefs->variant[ndx] && + *mdefs->variant[ndx]) { + if (pfx) + *outstr++ = pfx; + strcpy(outstr, mdefs->variant[ndx]); + outstr += strlen(mdefs->variant[ndx]); + if (sfx) + *outstr++ = sfx; + } + if ((pfx == '(') && (*str == ')')) + str++; + } + else { + *outstr++ = *str++; + } + } + *outstr++ = '\0'; + if (orig != name) + _XkbFree(orig); return name; } /***====================================================================***/ Bool -XkbRF_GetComponents( XkbRF_RulesPtr rules, - XkbRF_VarDefsPtr defs, - XkbComponentNamesPtr names) +XkbRF_GetComponents(XkbRF_RulesPtr rules, + XkbRF_VarDefsPtr defs, + XkbComponentNamesPtr names) { XkbRF_MultiDefsRec mdefs; MakeMultiDefs(&mdefs, defs); - bzero((char *)names,sizeof(XkbComponentNamesRec)); + bzero((char *) names, sizeof(XkbComponentNamesRec)); XkbRF_ClearPartialMatches(rules); XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Normal); XkbRF_ApplyPartialMatches(rules, names); @@ -901,130 +940,131 @@ XkbRF_GetComponents( XkbRF_RulesPtr rules, XkbRF_ApplyPartialMatches(rules, names); if (names->keycodes) - names->keycodes= XkbRF_SubstituteVars(names->keycodes, &mdefs); + names->keycodes = XkbRF_SubstituteVars(names->keycodes, &mdefs); if (names->symbols) - names->symbols= XkbRF_SubstituteVars(names->symbols, &mdefs); + names->symbols = XkbRF_SubstituteVars(names->symbols, &mdefs); if (names->types) - names->types= XkbRF_SubstituteVars(names->types, &mdefs); + names->types = XkbRF_SubstituteVars(names->types, &mdefs); if (names->compat) - names->compat= XkbRF_SubstituteVars(names->compat, &mdefs); + names->compat = XkbRF_SubstituteVars(names->compat, &mdefs); if (names->geometry) - names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs); + names->geometry = XkbRF_SubstituteVars(names->geometry, &mdefs); if (names->keymap) - names->keymap= XkbRF_SubstituteVars(names->keymap, &mdefs); + names->keymap = XkbRF_SubstituteVars(names->keymap, &mdefs); FreeMultiDefs(&mdefs); return (names->keycodes && names->symbols && names->types && - names->compat && names->geometry ) || names->keymap; + names->compat && names->geometry) || names->keymap; } XkbRF_RulePtr -XkbRF_AddRule(XkbRF_RulesPtr rules) +XkbRF_AddRule(XkbRF_RulesPtr rules) { - if (rules->sz_rules<1) { - rules->sz_rules= 16; - rules->num_rules= 0; - rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec); + if (rules->sz_rules < 1) { + rules->sz_rules = 16; + rules->num_rules = 0; + rules->rules = _XkbTypedCalloc(rules->sz_rules, XkbRF_RuleRec); } - else if (rules->num_rules>=rules->sz_rules) { - rules->sz_rules*= 2; - rules->rules= _XkbTypedRealloc(rules->rules,rules->sz_rules, - XkbRF_RuleRec); + else if (rules->num_rules >= rules->sz_rules) { + rules->sz_rules *= 2; + rules->rules = _XkbTypedRealloc(rules->rules, rules->sz_rules, + XkbRF_RuleRec); } if (!rules->rules) { - rules->sz_rules= rules->num_rules= 0; + rules->sz_rules = rules->num_rules = 0; #ifdef DEBUG - fprintf(stderr,"Allocation failure in XkbRF_AddRule\n"); + fprintf(stderr, "Allocation failure in XkbRF_AddRule\n"); #endif - return NULL; + return NULL; } - bzero((char *)&rules->rules[rules->num_rules],sizeof(XkbRF_RuleRec)); + bzero((char *) &rules->rules[rules->num_rules], sizeof(XkbRF_RuleRec)); return &rules->rules[rules->num_rules++]; } XkbRF_GroupPtr -XkbRF_AddGroup(XkbRF_RulesPtr rules) +XkbRF_AddGroup(XkbRF_RulesPtr rules) { - if (rules->sz_groups<1) { - rules->sz_groups= 16; - rules->num_groups= 0; - rules->groups= _XkbTypedCalloc(rules->sz_groups,XkbRF_GroupRec); + if (rules->sz_groups < 1) { + rules->sz_groups = 16; + rules->num_groups = 0; + rules->groups = _XkbTypedCalloc(rules->sz_groups, XkbRF_GroupRec); } else if (rules->num_groups >= rules->sz_groups) { - rules->sz_groups *= 2; - rules->groups= _XkbTypedRealloc(rules->groups,rules->sz_groups, - XkbRF_GroupRec); + rules->sz_groups *= 2; + rules->groups = _XkbTypedRealloc(rules->groups, rules->sz_groups, + XkbRF_GroupRec); } if (!rules->groups) { - rules->sz_groups= rules->num_groups= 0; - return NULL; + rules->sz_groups = rules->num_groups = 0; + return NULL; } - bzero((char *)&rules->groups[rules->num_groups],sizeof(XkbRF_GroupRec)); + bzero((char *) &rules->groups[rules->num_groups], sizeof(XkbRF_GroupRec)); return &rules->groups[rules->num_groups++]; } Bool XkbRF_LoadRules(FILE *file, XkbRF_RulesPtr rules) { -InputLine line; -RemapSpec remap; -XkbRF_RuleRec trule,*rule; -XkbRF_GroupRec tgroup,*group; + InputLine line; + RemapSpec remap; + XkbRF_RuleRec trule, *rule; + XkbRF_GroupRec tgroup, *group; if (!(rules && file)) - return False; - bzero((char *)&remap,sizeof(RemapSpec)); - bzero((char *)&tgroup,sizeof(XkbRF_GroupRec)); + return False; + bzero((char *) &remap, sizeof(RemapSpec)); + bzero((char *) &tgroup, sizeof(XkbRF_GroupRec)); InitInputLine(&line); - while (GetInputLine(file,&line,True)) { - if (CheckLine(&line,&remap,&trule,&tgroup)) { + while (GetInputLine(file, &line, True)) { + if (CheckLine(&line, &remap, &trule, &tgroup)) { if (tgroup.number) { - if ((group= XkbRF_AddGroup(rules))!=NULL) { - *group= tgroup; - bzero((char *)&tgroup,sizeof(XkbRF_GroupRec)); - } - } else { - if ((rule= XkbRF_AddRule(rules))!=NULL) { - *rule= trule; - bzero((char *)&trule,sizeof(XkbRF_RuleRec)); - } - } - } - line.num_line= 0; + if ((group = XkbRF_AddGroup(rules)) != NULL) { + *group = tgroup; + bzero((char *) &tgroup, sizeof(XkbRF_GroupRec)); + } + } + else { + if ((rule = XkbRF_AddRule(rules)) != NULL) { + *rule = trule; + bzero((char *) &trule, sizeof(XkbRF_RuleRec)); + } + } + } + line.num_line = 0; } FreeInputLine(&line); return True; } Bool -XkbRF_LoadRulesByName(char *base,char *locale,XkbRF_RulesPtr rules) +XkbRF_LoadRulesByName(char *base, char *locale, XkbRF_RulesPtr rules) { -FILE * file; -char buf[PATH_MAX]; -Bool ok; + FILE *file; + char buf[PATH_MAX]; + Bool ok; - if ((!base)||(!rules)) - return False; + if ((!base) || (!rules)) + return False; if (locale) { - if (strlen(base)+strlen(locale)+2 > PATH_MAX) - return False; - sprintf(buf,"%s-%s", base, locale); + if (strlen(base) + strlen(locale) + 2 > PATH_MAX) + return False; + sprintf(buf, "%s-%s", base, locale); } else { - if (strlen(base)+1 > PATH_MAX) - return False; - strcpy(buf,base); + if (strlen(base) + 1 > PATH_MAX) + return False; + strcpy(buf, base); } - file= fopen(buf, "r"); - if ((!file)&&(locale)) { /* fallback if locale was specified */ - strcpy(buf,base); - file= fopen(buf, "r"); + file = fopen(buf, "r"); + if ((!file) && (locale)) { /* fallback if locale was specified */ + strcpy(buf, base); + file = fopen(buf, "r"); } if (!file) - return False; - ok= XkbRF_LoadRules(file,rules); + return False; + ok = XkbRF_LoadRules(file, rules); fclose(file); return ok; } @@ -1039,192 +1079,198 @@ Bool ok; #define HEAD_EXTRA 5 XkbRF_VarDescPtr -XkbRF_AddVarDesc(XkbRF_DescribeVarsPtr vars) +XkbRF_AddVarDesc(XkbRF_DescribeVarsPtr vars) { - if (vars->sz_desc<1) { - vars->sz_desc= 16; - vars->num_desc= 0; - vars->desc= _XkbTypedCalloc(vars->sz_desc,XkbRF_VarDescRec); + if (vars->sz_desc < 1) { + vars->sz_desc = 16; + vars->num_desc = 0; + vars->desc = _XkbTypedCalloc(vars->sz_desc, XkbRF_VarDescRec); } - else if (vars->num_desc>=vars->sz_desc) { - vars->sz_desc*= 2; - vars->desc= _XkbTypedRealloc(vars->desc,vars->sz_desc,XkbRF_VarDescRec); + else if (vars->num_desc >= vars->sz_desc) { + vars->sz_desc *= 2; + vars->desc = + _XkbTypedRealloc(vars->desc, vars->sz_desc, XkbRF_VarDescRec); } if (!vars->desc) { - vars->sz_desc= vars->num_desc= 0; - PR_DEBUG("Allocation failure in XkbRF_AddVarDesc\n"); - return NULL; + vars->sz_desc = vars->num_desc = 0; + PR_DEBUG("Allocation failure in XkbRF_AddVarDesc\n"); + return NULL; } - vars->desc[vars->num_desc].name= NULL; - vars->desc[vars->num_desc].desc= NULL; + vars->desc[vars->num_desc].name = NULL; + vars->desc[vars->num_desc].desc = NULL; return &vars->desc[vars->num_desc++]; } XkbRF_VarDescPtr -XkbRF_AddVarDescCopy(XkbRF_DescribeVarsPtr vars,XkbRF_VarDescPtr from) +XkbRF_AddVarDescCopy(XkbRF_DescribeVarsPtr vars, XkbRF_VarDescPtr from) { -XkbRF_VarDescPtr nd; + XkbRF_VarDescPtr nd; - if ((nd=XkbRF_AddVarDesc(vars))!=NULL) { - nd->name= _XkbDupString(from->name); - nd->desc= _XkbDupString(from->desc); + if ((nd = XkbRF_AddVarDesc(vars)) != NULL) { + nd->name = _XkbDupString(from->name); + nd->desc = _XkbDupString(from->desc); } return nd; } XkbRF_DescribeVarsPtr -XkbRF_AddVarToDescribe(XkbRF_RulesPtr rules,char *name) +XkbRF_AddVarToDescribe(XkbRF_RulesPtr rules, char *name) { - if (rules->sz_extra<1) { - rules->num_extra= 0; - rules->sz_extra= 1; - rules->extra_names= _XkbTypedCalloc(rules->sz_extra,char *); - rules->extra= _XkbTypedCalloc(rules->sz_extra, XkbRF_DescribeVarsRec); - } - else if (rules->num_extra>=rules->sz_extra) { - rules->sz_extra*= 2; - rules->extra_names= _XkbTypedRealloc(rules->extra_names,rules->sz_extra, - char *); - rules->extra=_XkbTypedRealloc(rules->extra, rules->sz_extra, - XkbRF_DescribeVarsRec); - } - if ((!rules->extra_names)||(!rules->extra)) { - PR_DEBUG("allocation error in extra parts\n"); - rules->sz_extra= rules->num_extra= 0; - rules->extra_names= NULL; - rules->extra= NULL; - return NULL; - } - rules->extra_names[rules->num_extra]= _XkbDupString(name); - bzero(&rules->extra[rules->num_extra],sizeof(XkbRF_DescribeVarsRec)); + if (rules->sz_extra < 1) { + rules->num_extra = 0; + rules->sz_extra = 1; + rules->extra_names = _XkbTypedCalloc(rules->sz_extra, char *); + + rules->extra = _XkbTypedCalloc(rules->sz_extra, XkbRF_DescribeVarsRec); + } + else if (rules->num_extra >= rules->sz_extra) { + rules->sz_extra *= 2; + rules->extra_names = + _XkbTypedRealloc(rules->extra_names, rules->sz_extra, char *); + rules->extra = + _XkbTypedRealloc(rules->extra, rules->sz_extra, + XkbRF_DescribeVarsRec); + } + if ((!rules->extra_names) || (!rules->extra)) { + PR_DEBUG("allocation error in extra parts\n"); + rules->sz_extra = rules->num_extra = 0; + rules->extra_names = NULL; + rules->extra = NULL; + return NULL; + } + rules->extra_names[rules->num_extra] = _XkbDupString(name); + bzero(&rules->extra[rules->num_extra], sizeof(XkbRF_DescribeVarsRec)); return &rules->extra[rules->num_extra++]; } Bool -XkbRF_LoadDescriptions(FILE *file,XkbRF_RulesPtr rules) +XkbRF_LoadDescriptions(FILE *file, XkbRF_RulesPtr rules) { -InputLine line; -XkbRF_VarDescRec tmp; -char *tok; -int len,headingtype,extra_ndx = 0; + InputLine line; + XkbRF_VarDescRec tmp; + char *tok; + int len, headingtype, extra_ndx = 0; - bzero((char *)&tmp, sizeof(XkbRF_VarDescRec)); + bzero((char *) &tmp, sizeof(XkbRF_VarDescRec)); headingtype = HEAD_NONE; InitInputLine(&line); - for ( ; GetInputLine(file,&line,False); line.num_line= 0) { - if (line.line[0]=='!') { - tok = strtok(&(line.line[1]), " \t"); - if (strcmp(tok,"model") == 0) - headingtype = HEAD_MODEL; - else if (_XkbStrCaseCmp(tok,"layout") == 0) - headingtype = HEAD_LAYOUT; - else if (_XkbStrCaseCmp(tok,"variant") == 0) - headingtype = HEAD_VARIANT; - else if (_XkbStrCaseCmp(tok,"option") == 0) - headingtype = HEAD_OPTION; - else { - int i; - headingtype = HEAD_EXTRA; - extra_ndx= -1; - for (i=0;(i<rules->num_extra)&&(extra_ndx<0);i++) { - if (_XkbStrCaseCmp(tok,rules->extra_names[i])) - extra_ndx= i; - } - if (extra_ndx<0) { - XkbRF_DescribeVarsPtr var; - PR_DEBUG1("Extra heading \"%s\" encountered\n",tok); - var= XkbRF_AddVarToDescribe(rules,tok); - if (var) - extra_ndx= var-rules->extra; - else headingtype= HEAD_NONE; - } - } - continue; - } - - if (headingtype == HEAD_NONE) { - PR_DEBUG("Must have a heading before first line of data\n"); - PR_DEBUG("Illegal line of data ignored\n"); - continue; - } - - len = strlen(line.line); - if ((tmp.name= strtok(line.line, " \t")) == NULL) { - PR_DEBUG("Huh? No token on line\n"); - PR_DEBUG("Illegal line of data ignored\n"); - continue; - } - if (strlen(tmp.name) == len) { - PR_DEBUG("No description found\n"); - PR_DEBUG("Illegal line of data ignored\n"); - continue; - } - - tok = line.line + strlen(tmp.name) + 1; - while ((*tok!='\n')&&isspace(*tok)) - tok++; - if (*tok == '\0') { - PR_DEBUG("No description found\n"); - PR_DEBUG("Illegal line of data ignored\n"); - continue; - } - tmp.desc= tok; - switch (headingtype) { - case HEAD_MODEL: - XkbRF_AddVarDescCopy(&rules->models,&tmp); - break; - case HEAD_LAYOUT: - XkbRF_AddVarDescCopy(&rules->layouts,&tmp); - break; - case HEAD_VARIANT: - XkbRF_AddVarDescCopy(&rules->variants,&tmp); - break; - case HEAD_OPTION: - XkbRF_AddVarDescCopy(&rules->options,&tmp); - break; - case HEAD_EXTRA: - XkbRF_AddVarDescCopy(&rules->extra[extra_ndx],&tmp); - break; - } + for (; GetInputLine(file, &line, False); line.num_line = 0) { + if (line.line[0] == '!') { + tok = strtok(&(line.line[1]), " \t"); + if (strcmp(tok, "model") == 0) + headingtype = HEAD_MODEL; + else if (_XkbStrCaseCmp(tok, "layout") == 0) + headingtype = HEAD_LAYOUT; + else if (_XkbStrCaseCmp(tok, "variant") == 0) + headingtype = HEAD_VARIANT; + else if (_XkbStrCaseCmp(tok, "option") == 0) + headingtype = HEAD_OPTION; + else { + int i; + + headingtype = HEAD_EXTRA; + extra_ndx = -1; + for (i = 0; (i < rules->num_extra) && (extra_ndx < 0); i++) { + if (_XkbStrCaseCmp(tok, rules->extra_names[i])) + extra_ndx = i; + } + if (extra_ndx < 0) { + XkbRF_DescribeVarsPtr var; + + PR_DEBUG1("Extra heading \"%s\" encountered\n", tok); + var = XkbRF_AddVarToDescribe(rules, tok); + if (var) + extra_ndx = var - rules->extra; + else + headingtype = HEAD_NONE; + } + } + continue; + } + + if (headingtype == HEAD_NONE) { + PR_DEBUG("Must have a heading before first line of data\n"); + PR_DEBUG("Illegal line of data ignored\n"); + continue; + } + + len = strlen(line.line); + if ((tmp.name = strtok(line.line, " \t")) == NULL) { + PR_DEBUG("Huh? No token on line\n"); + PR_DEBUG("Illegal line of data ignored\n"); + continue; + } + if (strlen(tmp.name) == len) { + PR_DEBUG("No description found\n"); + PR_DEBUG("Illegal line of data ignored\n"); + continue; + } + + tok = line.line + strlen(tmp.name) + 1; + while ((*tok != '\n') && isspace(*tok)) + tok++; + if (*tok == '\0') { + PR_DEBUG("No description found\n"); + PR_DEBUG("Illegal line of data ignored\n"); + continue; + } + tmp.desc = tok; + switch (headingtype) { + case HEAD_MODEL: + XkbRF_AddVarDescCopy(&rules->models, &tmp); + break; + case HEAD_LAYOUT: + XkbRF_AddVarDescCopy(&rules->layouts, &tmp); + break; + case HEAD_VARIANT: + XkbRF_AddVarDescCopy(&rules->variants, &tmp); + break; + case HEAD_OPTION: + XkbRF_AddVarDescCopy(&rules->options, &tmp); + break; + case HEAD_EXTRA: + XkbRF_AddVarDescCopy(&rules->extra[extra_ndx], &tmp); + break; + } } FreeInputLine(&line); - if ((rules->models.num_desc==0) && (rules->layouts.num_desc==0) && - (rules->variants.num_desc==0) && (rules->options.num_desc==0) && - (rules->num_extra==0)) { - return False; + if ((rules->models.num_desc == 0) && (rules->layouts.num_desc == 0) && + (rules->variants.num_desc == 0) && (rules->options.num_desc == 0) && + (rules->num_extra == 0)) { + return False; } return True; } Bool -XkbRF_LoadDescriptionsByName(char *base,char *locale,XkbRF_RulesPtr rules) +XkbRF_LoadDescriptionsByName(char *base, char *locale, XkbRF_RulesPtr rules) { -FILE * file; -char buf[PATH_MAX]; -Bool ok; + FILE *file; + char buf[PATH_MAX]; + Bool ok; - if ((!base)||(!rules)) - return False; + if ((!base) || (!rules)) + return False; if (locale) { - if (strlen(base)+strlen(locale)+6 > PATH_MAX) - return False; - sprintf(buf,"%s-%s.lst", base, locale); + if (strlen(base) + strlen(locale) + 6 > PATH_MAX) + return False; + sprintf(buf, "%s-%s.lst", base, locale); } else { - if (strlen(base)+5 > PATH_MAX) - return False; - sprintf(buf,"%s.lst", base); + if (strlen(base) + 5 > PATH_MAX) + return False; + sprintf(buf, "%s.lst", base); } - file= fopen(buf, "r"); - if ((!file)&&(locale)) { /* fallback if locale was specified */ - sprintf(buf,"%s.lst", base); + file = fopen(buf, "r"); + if ((!file) && (locale)) { /* fallback if locale was specified */ + sprintf(buf, "%s.lst", base); - file= fopen(buf, "r"); + file = fopen(buf, "r"); } if (!file) - return False; - ok= XkbRF_LoadDescriptions(file,rules); + return False; + ok = XkbRF_LoadDescriptions(file, rules); fclose(file); return ok; } @@ -1232,49 +1278,49 @@ Bool ok; /***====================================================================***/ XkbRF_RulesPtr -XkbRF_Load(char *base,char *locale,Bool wantDesc,Bool wantRules) +XkbRF_Load(char *base, char *locale, Bool wantDesc, Bool wantRules) { -XkbRF_RulesPtr rules; - - if ((!base)||((!wantDesc)&&(!wantRules))) - return NULL; - if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL) - return NULL; - if (wantDesc&&(!XkbRF_LoadDescriptionsByName(base,locale,rules))) { - XkbRF_Free(rules,True); - return NULL; + XkbRF_RulesPtr rules; + + if ((!base) || ((!wantDesc) && (!wantRules))) + return NULL; + if ((rules = _XkbTypedCalloc(1, XkbRF_RulesRec)) == NULL) + return NULL; + if (wantDesc && (!XkbRF_LoadDescriptionsByName(base, locale, rules))) { + XkbRF_Free(rules, True); + return NULL; } - if (wantRules&&(!XkbRF_LoadRulesByName(base,locale,rules))) { - XkbRF_Free(rules,True); - return NULL; + if (wantRules && (!XkbRF_LoadRulesByName(base, locale, rules))) { + XkbRF_Free(rules, True); + return NULL; } return rules; } XkbRF_RulesPtr -XkbRF_Create(int szRules,int szExtra) +XkbRF_Create(int szRules, int szExtra) { -XkbRF_RulesPtr rules; - - if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL) - return NULL; - if (szRules>0) { - rules->sz_rules= szRules; - rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec); - if (!rules->rules) { - _XkbFree(rules); - return NULL; - } - } - if (szExtra>0) { - rules->sz_extra= szExtra; - rules->extra= _XkbTypedCalloc(rules->sz_extra,XkbRF_DescribeVarsRec); - if (!rules->extra) { - if (rules->rules) - _XkbFree(rules->rules); - _XkbFree(rules); - return NULL; - } + XkbRF_RulesPtr rules; + + if ((rules = _XkbTypedCalloc(1, XkbRF_RulesRec)) == NULL) + return NULL; + if (szRules > 0) { + rules->sz_rules = szRules; + rules->rules = _XkbTypedCalloc(rules->sz_rules, XkbRF_RuleRec); + if (!rules->rules) { + _XkbFree(rules); + return NULL; + } + } + if (szExtra > 0) { + rules->sz_extra = szExtra; + rules->extra = _XkbTypedCalloc(rules->sz_extra, XkbRF_DescribeVarsRec); + if (!rules->extra) { + if (rules->rules) + _XkbFree(rules->rules); + _XkbFree(rules); + return NULL; + } } return rules; } @@ -1284,133 +1330,146 @@ XkbRF_RulesPtr rules; static void XkbRF_ClearVarDescriptions(XkbRF_DescribeVarsPtr var) { -register int i; - - for (i=0;i<var->num_desc;i++) { - if (var->desc[i].name) - _XkbFree(var->desc[i].name); - if (var->desc[i].desc) - _XkbFree(var->desc[i].desc); - var->desc[i].name= var->desc[i].desc= NULL; + register int i; + + for (i = 0; i < var->num_desc; i++) { + if (var->desc[i].name) + _XkbFree(var->desc[i].name); + if (var->desc[i].desc) + _XkbFree(var->desc[i].desc); + var->desc[i].name = var->desc[i].desc = NULL; } if (var->desc) - _XkbFree(var->desc); - var->desc= NULL; + _XkbFree(var->desc); + var->desc = NULL; return; } void -XkbRF_Free(XkbRF_RulesPtr rules,Bool freeRules) +XkbRF_Free(XkbRF_RulesPtr rules, Bool freeRules) { -int i; -XkbRF_RulePtr rule; -XkbRF_GroupPtr group; + int i; + XkbRF_RulePtr rule; + XkbRF_GroupPtr group; if (!rules) - return; + return; XkbRF_ClearVarDescriptions(&rules->models); XkbRF_ClearVarDescriptions(&rules->layouts); XkbRF_ClearVarDescriptions(&rules->variants); XkbRF_ClearVarDescriptions(&rules->options); if (rules->extra) { - for (i = 0; i < rules->num_extra; i++) { - XkbRF_ClearVarDescriptions(&rules->extra[i]); - } - _XkbFree(rules->extra); - rules->num_extra= rules->sz_extra= 0; - rules->extra= NULL; + for (i = 0; i < rules->num_extra; i++) { + XkbRF_ClearVarDescriptions(&rules->extra[i]); + } + _XkbFree(rules->extra); + rules->num_extra = rules->sz_extra = 0; + rules->extra = NULL; } if (rules->rules) { - for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) { - if (rule->model) _XkbFree(rule->model); - if (rule->layout) _XkbFree(rule->layout); - if (rule->variant) _XkbFree(rule->variant); - if (rule->option) _XkbFree(rule->option); - if (rule->keycodes) _XkbFree(rule->keycodes); - if (rule->symbols) _XkbFree(rule->symbols); - if (rule->types) _XkbFree(rule->types); - if (rule->compat) _XkbFree(rule->compat); - if (rule->geometry) _XkbFree(rule->geometry); - if (rule->keymap) _XkbFree(rule->keymap); - bzero((char *)rule,sizeof(XkbRF_RuleRec)); - } - _XkbFree(rules->rules); - rules->num_rules= rules->sz_rules= 0; - rules->rules= NULL; + for (i = 0, rule = rules->rules; i < rules->num_rules; i++, rule++) { + if (rule->model) + _XkbFree(rule->model); + if (rule->layout) + _XkbFree(rule->layout); + if (rule->variant) + _XkbFree(rule->variant); + if (rule->option) + _XkbFree(rule->option); + if (rule->keycodes) + _XkbFree(rule->keycodes); + if (rule->symbols) + _XkbFree(rule->symbols); + if (rule->types) + _XkbFree(rule->types); + if (rule->compat) + _XkbFree(rule->compat); + if (rule->geometry) + _XkbFree(rule->geometry); + if (rule->keymap) + _XkbFree(rule->keymap); + bzero((char *) rule, sizeof(XkbRF_RuleRec)); + } + _XkbFree(rules->rules); + rules->num_rules = rules->sz_rules = 0; + rules->rules = NULL; } if (rules->groups) { - for (i=0, group=rules->groups;i<rules->num_groups;i++,group++) { - if (group->name) _XkbFree(group->name); - if (group->words) _XkbFree(group->words); - } - _XkbFree(rules->groups); - rules->num_groups= 0; - rules->groups= NULL; + for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) { + if (group->name) + _XkbFree(group->name); + if (group->words) + _XkbFree(group->words); + } + _XkbFree(rules->groups); + rules->num_groups = 0; + rules->groups = NULL; } if (freeRules) - _XkbFree(rules); + _XkbFree(rules); return; } #ifndef XKB_IN_SERVER Bool -XkbRF_GetNamesProp(Display *dpy,char **rf_rtrn,XkbRF_VarDefsPtr vd_rtrn) +XkbRF_GetNamesProp(Display * dpy, char **rf_rtrn, XkbRF_VarDefsPtr vd_rtrn) { -Atom rules_atom,actual_type; -int fmt; -unsigned long nitems,bytes_after; -unsigned char *data; -char *out, *end; -Status rtrn; - - rules_atom= XInternAtom(dpy,_XKB_RF_NAMES_PROP_ATOM,True); - if (rules_atom==None) /* property cannot exist */ - return False; - rtrn= XGetWindowProperty(dpy,DefaultRootWindow(dpy),rules_atom, - 0L,_XKB_RF_NAMES_PROP_MAXLEN,False, - XA_STRING,&actual_type, - &fmt,&nitems,&bytes_after, - (unsigned char **)&data); - if (rtrn!=Success) - return False; + Atom rules_atom, actual_type; + int fmt; + unsigned long nitems, bytes_after; + unsigned char *data; + char *out, *end; + Status rtrn; + + rules_atom = XInternAtom(dpy, _XKB_RF_NAMES_PROP_ATOM, True); + if (rules_atom == None) /* property cannot exist */ + return False; + rtrn = XGetWindowProperty(dpy, DefaultRootWindow(dpy), rules_atom, + 0L, _XKB_RF_NAMES_PROP_MAXLEN, False, + XA_STRING, &actual_type, + &fmt, &nitems, &bytes_after, + (unsigned char **) &data); + if (rtrn != Success) + return False; if (rf_rtrn) - *rf_rtrn= NULL; - (void)bzero((char *)vd_rtrn,sizeof(XkbRF_VarDefsRec)); - if ((bytes_after>0)||(actual_type!=XA_STRING)||(fmt!=8)) { - if (data) XFree(data); - return (fmt==0?True:False); + *rf_rtrn = NULL; + (void) bzero((char *) vd_rtrn, sizeof(XkbRF_VarDefsRec)); + if ((bytes_after > 0) || (actual_type != XA_STRING) || (fmt != 8)) { + if (data) + XFree(data); + return (fmt == 0 ? True : False); } - out=(char*)data; - end=out+nitems; + out = (char *) data; + end = out + nitems; if (out && (*out) && rf_rtrn) - *rf_rtrn= _XkbDupString(out); - out+=strlen(out)+1; + *rf_rtrn = _XkbDupString(out); + out += strlen(out) + 1; - if (out<end) { - if (*out) - vd_rtrn->model= _XkbDupString(out); - out+=strlen(out)+1; + if (out < end) { + if (*out) + vd_rtrn->model = _XkbDupString(out); + out += strlen(out) + 1; } - if (out<end) { - if (*out) - vd_rtrn->layout= _XkbDupString(out); - out+=strlen(out)+1; + if (out < end) { + if (*out) + vd_rtrn->layout = _XkbDupString(out); + out += strlen(out) + 1; } - if (out<end) { - if (*out) - vd_rtrn->variant= _XkbDupString(out); - out+=strlen(out)+1; + if (out < end) { + if (*out) + vd_rtrn->variant = _XkbDupString(out); + out += strlen(out) + 1; } - if (out<end) { - if (*out) - vd_rtrn->options= _XkbDupString(out); - out+=strlen(out)+1; + if (out < end) { + if (*out) + vd_rtrn->options = _XkbDupString(out); + out += strlen(out) + 1; } XFree(data); @@ -1418,66 +1477,66 @@ Status rtrn; } Bool -XkbRF_SetNamesProp(Display *dpy,char *rules_file,XkbRF_VarDefsPtr var_defs) +XkbRF_SetNamesProp(Display *dpy, char *rules_file, XkbRF_VarDefsPtr var_defs) { -int len,out; -Atom name; -char * pval; - - len= (rules_file?strlen(rules_file):0); - len+= (var_defs->model?strlen(var_defs->model):0); - len+= (var_defs->layout?strlen(var_defs->layout):0); - len+= (var_defs->variant?strlen(var_defs->variant):0); - len+= (var_defs->options?strlen(var_defs->options):0); - if (len<1) + int len, out; + Atom name; + char *pval; + + len = (rules_file ? strlen(rules_file) : 0); + len += (var_defs->model ? strlen(var_defs->model) : 0); + len += (var_defs->layout ? strlen(var_defs->layout) : 0); + len += (var_defs->variant ? strlen(var_defs->variant) : 0); + len += (var_defs->options ? strlen(var_defs->options) : 0); + if (len < 1) return True; - len+= 5; /* trailing NULs */ + len += 5; /* trailing NULs */ - name= XInternAtom(dpy,_XKB_RF_NAMES_PROP_ATOM,False); - if (name==None) { /* should never happen */ - _XkbLibError(_XkbErrXReqFailure,"XkbRF_SetNamesProp",X_InternAtom); + name = XInternAtom(dpy, _XKB_RF_NAMES_PROP_ATOM, False); + if (name == None) { /* should never happen */ + _XkbLibError(_XkbErrXReqFailure, "XkbRF_SetNamesProp", X_InternAtom); return False; } - pval= (char *)_XkbAlloc(len); + pval = (char *) _XkbAlloc(len); if (!pval) { - _XkbLibError(_XkbErrBadAlloc,"XkbRF_SetNamesProp",len); + _XkbLibError(_XkbErrBadAlloc, "XkbRF_SetNamesProp", len); return False; } - out= 0; + out = 0; if (rules_file) { - strcpy(&pval[out],rules_file); - out+= strlen(rules_file); + strcpy(&pval[out], rules_file); + out += strlen(rules_file); } - pval[out++]= '\0'; + pval[out++] = '\0'; if (var_defs->model) { - strcpy(&pval[out],var_defs->model); - out+= strlen(var_defs->model); + strcpy(&pval[out], var_defs->model); + out += strlen(var_defs->model); } - pval[out++]= '\0'; + pval[out++] = '\0'; if (var_defs->layout) { - strcpy(&pval[out],var_defs->layout); - out+= strlen(var_defs->layout); + strcpy(&pval[out], var_defs->layout); + out += strlen(var_defs->layout); } - pval[out++]= '\0'; + pval[out++] = '\0'; if (var_defs->variant) { - strcpy(&pval[out],var_defs->variant); - out+= strlen(var_defs->variant); + strcpy(&pval[out], var_defs->variant); + out += strlen(var_defs->variant); } - pval[out++]= '\0'; + pval[out++] = '\0'; if (var_defs->options) { - strcpy(&pval[out],var_defs->options); - out+= strlen(var_defs->options); + strcpy(&pval[out], var_defs->options); + out += strlen(var_defs->options); } - pval[out++]= '\0'; - if (out!=len) { - _XkbLibError(_XkbErrBadLength,"XkbRF_SetNamesProp",out); - _XkbFree(pval); - return False; + pval[out++] = '\0'; + if (out != len) { + _XkbLibError(_XkbErrBadLength, "XkbRF_SetNamesProp", out); + _XkbFree(pval); + return False; } - XChangeProperty(dpy,DefaultRootWindow(dpy),name,XA_STRING,8,PropModeReplace, - (unsigned char *)pval,len); + XChangeProperty(dpy, DefaultRootWindow(dpy), name, XA_STRING, 8, + PropModeReplace, (unsigned char *) pval, len); _XkbFree(pval); return True; } diff --git a/src/srvmisc.c b/src/srvmisc.c index 478d373..cbf1ec8 100644 --- a/src/srvmisc.c +++ b/src/srvmisc.c @@ -40,175 +40,196 @@ Bool XkbWriteToServer(XkbFileInfo *result) { -XkbDescPtr xkb; -Display * dpy; - - if ((result==NULL)||(result->xkb==NULL)||(result->xkb->dpy==NULL)) - return False; - xkb= result->xkb; - dpy= xkb->dpy; - if (!XkbSetMap(dpy,XkbAllMapComponentsMask,xkb)) - return False; - if (!XkbSetIndicatorMap(dpy,~0,xkb)) - return False; + XkbDescPtr xkb; + Display *dpy; + + if ((result == NULL) || (result->xkb == NULL) || (result->xkb->dpy == NULL)) + return False; + xkb = result->xkb; + dpy = xkb->dpy; + if (!XkbSetMap(dpy, XkbAllMapComponentsMask, xkb)) + return False; + if (!XkbSetIndicatorMap(dpy, ~0, xkb)) + return False; #ifdef NOTYET - if (!XkbSetControls(dpy,XkbAllControlsMask,xkb)) - return False; + if (!XkbSetControls(dpy, XkbAllControlsMask, xkb)) + return False; #endif - if (!XkbSetCompatMap(dpy,XkbAllCompatMask,xkb,True)) - return False; - if (!XkbSetNames(dpy,XkbAllNamesMask,0,xkb->map->num_types,xkb)) - return False; + if (!XkbSetCompatMap(dpy, XkbAllCompatMask, xkb, True)) + return False; + if (!XkbSetNames(dpy, XkbAllNamesMask, 0, xkb->map->num_types, xkb)) + return False; if (xkb->geom) { - if (XkbSetGeometry(dpy,xkb->device_spec,xkb->geom)!=Success) - return False; + if (XkbSetGeometry(dpy, xkb->device_spec, xkb->geom) != Success) + return False; } return True; #ifdef NOTYET switch (result->type) { - case XkmSemanticsFile: - func= WriteCHdrSemantics; - break; - case XkmLayoutFile: - func= WriteCHdrLayout; - break; - case XkmKeymapFile: - func= WriteCHdrKeymap; - break; - default: - _XkbLibError(_XkbErrIllegalContents,"XkbWriteToServer",result->type); - break; + case XkmSemanticsFile: + func = WriteCHdrSemantics; + break; + case XkmLayoutFile: + func = WriteCHdrLayout; + break; + case XkmKeymapFile: + func = WriteCHdrKeymap; + break; + default: + _XkbLibError(_XkbErrIllegalContents, "XkbWriteToServer", result->type); + break; } return ok; #endif } unsigned -XkbReadFromServer(Display *dpy,unsigned need,unsigned want,XkbFileInfo *result) +XkbReadFromServer(Display *dpy, unsigned need, unsigned want, + XkbFileInfo *result) { -unsigned which= need|want; -unsigned tmp = 0; - - if ((result==NULL)||(dpy==NULL)) - return which; - - if (which&XkmSymbolsMask) tmp= XkbAllMapComponentsMask; - else if (which&XkmTypesMask) tmp= XkbKeyTypesMask; - if (result->xkb==NULL) { - result->xkb= XkbGetMap(dpy,tmp,XkbUseCoreKbd); - if (!result->xkb) - return which; - else which&= ~(XkmSymbolsMask|XkmTypesMask|XkmVirtualModsMask); + unsigned which = need | want; + unsigned tmp = 0; + + if ((result == NULL) || (dpy == NULL)) + return which; + + if (which & XkmSymbolsMask) + tmp = XkbAllMapComponentsMask; + else if (which & XkmTypesMask) + tmp = XkbKeyTypesMask; + if (result->xkb == NULL) { + result->xkb = XkbGetMap(dpy, tmp, XkbUseCoreKbd); + if (!result->xkb) + return which; + else + which &= ~(XkmSymbolsMask | XkmTypesMask | XkmVirtualModsMask); } - else if ((tmp)&&(XkbGetUpdatedMap(dpy,tmp,result->xkb)==Success)) - which&= ~(XkmSymbolsMask|XkmTypesMask|XkmVirtualModsMask); + else if ((tmp) && (XkbGetUpdatedMap(dpy, tmp, result->xkb) == Success)) + which &= ~(XkmSymbolsMask | XkmTypesMask | XkmVirtualModsMask); - if (which&XkmIndicatorsMask) { - if (XkbGetIndicatorMap(dpy,XkbAllIndicatorsMask,result->xkb)==Success) - which&= ~XkmIndicatorsMask; + if (which & XkmIndicatorsMask) { + if (XkbGetIndicatorMap(dpy, XkbAllIndicatorsMask, result->xkb) == + Success) + which &= ~XkmIndicatorsMask; } - if (which&XkmCompatMapMask) { - if (XkbGetCompatMap(dpy,XkbAllCompatMask,result->xkb)==Success) - which&= ~XkmCompatMapMask; + if (which & XkmCompatMapMask) { + if (XkbGetCompatMap(dpy, XkbAllCompatMask, result->xkb) == Success) + which &= ~XkmCompatMapMask; } - if (which&XkmGeometryMask) { - if (XkbGetGeometry(dpy,result->xkb)==Success) - which&= ~XkmGeometryMask; + if (which & XkmGeometryMask) { + if (XkbGetGeometry(dpy, result->xkb) == Success) + which &= ~XkmGeometryMask; } - XkbGetNames(dpy,XkbAllNamesMask,result->xkb); + XkbGetNames(dpy, XkbAllNamesMask, result->xkb); return which; } Status -XkbChangeKbdDisplay(Display *newDpy,XkbFileInfo *result) +XkbChangeKbdDisplay(Display *newDpy, XkbFileInfo *result) { -register int i; -XkbDescPtr xkb; -Display * oldDpy; -Atom * atm; - - if ((result->xkb==NULL)||(result->xkb->dpy==newDpy)) - return Success; - xkb= result->xkb; - oldDpy= xkb->dpy; + register int i; + XkbDescPtr xkb; + Display *oldDpy; + Atom *atm; + + if ((result->xkb == NULL) || (result->xkb->dpy == newDpy)) + return Success; + xkb = result->xkb; + oldDpy = xkb->dpy; if (xkb->names) { - XkbNamesPtr names= xkb->names; - names->keycodes= XkbChangeAtomDisplay(oldDpy,newDpy,names->keycodes); - names->geometry= XkbChangeAtomDisplay(oldDpy,newDpy,names->geometry); - names->symbols= XkbChangeAtomDisplay(oldDpy,newDpy,names->symbols); - names->types= XkbChangeAtomDisplay(oldDpy,newDpy,names->types); - names->compat= XkbChangeAtomDisplay(oldDpy,newDpy,names->compat); - names->phys_symbols= XkbChangeAtomDisplay(oldDpy,newDpy, - names->phys_symbols); - for (i=0,atm=names->vmods;i<XkbNumVirtualMods;i++,atm++) { - *atm= XkbChangeAtomDisplay(oldDpy,newDpy,*atm); - } - for (i=0,atm=names->indicators;i<XkbNumIndicators;i++,atm++) { - *atm= XkbChangeAtomDisplay(oldDpy,newDpy,*atm); - } - for (i=0,atm=names->groups;i<XkbNumKbdGroups;i++,atm++) { - *atm= XkbChangeAtomDisplay(oldDpy,newDpy,*atm); - } - for (i=0,atm=names->radio_groups;i<names->num_rg;i++,atm++) { - *atm= XkbChangeAtomDisplay(oldDpy,newDpy,*atm); - } + XkbNamesPtr names = xkb->names; + + names->keycodes = XkbChangeAtomDisplay(oldDpy, newDpy, names->keycodes); + names->geometry = XkbChangeAtomDisplay(oldDpy, newDpy, names->geometry); + names->symbols = XkbChangeAtomDisplay(oldDpy, newDpy, names->symbols); + names->types = XkbChangeAtomDisplay(oldDpy, newDpy, names->types); + names->compat = XkbChangeAtomDisplay(oldDpy, newDpy, names->compat); + names->phys_symbols = XkbChangeAtomDisplay(oldDpy, newDpy, + names->phys_symbols); + for (i = 0, atm = names->vmods; i < XkbNumVirtualMods; i++, atm++) { + *atm = XkbChangeAtomDisplay(oldDpy, newDpy, *atm); + } + for (i = 0, atm = names->indicators; i < XkbNumIndicators; i++, atm++) { + *atm = XkbChangeAtomDisplay(oldDpy, newDpy, *atm); + } + for (i = 0, atm = names->groups; i < XkbNumKbdGroups; i++, atm++) { + *atm = XkbChangeAtomDisplay(oldDpy, newDpy, *atm); + } + for (i = 0, atm = names->radio_groups; i < names->num_rg; i++, atm++) { + *atm = XkbChangeAtomDisplay(oldDpy, newDpy, *atm); + } } if (xkb->map) { - register int t; - XkbKeyTypePtr type; - for (t=0,type=xkb->map->types;t<xkb->map->num_types;t++,type++) { - type->name= XkbChangeAtomDisplay(oldDpy,newDpy,type->name); - if (type->level_names!=NULL) { - for (i=0,atm=type->level_names;i<type->num_levels;i++,atm++) { - *atm= XkbChangeAtomDisplay(oldDpy,newDpy,*atm); - } - } - } + register int t; + XkbKeyTypePtr type; + + for (t = 0, type = xkb->map->types; t < xkb->map->num_types; + t++, type++) { + type->name = XkbChangeAtomDisplay(oldDpy, newDpy, type->name); + if (type->level_names != NULL) { + for (i = 0, atm = type->level_names; i < type->num_levels; + i++, atm++) { + *atm = XkbChangeAtomDisplay(oldDpy, newDpy, *atm); + } + } + } } if (xkb->geom) { - XkbGeometryPtr geom= xkb->geom; - geom->name= XkbChangeAtomDisplay(oldDpy,newDpy,geom->name); - if (geom->shapes) { - register int s; - XkbShapePtr shape; - for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) { - shape->name= XkbChangeAtomDisplay(oldDpy,newDpy,shape->name); - } - } - if (geom->sections) { - register int s; - XkbSectionPtr section; - for (s=0,section=geom->sections;s<geom->num_sections;s++,section++){ - section->name=XkbChangeAtomDisplay(oldDpy,newDpy,section->name); - if (section->doodads) { - register int d; - XkbDoodadPtr doodad; - for (d=0,doodad=section->doodads;d<section->num_doodads; - d++,doodad++) { - doodad->any.name= XkbChangeAtomDisplay(oldDpy,newDpy, - doodad->any.name); - } - } - if (section->overlays) { - register int o; - register XkbOverlayPtr ol; - for (o=0,ol=section->overlays;o<section->num_overlays; - o++,ol++) { - ol->name= XkbChangeAtomDisplay(oldDpy,newDpy,ol->name); - } - } - } - } - if (geom->doodads) { - register int d; - XkbDoodadPtr doodad; - for (d=0,doodad=geom->doodads;d<geom->num_doodads;d++,doodad++) { - doodad->any.name= XkbChangeAtomDisplay(oldDpy,newDpy, - doodad->any.name); - } - } + XkbGeometryPtr geom = xkb->geom; + + geom->name = XkbChangeAtomDisplay(oldDpy, newDpy, geom->name); + if (geom->shapes) { + register int s; + XkbShapePtr shape; + + for (s = 0, shape = geom->shapes; s < geom->num_shapes; + s++, shape++) { + shape->name = XkbChangeAtomDisplay(oldDpy, newDpy, shape->name); + } + } + if (geom->sections) { + register int s; + XkbSectionPtr section; + + for (s = 0, section = geom->sections; s < geom->num_sections; + s++, section++) { + section->name = + XkbChangeAtomDisplay(oldDpy, newDpy, section->name); + if (section->doodads) { + register int d; + XkbDoodadPtr doodad; + + for (d = 0, doodad = section->doodads; + d < section->num_doodads; d++, doodad++) { + doodad->any.name = + XkbChangeAtomDisplay(oldDpy, newDpy, + doodad->any.name); + } + } + if (section->overlays) { + register int o; + register XkbOverlayPtr ol; + + for (o = 0, ol = section->overlays; + o < section->num_overlays; o++, ol++) { + ol->name = + XkbChangeAtomDisplay(oldDpy, newDpy, ol->name); + } + } + } + } + if (geom->doodads) { + register int d; + XkbDoodadPtr doodad; + + for (d = 0, doodad = geom->doodads; d < geom->num_doodads; + d++, doodad++) { + doodad->any.name = + XkbChangeAtomDisplay(oldDpy, newDpy, doodad->any.name); + } + } } - xkb->dpy= newDpy; + xkb->dpy = newDpy; return Success; } diff --git a/src/xkbatom.c b/src/xkbatom.c index b60e90e..8878892 100644 --- a/src/xkbatom.c +++ b/src/xkbatom.c @@ -89,95 +89,95 @@ SOFTWARE. #define InitialTableSize 100 typedef struct _Node { - struct _Node *left, *right; + struct _Node *left, *right; Atom a; unsigned int fingerPrint; - char *string; + char *string; } NodeRec, *NodePtr; #define BAD_RESOURCE 0xe0000000 static Atom lastAtom = None; -static NodePtr atomRoot = (NodePtr)NULL; +static NodePtr atomRoot = (NodePtr) NULL; static unsigned long tableLength; static NodePtr *nodeTable; static Atom -_XkbMakeAtom(char *string,unsigned len,Bool makeit) +_XkbMakeAtom(char *string, unsigned len, Bool makeit) { - register NodePtr * np; + register NodePtr *np; unsigned i; - int comp; - register unsigned int fp = 0; + int comp; + register unsigned int fp = 0; np = &atomRoot; - for (i = 0; i < (len+1)/2; i++) - { - fp = fp * 27 + string[i]; - fp = fp * 27 + string[len - 1 - i]; + for (i = 0; i < (len + 1) / 2; i++) { + fp = fp * 27 + string[i]; + fp = fp * 27 + string[len - 1 - i]; } - while (*np != (NodePtr) NULL) - { - if (fp < (*np)->fingerPrint) - np = &((*np)->left); - else if (fp > (*np)->fingerPrint) - np = &((*np)->right); - else - { /* now start testing the strings */ - comp = strncmp(string, (*np)->string, (int)len); - if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string)))) - np = &((*np)->left); - else if (comp > 0) - np = &((*np)->right); - else - return(*np)->a; - } + while (*np != (NodePtr) NULL) { + if (fp < (*np)->fingerPrint) + np = &((*np)->left); + else if (fp > (*np)->fingerPrint) + np = &((*np)->right); + else { /* now start testing the strings */ + comp = strncmp(string, (*np)->string, (int) len); + if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string)))) + np = &((*np)->left); + else if (comp > 0) + np = &((*np)->right); + else + return (*np)->a; + } } - if (makeit) - { - register NodePtr nd; - - nd = (NodePtr) _XkbAlloc(sizeof(NodeRec)); - if (!nd) - return BAD_RESOURCE; - nd->string = (char *) _XkbAlloc(len + 1); - if (!nd->string) { - _XkbFree(nd); - return BAD_RESOURCE; - } - strncpy(nd->string, string, (int)len); - nd->string[len] = 0; - if ((lastAtom + 1) >= tableLength) { - NodePtr *table; - - table = (NodePtr *) _XkbRealloc(nodeTable, - tableLength * (2 * sizeof(NodePtr))); - if (!table) { - if (nd->string != string) - _XkbFree(nd->string); - _XkbFree(nd); - return BAD_RESOURCE; - } - tableLength <<= 1; - nodeTable = table; - } - *np = nd; - nd->left = nd->right = (NodePtr) NULL; - nd->fingerPrint = fp; - nd->a = (++lastAtom); - *(nodeTable+lastAtom) = nd; - return nd->a; + if (makeit) { + register NodePtr nd; + + nd = (NodePtr) _XkbAlloc(sizeof(NodeRec)); + if (!nd) + return BAD_RESOURCE; + nd->string = (char *) _XkbAlloc(len + 1); + if (!nd->string) { + _XkbFree(nd); + return BAD_RESOURCE; + } + strncpy(nd->string, string, (int) len); + nd->string[len] = 0; + if ((lastAtom + 1) >= tableLength) { + NodePtr *table; + + table = (NodePtr *) _XkbRealloc(nodeTable, + tableLength * (2 * + sizeof(NodePtr))); + if (!table) { + if (nd->string != string) + _XkbFree(nd->string); + _XkbFree(nd); + return BAD_RESOURCE; + } + tableLength <<= 1; + nodeTable = table; + } + *np = nd; + nd->left = nd->right = (NodePtr) NULL; + nd->fingerPrint = fp; + nd->a = (++lastAtom); + *(nodeTable + lastAtom) = nd; + return nd->a; } else - return None; + return None; } static char * _XkbNameForAtom(Atom atom) { NodePtr node; - if (atom > lastAtom) return NULL; - if ((node = nodeTable[atom]) == (NodePtr)NULL) return NULL; + + if (atom > lastAtom) + return NULL; + if ((node = nodeTable[atom]) == (NodePtr) NULL) + return NULL; return strdup(node->string); } @@ -185,46 +185,46 @@ static void _XkbInitAtoms(void) { tableLength = InitialTableSize; - nodeTable = (NodePtr *)_XkbAlloc(InitialTableSize*sizeof(NodePtr)); - nodeTable[None] = (NodePtr)NULL; + nodeTable = (NodePtr *) _XkbAlloc(InitialTableSize * sizeof(NodePtr)); + nodeTable[None] = (NodePtr) NULL; } /***====================================================================***/ char * -XkbAtomGetString(Display *dpy,Atom atm) +XkbAtomGetString(Display *dpy, Atom atm) { - if (atm==None) - return NULL; - if (dpy==NULL) - return _XkbNameForAtom(atm); - return XGetAtomName(dpy,atm); + if (atm == None) + return NULL; + if (dpy == NULL) + return _XkbNameForAtom(atm); + return XGetAtomName(dpy, atm); } /***====================================================================***/ Atom -XkbInternAtom(Display *dpy,char *name,Bool onlyIfExists) +XkbInternAtom(Display *dpy, char *name, Bool onlyIfExists) { - if (name==NULL) - return None; - if (dpy==NULL) { - return _XkbMakeAtom(name, strlen(name), (!onlyIfExists)); + if (name == NULL) + return None; + if (dpy == NULL) { + return _XkbMakeAtom(name, strlen(name), (!onlyIfExists)); } - return XInternAtom(dpy,name,onlyIfExists); + return XInternAtom(dpy, name, onlyIfExists); } /***====================================================================***/ Atom -XkbChangeAtomDisplay(Display *oldDpy,Display *newDpy,Atom atm) +XkbChangeAtomDisplay(Display *oldDpy, Display *newDpy, Atom atm) { -char *tmp; + char *tmp; - if (atm!=None) { - tmp= XkbAtomGetString(oldDpy,atm); - if (tmp!=NULL) - return XkbInternAtom(newDpy,tmp,False); + if (atm != None) { + tmp = XkbAtomGetString(oldDpy, atm); + if (tmp != NULL) + return XkbInternAtom(newDpy, tmp, False); } return None; } @@ -234,10 +234,11 @@ char *tmp; void XkbInitAtoms(Display *dpy) { -static int been_here= 0; - if ((dpy==NULL)&&(!been_here)) { - _XkbInitAtoms(); - been_here= 1; + static int been_here = 0; + + if ((dpy == NULL) && (!been_here)) { + _XkbInitAtoms(); + been_here = 1; } return; } diff --git a/src/xkbbells.c b/src/xkbbells.c index 10b2725..f90faea 100644 --- a/src/xkbbells.c +++ b/src/xkbbells.c @@ -32,71 +32,73 @@ #include "XKBbells.h" static const char *_xkbStdBellNames[XkbBI_NumBells] = { - "Info", - "Warning", - "MinorError", - "MajorError", - "BadValue", - "InvalidLocation", - "Question", - "Start", - "End", - "Success", - "Failure", - "Wait", - "Proceed", - "Ignore", - "Iconify", - "Deconify", - "Open", - "Close", - "TerminalBell", - "MarginBell", - "CursorStuck", - "NewMail", - "LaunchApp", - "AppDeath", - "ImAlive", - "ClockChimeHour", - "ClockChimeHalf", - "ClockChimeQuarter", - "RepeatingLastBell", - "ComposeFail", - "AX_FeatureOn", - "AX_FeatureOff", - "AX_FeatureChange", - "AX_IndicatorOn", - "AX_IndicatorOff", - "AX_IndicatorChange", - "AX_SlowKeysWarning", - "AX_SlowKeyPress", - "AX_SlowKeyAccept", - "AX_SlowKeyReject", - "AX_SlowKeyRelease", - "AX_BounceKeyReject", - "AX_StickyLatch", - "AX_StickyLock", - "AX_StickyUnlock" + "Info", + "Warning", + "MinorError", + "MajorError", + "BadValue", + "InvalidLocation", + "Question", + "Start", + "End", + "Success", + "Failure", + "Wait", + "Proceed", + "Ignore", + "Iconify", + "Deconify", + "Open", + "Close", + "TerminalBell", + "MarginBell", + "CursorStuck", + "NewMail", + "LaunchApp", + "AppDeath", + "ImAlive", + "ClockChimeHour", + "ClockChimeHalf", + "ClockChimeQuarter", + "RepeatingLastBell", + "ComposeFail", + "AX_FeatureOn", + "AX_FeatureOff", + "AX_FeatureChange", + "AX_IndicatorOn", + "AX_IndicatorOff", + "AX_IndicatorChange", + "AX_SlowKeysWarning", + "AX_SlowKeyPress", + "AX_SlowKeyAccept", + "AX_SlowKeyReject", + "AX_SlowKeyRelease", + "AX_BounceKeyReject", + "AX_StickyLatch", + "AX_StickyLock", + "AX_StickyUnlock" }; static Atom _xkbStdBellAtoms[XkbBI_NumBells]; Bool -XkbStdBell(Display *dpy,Window win,int percent,int bellDef) +XkbStdBell(Display *dpy, Window win, int percent, int bellDef) { - if ((bellDef<0)||(bellDef>=XkbBI_NumBells)) - bellDef= XkbBI_Info; - if (_xkbStdBellAtoms[bellDef]==None) - _xkbStdBellAtoms[bellDef]= XInternAtom(dpy,_xkbStdBellNames[bellDef],0); - return XkbBell(dpy,win,percent,_xkbStdBellAtoms[bellDef]); + if ((bellDef < 0) || (bellDef >= XkbBI_NumBells)) + bellDef = XkbBI_Info; + if (_xkbStdBellAtoms[bellDef] == None) + _xkbStdBellAtoms[bellDef] = + XInternAtom(dpy, _xkbStdBellNames[bellDef], 0); + return XkbBell(dpy, win, percent, _xkbStdBellAtoms[bellDef]); } Bool -XkbStdBellEvent(Display *dpy,Window win,int percent,int bellDef) +XkbStdBellEvent(Display *dpy, Window win, int percent, int bellDef) { - if ((bellDef<0)||(bellDef>=XkbBI_NumBells)) - bellDef= XkbBI_Info; - if (_xkbStdBellAtoms[bellDef]==None) - _xkbStdBellAtoms[bellDef]= XInternAtom(dpy,_xkbStdBellNames[bellDef],0); - return XkbBellEvent(dpy,win,percent,_xkbStdBellAtoms[bellDef]); + if ((bellDef < 0) || (bellDef >= XkbBI_NumBells)) + bellDef = XkbBI_Info; + if (_xkbStdBellAtoms[bellDef] == None) + _xkbStdBellAtoms[bellDef] = + XInternAtom(dpy, _xkbStdBellNames[bellDef], 0); + return XkbBellEvent(dpy, win, percent, _xkbStdBellAtoms[bellDef]); } diff --git a/src/xkbconfig.c b/src/xkbconfig.c index b60017f..706286f 100644 --- a/src/xkbconfig.c +++ b/src/xkbconfig.c @@ -63,143 +63,152 @@ /***====================================================================***/ #define XKBCF_MAX_STR_LEN 100 -static char _XkbCF_rtrn[XKBCF_MAX_STR_LEN+1]; +static char _XkbCF_rtrn[XKBCF_MAX_STR_LEN + 1]; static int -ScanIdent(FILE *file,int ch,XkbCFScanResultPtr val_rtrn) +ScanIdent(FILE *file, int ch, XkbCFScanResultPtr val_rtrn) { -register int i; -char * str; + register int i; + char *str; - val_rtrn->str= str= _XkbCF_rtrn; - for (i=0;(isalpha(ch)||isdigit(ch)||(ch=='_'));ch=getc(file)) { - if (i<XKBCF_MAX_STR_LEN) - str[i++]= ch; + val_rtrn->str = str = _XkbCF_rtrn; + for (i = 0; (isalpha(ch) || isdigit(ch) || (ch == '_')); ch = getc(file)) { + if (i < XKBCF_MAX_STR_LEN) + str[i++] = ch; } - if ((ch!=EOF)&&(ch!=' ')&&(ch!='\t')) - ungetc(ch,file); - str[i]= '\0'; + if ((ch != EOF) && (ch != ' ') && (ch != '\t')) + ungetc(ch, file); + str[i] = '\0'; return XkbCF_Ident; } static int -ScanString(FILE *file,int quote,XkbCFScanResultPtr val_rtrn) +ScanString(FILE *file, int quote, XkbCFScanResultPtr val_rtrn) { -int ch,nInBuf; + int ch, nInBuf; nInBuf = 0; - while ( ((ch=getc(file))!=EOF) && (ch!='\n') && (ch!=quote) ) { - if ( ch == '\\' ) { - if ((ch = getc(file))!=EOF) { - if ( ch=='n' ) ch = '\n'; - else if ( ch == 't' ) ch = '\t'; - else if ( ch == 'v' ) ch = '\v'; - else if ( ch == 'b' ) ch = '\b'; - else if ( ch == 'r' ) ch = '\r'; - else if ( ch == 'f' ) ch = '\f'; - else if ( ch == 'e' ) ch = '\033'; - else if ( ch == '0' ) { - int tmp,stop; - ch = stop = 0; - if (((tmp=getc(file))!=EOF) && (isdigit(tmp)) && - (tmp!='8') && (tmp!='9')) { - ch= (ch*8)+(tmp-'0'); - } - else { - stop= 1; - ungetc(tmp,file); - } - if ((!stop) && ((tmp=getc(file))!=EOF) && (isdigit(tmp)) && - (tmp!='8') && (tmp!='9')) { - ch= (ch*8)+(tmp-'0'); - } - else { - stop= 1; - ungetc(tmp,file); - } - if ((!stop) && ((tmp=getc(file))!=EOF) && (isdigit(tmp)) && - (tmp!='8') && (tmp!='9')) { - ch= (ch*8)+(tmp-'0'); - } - else { - stop= 1; - ungetc(tmp,file); - } - } - } - else return XkbCF_EOF; - } - - if ( nInBuf < XKBCF_MAX_STR_LEN-1 ) - _XkbCF_rtrn[nInBuf++] = ch; + while (((ch = getc(file)) != EOF) && (ch != '\n') && (ch != quote)) { + if (ch == '\\') { + if ((ch = getc(file)) != EOF) { + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'e') + ch = '\033'; + else if (ch == '0') { + int tmp, stop; + + ch = stop = 0; + if (((tmp = getc(file)) != EOF) && (isdigit(tmp)) && + (tmp != '8') && (tmp != '9')) { + ch = (ch * 8) + (tmp - '0'); + } + else { + stop = 1; + ungetc(tmp, file); + } + if ((!stop) && ((tmp = getc(file)) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) { + ch = (ch * 8) + (tmp - '0'); + } + else { + stop = 1; + ungetc(tmp, file); + } + if ((!stop) && ((tmp = getc(file)) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) { + ch = (ch * 8) + (tmp - '0'); + } + else { + stop = 1; + ungetc(tmp, file); + } + } + } + else + return XkbCF_EOF; + } + + if (nInBuf < XKBCF_MAX_STR_LEN - 1) + _XkbCF_rtrn[nInBuf++] = ch; } - if ( ch == quote ) { - _XkbCF_rtrn[nInBuf++] = '\0'; - val_rtrn->str= _XkbCF_rtrn; - return XkbCF_String; + if (ch == quote) { + _XkbCF_rtrn[nInBuf++] = '\0'; + val_rtrn->str = _XkbCF_rtrn; + return XkbCF_String; } return XkbCF_UnterminatedString; } static int -ScanInteger(FILE *file,int ch,XkbCFScanResultPtr val_rtrn) +ScanInteger(FILE *file, int ch, XkbCFScanResultPtr val_rtrn) { -int i; + int i; if (isdigit(ch)) - ungetc(ch,file); - if (fscanf(file,"%i",&i)==1) { - val_rtrn->ival= i; - return XkbCF_Integer; + ungetc(ch, file); + if (fscanf(file, "%i", &i) == 1) { + val_rtrn->ival = i; + return XkbCF_Integer; } return XkbCF_Unknown; } int -XkbCFScan(FILE *file,XkbCFScanResultPtr val_rtrn,XkbConfigRtrnPtr rtrn) +XkbCFScan(FILE *file, XkbCFScanResultPtr val_rtrn, XkbConfigRtrnPtr rtrn) { -int ch; + int ch; do { - ch= getc(file); - } while ((ch=='\t')||(ch==' ')); + ch = getc(file); + } while ((ch == '\t') || (ch == ' ')); if (isalpha(ch)) - return ScanIdent(file,ch,val_rtrn); + return ScanIdent(file, ch, val_rtrn); else if (isdigit(ch)) - return ScanInteger(file,ch,val_rtrn); - else if (ch=='"') - return ScanString(file,ch,val_rtrn); - else if (ch=='\n') { - rtrn->line++; - return XkbCF_EOL; + return ScanInteger(file, ch, val_rtrn); + else if (ch == '"') + return ScanString(file, ch, val_rtrn); + else if (ch == '\n') { + rtrn->line++; + return XkbCF_EOL; } - else if (ch==';') - return XkbCF_Semi; - else if (ch=='=') - return XkbCF_Equals; - else if (ch=='+') { - ch= getc(file); - if (ch=='=') - return XkbCF_PlusEquals; - if ((ch!=EOF)&&(ch!=' ')&&(ch!='\t')) - ungetc(ch,file); - return XkbCF_Plus; + else if (ch == ';') + return XkbCF_Semi; + else if (ch == '=') + return XkbCF_Equals; + else if (ch == '+') { + ch = getc(file); + if (ch == '=') + return XkbCF_PlusEquals; + if ((ch != EOF) && (ch != ' ') && (ch != '\t')) + ungetc(ch, file); + return XkbCF_Plus; } - else if (ch=='-') { - ch= getc(file); - if (ch=='=') - return XkbCF_MinusEquals; - if ((ch!=EOF)&&(ch!=' ')&&(ch!='\t')) - ungetc(ch,file); - return XkbCF_Minus; + else if (ch == '-') { + ch = getc(file); + if (ch == '=') + return XkbCF_MinusEquals; + if ((ch != EOF) && (ch != ' ') && (ch != '\t')) + ungetc(ch, file); + return XkbCF_Minus; } - else if (ch==EOF) - return XkbCF_EOF; - else if ((ch=='#')||((ch=='/')&&(getc(file)=='/'))) { - while ((ch!='\n')&&(ch!=EOF)) - ch= getc(file); - rtrn->line++; - return XkbCF_EOL; + else if (ch == EOF) + return XkbCF_EOF; + else if ((ch == '#') || ((ch == '/') && (getc(file) == '/'))) { + while ((ch != '\n') && (ch != EOF)) + ch = getc(file); + rtrn->line++; + return XkbCF_EOL; } return XkbCF_Unknown; } @@ -251,1102 +260,1111 @@ int ch; #define _XkbCF_InitialFeedback 37 static Bool -AddCtrlByName(XkbConfigRtrnPtr rtrn,char *name,unsigned long *ctrls_rtrn) +AddCtrlByName(XkbConfigRtrnPtr rtrn, char *name, unsigned long *ctrls_rtrn) { - if ((_XkbStrCaseCmp(name,"repeat")==0)|| - (_XkbStrCaseCmp(name,"repeatkeys")==0)) - *ctrls_rtrn= XkbRepeatKeysMask; - else if (_XkbStrCaseCmp(name,"slowkeys")==0) - *ctrls_rtrn= XkbSlowKeysMask; - else if (_XkbStrCaseCmp(name,"bouncekeys")==0) - *ctrls_rtrn= XkbBounceKeysMask; - else if (_XkbStrCaseCmp(name,"stickykeys")==0) - *ctrls_rtrn= XkbStickyKeysMask; - else if (_XkbStrCaseCmp(name,"mousekeys")==0) - *ctrls_rtrn= XkbMouseKeysMask; - else if (_XkbStrCaseCmp(name,"mousekeysaccel")==0) - *ctrls_rtrn= XkbMouseKeysAccelMask; - else if (_XkbStrCaseCmp(name,"accessxkeys")==0) - *ctrls_rtrn= XkbAccessXKeysMask; - else if (_XkbStrCaseCmp(name,"accessxtimeout")==0) - *ctrls_rtrn= XkbAccessXTimeoutMask; - else if (_XkbStrCaseCmp(name,"accessxfeedback")==0) - *ctrls_rtrn= XkbAccessXFeedbackMask; - else if (_XkbStrCaseCmp(name,"audiblebell")==0) - *ctrls_rtrn= XkbAudibleBellMask; - else if (_XkbStrCaseCmp(name,"overlay1")==0) - *ctrls_rtrn= XkbOverlay1Mask; - else if (_XkbStrCaseCmp(name,"overlay2")==0) - *ctrls_rtrn= XkbOverlay2Mask; - else if (_XkbStrCaseCmp(name,"ignoregrouplock")==0) - *ctrls_rtrn= XkbIgnoreGroupLockMask; + if ((_XkbStrCaseCmp(name, "repeat") == 0) || + (_XkbStrCaseCmp(name, "repeatkeys") == 0)) + *ctrls_rtrn = XkbRepeatKeysMask; + else if (_XkbStrCaseCmp(name, "slowkeys") == 0) + *ctrls_rtrn = XkbSlowKeysMask; + else if (_XkbStrCaseCmp(name, "bouncekeys") == 0) + *ctrls_rtrn = XkbBounceKeysMask; + else if (_XkbStrCaseCmp(name, "stickykeys") == 0) + *ctrls_rtrn = XkbStickyKeysMask; + else if (_XkbStrCaseCmp(name, "mousekeys") == 0) + *ctrls_rtrn = XkbMouseKeysMask; + else if (_XkbStrCaseCmp(name, "mousekeysaccel") == 0) + *ctrls_rtrn = XkbMouseKeysAccelMask; + else if (_XkbStrCaseCmp(name, "accessxkeys") == 0) + *ctrls_rtrn = XkbAccessXKeysMask; + else if (_XkbStrCaseCmp(name, "accessxtimeout") == 0) + *ctrls_rtrn = XkbAccessXTimeoutMask; + else if (_XkbStrCaseCmp(name, "accessxfeedback") == 0) + *ctrls_rtrn = XkbAccessXFeedbackMask; + else if (_XkbStrCaseCmp(name, "audiblebell") == 0) + *ctrls_rtrn = XkbAudibleBellMask; + else if (_XkbStrCaseCmp(name, "overlay1") == 0) + *ctrls_rtrn = XkbOverlay1Mask; + else if (_XkbStrCaseCmp(name, "overlay2") == 0) + *ctrls_rtrn = XkbOverlay2Mask; + else if (_XkbStrCaseCmp(name, "ignoregrouplock") == 0) + *ctrls_rtrn = XkbIgnoreGroupLockMask; else { - rtrn->error= XkbCF_ExpectedControl; - return False; + rtrn->error = XkbCF_ExpectedControl; + return False; } return True; } static Bool -AddAXTimeoutOptByName( XkbConfigRtrnPtr rtrn, - char * name, - unsigned short * opts_rtrn) +AddAXTimeoutOptByName(XkbConfigRtrnPtr rtrn, + char *name, + unsigned short *opts_rtrn) { - if (_XkbStrCaseCmp(name,"slowkeyspress")==0) - *opts_rtrn= XkbAX_SKPressFBMask; - else if (_XkbStrCaseCmp(name,"slowkeysaccept")==0) - *opts_rtrn= XkbAX_SKAcceptFBMask; - else if (_XkbStrCaseCmp(name,"feature")==0) - *opts_rtrn= XkbAX_FeatureFBMask; - else if (_XkbStrCaseCmp(name,"slowwarn")==0) - *opts_rtrn= XkbAX_SlowWarnFBMask; - else if (_XkbStrCaseCmp(name,"indicator")==0) - *opts_rtrn= XkbAX_IndicatorFBMask; - else if (_XkbStrCaseCmp(name,"stickykeys")==0) - *opts_rtrn= XkbAX_StickyKeysFBMask; - else if (_XkbStrCaseCmp(name,"twokeys")==0) - *opts_rtrn= XkbAX_TwoKeysMask; - else if (_XkbStrCaseCmp(name,"latchtolock")==0) - *opts_rtrn= XkbAX_LatchToLockMask; - else if (_XkbStrCaseCmp(name,"slowkeysrelease")==0) - *opts_rtrn= XkbAX_SKReleaseFBMask; - else if (_XkbStrCaseCmp(name,"slowkeysreject")==0) - *opts_rtrn= XkbAX_SKRejectFBMask; - else if (_XkbStrCaseCmp(name,"bouncekeysreject")==0) - *opts_rtrn= XkbAX_BKRejectFBMask; - else if (_XkbStrCaseCmp(name,"dumbbell")==0) - *opts_rtrn= XkbAX_DumbBellFBMask; + if (_XkbStrCaseCmp(name, "slowkeyspress") == 0) + *opts_rtrn = XkbAX_SKPressFBMask; + else if (_XkbStrCaseCmp(name, "slowkeysaccept") == 0) + *opts_rtrn = XkbAX_SKAcceptFBMask; + else if (_XkbStrCaseCmp(name, "feature") == 0) + *opts_rtrn = XkbAX_FeatureFBMask; + else if (_XkbStrCaseCmp(name, "slowwarn") == 0) + *opts_rtrn = XkbAX_SlowWarnFBMask; + else if (_XkbStrCaseCmp(name, "indicator") == 0) + *opts_rtrn = XkbAX_IndicatorFBMask; + else if (_XkbStrCaseCmp(name, "stickykeys") == 0) + *opts_rtrn = XkbAX_StickyKeysFBMask; + else if (_XkbStrCaseCmp(name, "twokeys") == 0) + *opts_rtrn = XkbAX_TwoKeysMask; + else if (_XkbStrCaseCmp(name, "latchtolock") == 0) + *opts_rtrn = XkbAX_LatchToLockMask; + else if (_XkbStrCaseCmp(name, "slowkeysrelease") == 0) + *opts_rtrn = XkbAX_SKReleaseFBMask; + else if (_XkbStrCaseCmp(name, "slowkeysreject") == 0) + *opts_rtrn = XkbAX_SKRejectFBMask; + else if (_XkbStrCaseCmp(name, "bouncekeysreject") == 0) + *opts_rtrn = XkbAX_BKRejectFBMask; + else if (_XkbStrCaseCmp(name, "dumbbell") == 0) + *opts_rtrn = XkbAX_DumbBellFBMask; else { - rtrn->error= XkbCF_ExpectedControl; - return False; + rtrn->error = XkbCF_ExpectedControl; + return False; } return True; } XkbConfigUnboundModPtr -XkbCFAddModByName( XkbConfigRtrnPtr rtrn, - int what, - char * name, - Bool merge, - XkbConfigUnboundModPtr last) +XkbCFAddModByName(XkbConfigRtrnPtr rtrn, int what, char *name, Bool merge, + XkbConfigUnboundModPtr last) { - if (rtrn->num_unbound_mods>=rtrn->sz_unbound_mods) { - rtrn->sz_unbound_mods+= 5; - rtrn->unbound_mods= _XkbTypedRealloc(rtrn->unbound_mods, - rtrn->sz_unbound_mods, - XkbConfigUnboundModRec); - if (rtrn->unbound_mods==NULL) { - rtrn->error= XkbCF_BadAlloc; - return NULL; - } + if (rtrn->num_unbound_mods >= rtrn->sz_unbound_mods) { + rtrn->sz_unbound_mods += 5; + rtrn->unbound_mods = _XkbTypedRealloc(rtrn->unbound_mods, + rtrn->sz_unbound_mods, + XkbConfigUnboundModRec); + if (rtrn->unbound_mods == NULL) { + rtrn->error = XkbCF_BadAlloc; + return NULL; + } } - if (last==NULL) { - last= &rtrn->unbound_mods[rtrn->num_unbound_mods++]; - last->what= what; - last->mods= 0; - last->vmods= 0; - last->merge= merge; - last->name= NULL; + if (last == NULL) { + last = &rtrn->unbound_mods[rtrn->num_unbound_mods++]; + last->what = what; + last->mods = 0; + last->vmods = 0; + last->merge = merge; + last->name = NULL; } - if (_XkbStrCaseCmp(name,"shift")==0) - last->mods|= ShiftMask; - else if (_XkbStrCaseCmp(name,"lock")==0) - last->mods|= LockMask; - else if ((_XkbStrCaseCmp(name,"control")==0)|| - (_XkbStrCaseCmp(name,"ctrl")==0)) - last->mods|= ControlMask; - else if (_XkbStrCaseCmp(name,"mod1")==0) - last->mods|= Mod1Mask; - else if (_XkbStrCaseCmp(name,"mod2")==0) - last->mods|= Mod2Mask; - else if (_XkbStrCaseCmp(name,"mod3")==0) - last->mods|= Mod3Mask; - else if (_XkbStrCaseCmp(name,"mod4")==0) - last->mods|= Mod4Mask; - else if (_XkbStrCaseCmp(name,"mod5")==0) - last->mods|= Mod5Mask; + if (_XkbStrCaseCmp(name, "shift") == 0) + last->mods |= ShiftMask; + else if (_XkbStrCaseCmp(name, "lock") == 0) + last->mods |= LockMask; + else if ((_XkbStrCaseCmp(name, "control") == 0) || + (_XkbStrCaseCmp(name, "ctrl") == 0)) + last->mods |= ControlMask; + else if (_XkbStrCaseCmp(name, "mod1") == 0) + last->mods |= Mod1Mask; + else if (_XkbStrCaseCmp(name, "mod2") == 0) + last->mods |= Mod2Mask; + else if (_XkbStrCaseCmp(name, "mod3") == 0) + last->mods |= Mod3Mask; + else if (_XkbStrCaseCmp(name, "mod4") == 0) + last->mods |= Mod4Mask; + else if (_XkbStrCaseCmp(name, "mod5") == 0) + last->mods |= Mod5Mask; else { - if (last->name!=NULL) { - last= &rtrn->unbound_mods[rtrn->num_unbound_mods++]; - last->what= what; - last->mods= 0; - last->vmods= 0; - last->merge= merge; - last->name= NULL; - } - last->name= _XkbDupString(name); + if (last->name != NULL) { + last = &rtrn->unbound_mods[rtrn->num_unbound_mods++]; + last->what = what; + last->mods = 0; + last->vmods = 0; + last->merge = merge; + last->name = NULL; + } + last->name = _XkbDupString(name); } return last; } int -XkbCFBindMods(XkbConfigRtrnPtr rtrn,XkbDescPtr xkb) +XkbCFBindMods(XkbConfigRtrnPtr rtrn, XkbDescPtr xkb) { -register int n,v; -Atom name; -XkbConfigUnboundModPtr mod; -int missing; - - if (rtrn->num_unbound_mods<1) - return 0; - if ((xkb==NULL) || (xkb->names==NULL)) - return -1; - - missing= 0; - for (n=0,mod=rtrn->unbound_mods;n<rtrn->num_unbound_mods;n++,mod++) { - if (mod->name!=NULL) { - name= XkbInternAtom(xkb->dpy,mod->name,True); - if (name==None) - continue; - for (v=0;v<XkbNumVirtualMods;v++) { - if (xkb->names->vmods[v]==name) { - mod->vmods= (1<<v); - _XkbFree(mod->name); - mod->name= NULL; - break; - } - } - if (mod->name!=NULL) - missing++; - } + register int n, v; + Atom name; + XkbConfigUnboundModPtr mod; + int missing; + + if (rtrn->num_unbound_mods < 1) + return 0; + if ((xkb == NULL) || (xkb->names == NULL)) + return -1; + + missing = 0; + for (n = 0, mod = rtrn->unbound_mods; n < rtrn->num_unbound_mods; + n++, mod++) { + if (mod->name != NULL) { + name = XkbInternAtom(xkb->dpy, mod->name, True); + if (name == None) + continue; + for (v = 0; v < XkbNumVirtualMods; v++) { + if (xkb->names->vmods[v] == name) { + mod->vmods = (1 << v); + _XkbFree(mod->name); + mod->name = NULL; + break; + } + } + if (mod->name != NULL) + missing++; + } } return missing; } Bool -XkbCFApplyMods(XkbConfigRtrnPtr rtrn,int what,XkbConfigModInfoPtr info) +XkbCFApplyMods(XkbConfigRtrnPtr rtrn, int what, XkbConfigModInfoPtr info) { -register int n; -XkbConfigUnboundModPtr mod; - - if (rtrn->num_unbound_mods<1) - return True; - - for (n=0,mod=rtrn->unbound_mods;n<rtrn->num_unbound_mods;n++,mod++) { - if (mod->what!=what) - continue; - if (mod->merge==XkbCF_MergeRemove) { - info->mods_clear|= mod->mods; - info->vmods_clear|= mod->vmods; - } - else { - if (mod->merge==XkbCF_MergeSet) - info->replace= True; - info->mods|= mod->mods; - info->vmods|= mod->vmods; - } - if (mod->name==NULL) { - mod->what= _XkbCF_Illegal; - } - else { - mod->mods= 0; - mod->vmods= 0; - } + register int n; + XkbConfigUnboundModPtr mod; + + if (rtrn->num_unbound_mods < 1) + return True; + + for (n = 0, mod = rtrn->unbound_mods; n < rtrn->num_unbound_mods; + n++, mod++) { + if (mod->what != what) + continue; + if (mod->merge == XkbCF_MergeRemove) { + info->mods_clear |= mod->mods; + info->vmods_clear |= mod->vmods; + } + else { + if (mod->merge == XkbCF_MergeSet) + info->replace = True; + info->mods |= mod->mods; + info->vmods |= mod->vmods; + } + if (mod->name == NULL) { + mod->what = _XkbCF_Illegal; + } + else { + mod->mods = 0; + mod->vmods = 0; + } } return True; } /*ARGSUSED*/ static Bool -DefaultParser( FILE * file, - XkbConfigFieldsPtr fields, - XkbConfigFieldPtr field, - XkbDescPtr xkb, - XkbConfigRtrnPtr rtrn) +DefaultParser(FILE * file, + XkbConfigFieldsPtr fields, + XkbConfigFieldPtr field, + XkbDescPtr xkb, + XkbConfigRtrnPtr rtrn) { -int tok; -XkbCFScanResultRec val; -char ** str; -int merge; -unsigned long * ctrls, ctrls_mask; -unsigned short * opts, opts_mask; -int * pival, sign; -int onoff; -XkbConfigUnboundModPtr last; -unsigned what; - - tok= XkbCFScan(file,&val,rtrn); - str= NULL; - onoff= 0; - pival= NULL; + int tok; + XkbCFScanResultRec val; + char **str; + int merge; + unsigned long *ctrls, ctrls_mask; + unsigned short *opts, opts_mask; + int *pival, sign; + int onoff; + XkbConfigUnboundModPtr last; + unsigned what; + + tok = XkbCFScan(file, &val, rtrn); + str = NULL; + onoff = 0; + pival = NULL; switch (field->field_id) { - case _XkbCF_RulesFile: if (!str) str= &rtrn->rules_file; - case _XkbCF_Model: if (!str) str= &rtrn->model; - case _XkbCF_Layout: if (!str) str= &rtrn->layout; - case _XkbCF_Variant: if (!str) str= &rtrn->variant; - case _XkbCF_Options: if (!str) str= &rtrn->options; - case _XkbCF_Keymap: if (!str) str= &rtrn->keymap; - case _XkbCF_Keycodes: if (!str) str= &rtrn->keycodes; - case _XkbCF_Geometry: if (!str) str= &rtrn->geometry; - case _XkbCF_PhysSymbols:if (!str) str= &rtrn->phys_symbols; - case _XkbCF_Symbols: if (!str) str= &rtrn->symbols; - case _XkbCF_Types: if (!str) str= &rtrn->types; - case _XkbCF_CompatMap: if (!str) str= &rtrn->compat; - if (tok!=XkbCF_Equals) { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_String)&&(tok!=XkbCF_Ident)) { - rtrn->error= XkbCF_ExpectedString; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedEOS; - return False; - } - if (*str!=NULL) - _XkbFree(*str); - *str= _XkbDupString(val.str); - break; - case _XkbCF_InitialMods: - case _XkbCF_IgnoreLockMods: - case _XkbCF_InternalMods: - what= XkbCF_InitialMods; - if (field->field_id==_XkbCF_InitialMods) - rtrn->defined|= (what=XkbCF_InitialMods); - else if (field->field_id==_XkbCF_InternalMods) - rtrn->defined|= (what=XkbCF_InternalMods); - else if (field->field_id==_XkbCF_IgnoreLockMods) - rtrn->defined|= (what=XkbCF_IgnoreLockMods); - if (tok==XkbCF_Equals) merge= XkbCF_MergeSet; - else if (tok==XkbCF_MinusEquals) merge= XkbCF_MergeRemove; - else if (tok==XkbCF_PlusEquals) merge= XkbCF_MergeAdd; - else { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok==XkbCF_EOL)||(tok==XkbCF_Semi)||(tok==XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedModifier; - return False; - } - last= NULL; - while ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - if ((tok!=XkbCF_Ident)&&(tok!=XkbCF_String)) { - rtrn->error= XkbCF_ExpectedModifier; - return False; - } - last=XkbCFAddModByName(rtrn,what,val.str,merge,last); - if (last==NULL) - return False; - if (merge==XkbCF_MergeSet) - merge= XkbCF_MergeAdd; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_EOF)&&(tok!=XkbCF_Semi)) { - if (tok!=XkbCF_Plus) { - rtrn->error= XkbCF_ExpectedOperator; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - } - } - break; - case _XkbCF_InitialCtrls: - rtrn->defined|= XkbCF_InitialCtrls; - ctrls= NULL; - if (tok==XkbCF_PlusEquals) - ctrls= &rtrn->initial_ctrls; - else if (tok==XkbCF_MinusEquals) - ctrls= &rtrn->initial_ctrls_clear; - else if (tok==XkbCF_Equals) { - ctrls= &rtrn->initial_ctrls; - rtrn->replace_initial_ctrls= True; - *ctrls= 0; - } - else { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok==XkbCF_EOL)||(tok==XkbCF_Semi)||(tok==XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - while ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - if ((tok!=XkbCF_Ident)&&(tok!=XkbCF_String)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - if (!AddCtrlByName(rtrn,val.str,&ctrls_mask)) { - return False; - } - *ctrls |= ctrls_mask; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_EOF)&&(tok!=XkbCF_Semi)) { - if (tok!=XkbCF_Plus) { - rtrn->error= XkbCF_ExpectedOperator; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - } - } - break; - case _XkbCF_AccessXTimeoutCtrlsOn: - case _XkbCF_AccessXTimeoutCtrlsOff: - opts= NULL; - if (tok==XkbCF_MinusEquals) { - ctrls= &rtrn->axt_ctrls_ignore; - opts= &rtrn->axt_opts_ignore; - } - else if ((tok==XkbCF_PlusEquals)||(tok==XkbCF_Equals)) { - if (field->field_id==_XkbCF_AccessXTimeoutCtrlsOff) { - ctrls= &rtrn->axt_ctrls_off; - opts= &rtrn->axt_opts_off; - if (tok==XkbCF_Equals) - rtrn->replace_axt_ctrls_off= True; - } - else { - ctrls= &rtrn->axt_ctrls_on; - opts= &rtrn->axt_opts_on; - if (tok==XkbCF_Equals) - rtrn->replace_axt_ctrls_on= True; - } - *ctrls= 0; - } - else { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok==XkbCF_EOL)||(tok==XkbCF_Semi)||(tok==XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - while ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - if ((tok!=XkbCF_Ident)&&(tok!=XkbCF_String)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - if (!AddCtrlByName(rtrn,val.str,&ctrls_mask)) { - if (!AddAXTimeoutOptByName(rtrn,val.str,&opts_mask)) - return False; - *opts |= opts_mask; - if (field->field_id==_XkbCF_AccessXTimeoutCtrlsOff) { - rtrn->defined|= XkbCF_AccessXTimeoutOptsOff; - if (rtrn->replace_axt_ctrls_off) - rtrn->replace_axt_opts_off= True; - } - else { - rtrn->defined|= XkbCF_AccessXTimeoutOptsOn; - if (rtrn->replace_axt_ctrls_on) - rtrn->replace_axt_opts_on= True; - } - } - else - *ctrls |= ctrls_mask; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_EOF)&&(tok!=XkbCF_Semi)) { - if (tok!=XkbCF_Plus) { - rtrn->error= XkbCF_ExpectedOperator; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - } - } - break; - case _XkbCF_InitialFeedback: - rtrn->defined|= XkbCF_InitialOpts; - opts= NULL; - if (tok==XkbCF_PlusEquals) - opts= &rtrn->initial_opts; - else if (tok==XkbCF_MinusEquals) - opts= &rtrn->initial_opts_clear; - else if (tok==XkbCF_Equals) { - opts= &rtrn->initial_opts; - rtrn->replace_initial_opts= True; - *opts= 0; - } - else { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok==XkbCF_EOL)||(tok==XkbCF_Semi)||(tok==XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedAXOption; - return False; - } - while ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - if ((tok!=XkbCF_Ident)&&(tok!=XkbCF_String)) { - rtrn->error= XkbCF_ExpectedAXOption; - return False; - } - if (!AddAXTimeoutOptByName(rtrn,val.str,&opts_mask)) { - return False; - } - *opts |= opts_mask; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_EOF)&&(tok!=XkbCF_Semi)) { - if (tok!=XkbCF_Plus) { - rtrn->error= XkbCF_ExpectedOperator; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - } - } - break; - case _XkbCF_AccessXTimeoutOptsOff: - case _XkbCF_AccessXTimeoutOptsOn: - opts= NULL; - if (tok==XkbCF_MinusEquals) - opts= &rtrn->axt_opts_ignore; - else if ((tok==XkbCF_PlusEquals)||(tok==XkbCF_Equals)) { - if (field->field_id==_XkbCF_AccessXTimeoutOptsOff) { - opts= &rtrn->axt_opts_off; - if (tok==XkbCF_Equals) - rtrn->replace_axt_opts_off= True; - } - else { - opts= &rtrn->axt_opts_on; - if (tok==XkbCF_Equals) - rtrn->replace_axt_opts_on= True; - } - *opts = 0; - } - else { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if ((tok==XkbCF_EOL)||(tok==XkbCF_Semi)||(tok==XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - while ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - if ((tok!=XkbCF_Ident)&&(tok!=XkbCF_String)) { - rtrn->error= XkbCF_ExpectedControl; - return False; - } - if (!AddAXTimeoutOptByName(rtrn,val.str,&opts_mask)) - return False; - *opts |= opts_mask; - - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_EOF)&&(tok!=XkbCF_Semi)) { - if (tok!=XkbCF_Plus) { - rtrn->error= XkbCF_ExpectedOperator; - return False; - } - tok= XkbCFScan(file,&val,rtrn); - } - } - break; - case _XkbCF_ClickVolume: - if (!pival) { - pival= &rtrn->click_volume; - onoff= 100; - } - case _XkbCF_BellVolume: - if (!pival) { - pival= &rtrn->bell_volume; - onoff= 100; - } - case _XkbCF_BellPitch: - if (!pival) - pival= &rtrn->bell_pitch; - case _XkbCF_BellDuration: - if (!pival) - pival= &rtrn->bell_duration; - case _XkbCF_RepeatDelay: - if (!pival) - pival= &rtrn->repeat_delay; - case _XkbCF_RepeatInterval: - if (!pival) - pival= &rtrn->repeat_interval; - case _XkbCF_SlowKeysDelay: - if (!pival) - pival= &rtrn->slow_keys_delay; - case _XkbCF_DebounceDelay: - if (!pival) - pival= &rtrn->debounce_delay; - case _XkbCF_MouseKeysDelay: - if (!pival) - pival= &rtrn->mk_delay; - case _XkbCF_MouseKeysInterval: - if (!pival) - pival= &rtrn->mk_interval; - case _XkbCF_MouseKeysTimeToMax: - if (!pival) - pival= &rtrn->mk_time_to_max; - case _XkbCF_MouseKeysMaxSpeed: - if (!pival) - pival= &rtrn->mk_max_speed; - case _XkbCF_MouseKeysCurve: - if (!pival) - pival= &rtrn->mk_curve; - case _XkbCF_AccessXTimeout: - if (!pival) - pival= &rtrn->ax_timeout; - if (tok!=XkbCF_Equals) { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if (tok == XkbCF_Minus && field->field_id == _XkbCF_MouseKeysCurve) { - /* This can be a negative value */ - tok = XkbCFScan(file,&val,rtrn); - sign = -1; - } - else - sign = 1; - if (tok!=XkbCF_Integer) { - Bool ok= False; - if ((onoff)&&(tok==XkbCF_Ident)&&(val.str!=NULL)) { - if (_XkbStrCaseCmp(val.str,"on")) { - val.ival= onoff; - ok= True; - } - else if (_XkbStrCaseCmp(val.str,"off")) { - val.ival= 0; - ok= True; - } - } - if (!ok) { - rtrn->error= XkbCF_ExpectedInteger; - goto BAILOUT; - } - } - *pival= val.ival * sign; - if (field->field_id == _XkbCF_AccessXTimeout) - rtrn->defined|=XkbCF_AccessXTimeout; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedEOS; - return False; - } - break; - case _XkbCF_GroupsWrap: - if (tok!=XkbCF_Equals) { - rtrn->error= XkbCF_MissingEquals; - goto BAILOUT; - } - tok= XkbCFScan(file,&val,rtrn); - if (tok==XkbCF_Ident) { - if (_XkbStrCaseCmp(val.str,"wrap")==0) { - rtrn->groups_wrap= XkbSetGroupInfo(0,XkbWrapIntoRange,0); - } - else if (_XkbStrCaseCmp(val.str,"clamp")==0) { - rtrn->groups_wrap= XkbSetGroupInfo(0,XkbClampIntoRange,0); - } - else { - rtrn->error= XkbCF_ExpectedOORGroupBehavior; - return False; - } - } - else if ((tok==XkbCF_Integer)&&(XkbIsLegalGroup(val.ival-1))) { - rtrn->groups_wrap= XkbSetGroupInfo(0,XkbRedirectIntoRange, - val.ival-1); - } - else { - rtrn->error= XkbCF_ExpectedOORGroupBehavior; - return False; - } - rtrn->defined|= XkbCF_GroupsWrap; - tok= XkbCFScan(file,&val,rtrn); - if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)&&(tok!=XkbCF_EOF)) { - rtrn->error= XkbCF_ExpectedEOS; - return False; - } - break; - default: - rtrn->error= XkbCF_ExpectedInteger; - goto BAILOUT; + case _XkbCF_RulesFile: if (!str) str = &rtrn->rules_file; + case _XkbCF_Model: if (!str) str = &rtrn->model; + case _XkbCF_Layout: if (!str) str = &rtrn->layout; + case _XkbCF_Variant: if (!str) str = &rtrn->variant; + case _XkbCF_Options: if (!str) str = &rtrn->options; + case _XkbCF_Keymap: if (!str) str = &rtrn->keymap; + case _XkbCF_Keycodes: if (!str) str = &rtrn->keycodes; + case _XkbCF_Geometry: if (!str) str = &rtrn->geometry; + case _XkbCF_PhysSymbols: if (!str) str = &rtrn->phys_symbols; + case _XkbCF_Symbols: if (!str) str = &rtrn->symbols; + case _XkbCF_Types: if (!str) str = &rtrn->types; + case _XkbCF_CompatMap: if (!str) str = &rtrn->compat; + if (tok != XkbCF_Equals) { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_String) && (tok != XkbCF_Ident)) { + rtrn->error = XkbCF_ExpectedString; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedEOS; + return False; + } + if (*str != NULL) + _XkbFree(*str); + *str = _XkbDupString(val.str); + break; + case _XkbCF_InitialMods: + case _XkbCF_IgnoreLockMods: + case _XkbCF_InternalMods: + what = XkbCF_InitialMods; + if (field->field_id == _XkbCF_InitialMods) + rtrn->defined |= (what = XkbCF_InitialMods); + else if (field->field_id == _XkbCF_InternalMods) + rtrn->defined |= (what = XkbCF_InternalMods); + else if (field->field_id == _XkbCF_IgnoreLockMods) + rtrn->defined |= (what = XkbCF_IgnoreLockMods); + if (tok == XkbCF_Equals) + merge = XkbCF_MergeSet; + else if (tok == XkbCF_MinusEquals) + merge = XkbCF_MergeRemove; + else if (tok == XkbCF_PlusEquals) + merge = XkbCF_MergeAdd; + else { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedModifier; + return False; + } + last = NULL; + while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) { + rtrn->error = XkbCF_ExpectedModifier; + return False; + } + last = XkbCFAddModByName(rtrn, what, val.str, merge, last); + if (last == NULL) + return False; + if (merge == XkbCF_MergeSet) + merge = XkbCF_MergeAdd; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) { + if (tok != XkbCF_Plus) { + rtrn->error = XkbCF_ExpectedOperator; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + } + } + break; + case _XkbCF_InitialCtrls: + rtrn->defined |= XkbCF_InitialCtrls; + ctrls = NULL; + if (tok == XkbCF_PlusEquals) + ctrls = &rtrn->initial_ctrls; + else if (tok == XkbCF_MinusEquals) + ctrls = &rtrn->initial_ctrls_clear; + else if (tok == XkbCF_Equals) { + ctrls = &rtrn->initial_ctrls; + rtrn->replace_initial_ctrls = True; + *ctrls = 0; + } + else { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + if (!AddCtrlByName(rtrn, val.str, &ctrls_mask)) { + return False; + } + *ctrls |= ctrls_mask; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) { + if (tok != XkbCF_Plus) { + rtrn->error = XkbCF_ExpectedOperator; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + } + } + break; + case _XkbCF_AccessXTimeoutCtrlsOn: + case _XkbCF_AccessXTimeoutCtrlsOff: + opts = NULL; + if (tok == XkbCF_MinusEquals) { + ctrls = &rtrn->axt_ctrls_ignore; + opts = &rtrn->axt_opts_ignore; + } + else if ((tok == XkbCF_PlusEquals) || (tok == XkbCF_Equals)) { + if (field->field_id == _XkbCF_AccessXTimeoutCtrlsOff) { + ctrls = &rtrn->axt_ctrls_off; + opts = &rtrn->axt_opts_off; + if (tok == XkbCF_Equals) + rtrn->replace_axt_ctrls_off = True; + } + else { + ctrls = &rtrn->axt_ctrls_on; + opts = &rtrn->axt_opts_on; + if (tok == XkbCF_Equals) + rtrn->replace_axt_ctrls_on = True; + } + *ctrls = 0; + } + else { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + if (!AddCtrlByName(rtrn, val.str, &ctrls_mask)) { + if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask)) + return False; + *opts |= opts_mask; + if (field->field_id == _XkbCF_AccessXTimeoutCtrlsOff) { + rtrn->defined |= XkbCF_AccessXTimeoutOptsOff; + if (rtrn->replace_axt_ctrls_off) + rtrn->replace_axt_opts_off = True; + } + else { + rtrn->defined |= XkbCF_AccessXTimeoutOptsOn; + if (rtrn->replace_axt_ctrls_on) + rtrn->replace_axt_opts_on = True; + } + } + else + *ctrls |= ctrls_mask; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) { + if (tok != XkbCF_Plus) { + rtrn->error = XkbCF_ExpectedOperator; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + } + } + break; + case _XkbCF_InitialFeedback: + rtrn->defined |= XkbCF_InitialOpts; + opts = NULL; + if (tok == XkbCF_PlusEquals) + opts = &rtrn->initial_opts; + else if (tok == XkbCF_MinusEquals) + opts = &rtrn->initial_opts_clear; + else if (tok == XkbCF_Equals) { + opts = &rtrn->initial_opts; + rtrn->replace_initial_opts = True; + *opts = 0; + } + else { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedAXOption; + return False; + } + while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) { + rtrn->error = XkbCF_ExpectedAXOption; + return False; + } + if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask)) { + return False; + } + *opts |= opts_mask; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) { + if (tok != XkbCF_Plus) { + rtrn->error = XkbCF_ExpectedOperator; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + } + } + break; + case _XkbCF_AccessXTimeoutOptsOff: + case _XkbCF_AccessXTimeoutOptsOn: + opts = NULL; + if (tok == XkbCF_MinusEquals) + opts = &rtrn->axt_opts_ignore; + else if ((tok == XkbCF_PlusEquals) || (tok == XkbCF_Equals)) { + if (field->field_id == _XkbCF_AccessXTimeoutOptsOff) { + opts = &rtrn->axt_opts_off; + if (tok == XkbCF_Equals) + rtrn->replace_axt_opts_off = True; + } + else { + opts = &rtrn->axt_opts_on; + if (tok == XkbCF_Equals) + rtrn->replace_axt_opts_on = True; + } + *opts = 0; + } + else { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) { + rtrn->error = XkbCF_ExpectedControl; + return False; + } + if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask)) + return False; + *opts |= opts_mask; + + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) { + if (tok != XkbCF_Plus) { + rtrn->error = XkbCF_ExpectedOperator; + return False; + } + tok = XkbCFScan(file, &val, rtrn); + } + } + break; + case _XkbCF_ClickVolume: + if (!pival) { + pival = &rtrn->click_volume; + onoff = 100; + } + case _XkbCF_BellVolume: + if (!pival) { + pival = &rtrn->bell_volume; + onoff = 100; + } + case _XkbCF_BellPitch: if (!pival) pival = &rtrn->bell_pitch; + case _XkbCF_BellDuration: if (!pival) pival = &rtrn->bell_duration; + case _XkbCF_RepeatDelay: if (!pival) pival = &rtrn->repeat_delay; + case _XkbCF_RepeatInterval: if (!pival) pival = &rtrn->repeat_interval; + case _XkbCF_SlowKeysDelay: if (!pival) pival = &rtrn->slow_keys_delay; + case _XkbCF_DebounceDelay: if (!pival) pival = &rtrn->debounce_delay; + case _XkbCF_MouseKeysDelay: if (!pival) pival = &rtrn->mk_delay; + case _XkbCF_MouseKeysInterval: if (!pival) pival = &rtrn->mk_interval; + case _XkbCF_MouseKeysTimeToMax: if (!pival) pival = &rtrn->mk_time_to_max; + case _XkbCF_MouseKeysMaxSpeed: if (!pival) pival = &rtrn->mk_max_speed; + case _XkbCF_MouseKeysCurve: if (!pival) pival = &rtrn->mk_curve; + case _XkbCF_AccessXTimeout: if (!pival) pival = &rtrn->ax_timeout; + if (tok != XkbCF_Equals) { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if (tok == XkbCF_Minus && field->field_id == _XkbCF_MouseKeysCurve) { + /* This can be a negative value */ + tok = XkbCFScan(file, &val, rtrn); + sign = -1; + } + else + sign = 1; + if (tok != XkbCF_Integer) { + Bool ok = False; + + if ((onoff) && (tok == XkbCF_Ident) && (val.str != NULL)) { + if (_XkbStrCaseCmp(val.str, "on")) { + val.ival = onoff; + ok = True; + } + else if (_XkbStrCaseCmp(val.str, "off")) { + val.ival = 0; + ok = True; + } + } + if (!ok) { + rtrn->error = XkbCF_ExpectedInteger; + goto BAILOUT; + } + } + *pival = val.ival * sign; + if (field->field_id == _XkbCF_AccessXTimeout) + rtrn->defined |= XkbCF_AccessXTimeout; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedEOS; + return False; + } + break; + case _XkbCF_GroupsWrap: + if (tok != XkbCF_Equals) { + rtrn->error = XkbCF_MissingEquals; + goto BAILOUT; + } + tok = XkbCFScan(file, &val, rtrn); + if (tok == XkbCF_Ident) { + if (_XkbStrCaseCmp(val.str, "wrap") == 0) { + rtrn->groups_wrap = XkbSetGroupInfo(0, XkbWrapIntoRange, 0); + } + else if (_XkbStrCaseCmp(val.str, "clamp") == 0) { + rtrn->groups_wrap = XkbSetGroupInfo(0, XkbClampIntoRange, 0); + } + else { + rtrn->error = XkbCF_ExpectedOORGroupBehavior; + return False; + } + } + else if ((tok == XkbCF_Integer) && (XkbIsLegalGroup(val.ival - 1))) { + rtrn->groups_wrap = XkbSetGroupInfo(0, XkbRedirectIntoRange, + val.ival - 1); + } + else { + rtrn->error = XkbCF_ExpectedOORGroupBehavior; + return False; + } + rtrn->defined |= XkbCF_GroupsWrap; + tok = XkbCFScan(file, &val, rtrn); + if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) { + rtrn->error = XkbCF_ExpectedEOS; + return False; + } + break; + default: + rtrn->error = XkbCF_ExpectedInteger; + goto BAILOUT; } return True; -BAILOUT: + BAILOUT: return False; } static Bool DefaultCleanUp(XkbConfigRtrnPtr rtrn) { - if (rtrn->keymap) _XkbFree(rtrn->keymap); - if (rtrn->keycodes) _XkbFree(rtrn->keycodes); - if (rtrn->geometry) _XkbFree(rtrn->geometry); - if (rtrn->phys_symbols) _XkbFree(rtrn->phys_symbols); - if (rtrn->symbols) _XkbFree(rtrn->symbols); - if (rtrn->types) _XkbFree(rtrn->types); - if (rtrn->compat) _XkbFree(rtrn->compat); - rtrn->keycodes= rtrn->geometry= NULL; - rtrn->symbols= rtrn->phys_symbols= NULL; - rtrn->types= rtrn->compat= NULL; - if ((rtrn->unbound_mods!=NULL)&&(rtrn->num_unbound_mods>0)) { - register int i; - for (i=0;i<rtrn->num_unbound_mods;i++) { - if (rtrn->unbound_mods[i].name!=NULL) { - _XkbFree(rtrn->unbound_mods[i].name); - rtrn->unbound_mods[i].name= NULL; - } - } - _XkbFree(rtrn->unbound_mods); - rtrn->sz_unbound_mods= 0; - rtrn->num_unbound_mods= 0; - rtrn->unbound_mods= NULL; + if (rtrn->keymap) + _XkbFree(rtrn->keymap); + if (rtrn->keycodes) + _XkbFree(rtrn->keycodes); + if (rtrn->geometry) + _XkbFree(rtrn->geometry); + if (rtrn->phys_symbols) + _XkbFree(rtrn->phys_symbols); + if (rtrn->symbols) + _XkbFree(rtrn->symbols); + if (rtrn->types) + _XkbFree(rtrn->types); + if (rtrn->compat) + _XkbFree(rtrn->compat); + rtrn->keycodes = rtrn->geometry = NULL; + rtrn->symbols = rtrn->phys_symbols = NULL; + rtrn->types = rtrn->compat = NULL; + if ((rtrn->unbound_mods != NULL) && (rtrn->num_unbound_mods > 0)) { + register int i; + + for (i = 0; i < rtrn->num_unbound_mods; i++) { + if (rtrn->unbound_mods[i].name != NULL) { + _XkbFree(rtrn->unbound_mods[i].name); + rtrn->unbound_mods[i].name = NULL; + } + } + _XkbFree(rtrn->unbound_mods); + rtrn->sz_unbound_mods = 0; + rtrn->num_unbound_mods = 0; + rtrn->unbound_mods = NULL; } return True; } static Bool -DefaultApplyNames(XkbConfigRtrnPtr rtrn,XkbDescPtr xkb) +DefaultApplyNames(XkbConfigRtrnPtr rtrn, XkbDescPtr xkb) { -char *str; - - if (XkbAllocNames(xkb,XkbComponentNamesMask,0,0)!=Success) - return False; - if ((str=rtrn->keycodes)!=NULL) { - xkb->names->keycodes= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->keycodes= NULL; + char *str; + + if (XkbAllocNames(xkb, XkbComponentNamesMask, 0, 0) != Success) + return False; + if ((str = rtrn->keycodes) != NULL) { + xkb->names->keycodes = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->keycodes = NULL; } - if ((str=rtrn->geometry)!=NULL) { - xkb->names->geometry= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->geometry= NULL; + if ((str = rtrn->geometry) != NULL) { + xkb->names->geometry = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->geometry = NULL; } - if ((str=rtrn->symbols)!=NULL) { - xkb->names->symbols= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->symbols= NULL; + if ((str = rtrn->symbols) != NULL) { + xkb->names->symbols = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->symbols = NULL; } - if ((str=rtrn->phys_symbols)!=NULL) { - xkb->names->phys_symbols= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->phys_symbols= NULL; + if ((str = rtrn->phys_symbols) != NULL) { + xkb->names->phys_symbols = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->phys_symbols = NULL; } - if ((str=rtrn->types)!=NULL) { - xkb->names->types= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->types= NULL; + if ((str = rtrn->types) != NULL) { + xkb->names->types = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->types = NULL; } - if ((str=rtrn->compat)!=NULL) { - xkb->names->compat= XkbInternAtom(xkb->dpy,str,False); - _XkbFree(str); - rtrn->compat= NULL; + if ((str = rtrn->compat) != NULL) { + xkb->names->compat = XkbInternAtom(xkb->dpy, str, False); + _XkbFree(str); + rtrn->compat = NULL; } return True; } static Bool -DefaultApplyControls(XkbConfigRtrnPtr rtrn,XkbDescPtr xkb) +DefaultApplyControls(XkbConfigRtrnPtr rtrn, XkbDescPtr xkb) { -unsigned on,off; -XkbControlsPtr ctrls; -unsigned int mask; + unsigned on, off; + XkbControlsPtr ctrls; + unsigned int mask; - if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success) - return False; - ctrls= xkb->ctrls; + if (XkbAllocControls(xkb, XkbAllControlsMask) != Success) + return False; + ctrls = xkb->ctrls; if (rtrn->replace_initial_ctrls) - ctrls->enabled_ctrls= rtrn->initial_ctrls; - else ctrls->enabled_ctrls|= rtrn->initial_ctrls; - ctrls->enabled_ctrls&= ~rtrn->initial_ctrls_clear; + ctrls->enabled_ctrls = rtrn->initial_ctrls; + else + ctrls->enabled_ctrls |= rtrn->initial_ctrls; + ctrls->enabled_ctrls &= ~rtrn->initial_ctrls_clear; if (rtrn->internal_mods.replace) { - ctrls->internal.real_mods= rtrn->internal_mods.mods; - ctrls->internal.vmods= rtrn->internal_mods.vmods; + ctrls->internal.real_mods = rtrn->internal_mods.mods; + ctrls->internal.vmods = rtrn->internal_mods.vmods; } else { - ctrls->internal.real_mods&= ~rtrn->internal_mods.mods_clear; - ctrls->internal.vmods&= ~rtrn->internal_mods.vmods_clear; - ctrls->internal.real_mods|= rtrn->internal_mods.mods; - ctrls->internal.vmods|= rtrn->internal_mods.vmods; + ctrls->internal.real_mods &= ~rtrn->internal_mods.mods_clear; + ctrls->internal.vmods &= ~rtrn->internal_mods.vmods_clear; + ctrls->internal.real_mods |= rtrn->internal_mods.mods; + ctrls->internal.vmods |= rtrn->internal_mods.vmods; } - mask= 0; - (void)XkbVirtualModsToReal(xkb,ctrls->internal.vmods,&mask); - ctrls->internal.mask= (ctrls->internal.real_mods|mask); + mask = 0; + (void) XkbVirtualModsToReal(xkb, ctrls->internal.vmods, &mask); + ctrls->internal.mask = (ctrls->internal.real_mods | mask); if (rtrn->ignore_lock_mods.replace) { - ctrls->ignore_lock.real_mods= rtrn->ignore_lock_mods.mods; - ctrls->ignore_lock.vmods= rtrn->ignore_lock_mods.vmods; + ctrls->ignore_lock.real_mods = rtrn->ignore_lock_mods.mods; + ctrls->ignore_lock.vmods = rtrn->ignore_lock_mods.vmods; } else { - ctrls->ignore_lock.real_mods&= ~rtrn->ignore_lock_mods.mods_clear; - ctrls->ignore_lock.vmods&= ~rtrn->ignore_lock_mods.vmods_clear; - ctrls->ignore_lock.real_mods|= rtrn->ignore_lock_mods.mods; - ctrls->ignore_lock.vmods|= rtrn->ignore_lock_mods.vmods; + ctrls->ignore_lock.real_mods &= ~rtrn->ignore_lock_mods.mods_clear; + ctrls->ignore_lock.vmods &= ~rtrn->ignore_lock_mods.vmods_clear; + ctrls->ignore_lock.real_mods |= rtrn->ignore_lock_mods.mods; + ctrls->ignore_lock.vmods |= rtrn->ignore_lock_mods.vmods; } - mask= 0; - (void)XkbVirtualModsToReal(xkb,ctrls->ignore_lock.vmods,&mask); - ctrls->ignore_lock.mask= (ctrls->ignore_lock.real_mods|mask); - - if (rtrn->repeat_delay>0) - ctrls->repeat_delay= rtrn->repeat_delay; - if (rtrn->repeat_interval>0) - ctrls->repeat_interval= rtrn->repeat_interval; - if (rtrn->slow_keys_delay>0) - ctrls->slow_keys_delay= rtrn->slow_keys_delay; - if (rtrn->debounce_delay>0) - ctrls->debounce_delay= rtrn->debounce_delay; - if (rtrn->mk_delay>0) - ctrls->mk_delay= rtrn->mk_delay; - if (rtrn->mk_interval>0) - ctrls->mk_interval= rtrn->mk_interval; - if (rtrn->mk_time_to_max>0) - ctrls->mk_time_to_max= rtrn->mk_time_to_max; - if (rtrn->mk_max_speed>0) - ctrls->mk_max_speed= rtrn->mk_max_speed; - if (rtrn->mk_curve>0) - ctrls->mk_curve= rtrn->mk_curve; - if (rtrn->defined&XkbCF_AccessXTimeout && rtrn->ax_timeout > 0) - ctrls->ax_timeout= rtrn->ax_timeout; + mask = 0; + (void) XkbVirtualModsToReal(xkb, ctrls->ignore_lock.vmods, &mask); + ctrls->ignore_lock.mask = (ctrls->ignore_lock.real_mods | mask); + + if (rtrn->repeat_delay > 0) + ctrls->repeat_delay = rtrn->repeat_delay; + if (rtrn->repeat_interval > 0) + ctrls->repeat_interval = rtrn->repeat_interval; + if (rtrn->slow_keys_delay > 0) + ctrls->slow_keys_delay = rtrn->slow_keys_delay; + if (rtrn->debounce_delay > 0) + ctrls->debounce_delay = rtrn->debounce_delay; + if (rtrn->mk_delay > 0) + ctrls->mk_delay = rtrn->mk_delay; + if (rtrn->mk_interval > 0) + ctrls->mk_interval = rtrn->mk_interval; + if (rtrn->mk_time_to_max > 0) + ctrls->mk_time_to_max = rtrn->mk_time_to_max; + if (rtrn->mk_max_speed > 0) + ctrls->mk_max_speed = rtrn->mk_max_speed; + if (rtrn->mk_curve > 0) + ctrls->mk_curve = rtrn->mk_curve; + if (rtrn->defined & XkbCF_AccessXTimeout && rtrn->ax_timeout > 0) + ctrls->ax_timeout = rtrn->ax_timeout; /* any value set to both off and on is reset to ignore */ - if ((off=(rtrn->axt_ctrls_on&rtrn->axt_ctrls_off))!=0) - rtrn->axt_ctrls_ignore|= off; + if ((off = (rtrn->axt_ctrls_on & rtrn->axt_ctrls_off)) != 0) + rtrn->axt_ctrls_ignore |= off; /* ignore takes priority over on and off */ - rtrn->axt_ctrls_on&= ~rtrn->axt_ctrls_ignore; - rtrn->axt_ctrls_off&= ~rtrn->axt_ctrls_ignore; + rtrn->axt_ctrls_on &= ~rtrn->axt_ctrls_ignore; + rtrn->axt_ctrls_off &= ~rtrn->axt_ctrls_ignore; if (!rtrn->replace_axt_ctrls_off) { - off= (ctrls->axt_ctrls_mask&(~ctrls->axt_ctrls_values)); - off&= ~rtrn->axt_ctrls_on; - off|= rtrn->axt_ctrls_off; + off = (ctrls->axt_ctrls_mask & (~ctrls->axt_ctrls_values)); + off &= ~rtrn->axt_ctrls_on; + off |= rtrn->axt_ctrls_off; } - else off= rtrn->axt_ctrls_off; + else + off = rtrn->axt_ctrls_off; if (!rtrn->replace_axt_ctrls_on) { - on= (ctrls->axt_ctrls_mask&ctrls->axt_ctrls_values); - on&= ~rtrn->axt_ctrls_off; - on|= rtrn->axt_ctrls_on; + on = (ctrls->axt_ctrls_mask & ctrls->axt_ctrls_values); + on &= ~rtrn->axt_ctrls_off; + on |= rtrn->axt_ctrls_on; } - else on= rtrn->axt_ctrls_on; - ctrls->axt_ctrls_mask= (on|off)&~rtrn->axt_ctrls_ignore; - ctrls->axt_ctrls_values= on&~rtrn->axt_ctrls_ignore; + else + on = rtrn->axt_ctrls_on; + ctrls->axt_ctrls_mask = (on | off) & ~rtrn->axt_ctrls_ignore; + ctrls->axt_ctrls_values = on & ~rtrn->axt_ctrls_ignore; /* any value set to both off and on is reset to ignore */ - if ((off=(rtrn->axt_opts_on&rtrn->axt_opts_off))!=0) - rtrn->axt_opts_ignore|= off; + if ((off = (rtrn->axt_opts_on & rtrn->axt_opts_off)) != 0) + rtrn->axt_opts_ignore |= off; /* ignore takes priority over on and off */ - rtrn->axt_opts_on&= ~rtrn->axt_opts_ignore; - rtrn->axt_opts_off&= ~rtrn->axt_opts_ignore; + rtrn->axt_opts_on &= ~rtrn->axt_opts_ignore; + rtrn->axt_opts_off &= ~rtrn->axt_opts_ignore; if (rtrn->replace_axt_opts_off) { - off= (ctrls->axt_opts_mask&(~ctrls->axt_opts_values)); - off&= ~rtrn->axt_opts_on; - off|= rtrn->axt_opts_off; + off = (ctrls->axt_opts_mask & (~ctrls->axt_opts_values)); + off &= ~rtrn->axt_opts_on; + off |= rtrn->axt_opts_off; } - else off= rtrn->axt_opts_off; + else + off = rtrn->axt_opts_off; if (!rtrn->replace_axt_opts_on) { - on= (ctrls->axt_opts_mask&ctrls->axt_opts_values); - on&= ~rtrn->axt_opts_off; - on|= rtrn->axt_opts_on; + on = (ctrls->axt_opts_mask & ctrls->axt_opts_values); + on &= ~rtrn->axt_opts_off; + on |= rtrn->axt_opts_on; } - else on= rtrn->axt_opts_on; - ctrls->axt_opts_mask= (unsigned short)((on|off)&~rtrn->axt_ctrls_ignore); - ctrls->axt_opts_values= (unsigned short)(on&~rtrn->axt_ctrls_ignore); - - if (rtrn->defined&XkbCF_GroupsWrap) { - int n; - n= XkbNumGroups(ctrls->groups_wrap); - rtrn->groups_wrap= XkbSetNumGroups(rtrn->groups_wrap,n); - ctrls->groups_wrap= rtrn->groups_wrap; + else + on = rtrn->axt_opts_on; + ctrls->axt_opts_mask = + (unsigned short) ((on | off) & ~rtrn->axt_ctrls_ignore); + ctrls->axt_opts_values = (unsigned short) (on & ~rtrn->axt_ctrls_ignore); + + if (rtrn->defined & XkbCF_GroupsWrap) { + int n; + + n = XkbNumGroups(ctrls->groups_wrap); + rtrn->groups_wrap = XkbSetNumGroups(rtrn->groups_wrap, n); + ctrls->groups_wrap = rtrn->groups_wrap; } return True; } /*ARGSUSED*/ static Bool -DefaultFinish( XkbConfigFieldsPtr fields, - XkbDescPtr xkb, - XkbConfigRtrnPtr rtrn, - int what) +DefaultFinish(XkbConfigFieldsPtr fields, XkbDescPtr xkb, + XkbConfigRtrnPtr rtrn, int what) { - if ((what==XkbCF_Destroy)||(what==XkbCF_CleanUp)) - return DefaultCleanUp(rtrn); - if (what==XkbCF_Check) { - if ((rtrn->symbols==NULL)&&(rtrn->phys_symbols!=NULL)) - rtrn->symbols= _XkbDupString(rtrn->phys_symbols); + if ((what == XkbCF_Destroy) || (what == XkbCF_CleanUp)) + return DefaultCleanUp(rtrn); + if (what == XkbCF_Check) { + if ((rtrn->symbols == NULL) && (rtrn->phys_symbols != NULL)) + rtrn->symbols = _XkbDupString(rtrn->phys_symbols); } - if ((what==XkbCF_Apply)||(what==XkbCF_Check)) { - if (xkb && xkb->names && (rtrn->num_unbound_mods>0)) - XkbCFBindMods(rtrn,xkb); - XkbCFApplyMods(rtrn,XkbCF_InitialMods,&rtrn->initial_mods); - XkbCFApplyMods(rtrn,XkbCF_InternalMods,&rtrn->internal_mods); - XkbCFApplyMods(rtrn,XkbCF_IgnoreLockMods,&rtrn->ignore_lock_mods); + if ((what == XkbCF_Apply) || (what == XkbCF_Check)) { + if (xkb && xkb->names && (rtrn->num_unbound_mods > 0)) + XkbCFBindMods(rtrn, xkb); + XkbCFApplyMods(rtrn, XkbCF_InitialMods, &rtrn->initial_mods); + XkbCFApplyMods(rtrn, XkbCF_InternalMods, &rtrn->internal_mods); + XkbCFApplyMods(rtrn, XkbCF_IgnoreLockMods, &rtrn->ignore_lock_mods); } - if (what==XkbCF_Apply) { - if (xkb!=NULL) { - DefaultApplyNames(rtrn,xkb); - DefaultApplyControls(rtrn,xkb); - XkbCFBindMods(rtrn,xkb); - } + if (what == XkbCF_Apply) { + if (xkb != NULL) { + DefaultApplyNames(rtrn, xkb); + DefaultApplyControls(rtrn, xkb); + XkbCFBindMods(rtrn, xkb); + } } return True; } static XkbConfigFieldRec _XkbCFDfltFields[] = { - { "rules", _XkbCF_RulesFile }, - { "model", _XkbCF_Model }, - { "layout", _XkbCF_Layout }, - { "variant", _XkbCF_Variant }, - { "options", _XkbCF_Options }, - { "keymap", _XkbCF_Keymap }, - { "keycodes", _XkbCF_Keycodes }, - { "geometry", _XkbCF_Geometry }, - { "realsymbols",_XkbCF_PhysSymbols }, - { "actualsymbols",_XkbCF_PhysSymbols }, - { "symbols", _XkbCF_Symbols }, - { "symbolstouse",_XkbCF_Symbols }, - { "types", _XkbCF_Types }, - { "compat", _XkbCF_CompatMap }, - { "modifiers", _XkbCF_InitialMods }, - { "controls", _XkbCF_InitialCtrls }, - { "click", _XkbCF_ClickVolume }, - { "clickvolume",_XkbCF_ClickVolume }, - { "bell", _XkbCF_BellVolume }, - { "bellvolume", _XkbCF_BellVolume }, - { "bellpitch", _XkbCF_BellPitch }, - { "bellduration",_XkbCF_BellDuration }, - { "repeatdelay",_XkbCF_RepeatDelay }, - { "repeatinterval",_XkbCF_RepeatInterval }, - { "slowkeysdelay",_XkbCF_SlowKeysDelay }, - { "debouncedelay",_XkbCF_DebounceDelay }, - { "mousekeysdelay",_XkbCF_MouseKeysDelay }, - { "mousekeysinterval",_XkbCF_MouseKeysInterval }, - { "mousekeystimetomax",_XkbCF_MouseKeysTimeToMax }, - { "mousekeysmaxspeed",_XkbCF_MouseKeysMaxSpeed }, - { "mousekeyscurve",_XkbCF_MouseKeysCurve }, - { "accessxtimeout",_XkbCF_AccessXTimeout }, - { "axtimeout",_XkbCF_AccessXTimeout }, - { "accessxtimeoutctrlson",_XkbCF_AccessXTimeoutCtrlsOn }, - { "axtctrlson", _XkbCF_AccessXTimeoutCtrlsOn }, - { "accessxtimeoutctrlsoff",_XkbCF_AccessXTimeoutCtrlsOff }, - { "axtctrlsoff",_XkbCF_AccessXTimeoutCtrlsOff }, - { "accessxtimeoutfeedbackon", _XkbCF_AccessXTimeoutOptsOn }, - { "axtfeedbackon", _XkbCF_AccessXTimeoutOptsOn }, - { "accessxtimeoutfeedbackoff", _XkbCF_AccessXTimeoutOptsOff }, - { "axtfeedbackoff", _XkbCF_AccessXTimeoutOptsOff }, - { "ignorelockmods",_XkbCF_IgnoreLockMods }, - { "ignorelockmodifiers",_XkbCF_IgnoreLockMods }, - { "ignoregrouplock",_XkbCF_IgnoreGroupLock }, - { "internalmods",_XkbCF_InternalMods }, - { "internalmodifiers",_XkbCF_InternalMods }, - { "outofrangegroups",_XkbCF_GroupsWrap }, - { "groups", _XkbCF_GroupsWrap }, - { "feedback", _XkbCF_InitialFeedback }, + {"rules", _XkbCF_RulesFile}, + {"model", _XkbCF_Model}, + {"layout", _XkbCF_Layout}, + {"variant", _XkbCF_Variant}, + {"options", _XkbCF_Options}, + {"keymap", _XkbCF_Keymap}, + {"keycodes", _XkbCF_Keycodes}, + {"geometry", _XkbCF_Geometry}, + {"realsymbols", _XkbCF_PhysSymbols}, + {"actualsymbols", _XkbCF_PhysSymbols}, + {"symbols", _XkbCF_Symbols}, + {"symbolstouse", _XkbCF_Symbols}, + {"types", _XkbCF_Types}, + {"compat", _XkbCF_CompatMap}, + {"modifiers", _XkbCF_InitialMods}, + {"controls", _XkbCF_InitialCtrls}, + {"click", _XkbCF_ClickVolume}, + {"clickvolume", _XkbCF_ClickVolume}, + {"bell", _XkbCF_BellVolume}, + {"bellvolume", _XkbCF_BellVolume}, + {"bellpitch", _XkbCF_BellPitch}, + {"bellduration", _XkbCF_BellDuration}, + {"repeatdelay", _XkbCF_RepeatDelay}, + {"repeatinterval", _XkbCF_RepeatInterval}, + {"slowkeysdelay", _XkbCF_SlowKeysDelay}, + {"debouncedelay", _XkbCF_DebounceDelay}, + {"mousekeysdelay", _XkbCF_MouseKeysDelay}, + {"mousekeysinterval", _XkbCF_MouseKeysInterval}, + {"mousekeystimetomax", _XkbCF_MouseKeysTimeToMax}, + {"mousekeysmaxspeed", _XkbCF_MouseKeysMaxSpeed}, + {"mousekeyscurve", _XkbCF_MouseKeysCurve}, + {"accessxtimeout", _XkbCF_AccessXTimeout}, + {"axtimeout", _XkbCF_AccessXTimeout}, + {"accessxtimeoutctrlson", _XkbCF_AccessXTimeoutCtrlsOn}, + {"axtctrlson", _XkbCF_AccessXTimeoutCtrlsOn}, + {"accessxtimeoutctrlsoff", _XkbCF_AccessXTimeoutCtrlsOff}, + {"axtctrlsoff", _XkbCF_AccessXTimeoutCtrlsOff}, + {"accessxtimeoutfeedbackon",_XkbCF_AccessXTimeoutOptsOn}, + {"axtfeedbackon", _XkbCF_AccessXTimeoutOptsOn}, + {"accessxtimeoutfeedbackoff",_XkbCF_AccessXTimeoutOptsOff}, + {"axtfeedbackoff", _XkbCF_AccessXTimeoutOptsOff}, + {"ignorelockmods", _XkbCF_IgnoreLockMods}, + {"ignorelockmodifiers", _XkbCF_IgnoreLockMods}, + {"ignoregrouplock", _XkbCF_IgnoreGroupLock}, + {"internalmods", _XkbCF_InternalMods}, + {"internalmodifiers", _XkbCF_InternalMods}, + {"outofrangegroups", _XkbCF_GroupsWrap}, + {"groups", _XkbCF_GroupsWrap}, + {"feedback", _XkbCF_InitialFeedback}, }; #define _XkbCFNumDfltFields (sizeof(_XkbCFDfltFields)/sizeof(XkbConfigFieldRec)) static XkbConfigFieldsRec _XkbCFDflts = { - 0, /* cfg_id */ - _XkbCFNumDfltFields, /* num_fields */ - _XkbCFDfltFields, /* fields */ - DefaultParser, /* parser */ - DefaultFinish, /* finish */ - NULL, /* priv */ - NULL /* next */ + 0, /* cfg_id */ + _XkbCFNumDfltFields, /* num_fields */ + _XkbCFDfltFields, /* fields */ + DefaultParser, /* parser */ + DefaultFinish, /* finish */ + NULL, /* priv */ + NULL /* next */ }; -XkbConfigFieldsPtr XkbCFDflts= &_XkbCFDflts; +XkbConfigFieldsPtr XkbCFDflts = &_XkbCFDflts; /***====================================================================***/ XkbConfigFieldsPtr XkbCFDup(XkbConfigFieldsPtr fields) { -XkbConfigFieldsPtr pNew; - - pNew= _XkbTypedAlloc(XkbConfigFieldsRec); - if (pNew!=NULL) { - memcpy(pNew,fields,sizeof(XkbConfigFieldsRec)); - if ((pNew->fields!=NULL)&&(pNew->num_fields>0)) { - pNew->fields= _XkbTypedCalloc(pNew->num_fields,XkbConfigFieldRec); - if (pNew->fields) { - memcpy(fields->fields,pNew->fields, - (pNew->num_fields*sizeof(XkbConfigFieldRec))); - } - else { - _XkbFree(pNew); - return NULL; - } - } - else { - pNew->num_fields= 0; - pNew->fields= NULL; - } - pNew->next= NULL; + XkbConfigFieldsPtr pNew; + + pNew = _XkbTypedAlloc(XkbConfigFieldsRec); + if (pNew != NULL) { + memcpy(pNew, fields, sizeof(XkbConfigFieldsRec)); + if ((pNew->fields != NULL) && (pNew->num_fields > 0)) { + pNew->fields = _XkbTypedCalloc(pNew->num_fields, XkbConfigFieldRec); + if (pNew->fields) { + memcpy(fields->fields, pNew->fields, + (pNew->num_fields * sizeof(XkbConfigFieldRec))); + } + else { + _XkbFree(pNew); + return NULL; + } + } + else { + pNew->num_fields = 0; + pNew->fields = NULL; + } + pNew->next = NULL; } return pNew; } XkbConfigFieldsPtr -XkbCFFree(XkbConfigFieldsPtr fields,Bool all) +XkbCFFree(XkbConfigFieldsPtr fields, Bool all) { -XkbConfigFieldsPtr next; - - next= NULL; - while (fields!=NULL) { - next= fields->next; - if (fields!=XkbCFDflts) { - if (fields->fields) { - _XkbFree(fields->fields); - fields->fields= NULL; - fields->num_fields= 0; - } - _XkbFree(fields); - } - fields= (all?next:NULL); + XkbConfigFieldsPtr next; + + next = NULL; + while (fields != NULL) { + next = fields->next; + if (fields != XkbCFDflts) { + if (fields->fields) { + _XkbFree(fields->fields); + fields->fields = NULL; + fields->num_fields = 0; + } + _XkbFree(fields); + } + fields = (all ? next : NULL); } return next; } Bool -XkbCFApplyRtrnValues( XkbConfigRtrnPtr rtrn, - XkbConfigFieldsPtr fields, - XkbDescPtr xkb) +XkbCFApplyRtrnValues(XkbConfigRtrnPtr rtrn, + XkbConfigFieldsPtr fields, + XkbDescPtr xkb) { -Bool ok; + Bool ok; - if ((fields==NULL)||(rtrn==NULL)||(xkb==NULL)) - return False; - for (ok=True;fields!=NULL;fields=fields->next) { - if (fields->finish!=NULL) - ok= (*fields->finish)(fields,xkb,rtrn,XkbCF_Apply)&&ok; + if ((fields == NULL) || (rtrn == NULL) || (xkb == NULL)) + return False; + for (ok = True; fields != NULL; fields = fields->next) { + if (fields->finish != NULL) + ok = (*fields->finish) (fields, xkb, rtrn, XkbCF_Apply) && ok; } return ok; } XkbConfigRtrnPrivPtr -XkbCFAddPrivate( XkbConfigRtrnPtr rtrn, - XkbConfigFieldsPtr fields, - XPointer ptr) +XkbCFAddPrivate(XkbConfigRtrnPtr rtrn, XkbConfigFieldsPtr fields, XPointer ptr) { -XkbConfigRtrnPrivPtr priv; - - if ((rtrn==NULL)||(fields==NULL)) - return NULL; - priv= _XkbTypedAlloc(XkbConfigRtrnPrivRec); - if (priv!=NULL) { - priv->cfg_id= fields->cfg_id; - priv->priv= ptr; - priv->next= rtrn->priv; - rtrn->priv= priv; + XkbConfigRtrnPrivPtr priv; + + if ((rtrn == NULL) || (fields == NULL)) + return NULL; + priv = _XkbTypedAlloc(XkbConfigRtrnPrivRec); + if (priv != NULL) { + priv->cfg_id = fields->cfg_id; + priv->priv = ptr; + priv->next = rtrn->priv; + rtrn->priv = priv; } return priv; } void -XkbCFFreeRtrn( XkbConfigRtrnPtr rtrn, - XkbConfigFieldsPtr fields, - XkbDescPtr xkb) +XkbCFFreeRtrn(XkbConfigRtrnPtr rtrn, XkbConfigFieldsPtr fields, XkbDescPtr xkb) { -XkbConfigRtrnPrivPtr tmp,next; - - if ((fields==NULL)||(rtrn==NULL)) - return; - while (fields!=NULL) { - if (fields->finish!=NULL) - (*fields->finish)(fields,xkb,rtrn,XkbCF_Destroy); - fields= fields->next; + XkbConfigRtrnPrivPtr tmp, next; + + if ((fields == NULL) || (rtrn == NULL)) + return; + while (fields != NULL) { + if (fields->finish != NULL) + (*fields->finish) (fields, xkb, rtrn, XkbCF_Destroy); + fields = fields->next; } - for (tmp=rtrn->priv;tmp!=NULL;tmp=next) { - next= tmp->next; - bzero((char *)tmp,sizeof(XkbConfigRtrnPrivRec)); - _XkbFree(tmp); + for (tmp = rtrn->priv; tmp != NULL; tmp = next) { + next = tmp->next; + bzero((char *) tmp, sizeof(XkbConfigRtrnPrivRec)); + _XkbFree(tmp); } - bzero((char *)rtrn,sizeof(XkbConfigRtrnRec)); + bzero((char *) rtrn, sizeof(XkbConfigRtrnRec)); return; } Bool -XkbCFParse( FILE * file, - XkbConfigFieldsPtr fields, - XkbDescPtr xkb, - XkbConfigRtrnPtr rtrn) +XkbCFParse(FILE *file, XkbConfigFieldsPtr fields, + XkbDescPtr xkb, XkbConfigRtrnPtr rtrn) { -int tok; -XkbCFScanResultRec val; -XkbConfigFieldsPtr tmp; - - if ((file==NULL)||(fields==NULL)||(rtrn==NULL)) - return False; - for (tok=0,tmp=fields;tmp!=NULL;tmp=tmp->next,tok++) { - fields->cfg_id= tok; + int tok; + XkbCFScanResultRec val; + XkbConfigFieldsPtr tmp; + + if ((file == NULL) || (fields == NULL) || (rtrn == NULL)) + return False; + for (tok = 0, tmp = fields; tmp != NULL; tmp = tmp->next, tok++) { + fields->cfg_id = tok; } - bzero((char *)rtrn,sizeof(XkbConfigRtrnRec)); - rtrn->line= 1; - rtrn->click_volume= -1; - rtrn->bell_volume= -1; - while ((tok=XkbCFScan(file,&val,rtrn))!=XkbCF_EOF) { - if (tok==XkbCF_Ident) { - Bool done; - for (tmp=fields,done=False;(tmp!=NULL)&&(!done);tmp=tmp->next) { - register int i; - XkbConfigFieldPtr f; - - for (i=0,f=tmp->fields;(i<tmp->num_fields)&&(!done);i++,f++) { - if (_XkbStrCaseCmp(val.str,f->field)!=0) - continue; - if ((*tmp->parser)(file,tmp,f,xkb,rtrn)) - done= True; - else goto BAILOUT; - } - } - } - else if ((tok!=XkbCF_EOL)&&(tok!=XkbCF_Semi)) { - rtrn->error= XkbCF_MissingIdent; - goto BAILOUT; - } + bzero((char *) rtrn, sizeof(XkbConfigRtrnRec)); + rtrn->line = 1; + rtrn->click_volume = -1; + rtrn->bell_volume = -1; + while ((tok = XkbCFScan(file, &val, rtrn)) != XkbCF_EOF) { + if (tok == XkbCF_Ident) { + Bool done; + + for (tmp = fields, done = False; (tmp != NULL) && (!done); + tmp = tmp->next) { + register int i; + + XkbConfigFieldPtr f; + + for (i = 0, f = tmp->fields; (i < tmp->num_fields) && (!done); + i++, f++) { + if (_XkbStrCaseCmp(val.str, f->field) != 0) + continue; + if ((*tmp->parser) (file, tmp, f, xkb, rtrn)) + done = True; + else + goto BAILOUT; + } + } + } + else if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi)) { + rtrn->error = XkbCF_MissingIdent; + goto BAILOUT; + } } - for (tmp=fields;tmp!=NULL;tmp=tmp->next) { - if ((tmp->finish)&&(!(*tmp->finish)(tmp,xkb,rtrn,XkbCF_Check))) - goto BAILOUT; + for (tmp = fields; tmp != NULL; tmp = tmp->next) { + if ((tmp->finish) && (!(*tmp->finish) (tmp, xkb, rtrn, XkbCF_Check))) + goto BAILOUT; } return True; -BAILOUT: - for (tmp=fields;tmp!=NULL;tmp=tmp->next) { - if (tmp->finish) - (*tmp->finish)(tmp,xkb,rtrn,XkbCF_CleanUp); + BAILOUT: + for (tmp = fields; tmp != NULL; tmp = tmp->next) { + if (tmp->finish) + (*tmp->finish) (tmp, xkb, rtrn, XkbCF_CleanUp); } return False; } /*ARGSUSED*/ void -XkbCFReportError(FILE *file,char *name,int error,int line) +XkbCFReportError(FILE *file, char *name, int error, int line) { -const char *msg; - - switch(error) { - case XkbCF_BadAlloc: - msg= "allocation failed\n"; break; - case XkbCF_UnterminatedString: - msg= "unterminated string on line %d"; break; - case XkbCF_MissingIdent: - msg= "expected identifier on line %d"; break; - case XkbCF_MissingEquals: - msg= "expected '=' on line %d"; break; - case XkbCF_ExpectedEOS: - msg= "expected ';' or newline on line %d"; break; - case XkbCF_ExpectedBoolean: - msg= "expected a boolean value on line %d"; break; - case XkbCF_ExpectedInteger: - msg= "expected a numeric value on line %d"; break; - case XkbCF_ExpectedString: - msg= "expected a string on line %d"; break; - case XkbCF_ExpectedModifier: - msg= "expected a modifier name on line %d"; break; - case XkbCF_ExpectedControl: - msg= "expected a control name on line %d"; break; - case XkbCF_ExpectedAXOption: - msg= "expected an AccessX option on line %d"; break; - case XkbCF_ExpectedOperator: - msg= "expected '+' or '-' on line %d"; break; - case XkbCF_ExpectedOORGroupBehavior: - msg= "expected wrap, clamp or group number on line %d"; break; - default: - msg= "unknown error on line %d"; break; + const char *msg; + + switch (error) { + case XkbCF_BadAlloc: + msg = "allocation failed\n"; + break; + case XkbCF_UnterminatedString: + msg = "unterminated string on line %d"; + break; + case XkbCF_MissingIdent: + msg = "expected identifier on line %d"; + break; + case XkbCF_MissingEquals: + msg = "expected '=' on line %d"; + break; + case XkbCF_ExpectedEOS: + msg = "expected ';' or newline on line %d"; + break; + case XkbCF_ExpectedBoolean: + msg = "expected a boolean value on line %d"; + break; + case XkbCF_ExpectedInteger: + msg = "expected a numeric value on line %d"; + break; + case XkbCF_ExpectedString: + msg = "expected a string on line %d"; + break; + case XkbCF_ExpectedModifier: + msg = "expected a modifier name on line %d"; + break; + case XkbCF_ExpectedControl: + msg = "expected a control name on line %d"; + break; + case XkbCF_ExpectedAXOption: + msg = "expected an AccessX option on line %d"; + break; + case XkbCF_ExpectedOperator: + msg = "expected '+' or '-' on line %d"; + break; + case XkbCF_ExpectedOORGroupBehavior: + msg = "expected wrap, clamp or group number on line %d"; + break; + default: + msg = "unknown error on line %d"; + break; } #ifndef XKB_IN_SERVER - fprintf(file,msg,line); - if (name) fprintf(file," of %s\n",name); - else fprintf(file,"\n"); + fprintf(file, msg, line); + if (name) + fprintf(file, " of %s\n", name); + else + fprintf(file, "\n"); #else - ErrorF(msg,line); - if (name) ErrorF(" of %s\n",name); - else ErrorF("\n"); + ErrorF(msg, line); + if (name) + ErrorF(" of %s\n", name); + else + ErrorF("\n"); #endif return; } diff --git a/src/xkbdraw.c b/src/xkbdraw.c index 179dc74..421c8c7 100644 --- a/src/xkbdraw.c +++ b/src/xkbdraw.c @@ -41,81 +41,87 @@ #include "XKBfileInt.h" static void -_XkbAddDrawable(XkbDrawablePtr *pfirst,XkbDrawablePtr *plast,XkbDrawablePtr tmp) +_XkbAddDrawable(XkbDrawablePtr *pfirst, XkbDrawablePtr *plast, + XkbDrawablePtr tmp) { -XkbDrawablePtr old; + XkbDrawablePtr old; - if (*pfirst==NULL) { - *pfirst= *plast= tmp; + if (*pfirst == NULL) { + *pfirst = *plast = tmp; } - else if (tmp->priority>=(*plast)->priority) { - (*plast)->next= tmp; - *plast= tmp; + else if (tmp->priority >= (*plast)->priority) { + (*plast)->next = tmp; + *plast = tmp; } - else if (tmp->priority<(*pfirst)->priority) { - tmp->next= (*pfirst); - (*pfirst)= tmp; + else if (tmp->priority < (*pfirst)->priority) { + tmp->next = (*pfirst); + (*pfirst) = tmp; } else { - old= *pfirst; - while ((old->next)&&(old->next->priority<=tmp->priority)) { - old= old->next; - } - tmp->next= old->next; - old->next= tmp; + old = *pfirst; + while ((old->next) && (old->next->priority <= tmp->priority)) { + old = old->next; + } + tmp->next = old->next; + old->next = tmp; } return; } XkbDrawablePtr -XkbGetOrderedDrawables(XkbGeometryPtr geom,XkbSectionPtr section) +XkbGetOrderedDrawables(XkbGeometryPtr geom, XkbSectionPtr section) { -XkbDrawablePtr first,last,tmp; -int i; + XkbDrawablePtr first, last, tmp; + int i; - first= last= NULL; - if (geom!=NULL) { - XkbSectionPtr section; - XkbDoodadPtr doodad; - for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) { - tmp= _XkbTypedCalloc(1,XkbDrawableRec); - if (!tmp) { - XkbFreeOrderedDrawables(first); - return NULL; - } - tmp->type= XkbDW_Section; - tmp->priority= section->priority; - tmp->u.section= section; - tmp->next= NULL; - _XkbAddDrawable(&first,&last,tmp); - } - for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) { - tmp= _XkbTypedCalloc(1,XkbDrawableRec); - if (!tmp) { - XkbFreeOrderedDrawables(first); - return NULL; - } - tmp->type= XkbDW_Doodad; - tmp->priority= doodad->any.priority; - tmp->u.doodad= doodad; - tmp->next= NULL; - _XkbAddDrawable(&first,&last,tmp); - } + first = last = NULL; + if (geom != NULL) { + XkbSectionPtr section; + XkbDoodadPtr doodad; + + for (i = 0, section = geom->sections; i < geom->num_sections; + i++, section++) { + tmp = _XkbTypedCalloc(1, XkbDrawableRec); + if (!tmp) { + XkbFreeOrderedDrawables(first); + return NULL; + } + tmp->type = XkbDW_Section; + tmp->priority = section->priority; + tmp->u.section = section; + tmp->next = NULL; + _XkbAddDrawable(&first, &last, tmp); + } + for (i = 0, doodad = geom->doodads; i < geom->num_doodads; + i++, doodad++) { + tmp = _XkbTypedCalloc(1, XkbDrawableRec); + if (!tmp) { + XkbFreeOrderedDrawables(first); + return NULL; + } + tmp->type = XkbDW_Doodad; + tmp->priority = doodad->any.priority; + tmp->u.doodad = doodad; + tmp->next = NULL; + _XkbAddDrawable(&first, &last, tmp); + } } - if (section!=NULL) { - XkbDoodadPtr doodad; - for (i=0,doodad=section->doodads;i<section->num_doodads;i++,doodad++) { - tmp= _XkbTypedCalloc(1,XkbDrawableRec); - if (!tmp) { - XkbFreeOrderedDrawables(first); - return NULL; - } - tmp->type= XkbDW_Doodad; - tmp->priority= doodad->any.priority; - tmp->u.doodad= doodad; - tmp->next= NULL; - _XkbAddDrawable(&first,&last,tmp); - } + if (section != NULL) { + XkbDoodadPtr doodad; + + for (i = 0, doodad = section->doodads; i < section->num_doodads; + i++, doodad++) { + tmp = _XkbTypedCalloc(1, XkbDrawableRec); + if (!tmp) { + XkbFreeOrderedDrawables(first); + return NULL; + } + tmp->type = XkbDW_Doodad; + tmp->priority = doodad->any.priority; + tmp->u.doodad = doodad; + tmp->next = NULL; + _XkbAddDrawable(&first, &last, tmp); + } } return first; } @@ -123,11 +129,11 @@ int i; void XkbFreeOrderedDrawables(XkbDrawablePtr draw) { -XkbDrawablePtr tmp; + XkbDrawablePtr tmp; - for (;draw!=NULL;draw=tmp) { - tmp= draw->next; - _XkbFree(draw); - } - return; + for (; draw != NULL; draw = tmp) { + tmp = draw->next; + _XkbFree(draw); + } + return; } diff --git a/src/xkberrs.c b/src/xkberrs.c index f28f02b..2fe482b 100644 --- a/src/xkberrs.c +++ b/src/xkberrs.c @@ -41,37 +41,36 @@ #include <X11/XKBlib.h> #include <X11/extensions/XKBfile.h> -const char * _XkbErrMessages[] = { - "success", /* _XkbSuccess */ - "key names not defined", /* _XkbErrMissingNames */ - "key types not defined", /* _XkbErrMissingTypes */ - "required key types not present", /* _XkbErrMissingReqTypes */ - "symbols not defined", /* _XkbErrMissingSymbols */ - "virtual modifier bindings not defined",/* _XkbErrMissingVMods */ - "indicators not defined", /* _XkbErrMissingIndicators */ - "compatibility map not defined", /* _XkbErrMissingCompatMap */ - "symbol interpretations not defined", /* _XkbErrMissingSymInterps */ - "geometry not defined", /* _XkbErrMissingGeometry */ - "illegal doodad type", /* _XkbErrIllegalDoodad */ - "illegal TOC type", /* _XkbErrIllegalTOCType */ - "illegal contents", /* _XkbErrIllegalContents */ - "empty file", /* _XkbErrEmptyFile */ - "file not found", /* _XkbErrFileNotFound */ - "cannot open", /* _XkbErrFileCannotOpen */ - "bad value", /* _XkbErrBadValue */ - "bad match", /* _XkbErrBadMatch */ - "illegal name for type", /* _XkbErrBadTypeName */ - "illegal width for type", /* _XkbErrBadTypeWidth */ - "bad file type", /* _XkbErrBadFileType */ - "bad file version", /* _XkbErrBadFileVersion */ - "error in Xkm file", /* _XkbErrBadFileFormat */ - "allocation failed", /* _XkbErrBadAlloc */ - "bad length", /* _XkbErrBadLength */ - "X request failed", /* _XkbErrXReqFailure */ - "not implemented" /* _XkbErrBadImplementation */ +const char *_XkbErrMessages[] = { + "success", /* _XkbSuccess */ + "key names not defined", /* _XkbErrMissingNames */ + "key types not defined", /* _XkbErrMissingTypes */ + "required key types not present", /* _XkbErrMissingReqTypes */ + "symbols not defined", /* _XkbErrMissingSymbols */ + "virtual modifier bindings not defined", /* _XkbErrMissingVMods */ + "indicators not defined", /* _XkbErrMissingIndicators */ + "compatibility map not defined", /* _XkbErrMissingCompatMap */ + "symbol interpretations not defined", /* _XkbErrMissingSymInterps */ + "geometry not defined", /* _XkbErrMissingGeometry */ + "illegal doodad type", /* _XkbErrIllegalDoodad */ + "illegal TOC type", /* _XkbErrIllegalTOCType */ + "illegal contents", /* _XkbErrIllegalContents */ + "empty file", /* _XkbErrEmptyFile */ + "file not found", /* _XkbErrFileNotFound */ + "cannot open", /* _XkbErrFileCannotOpen */ + "bad value", /* _XkbErrBadValue */ + "bad match", /* _XkbErrBadMatch */ + "illegal name for type", /* _XkbErrBadTypeName */ + "illegal width for type", /* _XkbErrBadTypeWidth */ + "bad file type", /* _XkbErrBadFileType */ + "bad file version", /* _XkbErrBadFileVersion */ + "error in Xkm file", /* _XkbErrBadFileFormat */ + "allocation failed", /* _XkbErrBadAlloc */ + "bad length", /* _XkbErrBadLength */ + "X request failed", /* _XkbErrXReqFailure */ + "not implemented" /* _XkbErrBadImplementation */ }; -unsigned _XkbErrCode; -const char * _XkbErrLocation= NULL; -unsigned _XkbErrData; - +unsigned _XkbErrCode; +const char * _XkbErrLocation = NULL; +unsigned _XkbErrData; diff --git a/src/xkbmisc.c b/src/xkbmisc.c index e0b9bd6..1cd42e6 100644 --- a/src/xkbmisc.c +++ b/src/xkbmisc.c @@ -65,82 +65,80 @@ unsigned _XkbKSCheckCase(KeySym ks) { -unsigned set,rtrn; + unsigned set, rtrn; - set= (ks & (~0xff)) >> 8; - rtrn= 0; + set = (ks & (~0xff)) >> 8; + rtrn = 0; switch (set) { - case 0: /* latin 1 */ - if (((ks>=XK_A)&&(ks<=XK_Z))|| - ((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) { - rtrn|= _XkbKSUpper; - } - if (((ks>=XK_a)&&(ks<=XK_z))|| - ((ks>=XK_agrave)&&(ks<=XK_ydiaeresis))) { - rtrn|= _XkbKSLower; - } - break; - case 1: /* latin 2 */ - if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))|| - ((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) { - rtrn|= _XkbKSUpper; - } - if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_caron))|| - ((ks>=XK_racute)&&(ks<=XK_tcedilla))) { - rtrn|= _XkbKSLower; - } - break; - case 2: /* latin 3 */ - if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))|| - ((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) { - rtrn|= _XkbKSUpper; - } - if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))|| - ((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) { - rtrn|= _XkbKSLower; - } - break; - case 3: /* latin 4 */ - if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))|| - (ks==XK_ENG)|| - ((ks>=XK_Amacron)&&(ks<=XK_Umacron))) { - rtrn|= _XkbKSUpper; - } - if (((ks>=XK_rcedilla)&&(ks<=XK_tslash))|| - (ks==XK_eng)|| - ((ks>=XK_amacron)&&(ks<=XK_umacron))) { - rtrn|= _XkbKSLower; - } - break; - case 18: /* latin 8 */ - if ((ks==XK_Babovedot)|| - ((ks>=XK_Dabovedot)&&(ks<=XK_Wacute))|| - ((ks>=XK_Ygrave)&&(ks<=XK_Fabovedot))|| - (ks==XK_Mabovedot)|| - (ks==XK_Pabovedot)|| - (ks==XK_Sabovedot)|| - (ks==XK_Wdiaeresis)|| - ((ks>=XK_Wcircumflex)&&(ks<=XK_Ycircumflex))) { - rtrn|= _XkbKSUpper; - } - if ((ks==XK_babovedot)|| - (ks==XK_dabovedot)|| - (ks==XK_fabovedot)|| - (ks==XK_mabovedot)|| - ((ks>=XK_wgrave)&&(ks<=XK_wacute))|| - (ks==XK_ygrave)|| - ((ks>=XK_wdiaeresis)&&(ks<=XK_ycircumflex))) { - rtrn|= _XkbKSLower; - } - break; - case 19: /* latin 9 */ - if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) { - rtrn|= _XkbKSUpper; - } - if (ks==XK_oe) { - rtrn|= _XkbKSLower; - } - break; + case 0: /* latin 1 */ + if (((ks >= XK_A) && (ks <= XK_Z)) || + ((ks >= XK_Agrave) && (ks <= XK_THORN) && (ks != XK_multiply))) { + rtrn |= _XkbKSUpper; + } + if (((ks >= XK_a) && (ks <= XK_z)) || + ((ks >= XK_agrave) && (ks <= XK_ydiaeresis))) { + rtrn |= _XkbKSLower; + } + break; + case 1: /* latin 2 */ + if (((ks >= XK_Aogonek) && (ks <= XK_Zabovedot) && (ks != XK_breve)) || + ((ks >= XK_Racute) && (ks <= XK_Tcedilla))) { + rtrn |= _XkbKSUpper; + } + if (((ks >= XK_aogonek) && (ks <= XK_zabovedot) && (ks != XK_caron)) || + ((ks >= XK_racute) && (ks <= XK_tcedilla))) { + rtrn |= _XkbKSLower; + } + break; + case 2: /* latin 3 */ + if (((ks >= XK_Hstroke) && (ks <= XK_Jcircumflex)) || + ((ks >= XK_Cabovedot) && (ks <= XK_Scircumflex))) { + rtrn |= _XkbKSUpper; + } + if (((ks >= XK_hstroke) && (ks <= XK_jcircumflex)) || + ((ks >= XK_cabovedot) && (ks <= XK_scircumflex))) { + rtrn |= _XkbKSLower; + } + break; + case 3: /* latin 4 */ + if (((ks >= XK_Rcedilla) && (ks <= XK_Tslash)) || + (ks == XK_ENG) || ((ks >= XK_Amacron) && (ks <= XK_Umacron))) { + rtrn |= _XkbKSUpper; + } + if (((ks >= XK_rcedilla) && (ks <= XK_tslash)) || + (ks == XK_eng) || ((ks >= XK_amacron) && (ks <= XK_umacron))) { + rtrn |= _XkbKSLower; + } + break; + case 18: /* latin 8 */ + if ((ks == XK_Babovedot) || + ((ks >= XK_Dabovedot) && (ks <= XK_Wacute)) || + ((ks >= XK_Ygrave) && (ks <= XK_Fabovedot)) || + (ks == XK_Mabovedot) || + (ks == XK_Pabovedot) || + (ks == XK_Sabovedot) || + (ks == XK_Wdiaeresis) || + ((ks >= XK_Wcircumflex) && (ks <= XK_Ycircumflex))) { + rtrn |= _XkbKSUpper; + } + if ((ks == XK_babovedot) || + (ks == XK_dabovedot) || + (ks == XK_fabovedot) || + (ks == XK_mabovedot) || + ((ks >= XK_wgrave) && (ks <= XK_wacute)) || + (ks == XK_ygrave) || + ((ks >= XK_wdiaeresis) && (ks <= XK_ycircumflex))) { + rtrn |= _XkbKSLower; + } + break; + case 19: /* latin 9 */ + if ((ks == XK_OE) || (ks == XK_Ydiaeresis)) { + rtrn |= _XkbKSUpper; + } + if (ks == XK_oe) { + rtrn |= _XkbKSLower; + } + break; } return rtrn; } @@ -148,69 +146,71 @@ unsigned set,rtrn; /***===================================================================***/ Bool -XkbLookupGroupAndLevel( XkbDescPtr xkb, - int key, - int * mods_inout, - int * grp_inout, - int * lvl_rtrn) +XkbLookupGroupAndLevel(XkbDescPtr xkb, + int key, + int * mods_inout, + int * grp_inout, + int * lvl_rtrn) { -int nG,eG; + int nG, eG; - if ((!xkb)||(!XkbKeycodeInRange(xkb,key))||(!grp_inout)) - return False; + if ((!xkb) || (!XkbKeycodeInRange(xkb, key)) || (!grp_inout)) + return False; - nG= XkbKeyNumGroups(xkb,key); - eG= *grp_inout; + nG = XkbKeyNumGroups(xkb, key); + eG = *grp_inout; - if ( nG==0 ) { - *grp_inout= 0; - if (lvl_rtrn!=NULL) - *lvl_rtrn= 0; - return False; + if (nG == 0) { + *grp_inout = 0; + if (lvl_rtrn != NULL) + *lvl_rtrn = 0; + return False; } - else if ( nG==1 ) { - eG= 0; + else if (nG == 1) { + eG = 0; } - else if ( eG>=nG ) { - unsigned gI= XkbKeyGroupInfo(xkb,key); - switch (XkbOutOfRangeGroupAction(gI)) { - default: - eG %= nG; - break; - case XkbClampIntoRange: - eG = nG-1; - break; - case XkbRedirectIntoRange: - eG = XkbOutOfRangeGroupNumber(gI); - if (eG>=nG) - eG= 0; - break; - } + else if (eG >= nG) { + unsigned gI = XkbKeyGroupInfo(xkb, key); + + switch (XkbOutOfRangeGroupAction(gI)) { + default: + eG %= nG; + break; + case XkbClampIntoRange: + eG = nG - 1; + break; + case XkbRedirectIntoRange: + eG = XkbOutOfRangeGroupNumber(gI); + if (eG >= nG) + eG = 0; + break; + } } - *grp_inout= eG; - if (mods_inout!=NULL) { - XkbKeyTypePtr type; - int preserve; - - type = XkbKeyKeyType(xkb,key,eG); - if (lvl_rtrn!=NULL) - *lvl_rtrn= 0; - preserve= 0; - if (type->map) { /* find the shift level */ - register int i; - register XkbKTMapEntryPtr entry; - for (i=0,entry=type->map;i<type->map_count;i++,entry++) { - if ((entry->active)&& - (((*mods_inout)&type->mods.mask)==entry->mods.mask)){ - if (lvl_rtrn!=NULL) - *lvl_rtrn= entry->level; - if (type->preserve) - preserve= type->preserve[i].mask; - break; - } - } - } - (*mods_inout)&= ~(type->mods.mask&(~preserve)); + *grp_inout = eG; + if (mods_inout != NULL) { + XkbKeyTypePtr type; + int preserve; + + type = XkbKeyKeyType(xkb, key, eG); + if (lvl_rtrn != NULL) + *lvl_rtrn = 0; + preserve = 0; + if (type->map) { /* find the shift level */ + register int i; + register XkbKTMapEntryPtr entry; + + for (i = 0, entry = type->map; i < type->map_count; i++, entry++) { + if ((entry->active) && + (((*mods_inout) & type->mods.mask) == entry->mods.mask)) { + if (lvl_rtrn != NULL) + *lvl_rtrn = entry->level; + if (type->preserve) + preserve = type->preserve[i].mask; + break; + } + } + } + (*mods_inout) &= ~(type->mods.mask & (~preserve)); } return True; } @@ -220,7 +220,7 @@ int nG,eG; static Bool XkbWriteSectionFromName(FILE *file, const char *sectionName, const char *name) { - fprintf(file," xkb_%-20s { include \"%s\" };\n",sectionName,name); + fprintf(file, " xkb_%-20s { include \"%s\" };\n", sectionName, name); return True; } @@ -229,202 +229,212 @@ XkbWriteSectionFromName(FILE *file, const char *sectionName, const char *name) /* ARGSUSED */ static void -_AddIncl( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - int index, - void * priv) +_AddIncl(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + int index, + void * priv) { - if ((priv)&&(strcmp((char *)priv,"%")!=0)) - fprintf(file," include \"%s\"\n",(char *)priv); + if ((priv) && (strcmp((char *) priv, "%") != 0)) + fprintf(file, " include \"%s\"\n", (char *) priv); return; } Bool -XkbWriteXKBKeymapForNames( FILE * file, - XkbComponentNamesPtr names, - Display * dpy, - XkbDescPtr xkb, - unsigned want, - unsigned need) +XkbWriteXKBKeymapForNames(FILE * file, + XkbComponentNamesPtr names, + Display * dpy, + XkbDescPtr xkb, + unsigned want, + unsigned need) { -char * name,*tmp; -unsigned complete; -XkbNamesPtr old_names; -int multi_section; -unsigned wantNames,wantConfig,wantDflts; -XkbFileInfo finfo; - - bzero(&finfo,sizeof(XkbFileInfo)); - - complete= 0; - if ((name=names->keymap)==NULL) name= "default"; - if (COMPLETE(names->keycodes)) complete|= XkmKeyNamesMask; - if (COMPLETE(names->types)) complete|= XkmTypesMask; - if (COMPLETE(names->compat)) complete|= XkmCompatMapMask; - if (COMPLETE(names->symbols)) complete|= XkmSymbolsMask; - if (COMPLETE(names->geometry)) complete|= XkmGeometryMask; - want|= (complete|need); - if (want&XkmSymbolsMask) - want|= XkmKeyNamesMask|XkmTypesMask; - - if (want==0) - return False; - - if (xkb!=NULL) { - old_names= xkb->names; - finfo.type= 0; - finfo.defined= 0; - finfo.xkb= xkb; - if (!XkbDetermineFileType(&finfo,XkbXKBFile,NULL)) - return False; + char *name, *tmp; + unsigned complete; + XkbNamesPtr old_names; + int multi_section; + unsigned wantNames, wantConfig, wantDflts; + XkbFileInfo finfo; + + bzero(&finfo, sizeof(XkbFileInfo)); + + complete = 0; + if ((name = names->keymap) == NULL) + name = "default"; + if (COMPLETE(names->keycodes)) + complete |= XkmKeyNamesMask; + if (COMPLETE(names->types)) + complete |= XkmTypesMask; + if (COMPLETE(names->compat)) + complete |= XkmCompatMapMask; + if (COMPLETE(names->symbols)) + complete |= XkmSymbolsMask; + if (COMPLETE(names->geometry)) + complete |= XkmGeometryMask; + want |= (complete | need); + if (want & XkmSymbolsMask) + want |= XkmKeyNamesMask | XkmTypesMask; + + if (want == 0) + return False; + + if (xkb != NULL) { + old_names = xkb->names; + finfo.type = 0; + finfo.defined = 0; + finfo.xkb = xkb; + if (!XkbDetermineFileType(&finfo, XkbXKBFile, NULL)) + return False; } - else old_names= NULL; - - wantConfig= want&(~complete); - if (xkb!=NULL) { - if (wantConfig&XkmTypesMask) { - if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes)) - wantConfig&= ~XkmTypesMask; - } - if (wantConfig&XkmCompatMapMask) { - if ((!xkb->compat) || (xkb->compat->num_si<1)) - wantConfig&= ~XkmCompatMapMask; - } - if (wantConfig&XkmSymbolsMask) { - if ((!xkb->map) || (!xkb->map->key_sym_map)) - wantConfig&= ~XkmSymbolsMask; - } - if (wantConfig&XkmIndicatorsMask) { - if (!xkb->indicators) - wantConfig&= ~XkmIndicatorsMask; - } - if (wantConfig&XkmKeyNamesMask) { - if ((!xkb->names)||(!xkb->names->keys)) - wantConfig&= ~XkmKeyNamesMask; - } - if ((wantConfig&XkmGeometryMask)&&(!xkb->geom)) - wantConfig&= ~XkmGeometryMask; + else + old_names = NULL; + + wantConfig = want & (~complete); + if (xkb != NULL) { + if (wantConfig & XkmTypesMask) { + if ((!xkb->map) || (xkb->map->num_types < XkbNumRequiredTypes)) + wantConfig &= ~XkmTypesMask; + } + if (wantConfig & XkmCompatMapMask) { + if ((!xkb->compat) || (xkb->compat->num_si < 1)) + wantConfig &= ~XkmCompatMapMask; + } + if (wantConfig & XkmSymbolsMask) { + if ((!xkb->map) || (!xkb->map->key_sym_map)) + wantConfig &= ~XkmSymbolsMask; + } + if (wantConfig & XkmIndicatorsMask) { + if (!xkb->indicators) + wantConfig &= ~XkmIndicatorsMask; + } + if (wantConfig & XkmKeyNamesMask) { + if ((!xkb->names) || (!xkb->names->keys)) + wantConfig &= ~XkmKeyNamesMask; + } + if ((wantConfig & XkmGeometryMask) && (!xkb->geom)) + wantConfig &= ~XkmGeometryMask; } else { - wantConfig= 0; + wantConfig = 0; } - complete|= wantConfig; - - wantDflts= 0; - wantNames= want&(~complete); - if ((xkb!=NULL) && (old_names!=NULL)) { - if (wantNames&XkmTypesMask) { - if (old_names->types!=None) { - tmp= XkbAtomGetString(dpy,old_names->types); - names->types= tmp; - } - else { - wantDflts|= XkmTypesMask; - } - complete|= XkmTypesMask; - } - if (wantNames&XkmCompatMapMask) { - if (old_names->compat!=None) { - tmp= XkbAtomGetString(dpy,old_names->compat); - names->compat= tmp; - } - else wantDflts|= XkmCompatMapMask; - complete|= XkmCompatMapMask; - } - if (wantNames&XkmSymbolsMask) { - if (old_names->symbols==None) - return False; - tmp= XkbAtomGetString(dpy,old_names->symbols); - names->symbols= tmp; - complete|= XkmSymbolsMask; - } - if (wantNames&XkmKeyNamesMask) { - if (old_names->keycodes!=None) { - tmp= XkbAtomGetString(dpy,old_names->keycodes); - names->keycodes= tmp; - } - else wantDflts|= XkmKeyNamesMask; - complete|= XkmKeyNamesMask; - } - if (wantNames&XkmGeometryMask) { - if (old_names->geometry==None) - return False; - tmp= XkbAtomGetString(dpy,old_names->geometry); - names->geometry= tmp; - complete|= XkmGeometryMask; - wantNames&= ~XkmGeometryMask; - } + complete |= wantConfig; + + wantDflts = 0; + wantNames = want & (~complete); + if ((xkb != NULL) && (old_names != NULL)) { + if (wantNames & XkmTypesMask) { + if (old_names->types != None) { + tmp = XkbAtomGetString(dpy, old_names->types); + names->types = tmp; + } + else { + wantDflts |= XkmTypesMask; + } + complete |= XkmTypesMask; + } + if (wantNames & XkmCompatMapMask) { + if (old_names->compat != None) { + tmp = XkbAtomGetString(dpy, old_names->compat); + names->compat = tmp; + } + else + wantDflts |= XkmCompatMapMask; + complete |= XkmCompatMapMask; + } + if (wantNames & XkmSymbolsMask) { + if (old_names->symbols == None) + return False; + tmp = XkbAtomGetString(dpy, old_names->symbols); + names->symbols = tmp; + complete |= XkmSymbolsMask; + } + if (wantNames & XkmKeyNamesMask) { + if (old_names->keycodes != None) { + tmp = XkbAtomGetString(dpy, old_names->keycodes); + names->keycodes = tmp; + } + else + wantDflts |= XkmKeyNamesMask; + complete |= XkmKeyNamesMask; + } + if (wantNames & XkmGeometryMask) { + if (old_names->geometry == None) + return False; + tmp = XkbAtomGetString(dpy, old_names->geometry); + names->geometry = tmp; + complete |= XkmGeometryMask; + wantNames &= ~XkmGeometryMask; + } } - if (complete&XkmCompatMapMask) - complete|= XkmIndicatorsMask|XkmVirtualModsMask; - else if (complete&(XkmSymbolsMask|XkmTypesMask)) - complete|= XkmVirtualModsMask; + if (complete & XkmCompatMapMask) + complete |= XkmIndicatorsMask | XkmVirtualModsMask; + else if (complete & (XkmSymbolsMask | XkmTypesMask)) + complete |= XkmVirtualModsMask; if (need & (~complete)) - return False; - if ((complete&XkmSymbolsMask)&&((XkmKeyNamesMask|XkmTypesMask)&(~complete))) - return False; - - multi_section= 1; - if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&& - ((complete&(~XkmKeymapLegal))==0)) { - fprintf(file,"xkb_keymap \"%s\" {\n",name); + return False; + if ((complete & XkmSymbolsMask) && + ((XkmKeyNamesMask | XkmTypesMask) & (~complete))) + return False; + + multi_section = 1; + if (((complete & XkmKeymapRequired) == XkmKeymapRequired) && + ((complete & (~XkmKeymapLegal)) == 0)) { + fprintf(file, "xkb_keymap \"%s\" {\n", name); } - else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&& - ((complete&(~XkmSemanticsLegal))==0)) { - fprintf(file,"xkb_semantics \"%s\" {\n",name); + else if (((complete & XkmSemanticsRequired) == XkmSemanticsRequired) && + ((complete & (~XkmSemanticsLegal)) == 0)) { + fprintf(file, "xkb_semantics \"%s\" {\n", name); } - else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&& - ((complete&(~XkmLayoutLegal))==0)) { - fprintf(file,"xkb_layout \"%s\" {\n",name); + else if (((complete & XkmLayoutRequired) == XkmLayoutRequired) && + ((complete & (~XkmLayoutLegal)) == 0)) { + fprintf(file, "xkb_layout \"%s\" {\n", name); } - else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) { - multi_section= 0; + else if (XkmSingleSection(complete & (~XkmVirtualModsMask))) { + multi_section = 0; } else { - return False; + return False; } - wantNames= complete&(~(wantConfig|wantDflts)); - name= names->keycodes; - if (wantConfig&XkmKeyNamesMask) - XkbWriteXKBKeycodes(file,&finfo,False,False,_AddIncl,name); - else if (wantDflts&XkmKeyNamesMask) - fprintf(stderr,"Default symbols not implemented yet!\n"); - else if (wantNames&XkmKeyNamesMask) - XkbWriteSectionFromName(file,"keycodes",name); - - name= names->types; - if (wantConfig&XkmTypesMask) - XkbWriteXKBKeyTypes(file,&finfo,False,False,_AddIncl,name); - else if (wantDflts&XkmTypesMask) - fprintf(stderr,"Default types not implemented yet!\n"); - else if (wantNames&XkmTypesMask) - XkbWriteSectionFromName(file,"types",name); - - name= names->compat; - if (wantConfig&XkmCompatMapMask) - XkbWriteXKBCompatMap(file,&finfo,False,False,_AddIncl,name); - else if (wantDflts&XkmCompatMapMask) - fprintf(stderr,"Default interps not implemented yet!\n"); - else if (wantNames&XkmCompatMapMask) - XkbWriteSectionFromName(file,"compatibility",name); - - name= names->symbols; - if (wantConfig&XkmSymbolsMask) - XkbWriteXKBSymbols(file,&finfo,False,False,_AddIncl,name); - else if (wantNames&XkmSymbolsMask) - XkbWriteSectionFromName(file,"symbols",name); - - name= names->geometry; - if (wantConfig&XkmGeometryMask) - XkbWriteXKBGeometry(file,&finfo,False,False,_AddIncl,name); - else if (wantNames&XkmGeometryMask) - XkbWriteSectionFromName(file,"geometry",name); + wantNames = complete & (~(wantConfig | wantDflts)); + name = names->keycodes; + if (wantConfig & XkmKeyNamesMask) + XkbWriteXKBKeycodes(file, &finfo, False, False, _AddIncl, name); + else if (wantDflts & XkmKeyNamesMask) + fprintf(stderr, "Default symbols not implemented yet!\n"); + else if (wantNames & XkmKeyNamesMask) + XkbWriteSectionFromName(file, "keycodes", name); + + name = names->types; + if (wantConfig & XkmTypesMask) + XkbWriteXKBKeyTypes(file, &finfo, False, False, _AddIncl, name); + else if (wantDflts & XkmTypesMask) + fprintf(stderr, "Default types not implemented yet!\n"); + else if (wantNames & XkmTypesMask) + XkbWriteSectionFromName(file, "types", name); + + name = names->compat; + if (wantConfig & XkmCompatMapMask) + XkbWriteXKBCompatMap(file, &finfo, False, False, _AddIncl, name); + else if (wantDflts & XkmCompatMapMask) + fprintf(stderr, "Default interps not implemented yet!\n"); + else if (wantNames & XkmCompatMapMask) + XkbWriteSectionFromName(file, "compatibility", name); + + name = names->symbols; + if (wantConfig & XkmSymbolsMask) + XkbWriteXKBSymbols(file, &finfo, False, False, _AddIncl, name); + else if (wantNames & XkmSymbolsMask) + XkbWriteSectionFromName(file, "symbols", name); + + name = names->geometry; + if (wantConfig & XkmGeometryMask) + XkbWriteXKBGeometry(file, &finfo, False, False, _AddIncl, name); + else if (wantNames & XkmGeometryMask) + XkbWriteSectionFromName(file, "geometry", name); if (multi_section) - fprintf(file,"};\n"); + fprintf(file, "};\n"); return True; } @@ -432,7 +442,7 @@ XkbFileInfo finfo; /*ARGSUSED*/ Status -XkbMergeFile(XkbDescPtr xkb,XkbFileInfo finfo) +XkbMergeFile(XkbDescPtr xkb, XkbFileInfo finfo) { return BadImplementation; } @@ -440,163 +450,195 @@ XkbMergeFile(XkbDescPtr xkb,XkbFileInfo finfo) /***====================================================================***/ int -XkbFindKeycodeByName(XkbDescPtr xkb,char *name,Bool use_aliases) +XkbFindKeycodeByName(XkbDescPtr xkb, char *name, Bool use_aliases) { -register int i; + register int i; - if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) - return 0; - for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { - if (strncmp(xkb->names->keys[i].name,name,XkbKeyNameLength)==0) - return i; + if ((!xkb) || (!xkb->names) || (!xkb->names->keys)) + return 0; + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { + if (strncmp(xkb->names->keys[i].name, name, XkbKeyNameLength) == 0) + return i; } if (!use_aliases) - return 0; + return 0; if (xkb->geom && xkb->geom->key_aliases) { - XkbKeyAliasPtr a; - a= xkb->geom->key_aliases; - for (i=0;i<xkb->geom->num_key_aliases;i++,a++) { - if (strncmp(name,a->alias,XkbKeyNameLength)==0) - return XkbFindKeycodeByName(xkb,a->real,False); - } + XkbKeyAliasPtr a; + + a = xkb->geom->key_aliases; + for (i = 0; i < xkb->geom->num_key_aliases; i++, a++) { + if (strncmp(name, a->alias, XkbKeyNameLength) == 0) + return XkbFindKeycodeByName(xkb, a->real, False); + } } if (xkb->names && xkb->names->key_aliases) { - XkbKeyAliasPtr a; - a= xkb->names->key_aliases; - for (i=0;i<xkb->names->num_key_aliases;i++,a++) { - if (strncmp(name,a->alias,XkbKeyNameLength)==0) - return XkbFindKeycodeByName(xkb,a->real,False); - } + XkbKeyAliasPtr a; + + a = xkb->names->key_aliases; + for (i = 0; i < xkb->names->num_key_aliases; i++, a++) { + if (strncmp(name, a->alias, XkbKeyNameLength) == 0) + return XkbFindKeycodeByName(xkb, a->real, False); + } } return 0; } - unsigned -XkbConvertGetByNameComponents(Bool toXkm,unsigned orig) +XkbConvertGetByNameComponents(Bool toXkm, unsigned orig) { -unsigned rtrn; + unsigned rtrn; - rtrn= 0; + rtrn = 0; if (toXkm) { - if (orig&XkbGBN_TypesMask) rtrn|= XkmTypesMask; - if (orig&XkbGBN_CompatMapMask) rtrn|= XkmCompatMapMask; - if (orig&XkbGBN_SymbolsMask) rtrn|= XkmSymbolsMask; - if (orig&XkbGBN_IndicatorMapMask) rtrn|= XkmIndicatorsMask; - if (orig&XkbGBN_KeyNamesMask) rtrn|= XkmKeyNamesMask; - if (orig&XkbGBN_GeometryMask) rtrn|= XkmGeometryMask; + if (orig & XkbGBN_TypesMask) + rtrn |= XkmTypesMask; + if (orig & XkbGBN_CompatMapMask) + rtrn |= XkmCompatMapMask; + if (orig & XkbGBN_SymbolsMask) + rtrn |= XkmSymbolsMask; + if (orig & XkbGBN_IndicatorMapMask) + rtrn |= XkmIndicatorsMask; + if (orig & XkbGBN_KeyNamesMask) + rtrn |= XkmKeyNamesMask; + if (orig & XkbGBN_GeometryMask) + rtrn |= XkmGeometryMask; } else { - if (orig&XkmTypesMask) rtrn|= XkbGBN_TypesMask; - if (orig&XkmCompatMapMask) rtrn|= XkbGBN_CompatMapMask; - if (orig&XkmSymbolsMask) rtrn|= XkbGBN_SymbolsMask; - if (orig&XkmIndicatorsMask) rtrn|= XkbGBN_IndicatorMapMask; - if (orig&XkmKeyNamesMask) rtrn|= XkbGBN_KeyNamesMask; - if (orig&XkmGeometryMask) rtrn|= XkbGBN_GeometryMask; - if (orig!=0) rtrn|= XkbGBN_OtherNamesMask; + if (orig & XkmTypesMask) + rtrn |= XkbGBN_TypesMask; + if (orig & XkmCompatMapMask) + rtrn |= XkbGBN_CompatMapMask; + if (orig & XkmSymbolsMask) + rtrn |= XkbGBN_SymbolsMask; + if (orig & XkmIndicatorsMask) + rtrn |= XkbGBN_IndicatorMapMask; + if (orig & XkmKeyNamesMask) + rtrn |= XkbGBN_KeyNamesMask; + if (orig & XkmGeometryMask) + rtrn |= XkbGBN_GeometryMask; + if (orig != 0) + rtrn |= XkbGBN_OtherNamesMask; } return rtrn; } unsigned -XkbConvertXkbComponents(Bool toXkm,unsigned orig) +XkbConvertXkbComponents(Bool toXkm, unsigned orig) { -unsigned rtrn; + unsigned rtrn; - rtrn= 0; + rtrn = 0; if (toXkm) { - if (orig&XkbClientMapMask) rtrn|= XkmTypesMask|XkmSymbolsMask; - if (orig&XkbServerMapMask) rtrn|= XkmTypesMask|XkmSymbolsMask; - if (orig&XkbCompatMapMask) rtrn|= XkmCompatMapMask; - if (orig&XkbIndicatorMapMask) rtrn|= XkmIndicatorsMask; - if (orig&XkbNamesMask) rtrn|= XkmKeyNamesMask; - if (orig&XkbGeometryMask) rtrn|= XkmGeometryMask; + if (orig & XkbClientMapMask) + rtrn |= XkmTypesMask | XkmSymbolsMask; + if (orig & XkbServerMapMask) + rtrn |= XkmTypesMask | XkmSymbolsMask; + if (orig & XkbCompatMapMask) + rtrn |= XkmCompatMapMask; + if (orig & XkbIndicatorMapMask) + rtrn |= XkmIndicatorsMask; + if (orig & XkbNamesMask) + rtrn |= XkmKeyNamesMask; + if (orig & XkbGeometryMask) + rtrn |= XkmGeometryMask; } else { - if (orig!=0) rtrn|= XkbNamesMask; - if (orig&XkmTypesMask) rtrn|= XkbClientMapMask; - if (orig&XkmCompatMapMask) - rtrn|= XkbCompatMapMask|XkbIndicatorMapMask; - if (orig&XkmSymbolsMask) rtrn|=XkbClientMapMask|XkbServerMapMask; - if (orig&XkmIndicatorsMask) rtrn|= XkbIndicatorMapMask; - if (orig&XkmKeyNamesMask) - rtrn|= XkbNamesMask|XkbIndicatorMapMask; - if (orig&XkmGeometryMask) rtrn|= XkbGeometryMask; + if (orig != 0) + rtrn |= XkbNamesMask; + if (orig & XkmTypesMask) + rtrn |= XkbClientMapMask; + if (orig & XkmCompatMapMask) + rtrn |= XkbCompatMapMask | XkbIndicatorMapMask; + if (orig & XkmSymbolsMask) + rtrn |= XkbClientMapMask | XkbServerMapMask; + if (orig & XkmIndicatorsMask) + rtrn |= XkbIndicatorMapMask; + if (orig & XkmKeyNamesMask) + rtrn |= XkbNamesMask | XkbIndicatorMapMask; + if (orig & XkmGeometryMask) + rtrn |= XkbGeometryMask; } return rtrn; } Bool -XkbDetermineFileType(XkbFileInfoPtr finfo,int format,int *opts_missing) +XkbDetermineFileType(XkbFileInfoPtr finfo, int format, int *opts_missing) { -unsigned present; -XkbDescPtr xkb; + unsigned present; + XkbDescPtr xkb; - if ((!finfo)||(!finfo->xkb)) - return False; + if ((!finfo) || (!finfo->xkb)) + return False; if (opts_missing) - *opts_missing= 0; - xkb= finfo->xkb; - present= 0; - if ((xkb->names)&&(xkb->names->keys)) present|= XkmKeyNamesMask; - if ((xkb->map)&&(xkb->map->types)) present|= XkmTypesMask; - if (xkb->compat) present|= XkmCompatMapMask; - if ((xkb->map)&&(xkb->map->num_syms>1)) present|= XkmSymbolsMask; - if (xkb->indicators) present|= XkmIndicatorsMask; - if (xkb->geom) present|= XkmGeometryMask; + *opts_missing = 0; + xkb = finfo->xkb; + present = 0; + if ((xkb->names) && (xkb->names->keys)) + present |= XkmKeyNamesMask; + if ((xkb->map) && (xkb->map->types)) + present |= XkmTypesMask; + if (xkb->compat) + present |= XkmCompatMapMask; + if ((xkb->map) && (xkb->map->num_syms > 1)) + present |= XkmSymbolsMask; + if (xkb->indicators) + present |= XkmIndicatorsMask; + if (xkb->geom) + present |= XkmGeometryMask; if (!present) - return False; - else switch (present) { - case XkmKeyNamesMask: - finfo->type= XkmKeyNamesIndex; - finfo->defined= present; - return True; - case XkmTypesMask: - finfo->type= XkmTypesIndex; - finfo->defined= present; - return True; - case XkmCompatMapMask: - finfo->type= XkmCompatMapIndex; - finfo->defined= present; - return True; - case XkmSymbolsMask: - if (format!=XkbXKMFile) { - finfo->type= XkmSymbolsIndex; - finfo->defined= present; - return True; - } - break; - case XkmGeometryMask: - finfo->type= XkmGeometryIndex; - finfo->defined= present; - return True; + return False; + else + switch (present) { + case XkmKeyNamesMask: + finfo->type = XkmKeyNamesIndex; + finfo->defined = present; + return True; + case XkmTypesMask: + finfo->type = XkmTypesIndex; + finfo->defined = present; + return True; + case XkmCompatMapMask: + finfo->type = XkmCompatMapIndex; + finfo->defined = present; + return True; + case XkmSymbolsMask: + if (format != XkbXKMFile) { + finfo->type = XkmSymbolsIndex; + finfo->defined = present; + return True; + } + break; + case XkmGeometryMask: + finfo->type = XkmGeometryIndex; + finfo->defined = present; + return True; + } + if ((present & (~XkmSemanticsLegal)) == 0) { + if ((XkmSemanticsRequired & present) == XkmSemanticsRequired) { + if (opts_missing) + *opts_missing = XkmSemanticsOptional & (~present); + finfo->type = XkmSemanticsFile; + finfo->defined = present; + return True; + } } - if ((present&(~XkmSemanticsLegal))==0) { - if ((XkmSemanticsRequired&present)==XkmSemanticsRequired) { - if (opts_missing) - *opts_missing= XkmSemanticsOptional&(~present); - finfo->type= XkmSemanticsFile; - finfo->defined= present; - return True; - } + else if ((present & (~XkmLayoutLegal)) == 0) { + if ((XkmLayoutRequired & present) == XkmLayoutRequired) { + if (opts_missing) + *opts_missing = XkmLayoutOptional & (~present); + finfo->type = XkmLayoutFile; + finfo->defined = present; + return True; + } } - else if ((present&(~XkmLayoutLegal))==0) { - if ((XkmLayoutRequired&present)==XkmLayoutRequired) { - if (opts_missing) - *opts_missing= XkmLayoutOptional&(~present); - finfo->type= XkmLayoutFile; - finfo->defined= present; - return True; - } - } - else if ((present&(~XkmKeymapLegal))==0) { - if ((XkmKeymapRequired&present)==XkmKeymapRequired) { - if (opts_missing) - *opts_missing= XkmKeymapOptional&(~present); - finfo->type= XkmKeymapFile; - finfo->defined= present; - return True; - } + else if ((present & (~XkmKeymapLegal)) == 0) { + if ((XkmKeymapRequired & present) == XkmKeymapRequired) { + if (opts_missing) + *opts_missing = XkmKeymapOptional & (~present); + finfo->type = XkmKeymapFile; + finfo->defined = present; + return True; + } } return False; } @@ -605,20 +647,20 @@ XkbDescPtr xkb; /* wildcards */ static unsigned char componentSpecLegal[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83, - 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83, + 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff }; void XkbEnsureSafeMapName(char *name) { - if (name==NULL) + if (name == NULL) return; - while (*name!='\0') { - if ((componentSpecLegal[(*name)/8]&(1<<((*name)%8)))==0) - *name= '_'; + while (*name != '\0') { + if ((componentSpecLegal[(*name) / 8] & (1 << ((*name) % 8))) == 0) + *name = '_'; name++; } return; @@ -629,39 +671,40 @@ XkbEnsureSafeMapName(char *name) #define UNMATCHABLE(c) (((c)=='(')||((c)==')')||((c)=='/')) Bool -XkbNameMatchesPattern(char *name,char *ptrn) +XkbNameMatchesPattern(char *name, char *ptrn) { - while (ptrn[0]!='\0') { - if (name[0]=='\0') { - if (ptrn[0]=='*') { - ptrn++; - continue; - } - return False; - } - if (ptrn[0]=='?') { - if (UNMATCHABLE(name[0])) - return False; - } - else if (ptrn[0]=='*') { - if ((!UNMATCHABLE(name[0]))&&XkbNameMatchesPattern(name+1,ptrn)) - return True; - return XkbNameMatchesPattern(name,ptrn+1); - } - else if (ptrn[0]!=name[0]) - return False; - name++; - ptrn++; + while (ptrn[0] != '\0') { + if (name[0] == '\0') { + if (ptrn[0] == '*') { + ptrn++; + continue; + } + return False; + } + if (ptrn[0] == '?') { + if (UNMATCHABLE(name[0])) + return False; + } + else if (ptrn[0] == '*') { + if ((!UNMATCHABLE(name[0])) && + XkbNameMatchesPattern(name + 1, ptrn)) + return True; + return XkbNameMatchesPattern(name, ptrn + 1); + } + else if (ptrn[0] != name[0]) + return False; + name++; + ptrn++; } /* if we get here, the pattern is exhausted (-:just like me:-) */ - return (name[0]=='\0'); + return (name[0] == '\0'); } #ifdef NEED_STRCASECMP _X_HIDDEN int -_XkbStrCaseCmp(char *str1,char *str2) +_XkbStrCaseCmp(char *str1, char *str2) { - const u_char *us1 = (const u_char *)str1, *us2 = (const u_char *)str2; + const u_char *us1 = (const u_char *) str1, *us2 = (const u_char *) str2; while (tolower(*us1) == tolower(*us2)) { if (*us1++ == '\0') diff --git a/src/xkbout.c b/src/xkbout.c index 91cd1ba..f9863e8 100644 --- a/src/xkbout.c +++ b/src/xkbout.c @@ -66,1004 +66,1065 @@ #define VMOD_COMMENT_VALUE 2 static Bool -WriteXKBVModDecl(FILE *file,Display *dpy,XkbDescPtr xkb,int showValue) +WriteXKBVModDecl(FILE *file, Display *dpy, XkbDescPtr xkb, int showValue) { -register int i,nMods; -Atom * vmodNames; - - if (xkb==NULL) - return False; - if (xkb->names!=NULL) - vmodNames= xkb->names->vmods; - else vmodNames= NULL; - - for (i=nMods=0;i<XkbNumVirtualMods;i++) { - if ((vmodNames!=NULL)&&(vmodNames[i]!=None)) { - if (nMods==0) fprintf(file," virtual_modifiers "); - else fprintf(file,","); - fprintf(file,"%s",XkbAtomText(dpy,vmodNames[i],XkbXKBFile)); - if ((showValue!=VMOD_HIDE_VALUE)&& - (xkb->server)&&(xkb->server->vmods[i]!=XkbNoModifierMask)) { - if (showValue==VMOD_COMMENT_VALUE) { - fprintf(file,"/* = %s */", - XkbModMaskText(xkb->server->vmods[i],XkbXKBFile)); - } - else { - fprintf(file,"= %s", - XkbModMaskText(xkb->server->vmods[i],XkbXKBFile)); - } - } - nMods++; - } + register int i, nMods; + Atom *vmodNames; + + if (xkb == NULL) + return False; + if (xkb->names != NULL) + vmodNames = xkb->names->vmods; + else + vmodNames = NULL; + + for (i = nMods = 0; i < XkbNumVirtualMods; i++) { + if ((vmodNames != NULL) && (vmodNames[i] != None)) { + if (nMods == 0) + fprintf(file, " virtual_modifiers "); + else + fprintf(file, ","); + fprintf(file, "%s", XkbAtomText(dpy, vmodNames[i], XkbXKBFile)); + if ((showValue != VMOD_HIDE_VALUE) && + (xkb->server) && (xkb->server->vmods[i] != XkbNoModifierMask)) { + if (showValue == VMOD_COMMENT_VALUE) { + fprintf(file, "/* = %s */", + XkbModMaskText(xkb->server->vmods[i], XkbXKBFile)); + } + else { + fprintf(file, "= %s", + XkbModMaskText(xkb->server->vmods[i], XkbXKBFile)); + } + } + nMods++; + } } - if (nMods>0) - fprintf(file,";\n\n"); + if (nMods > 0) + fprintf(file, ";\n\n"); return True; } /***====================================================================***/ static Bool -WriteXKBAction(FILE *file,XkbFileInfo *result,XkbAnyAction *action) +WriteXKBAction(FILE *file, XkbFileInfo *result, XkbAnyAction *action) { -XkbDescPtr xkb; -Display * dpy; + XkbDescPtr xkb; + Display *dpy; - xkb= result->xkb; - dpy= xkb->dpy; - fprintf(file,"%s",XkbActionText(dpy,xkb,(XkbAction *)action,XkbXKBFile)); + xkb = result->xkb; + dpy = xkb->dpy; + fprintf(file, "%s", + XkbActionText(dpy, xkb, (XkbAction *) action, XkbXKBFile)); return True; } /***====================================================================***/ Bool -XkbWriteXKBKeycodes( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBKeycodes(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Atom kcName; -register unsigned i; -XkbDescPtr xkb; -Display * dpy; -const char * alternate; - - xkb= result->xkb; - if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) { - _XkbLibError(_XkbErrMissingNames,"XkbWriteXKBKeycodes",0); - return False; + Atom kcName; + register unsigned i; + XkbDescPtr xkb; + Display *dpy; + const char *alternate; + + xkb = result->xkb; + if ((!xkb) || (!xkb->names) || (!xkb->names->keys)) { + _XkbLibError(_XkbErrMissingNames, "XkbWriteXKBKeycodes", 0); + return False; } - dpy= xkb->dpy; - kcName= xkb->names->keycodes; - if (kcName!=None) - fprintf(file,"xkb_keycodes \"%s\" {\n", - XkbAtomText(dpy,kcName,XkbXKBFile)); - else fprintf(file,"xkb_keycodes {\n"); - fprintf(file," minimum = %d;\n",xkb->min_key_code); - fprintf(file," maximum = %d;\n",xkb->max_key_code); - for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { - if (xkb->names->keys[i].name[0]!='\0') { - if (XkbFindKeycodeByName(xkb,xkb->names->keys[i].name,True)!=i) - alternate= "alternate "; - else alternate= ""; - fprintf(file," %s%6s = %d;\n",alternate, - XkbKeyNameText(xkb->names->keys[i].name,XkbXKBFile), - i); - } + dpy = xkb->dpy; + kcName = xkb->names->keycodes; + if (kcName != None) + fprintf(file, "xkb_keycodes \"%s\" {\n", + XkbAtomText(dpy, kcName, XkbXKBFile)); + else + fprintf(file, "xkb_keycodes {\n"); + fprintf(file, " minimum = %d;\n", xkb->min_key_code); + fprintf(file, " maximum = %d;\n", xkb->max_key_code); + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { + if (xkb->names->keys[i].name[0] != '\0') { + if (XkbFindKeycodeByName(xkb, xkb->names->keys[i].name, True) != i) + alternate = "alternate "; + else + alternate = ""; + fprintf(file, " %s%6s = %d;\n", alternate, + XkbKeyNameText(xkb->names->keys[i].name, XkbXKBFile), i); + } } - if (xkb->indicators!=NULL) { - for (i=0;i<XkbNumIndicators;i++) { - const char *type; - if (xkb->indicators->phys_indicators&(1<<i)) - type= " "; - else type= " virtual "; - if (xkb->names->indicators[i]!=None) { - fprintf(file,"%sindicator %d = \"%s\";\n",type,i+1, - XkbAtomText(dpy,xkb->names->indicators[i],XkbXKBFile)); - } - } + if (xkb->indicators != NULL) { + for (i = 0; i < XkbNumIndicators; i++) { + const char *type; + + if (xkb->indicators->phys_indicators & (1 << i)) + type = " "; + else + type = " virtual "; + if (xkb->names->indicators[i] != None) { + fprintf(file, "%sindicator %d = \"%s\";\n", type, i + 1, + XkbAtomText(dpy, xkb->names->indicators[i], + XkbXKBFile)); + } + } } - if (xkb->names->key_aliases!=NULL) { - XkbKeyAliasPtr pAl; - pAl= xkb->names->key_aliases; - for (i=0;i<xkb->names->num_key_aliases;i++,pAl++) { - fprintf(file," alias %6s = %6s;\n", - XkbKeyNameText(pAl->alias,XkbXKBFile), - XkbKeyNameText(pAl->real,XkbXKBFile)); - } + if (xkb->names->key_aliases != NULL) { + XkbKeyAliasPtr pAl; + + pAl = xkb->names->key_aliases; + for (i = 0; i < xkb->names->num_key_aliases; i++, pAl++) { + fprintf(file, " alias %6s = %6s;\n", + XkbKeyNameText(pAl->alias, XkbXKBFile), + XkbKeyNameText(pAl->real, XkbXKBFile)); + } } if (addOn) - (*addOn)(file,result,topLevel,showImplicit,XkmKeyNamesIndex,priv); - fprintf(file,"};\n\n"); + (*addOn) (file, result, topLevel, showImplicit, XkmKeyNamesIndex, priv); + fprintf(file, "};\n\n"); return True; } Bool -XkbWriteXKBKeyTypes( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBKeyTypes(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Display * dpy; -register unsigned i,n; -XkbKeyTypePtr type; -XkbKTMapEntryPtr entry; -XkbDescPtr xkb; - - xkb= result->xkb; - if ((!xkb)||(!xkb->map)||(!xkb->map->types)) { - _XkbLibError(_XkbErrMissingTypes,"XkbWriteXKBKeyTypes",0); - return False; + Display *dpy; + register unsigned i, n; + XkbKeyTypePtr type; + XkbKTMapEntryPtr entry; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((!xkb) || (!xkb->map) || (!xkb->map->types)) { + _XkbLibError(_XkbErrMissingTypes, "XkbWriteXKBKeyTypes", 0); + return False; } - dpy= xkb->dpy; - if (xkb->map->num_types<XkbNumRequiredTypes) { - _XkbLibError(_XkbErrMissingReqTypes,"XkbWriteXKBKeyTypes",0); - return 0; + dpy = xkb->dpy; + if (xkb->map->num_types < XkbNumRequiredTypes) { + _XkbLibError(_XkbErrMissingReqTypes, "XkbWriteXKBKeyTypes", 0); + return 0; } - if ((xkb->names==NULL)||(xkb->names->types==None)) - fprintf(file,"xkb_types {\n\n"); - else fprintf(file,"xkb_types \"%s\" {\n\n", - XkbAtomText(dpy,xkb->names->types,XkbXKBFile)); - WriteXKBVModDecl(file,dpy,xkb, - (showImplicit?VMOD_COMMENT_VALUE:VMOD_HIDE_VALUE)); - - type= xkb->map->types; - for (i=0;i<xkb->map->num_types;i++,type++) { - fprintf(file," type \"%s\" {\n", - XkbAtomText(dpy,type->name,XkbXKBFile)); - fprintf(file," modifiers= %s;\n", - XkbVModMaskText(dpy,xkb,type->mods.real_mods,type->mods.vmods, - XkbXKBFile)); - entry= type->map; - for (n=0;n<type->map_count;n++,entry++) { - char *str; - str=XkbVModMaskText(dpy,xkb,entry->mods.real_mods,entry->mods.vmods, - XkbXKBFile); - fprintf(file," map[%s]= Level%d;\n",str,entry->level+1); - if ((type->preserve)&&((type->preserve[n].real_mods)|| - (type->preserve[n].vmods))) { - fprintf(file," preserve[%s]= ",str); - fprintf(file,"%s;\n",XkbVModMaskText(dpy,xkb, - type->preserve[n].real_mods, - type->preserve[n].vmods, - XkbXKBFile)); - } - } - if (type->level_names!=NULL) { - Atom *name= type->level_names; - for (n=0;n<type->num_levels;n++,name++) { - if ((*name)==None) - continue; - fprintf(file," level_name[Level%d]= \"%s\";\n",n+1, - XkbAtomText(dpy,*name,XkbXKBFile)); - } - } - fprintf(file," };\n"); + if ((xkb->names == NULL) || (xkb->names->types == None)) + fprintf(file, "xkb_types {\n\n"); + else + fprintf(file, "xkb_types \"%s\" {\n\n", + XkbAtomText(dpy, xkb->names->types, XkbXKBFile)); + WriteXKBVModDecl(file, dpy, xkb, + (showImplicit ? VMOD_COMMENT_VALUE : VMOD_HIDE_VALUE)); + + type = xkb->map->types; + for (i = 0; i < xkb->map->num_types; i++, type++) { + fprintf(file, " type \"%s\" {\n", + XkbAtomText(dpy, type->name, XkbXKBFile)); + fprintf(file, " modifiers= %s;\n", + XkbVModMaskText(dpy, xkb, type->mods.real_mods, + type->mods.vmods, XkbXKBFile)); + entry = type->map; + for (n = 0; n < type->map_count; n++, entry++) { + char *str; + + str = + XkbVModMaskText(dpy, xkb, entry->mods.real_mods, + entry->mods.vmods, XkbXKBFile); + fprintf(file, " map[%s]= Level%d;\n", str, entry->level + 1); + if ((type->preserve) && ((type->preserve[n].real_mods) || + (type->preserve[n].vmods))) { + fprintf(file, " preserve[%s]= ", str); + fprintf(file, "%s;\n", XkbVModMaskText(dpy, xkb, + type->preserve[n]. + real_mods, + type->preserve[n].vmods, + XkbXKBFile)); + } + } + if (type->level_names != NULL) { + Atom *name = type->level_names; + + for (n = 0; n < type->num_levels; n++, name++) { + if ((*name) == None) + continue; + fprintf(file, " level_name[Level%d]= \"%s\";\n", n + 1, + XkbAtomText(dpy, *name, XkbXKBFile)); + } + } + fprintf(file, " };\n"); } if (addOn) - (*addOn)(file,result,topLevel,showImplicit,XkmTypesIndex,priv); - fprintf(file,"};\n\n"); + (*addOn) (file, result, topLevel, showImplicit, XkmTypesIndex, priv); + fprintf(file, "};\n\n"); return True; } static Bool -WriteXKBIndicatorMap( FILE * file, - XkbFileInfo * result, - Atom name, - XkbIndicatorMapPtr led, - XkbFileAddOnFunc addOn, - void * priv) +WriteXKBIndicatorMap(FILE * file, + XkbFileInfo * result, + Atom name, + XkbIndicatorMapPtr led, + XkbFileAddOnFunc addOn, + void * priv) { -XkbDescPtr xkb; -char *tmp; + XkbDescPtr xkb; + char *tmp; - xkb= result->xkb; + xkb = result->xkb; tmp = XkbAtomGetString(xkb->dpy, name); - fprintf(file," indicator \"%s\" {\n",tmp); + fprintf(file, " indicator \"%s\" {\n", tmp); _XkbFree(tmp); - if (led->flags&XkbIM_NoExplicit) - fprintf(file," !allowExplicit;\n"); - if (led->flags&XkbIM_LEDDrivesKB) - fprintf(file," indicatorDrivesKeyboard;\n"); - if (led->which_groups!=0) { - if (led->which_groups!=XkbIM_UseEffective) { - fprintf(file," whichGroupState= %s;\n", - XkbIMWhichStateMaskText(led->which_groups,XkbXKBFile)); - } - fprintf(file," groups= 0x%02x;\n",led->groups); + if (led->flags & XkbIM_NoExplicit) + fprintf(file, " !allowExplicit;\n"); + if (led->flags & XkbIM_LEDDrivesKB) + fprintf(file, " indicatorDrivesKeyboard;\n"); + if (led->which_groups != 0) { + if (led->which_groups != XkbIM_UseEffective) { + fprintf(file, " whichGroupState= %s;\n", + XkbIMWhichStateMaskText(led->which_groups, XkbXKBFile)); + } + fprintf(file, " groups= 0x%02x;\n", led->groups); } - if (led->which_mods!=0) { - if (led->which_mods!=XkbIM_UseEffective) { - fprintf(file," whichModState= %s;\n", - XkbIMWhichStateMaskText(led->which_mods,XkbXKBFile)); - } - fprintf(file," modifiers= %s;\n", - XkbVModMaskText(xkb->dpy,xkb, - led->mods.real_mods,led->mods.vmods, - XkbXKBFile)); + if (led->which_mods != 0) { + if (led->which_mods != XkbIM_UseEffective) { + fprintf(file, " whichModState= %s;\n", + XkbIMWhichStateMaskText(led->which_mods, XkbXKBFile)); + } + fprintf(file, " modifiers= %s;\n", + XkbVModMaskText(xkb->dpy, xkb, + led->mods.real_mods, led->mods.vmods, + XkbXKBFile)); } - if (led->ctrls!=0) { - fprintf(file," controls= %s;\n", - XkbControlsMaskText(led->ctrls,XkbXKBFile)); + if (led->ctrls != 0) { + fprintf(file, " controls= %s;\n", + XkbControlsMaskText(led->ctrls, XkbXKBFile)); } if (addOn) - (*addOn)(file,result,False,True,XkmIndicatorsIndex,priv); - fprintf(file," };\n"); + (*addOn) (file, result, False, True, XkmIndicatorsIndex, priv); + fprintf(file, " };\n"); return True; } Bool -XkbWriteXKBCompatMap( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBCompatMap(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Display * dpy; -register unsigned i; -XkbSymInterpretPtr interp; -XkbDescPtr xkb; - - xkb= result->xkb; - if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) { - _XkbLibError(_XkbErrMissingCompatMap,"XkbWriteXKBCompatMap",0); - return False; + Display * dpy; + register unsigned i; + XkbSymInterpretPtr interp; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((!xkb) || (!xkb->compat) || (!xkb->compat->sym_interpret)) { + _XkbLibError(_XkbErrMissingCompatMap, "XkbWriteXKBCompatMap", 0); + return False; } - dpy= xkb->dpy; - if ((xkb->names==NULL)||(xkb->names->compat==None)) - fprintf(file,"xkb_compatibility {\n\n"); - else fprintf(file,"xkb_compatibility \"%s\" {\n\n", - XkbAtomText(dpy,xkb->names->compat,XkbXKBFile)); - WriteXKBVModDecl(file,dpy,xkb, - (showImplicit?VMOD_COMMENT_VALUE:VMOD_HIDE_VALUE)); - - fprintf(file," interpret.useModMapMods= AnyLevel;\n"); - fprintf(file," interpret.repeat= False;\n"); - fprintf(file," interpret.locking= False;\n"); - interp= xkb->compat->sym_interpret; - for (i=0;i<xkb->compat->num_si;i++,interp++) { - fprintf(file," interpret %s+%s(%s) {\n", - ((interp->sym==NoSymbol)?"Any": - XkbKeysymText(interp->sym,XkbXKBFile)), - XkbSIMatchText(interp->match,XkbXKBFile), - XkbModMaskText(interp->mods,XkbXKBFile)); - if (interp->virtual_mod!=XkbNoModifier) { - fprintf(file," virtualModifier= %s;\n", - XkbVModIndexText(dpy,xkb,interp->virtual_mod,XkbXKBFile)); - } - if (interp->match&XkbSI_LevelOneOnly) - fprintf(file," useModMapMods=level1;\n"); - if (interp->flags&XkbSI_LockingKey) - fprintf(file," locking= True;\n"); - if (interp->flags&XkbSI_AutoRepeat) - fprintf(file," repeat= True;\n"); - fprintf(file," action= "); - WriteXKBAction(file,result,&interp->act); - fprintf(file,";\n"); - fprintf(file," };\n"); + dpy = xkb->dpy; + if ((xkb->names == NULL) || (xkb->names->compat == None)) + fprintf(file, "xkb_compatibility {\n\n"); + else + fprintf(file, "xkb_compatibility \"%s\" {\n\n", + XkbAtomText(dpy, xkb->names->compat, XkbXKBFile)); + WriteXKBVModDecl(file, dpy, xkb, + (showImplicit ? VMOD_COMMENT_VALUE : VMOD_HIDE_VALUE)); + + fprintf(file, " interpret.useModMapMods= AnyLevel;\n"); + fprintf(file, " interpret.repeat= False;\n"); + fprintf(file, " interpret.locking= False;\n"); + interp = xkb->compat->sym_interpret; + for (i = 0; i < xkb->compat->num_si; i++, interp++) { + fprintf(file, " interpret %s+%s(%s) {\n", + ((interp->sym == NoSymbol) ? "Any" : + XkbKeysymText(interp->sym, XkbXKBFile)), + XkbSIMatchText(interp->match, XkbXKBFile), + XkbModMaskText(interp->mods, XkbXKBFile)); + if (interp->virtual_mod != XkbNoModifier) { + fprintf(file, " virtualModifier= %s;\n", + XkbVModIndexText(dpy, xkb, interp->virtual_mod, + XkbXKBFile)); + } + if (interp->match & XkbSI_LevelOneOnly) + fprintf(file, " useModMapMods=level1;\n"); + if (interp->flags & XkbSI_LockingKey) + fprintf(file, " locking= True;\n"); + if (interp->flags & XkbSI_AutoRepeat) + fprintf(file, " repeat= True;\n"); + fprintf(file, " action= "); + WriteXKBAction(file, result, &interp->act); + fprintf(file, ";\n"); + fprintf(file, " };\n"); } - for (i=0;i<XkbNumKbdGroups;i++) { - XkbModsPtr gc; - - gc= &xkb->compat->groups[i]; - if ((gc->real_mods==0)&&(gc->vmods==0)) - continue; - fprintf(file," group %d = %s;\n",i+1,XkbVModMaskText(xkb->dpy,xkb, - gc->real_mods,gc->vmods, - XkbXKBFile)); + for (i = 0; i < XkbNumKbdGroups; i++) { + XkbModsPtr gc; + + gc = &xkb->compat->groups[i]; + if ((gc->real_mods == 0) && (gc->vmods == 0)) + continue; + fprintf(file, " group %d = %s;\n", i + 1, + XkbVModMaskText(xkb->dpy, xkb, gc->real_mods, gc->vmods, + XkbXKBFile)); } if (xkb->indicators) { - for (i=0;i<XkbNumIndicators;i++) { - XkbIndicatorMapPtr map= &xkb->indicators->maps[i]; - if ((map->flags!=0)||(map->which_groups!=0)||(map->groups!=0)|| - (map->which_mods!=0)|| - (map->mods.real_mods!=0)||(map->mods.vmods!=0)|| - (map->ctrls!=0)) { - WriteXKBIndicatorMap(file,result,xkb->names->indicators[i],map, - addOn,priv); - } - } + for (i = 0; i < XkbNumIndicators; i++) { + XkbIndicatorMapPtr map = &xkb->indicators->maps[i]; + + if ((map->flags != 0) || (map->which_groups != 0) || + (map->groups != 0) || (map->which_mods != 0) || + (map->mods.real_mods != 0) || (map->mods.vmods != 0) || + (map->ctrls != 0)) { + WriteXKBIndicatorMap(file, result, xkb->names->indicators[i], + map, addOn, priv); + } + } } if (addOn) - (*addOn)(file,result,topLevel,showImplicit,XkmCompatMapIndex,priv); - fprintf(file,"};\n\n"); + (*addOn) (file, result, topLevel, showImplicit, XkmCompatMapIndex, + priv); + fprintf(file, "};\n\n"); return True; } Bool -XkbWriteXKBSymbols( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBSymbols(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Display * dpy; -register unsigned i,tmp; -XkbDescPtr xkb; -XkbClientMapPtr map; -XkbServerMapPtr srv; -Bool showActions; - - xkb= result->xkb; - - if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) { - _XkbLibError(_XkbErrMissingSymbols,"XkbWriteXKBSymbols",0); - return False; + Display *dpy; + register unsigned i, tmp; + XkbDescPtr xkb; + XkbClientMapPtr map; + XkbServerMapPtr srv; + Bool showActions; + + xkb = result->xkb; + + if ((!xkb) || (!xkb->map) || (!xkb->map->syms) || (!xkb->map->key_sym_map)) { + _XkbLibError(_XkbErrMissingSymbols, "XkbWriteXKBSymbols", 0); + return False; } - if ((!xkb->names)||(!xkb->names->keys)) { - _XkbLibError(_XkbErrMissingNames,"XkbWriteXKBSymbols",0); - return False; + if ((!xkb->names) || (!xkb->names->keys)) { + _XkbLibError(_XkbErrMissingNames, "XkbWriteXKBSymbols", 0); + return False; } - map= xkb->map; - srv= xkb->server; - dpy= xkb->dpy; - - if ((xkb->names==NULL)||(xkb->names->symbols==None)) - fprintf(file,"xkb_symbols {\n\n"); - else fprintf(file,"xkb_symbols \"%s\" {\n\n", - XkbAtomText(dpy,xkb->names->symbols,XkbXKBFile)); - for (tmp=i=0;i<XkbNumKbdGroups;i++) { - if (xkb->names->groups[i]!=None) { - fprintf(file," name[group%d]=\"%s\";\n",i+1, - XkbAtomText(dpy,xkb->names->groups[i],XkbXKBFile)); - tmp++; - } + map = xkb->map; + srv = xkb->server; + dpy = xkb->dpy; + + if ((xkb->names == NULL) || (xkb->names->symbols == None)) + fprintf(file, "xkb_symbols {\n\n"); + else + fprintf(file, "xkb_symbols \"%s\" {\n\n", + XkbAtomText(dpy, xkb->names->symbols, XkbXKBFile)); + for (tmp = i = 0; i < XkbNumKbdGroups; i++) { + if (xkb->names->groups[i] != None) { + fprintf(file, " name[group%d]=\"%s\";\n", i + 1, + XkbAtomText(dpy, xkb->names->groups[i], XkbXKBFile)); + tmp++; + } } - if (tmp>0) - fprintf(file,"\n"); - for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { - Bool simple; - if ((int)XkbKeyNumSyms(xkb,i)<1) - continue; - if (XkbFindKeycodeByName(xkb,xkb->names->keys[i].name,True)!=i) - continue; - simple= True; - fprintf(file," key %6s {", - XkbKeyNameText(xkb->names->keys[i].name,XkbXKBFile)); - if (srv->explicit) { - if (((srv->explicit[i]&XkbExplicitKeyTypesMask)!=0)|| - (showImplicit)) { - int typeNdx,g; - Bool multi; - const char * comment=" "; - - if ((srv->explicit[i]&XkbExplicitKeyTypesMask)==0) - comment= "//"; - multi= False; - typeNdx= XkbKeyKeyTypeIndex(xkb,i,0); - for (g=1;(g<XkbKeyNumGroups(xkb,i))&&(!multi);g++) { - if (XkbKeyKeyTypeIndex(xkb,i,g)!=typeNdx) - multi= True; - } - if (multi) { - for (g=0;g<XkbKeyNumGroups(xkb,i);g++) { - typeNdx= XkbKeyKeyTypeIndex(xkb,i,g); - if (srv->explicit[i]&(1<<g)) { - fprintf(file,"\n%s type[group%d]= \"%s\",", - comment,g+1, - XkbAtomText(dpy,map->types[typeNdx].name, - XkbXKBFile)); - } - else if (showImplicit) { - fprintf(file,"\n// type[group%d]= \"%s\",",g+1, - XkbAtomText(dpy,map->types[typeNdx].name, - XkbXKBFile)); - } - } - } - else { - fprintf(file,"\n%s type= \"%s\",",comment, - XkbAtomText(dpy,map->types[typeNdx].name, - XkbXKBFile)); - } - simple= False; - } - if (((srv->explicit[i]&XkbExplicitAutoRepeatMask)!=0)&& - (xkb->ctrls!=NULL)) { - if (xkb->ctrls->per_key_repeat[i/8]&(1<<(i%8))) - fprintf(file,"\n repeat= Yes,"); - else fprintf(file,"\n repeat= No,"); - simple= False; - } - if ((xkb->server!=NULL)&&(xkb->server->vmodmap!=NULL)&& - (xkb->server->vmodmap[i]!=0)) { - if ((srv->explicit[i]&XkbExplicitVModMapMask)!=0) { - fprintf(file,"\n virtualMods= %s,", - XkbVModMaskText(dpy,xkb,0, - xkb->server->vmodmap[i], - XkbXKBFile)); - } - else if (showImplicit) { - fprintf(file,"\n// virtualMods= %s,", - XkbVModMaskText(dpy,xkb,0, - xkb->server->vmodmap[i], - XkbXKBFile)); - } - } - } - switch (XkbOutOfRangeGroupAction(XkbKeyGroupInfo(xkb,i))) { - case XkbClampIntoRange: - fprintf(file,"\n groupsClamp,"); - break; - case XkbRedirectIntoRange: - fprintf(file,"\n groupsRedirect= Group%d,", - XkbOutOfRangeGroupNumber(XkbKeyGroupInfo(xkb,i))+1); - break; - } - if (srv->behaviors!=NULL) { - unsigned type; - type= srv->behaviors[i].type&XkbKB_OpMask; - - if (type!=XkbKB_Default) { - simple= False; - fprintf(file,"\n %s,", - XkbBehaviorText(xkb,&srv->behaviors[i],XkbXKBFile)); - } - } - if ((srv->explicit==NULL) || showImplicit || - ((srv->explicit[i]&XkbExplicitInterpretMask)!=0)) - showActions= XkbKeyHasActions(xkb,i); - else showActions= False; - - if (((unsigned)XkbKeyNumGroups(xkb,i)>1)||showActions) - simple= False; - if (simple) { - KeySym *syms; - unsigned s; - - syms= XkbKeySymsPtr(xkb,i); - fprintf(file," [ "); - for (s=0;s<XkbKeyGroupWidth(xkb,i,XkbGroup1Index);s++) { - if (s!=0) - fprintf(file,", "); - fprintf(file,"%15s",XkbKeysymText(*syms++,XkbXKBFile)); - } - fprintf(file," ] };\n"); - } - else { - unsigned g,s; - KeySym *syms; - XkbAction *acts; - syms= XkbKeySymsPtr(xkb,i); - acts= XkbKeyActionsPtr(xkb,i); - for (g=0;g<XkbKeyNumGroups(xkb,i);g++) { - if (g!=0) - fprintf(file,","); - fprintf(file,"\n symbols[Group%d]= [ ",g+1); - for (s=0;s<XkbKeyGroupWidth(xkb,i,g);s++) { - if (s!=0) - fprintf(file,", "); - fprintf(file,"%15s",XkbKeysymText(syms[s],XkbXKBFile)); - } - fprintf(file," ]"); - syms+= XkbKeyGroupsWidth(xkb,i); - if (showActions) { - fprintf(file,",\n actions[Group%d]= [ ",g+1); - for (s=0;s<XkbKeyGroupWidth(xkb,i,g);s++) { - if (s!=0) - fprintf(file,", "); - WriteXKBAction(file,result,(XkbAnyAction *)&acts[s]); - } - fprintf(file," ]"); - acts+= XkbKeyGroupsWidth(xkb,i); - } - } - fprintf(file,"\n };\n"); - } + if (tmp > 0) + fprintf(file, "\n"); + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { + Bool simple; + + if ((int) XkbKeyNumSyms(xkb, i) < 1) + continue; + if (XkbFindKeycodeByName(xkb, xkb->names->keys[i].name, True) != i) + continue; + simple = True; + fprintf(file, " key %6s {", + XkbKeyNameText(xkb->names->keys[i].name, XkbXKBFile)); + if (srv->explicit) { + if (((srv->explicit[i] & XkbExplicitKeyTypesMask) != 0) || + (showImplicit)) { + int typeNdx, g; + Bool multi; + const char *comment = " "; + + if ((srv->explicit[i] & XkbExplicitKeyTypesMask) == 0) + comment = "//"; + multi = False; + typeNdx = XkbKeyKeyTypeIndex(xkb, i, 0); + for (g = 1; (g < XkbKeyNumGroups(xkb, i)) && (!multi); g++) { + if (XkbKeyKeyTypeIndex(xkb, i, g) != typeNdx) + multi = True; + } + if (multi) { + for (g = 0; g < XkbKeyNumGroups(xkb, i); g++) { + typeNdx = XkbKeyKeyTypeIndex(xkb, i, g); + if (srv->explicit[i] & (1 << g)) { + fprintf(file, "\n%s type[group%d]= \"%s\",", + comment, g + 1, + XkbAtomText(dpy, map->types[typeNdx].name, + XkbXKBFile)); + } + else if (showImplicit) { + fprintf(file, "\n// type[group%d]= \"%s\",", + g + 1, + XkbAtomText(dpy, map->types[typeNdx].name, + XkbXKBFile)); + } + } + } + else { + fprintf(file, "\n%s type= \"%s\",", comment, + XkbAtomText(dpy, map->types[typeNdx].name, + XkbXKBFile)); + } + simple = False; + } + if (((srv->explicit[i] & XkbExplicitAutoRepeatMask) != 0) && + (xkb->ctrls != NULL)) { + if (xkb->ctrls->per_key_repeat[i / 8] & (1 << (i % 8))) + fprintf(file, "\n repeat= Yes,"); + else + fprintf(file, "\n repeat= No,"); + simple = False; + } + if ((xkb->server != NULL) && (xkb->server->vmodmap != NULL) && + (xkb->server->vmodmap[i] != 0)) { + if ((srv->explicit[i] & XkbExplicitVModMapMask) != 0) { + fprintf(file, "\n virtualMods= %s,", + XkbVModMaskText(dpy, xkb, 0, + xkb->server->vmodmap[i], + XkbXKBFile)); + } + else if (showImplicit) { + fprintf(file, "\n// virtualMods= %s,", + XkbVModMaskText(dpy, xkb, 0, + xkb->server->vmodmap[i], + XkbXKBFile)); + } + } + } + switch (XkbOutOfRangeGroupAction(XkbKeyGroupInfo(xkb, i))) { + case XkbClampIntoRange: + fprintf(file, "\n groupsClamp,"); + break; + case XkbRedirectIntoRange: + fprintf(file, "\n groupsRedirect= Group%d,", + XkbOutOfRangeGroupNumber(XkbKeyGroupInfo(xkb, i)) + 1); + break; + } + if (srv->behaviors != NULL) { + unsigned type; + + type = srv->behaviors[i].type & XkbKB_OpMask; + + if (type != XkbKB_Default) { + simple = False; + fprintf(file, "\n %s,", + XkbBehaviorText(xkb, &srv->behaviors[i], XkbXKBFile)); + } + } + if ((srv->explicit == NULL) || showImplicit || + ((srv->explicit[i] & XkbExplicitInterpretMask) != 0)) + showActions = XkbKeyHasActions(xkb, i); + else + showActions = False; + + if (((unsigned) XkbKeyNumGroups(xkb, i) > 1) || showActions) + simple = False; + if (simple) { + KeySym *syms; + unsigned s; + + syms = XkbKeySymsPtr(xkb, i); + fprintf(file, " [ "); + for (s = 0; s < XkbKeyGroupWidth(xkb, i, XkbGroup1Index); s++) { + if (s != 0) + fprintf(file, ", "); + fprintf(file, "%15s", XkbKeysymText(*syms++, XkbXKBFile)); + } + fprintf(file, " ] };\n"); + } + else { + unsigned g, s; + KeySym *syms; + XkbAction *acts; + + syms = XkbKeySymsPtr(xkb, i); + acts = XkbKeyActionsPtr(xkb, i); + for (g = 0; g < XkbKeyNumGroups(xkb, i); g++) { + if (g != 0) + fprintf(file, ","); + fprintf(file, "\n symbols[Group%d]= [ ", g + 1); + for (s = 0; s < XkbKeyGroupWidth(xkb, i, g); s++) { + if (s != 0) + fprintf(file, ", "); + fprintf(file, "%15s", XkbKeysymText(syms[s], XkbXKBFile)); + } + fprintf(file, " ]"); + syms += XkbKeyGroupsWidth(xkb, i); + if (showActions) { + fprintf(file, ",\n actions[Group%d]= [ ", g + 1); + for (s = 0; s < XkbKeyGroupWidth(xkb, i, g); s++) { + if (s != 0) + fprintf(file, ", "); + WriteXKBAction(file, result, + (XkbAnyAction *) & acts[s]); + } + fprintf(file, " ]"); + acts += XkbKeyGroupsWidth(xkb, i); + } + } + fprintf(file, "\n };\n"); + } } if (map && map->modmap) { - for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { - if (map->modmap[i]!=0) { - register int n,bit; - for (bit=1,n=0;n<XkbNumModifiers;n++,bit<<=1) { - if (map->modmap[i]&bit) { - char buf[5]; - memcpy(buf,xkb->names->keys[i].name,4); - buf[4]= '\0'; - fprintf(file," modifier_map %s { <%s> };\n", - XkbModIndexText(n,XkbXKBFile),buf); - } - } - } - } + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { + if (map->modmap[i] != 0) { + register int n, bit; + + for (bit = 1, n = 0; n < XkbNumModifiers; n++, bit <<= 1) { + if (map->modmap[i] & bit) { + char buf[5]; + + memcpy(buf, xkb->names->keys[i].name, 4); + buf[4] = '\0'; + fprintf(file, " modifier_map %s { <%s> };\n", + XkbModIndexText(n, XkbXKBFile), buf); + } + } + } + } } if (addOn) - (*addOn)(file,result,topLevel,showImplicit,XkmSymbolsIndex,priv); - fprintf(file,"};\n\n"); + (*addOn) (file, result, topLevel, showImplicit, XkmSymbolsIndex, priv); + fprintf(file, "};\n\n"); return True; } static Bool -WriteXKBOutline( FILE * file, - XkbShapePtr shape, - XkbOutlinePtr outline, - int lastRadius, - int first, - int indent) +WriteXKBOutline(FILE * file, + XkbShapePtr shape, + XkbOutlinePtr outline, + int lastRadius, + int first, + int indent) { -register int i; -XkbPointPtr pt; -char * iStr; - - fprintf(file,"%s",iStr= XkbIndentText(first)); - if (first!=indent) - iStr= XkbIndentText(indent); - if (outline->corner_radius!=lastRadius) { - fprintf(file,"corner= %s,", - XkbGeomFPText(outline->corner_radius,XkbMessage)); - if (shape!=NULL) { - fprintf(file,"\n%s",iStr); - } + register int i; + XkbPointPtr pt; + char *iStr; + + fprintf(file, "%s", iStr = XkbIndentText(first)); + if (first != indent) + iStr = XkbIndentText(indent); + if (outline->corner_radius != lastRadius) { + fprintf(file, "corner= %s,", + XkbGeomFPText(outline->corner_radius, XkbMessage)); + if (shape != NULL) { + fprintf(file, "\n%s", iStr); + } } if (shape) { - if (outline==shape->approx) - fprintf(file,"approx= "); - else if (outline==shape->primary) - fprintf(file,"primary= "); + if (outline == shape->approx) + fprintf(file, "approx= "); + else if (outline == shape->primary) + fprintf(file, "primary= "); } - fprintf(file,"{"); - for (pt=outline->points,i=0;i<outline->num_points;i++,pt++) { - if (i==0) fprintf(file," "); - else if ((i%4)==0) fprintf(file,",\n%s ",iStr); - else fprintf(file,", "); - fprintf(file,"[ %3s, %3s ]",XkbGeomFPText(pt->x,XkbXKBFile), - XkbGeomFPText(pt->y,XkbXKBFile)); + fprintf(file, "{"); + for (pt = outline->points, i = 0; i < outline->num_points; i++, pt++) { + if (i == 0) + fprintf(file, " "); + else if ((i % 4) == 0) + fprintf(file, ",\n%s ", iStr); + else + fprintf(file, ", "); + fprintf(file, "[ %3s, %3s ]", XkbGeomFPText(pt->x, XkbXKBFile), + XkbGeomFPText(pt->y, XkbXKBFile)); } - fprintf(file," }"); + fprintf(file, " }"); return True; } static Bool -WriteXKBDoodad( FILE * file, - Display * dpy, - unsigned indent, - XkbGeometryPtr geom, - XkbDoodadPtr doodad) +WriteXKBDoodad(FILE * file, + Display * dpy, + unsigned indent, + XkbGeometryPtr geom, + XkbDoodadPtr doodad) { -register char * i_str; -XkbShapePtr shape; -XkbColorPtr color; - - i_str= XkbIndentText(indent); - fprintf(file,"%s%s \"%s\" {\n",i_str, - XkbDoodadTypeText(doodad->any.type,XkbMessage), - XkbAtomText(dpy,doodad->any.name,XkbMessage)); - fprintf(file,"%s top= %s;\n",i_str, - XkbGeomFPText(doodad->any.top,XkbXKBFile)); - fprintf(file,"%s left= %s;\n",i_str, - XkbGeomFPText(doodad->any.left,XkbXKBFile)); - fprintf(file,"%s priority= %d;\n",i_str,doodad->any.priority); + register char *i_str; + XkbShapePtr shape; + XkbColorPtr color; + + i_str = XkbIndentText(indent); + fprintf(file, "%s%s \"%s\" {\n", i_str, + XkbDoodadTypeText(doodad->any.type, XkbMessage), + XkbAtomText(dpy, doodad->any.name, XkbMessage)); + fprintf(file, "%s top= %s;\n", i_str, + XkbGeomFPText(doodad->any.top, XkbXKBFile)); + fprintf(file, "%s left= %s;\n", i_str, + XkbGeomFPText(doodad->any.left, XkbXKBFile)); + fprintf(file, "%s priority= %d;\n", i_str, doodad->any.priority); switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - if (doodad->shape.angle!=0) { - fprintf(file,"%s angle= %s;\n",i_str, - XkbGeomFPText(doodad->shape.angle,XkbXKBFile)); - } - if (doodad->shape.color_ndx!=0) { - fprintf(file,"%s color= \"%s\";\n",i_str, - XkbShapeDoodadColor(geom,&doodad->shape)->spec); - } - shape= XkbShapeDoodadShape(geom,&doodad->shape); - fprintf(file,"%s shape= \"%s\";\n",i_str, - XkbAtomText(dpy,shape->name,XkbXKBFile)); - break; - case XkbTextDoodad: - if (doodad->text.angle!=0) { - fprintf(file,"%s angle= %s;\n",i_str, - XkbGeomFPText(doodad->text.angle,XkbXKBFile)); - } - if (doodad->text.width!=0) { - fprintf(file,"%s width= %s;\n",i_str, - XkbGeomFPText(doodad->text.width,XkbXKBFile)); - - } - if (doodad->text.height!=0) { - fprintf(file,"%s height= %s;\n",i_str, - XkbGeomFPText(doodad->text.height,XkbXKBFile)); - - } - if (doodad->text.color_ndx!=0) { - color= XkbTextDoodadColor(geom,&doodad->text); - fprintf(file,"%s color= \"%s\";\n",i_str, - XkbStringText(color->spec,XkbXKBFile)); - } - fprintf(file,"%s XFont= \"%s\";\n",i_str, - XkbStringText(doodad->text.font,XkbXKBFile)); - fprintf(file,"%s text= \"%s\";\n",i_str, - XkbStringText(doodad->text.text,XkbXKBFile)); - break; - case XkbIndicatorDoodad: - shape= XkbIndicatorDoodadShape(geom,&doodad->indicator); - color= XkbIndicatorDoodadOnColor(geom,&doodad->indicator); - fprintf(file,"%s onColor= \"%s\";\n",i_str, - XkbStringText(color->spec,XkbXKBFile)); - color= XkbIndicatorDoodadOffColor(geom,&doodad->indicator); - fprintf(file,"%s offColor= \"%s\";\n",i_str, - XkbStringText(color->spec,XkbXKBFile)); - fprintf(file,"%s shape= \"%s\";\n",i_str, - XkbAtomText(dpy,shape->name,XkbXKBFile)); - break; - case XkbLogoDoodad: - fprintf(file,"%s logoName= \"%s\";\n",i_str, - XkbStringText(doodad->logo.logo_name,XkbXKBFile)); - if (doodad->shape.angle!=0) { - fprintf(file,"%s angle= %s;\n",i_str, - XkbGeomFPText(doodad->logo.angle,XkbXKBFile)); - } - if (doodad->shape.color_ndx!=0) { - fprintf(file,"%s color= \"%s\";\n",i_str, - XkbLogoDoodadColor(geom,&doodad->logo)->spec); - } - shape= XkbLogoDoodadShape(geom,&doodad->logo); - fprintf(file,"%s shape= \"%s\";\n",i_str, - XkbAtomText(dpy,shape->name,XkbXKBFile)); - break; + case XkbOutlineDoodad: + case XkbSolidDoodad: + if (doodad->shape.angle != 0) { + fprintf(file, "%s angle= %s;\n", i_str, + XkbGeomFPText(doodad->shape.angle, XkbXKBFile)); + } + if (doodad->shape.color_ndx != 0) { + fprintf(file, "%s color= \"%s\";\n", i_str, + XkbShapeDoodadColor(geom, &doodad->shape)->spec); + } + shape = XkbShapeDoodadShape(geom, &doodad->shape); + fprintf(file, "%s shape= \"%s\";\n", i_str, + XkbAtomText(dpy, shape->name, XkbXKBFile)); + break; + case XkbTextDoodad: + if (doodad->text.angle != 0) { + fprintf(file, "%s angle= %s;\n", i_str, + XkbGeomFPText(doodad->text.angle, XkbXKBFile)); + } + if (doodad->text.width != 0) { + fprintf(file, "%s width= %s;\n", i_str, + XkbGeomFPText(doodad->text.width, XkbXKBFile)); + + } + if (doodad->text.height != 0) { + fprintf(file, "%s height= %s;\n", i_str, + XkbGeomFPText(doodad->text.height, XkbXKBFile)); + + } + if (doodad->text.color_ndx != 0) { + color = XkbTextDoodadColor(geom, &doodad->text); + fprintf(file, "%s color= \"%s\";\n", i_str, + XkbStringText(color->spec, XkbXKBFile)); + } + fprintf(file, "%s XFont= \"%s\";\n", i_str, + XkbStringText(doodad->text.font, XkbXKBFile)); + fprintf(file, "%s text= \"%s\";\n", i_str, + XkbStringText(doodad->text.text, XkbXKBFile)); + break; + case XkbIndicatorDoodad: + shape = XkbIndicatorDoodadShape(geom, &doodad->indicator); + color = XkbIndicatorDoodadOnColor(geom, &doodad->indicator); + fprintf(file, "%s onColor= \"%s\";\n", i_str, + XkbStringText(color->spec, XkbXKBFile)); + color = XkbIndicatorDoodadOffColor(geom, &doodad->indicator); + fprintf(file, "%s offColor= \"%s\";\n", i_str, + XkbStringText(color->spec, XkbXKBFile)); + fprintf(file, "%s shape= \"%s\";\n", i_str, + XkbAtomText(dpy, shape->name, XkbXKBFile)); + break; + case XkbLogoDoodad: + fprintf(file, "%s logoName= \"%s\";\n", i_str, + XkbStringText(doodad->logo.logo_name, XkbXKBFile)); + if (doodad->shape.angle != 0) { + fprintf(file, "%s angle= %s;\n", i_str, + XkbGeomFPText(doodad->logo.angle, XkbXKBFile)); + } + if (doodad->shape.color_ndx != 0) { + fprintf(file, "%s color= \"%s\";\n", i_str, + XkbLogoDoodadColor(geom, &doodad->logo)->spec); + } + shape = XkbLogoDoodadShape(geom, &doodad->logo); + fprintf(file, "%s shape= \"%s\";\n", i_str, + XkbAtomText(dpy, shape->name, XkbXKBFile)); + break; } - fprintf(file,"%s};\n",i_str); + fprintf(file, "%s};\n", i_str); return True; } /*ARGSUSED*/ static Bool -WriteXKBOverlay( FILE * file, - Display * dpy, - unsigned indent, - XkbGeometryPtr geom, - XkbOverlayPtr ol) +WriteXKBOverlay(FILE * file, + Display * dpy, + unsigned indent, + XkbGeometryPtr geom, + XkbOverlayPtr ol) { -register char * i_str; -int r,k,nOut; -XkbOverlayRowPtr row; -XkbOverlayKeyPtr key; - - i_str= XkbIndentText(indent); - if (ol->name!=None) { - fprintf(file,"%soverlay \"%s\" {\n",i_str, - XkbAtomText(dpy,ol->name,XkbMessage)); + register char *i_str; + int r, k, nOut; + XkbOverlayRowPtr row; + XkbOverlayKeyPtr key; + + i_str = XkbIndentText(indent); + if (ol->name != None) { + fprintf(file, "%soverlay \"%s\" {\n", i_str, + XkbAtomText(dpy, ol->name, XkbMessage)); } - else fprintf(file,"%soverlay {\n",i_str); - for (nOut=r=0,row=ol->rows;r<ol->num_rows;r++,row++) { - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - char *over,*under; - over= XkbKeyNameText(key->over.name,XkbXKBFile); - under= XkbKeyNameText(key->under.name,XkbXKBFile); - if (nOut==0) - fprintf(file,"%s %6s=%6s",i_str,under,over); - else if ((nOut%4)==0) - fprintf(file,",\n%s %6s=%6s",i_str,under,over); - else fprintf(file,", %6s=%6s",under,over); - nOut++; - } + else + fprintf(file, "%soverlay {\n", i_str); + for (nOut = r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + char *over, *under; + + over = XkbKeyNameText(key->over.name, XkbXKBFile); + under = XkbKeyNameText(key->under.name, XkbXKBFile); + if (nOut == 0) + fprintf(file, "%s %6s=%6s", i_str, under, over); + else if ((nOut % 4) == 0) + fprintf(file, ",\n%s %6s=%6s", i_str, under, over); + else + fprintf(file, ", %6s=%6s", under, over); + nOut++; + } } - fprintf(file,"\n%s};\n",i_str); + fprintf(file, "\n%s};\n", i_str); return True; } static Bool -WriteXKBSection( FILE * file, - Display * dpy, - XkbSectionPtr s, - XkbGeometryPtr geom) +WriteXKBSection(FILE * file, + Display * dpy, + XkbSectionPtr s, + XkbGeometryPtr geom) { -register int i; -XkbRowPtr row; -int dfltKeyColor = 0; - - fprintf(file," section \"%s\" {\n", - XkbAtomText(dpy,s->name,XkbXKBFile)); - if (s->rows&&(s->rows->num_keys>0)) { - dfltKeyColor= s->rows->keys[0].color_ndx; - fprintf(file," key.color= \"%s\";\n", - XkbStringText(geom->colors[dfltKeyColor].spec,XkbXKBFile)); + register int i; + XkbRowPtr row; + int dfltKeyColor = 0; + + fprintf(file, " section \"%s\" {\n", + XkbAtomText(dpy, s->name, XkbXKBFile)); + if (s->rows && (s->rows->num_keys > 0)) { + dfltKeyColor = s->rows->keys[0].color_ndx; + fprintf(file, " key.color= \"%s\";\n", + XkbStringText(geom->colors[dfltKeyColor].spec, XkbXKBFile)); } - fprintf(file," priority= %d;\n",s->priority); - fprintf(file," top= %s;\n",XkbGeomFPText(s->top,XkbXKBFile)); - fprintf(file," left= %s;\n",XkbGeomFPText(s->left,XkbXKBFile)); - fprintf(file," width= %s;\n",XkbGeomFPText(s->width,XkbXKBFile)); - fprintf(file," height= %s;\n", - XkbGeomFPText(s->height,XkbXKBFile)); - if (s->angle!=0) { - fprintf(file," angle= %s;\n", - XkbGeomFPText(s->angle,XkbXKBFile)); + fprintf(file, " priority= %d;\n", s->priority); + fprintf(file, " top= %s;\n", + XkbGeomFPText(s->top, XkbXKBFile)); + fprintf(file, " left= %s;\n", + XkbGeomFPText(s->left, XkbXKBFile)); + fprintf(file, " width= %s;\n", + XkbGeomFPText(s->width, XkbXKBFile)); + fprintf(file, " height= %s;\n", + XkbGeomFPText(s->height, XkbXKBFile)); + if (s->angle != 0) { + fprintf(file, " angle= %s;\n", + XkbGeomFPText(s->angle, XkbXKBFile)); } - for (i=0,row=s->rows;row&&i<s->num_rows;i++,row++) { - fprintf(file," row {\n"); - fprintf(file," top= %s;\n", - XkbGeomFPText(row->top,XkbXKBFile)); - fprintf(file," left= %s;\n", - XkbGeomFPText(row->left,XkbXKBFile)); - if (row->vertical) - fprintf(file," vertical;\n"); - if (row->num_keys>0) { - register int k; - register XkbKeyPtr key; - int forceNL=0; - int nThisLine= 0; - fprintf(file," keys {\n"); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - XkbShapePtr shape; - if (key->color_ndx!=dfltKeyColor) - forceNL= 1; - if (k==0) { - fprintf(file," "); - nThisLine= 0; - } - else if (((nThisLine%2)==1)||(forceNL)) { - fprintf(file,",\n "); - forceNL= nThisLine= 0; - } - else { - fprintf(file,", "); - nThisLine++; - } - shape= XkbKeyShape(geom,key); - fprintf(file,"{ %6s, \"%s\", %3s", - XkbKeyNameText(key->name.name,XkbXKBFile), - XkbAtomText(dpy,shape->name,XkbXKBFile), - XkbGeomFPText(key->gap,XkbXKBFile)); - if (key->color_ndx!=dfltKeyColor) { - fprintf(file,", color=\"%s\"",XkbKeyColor(geom,key)->spec); - forceNL= 1; - } - fprintf(file," }"); - } - fprintf(file,"\n };\n"); - } - fprintf(file," };\n"); + for (i = 0, row = s->rows; row && i < s->num_rows; i++, row++) { + fprintf(file, " row {\n"); + fprintf(file, " top= %s;\n", + XkbGeomFPText(row->top, XkbXKBFile)); + fprintf(file, " left= %s;\n", + XkbGeomFPText(row->left, XkbXKBFile)); + if (row->vertical) + fprintf(file, " vertical;\n"); + if (row->num_keys > 0) { + register int k; + register XkbKeyPtr key; + int forceNL = 0; + int nThisLine = 0; + + fprintf(file, " keys {\n"); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + XkbShapePtr shape; + + if (key->color_ndx != dfltKeyColor) + forceNL = 1; + if (k == 0) { + fprintf(file, " "); + nThisLine = 0; + } + else if (((nThisLine % 2) == 1) || (forceNL)) { + fprintf(file, ",\n "); + forceNL = nThisLine = 0; + } + else { + fprintf(file, ", "); + nThisLine++; + } + shape = XkbKeyShape(geom, key); + fprintf(file, "{ %6s, \"%s\", %3s", + XkbKeyNameText(key->name.name, XkbXKBFile), + XkbAtomText(dpy, shape->name, XkbXKBFile), + XkbGeomFPText(key->gap, XkbXKBFile)); + if (key->color_ndx != dfltKeyColor) { + fprintf(file, ", color=\"%s\"", + XkbKeyColor(geom, key)->spec); + forceNL = 1; + } + fprintf(file, " }"); + } + fprintf(file, "\n };\n"); + } + fprintf(file, " };\n"); } - if (s->doodads!=NULL) { - XkbDoodadPtr doodad; - for (i=0,doodad=s->doodads;i<s->num_doodads;i++,doodad++) { - WriteXKBDoodad(file,dpy,8,geom,doodad); - } + if (s->doodads != NULL) { + XkbDoodadPtr doodad; + + for (i = 0, doodad = s->doodads; i < s->num_doodads; i++, doodad++) { + WriteXKBDoodad(file, dpy, 8, geom, doodad); + } } - if (s->overlays!=NULL) { - XkbOverlayPtr ol; - for (i=0,ol=s->overlays;i<s->num_overlays;i++,ol++) { - WriteXKBOverlay(file,dpy,8,geom,ol); - } + if (s->overlays != NULL) { + XkbOverlayPtr ol; + + for (i = 0, ol = s->overlays; i < s->num_overlays; i++, ol++) { + WriteXKBOverlay(file, dpy, 8, geom, ol); + } } - fprintf(file," }; // End of \"%s\" section\n\n", - XkbAtomText(dpy,s->name,XkbXKBFile)); + fprintf(file, " }; // End of \"%s\" section\n\n", + XkbAtomText(dpy, s->name, XkbXKBFile)); return True; } Bool -XkbWriteXKBGeometry( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBGeometry(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Display * dpy; -register unsigned i,n; -XkbDescPtr xkb; -XkbGeometryPtr geom; - - xkb= result->xkb; - if ((!xkb)||(!xkb->geom)) { - _XkbLibError(_XkbErrMissingGeometry,"XkbWriteXKBGeometry",0); - return False; + Display *dpy; + register unsigned i, n; + XkbDescPtr xkb; + XkbGeometryPtr geom; + + xkb = result->xkb; + if ((!xkb) || (!xkb->geom)) { + _XkbLibError(_XkbErrMissingGeometry, "XkbWriteXKBGeometry", 0); + return False; } - dpy= xkb->dpy; - geom= xkb->geom; - if (geom->name==None) - fprintf(file,"xkb_geometry {\n\n"); - else fprintf(file,"xkb_geometry \"%s\" {\n\n", - XkbAtomText(dpy,geom->name,XkbXKBFile)); - fprintf(file," width= %s;\n", - XkbGeomFPText(geom->width_mm,XkbXKBFile)); - fprintf(file," height= %s;\n\n", - XkbGeomFPText(geom->height_mm,XkbXKBFile)); - - if (geom->key_aliases!=NULL) { - XkbKeyAliasPtr pAl; - pAl= geom->key_aliases; - for (i=0;i<geom->num_key_aliases;i++,pAl++) { - fprintf(file," alias %6s = %6s;\n", - XkbKeyNameText(pAl->alias,XkbXKBFile), - XkbKeyNameText(pAl->real,XkbXKBFile)); - } - fprintf(file,"\n"); + dpy = xkb->dpy; + geom = xkb->geom; + if (geom->name == None) + fprintf(file, "xkb_geometry {\n\n"); + else + fprintf(file, "xkb_geometry \"%s\" {\n\n", + XkbAtomText(dpy, geom->name, XkbXKBFile)); + fprintf(file, " width= %s;\n", + XkbGeomFPText(geom->width_mm, XkbXKBFile)); + fprintf(file, " height= %s;\n\n", + XkbGeomFPText(geom->height_mm, XkbXKBFile)); + + if (geom->key_aliases != NULL) { + XkbKeyAliasPtr pAl; + + pAl = geom->key_aliases; + for (i = 0; i < geom->num_key_aliases; i++, pAl++) { + fprintf(file, " alias %6s = %6s;\n", + XkbKeyNameText(pAl->alias, XkbXKBFile), + XkbKeyNameText(pAl->real, XkbXKBFile)); + } + fprintf(file, "\n"); } - if (geom->base_color!=NULL) - fprintf(file," baseColor= \"%s\";\n", - XkbStringText(geom->base_color->spec,XkbXKBFile)); - if (geom->label_color!=NULL) - fprintf(file," labelColor= \"%s\";\n", - XkbStringText(geom->label_color->spec,XkbXKBFile)); - if (geom->label_font!=NULL) - fprintf(file," xfont= \"%s\";\n", - XkbStringText(geom->label_font,XkbXKBFile)); - if ((geom->num_colors>0)&&(showImplicit)) { - XkbColorPtr color; - for (color=geom->colors,i=0;i<geom->num_colors;i++,color++) { - fprintf(file,"// color[%d]= \"%s\"\n",i, - XkbStringText(color->spec,XkbXKBFile)); - } - fprintf(file,"\n"); + if (geom->base_color != NULL) + fprintf(file, " baseColor= \"%s\";\n", + XkbStringText(geom->base_color->spec, XkbXKBFile)); + if (geom->label_color != NULL) + fprintf(file, " labelColor= \"%s\";\n", + XkbStringText(geom->label_color->spec, XkbXKBFile)); + if (geom->label_font != NULL) + fprintf(file, " xfont= \"%s\";\n", + XkbStringText(geom->label_font, XkbXKBFile)); + if ((geom->num_colors > 0) && (showImplicit)) { + XkbColorPtr color; + + for (color = geom->colors, i = 0; i < geom->num_colors; i++, color++) { + fprintf(file, "// color[%d]= \"%s\"\n", i, + XkbStringText(color->spec, XkbXKBFile)); + } + fprintf(file, "\n"); } - if (geom->num_properties>0) { - XkbPropertyPtr prop; - for (prop=geom->properties,i=0;i<geom->num_properties;i++,prop++) { - fprintf(file," %s= \"%s\";\n",prop->name, - XkbStringText(prop->value,XkbXKBFile)); - } - fprintf(file,"\n"); + if (geom->num_properties > 0) { + XkbPropertyPtr prop; + + for (prop = geom->properties, i = 0; i < geom->num_properties; + i++, prop++) { + fprintf(file, " %s= \"%s\";\n", prop->name, + XkbStringText(prop->value, XkbXKBFile)); + } + fprintf(file, "\n"); } - if (geom->num_shapes>0) { - XkbShapePtr shape; - XkbOutlinePtr outline; - int lastR; - for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) { - lastR=0; - fprintf(file," shape \"%s\" {", - XkbAtomText(dpy,shape->name,XkbXKBFile)); - outline= shape->outlines; - if (shape->num_outlines>1) { - for (n=0;n<shape->num_outlines;n++,outline++) { - if (n==0) fprintf(file,"\n"); - else fprintf(file,",\n"); - WriteXKBOutline(file,shape,outline,lastR,8,8); - lastR= outline->corner_radius; - } - fprintf(file,"\n };\n"); - } - else { - WriteXKBOutline(file,NULL,outline,lastR,1,8); - fprintf(file," };\n"); - } - } + if (geom->num_shapes > 0) { + XkbShapePtr shape; + XkbOutlinePtr outline; + int lastR; + + for (shape = geom->shapes, i = 0; i < geom->num_shapes; i++, shape++) { + lastR = 0; + fprintf(file, " shape \"%s\" {", + XkbAtomText(dpy, shape->name, XkbXKBFile)); + outline = shape->outlines; + if (shape->num_outlines > 1) { + for (n = 0; n < shape->num_outlines; n++, outline++) { + if (n == 0) + fprintf(file, "\n"); + else + fprintf(file, ",\n"); + WriteXKBOutline(file, shape, outline, lastR, 8, 8); + lastR = outline->corner_radius; + } + fprintf(file, "\n };\n"); + } + else { + WriteXKBOutline(file, NULL, outline, lastR, 1, 8); + fprintf(file, " };\n"); + } + } } - if (geom->num_sections>0) { - XkbSectionPtr section; - for (section=geom->sections,i=0;i<geom->num_sections;i++,section++){ - WriteXKBSection(file,dpy,section,geom); - } + if (geom->num_sections > 0) { + XkbSectionPtr section; + + for (section = geom->sections, i = 0; i < geom->num_sections; + i++, section++) { + WriteXKBSection(file, dpy, section, geom); + } } - if (geom->num_doodads>0) { - XkbDoodadPtr doodad; - for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) { - WriteXKBDoodad(file,dpy,4,geom,doodad); - } + if (geom->num_doodads > 0) { + XkbDoodadPtr doodad; + + for (i = 0, doodad = geom->doodads; i < geom->num_doodads; + i++, doodad++) { + WriteXKBDoodad(file, dpy, 4, geom, doodad); + } } if (addOn) - (*addOn)(file,result,topLevel,showImplicit,XkmGeometryIndex,priv); - fprintf(file,"};\n\n"); + (*addOn) (file, result, topLevel, showImplicit, XkmGeometryIndex, priv); + fprintf(file, "};\n\n"); return True; } /*ARGSUSED*/ Bool -XkbWriteXKBSemantics( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBSemantics(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Bool ok; + Bool ok; - fprintf(file,"xkb_semantics {\n"); - ok= XkbWriteXKBKeyTypes(file,result,False,False,addOn,priv); - ok= ok&&XkbWriteXKBCompatMap(file,result,False,False,addOn,priv); - fprintf(file,"};\n"); + fprintf(file, "xkb_semantics {\n"); + ok = XkbWriteXKBKeyTypes(file, result, False, False, addOn, priv); + ok = ok && XkbWriteXKBCompatMap(file, result, False, False, addOn, priv); + fprintf(file, "};\n"); return ok; } /*ARGSUSED*/ Bool -XkbWriteXKBLayout( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBLayout(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Bool ok; -XkbDescPtr xkb; - - xkb= result->xkb; - fprintf(file,"xkb_layout {\n"); - ok= XkbWriteXKBKeycodes(file,result,False,showImplicit,addOn,priv); - ok= ok&&XkbWriteXKBKeyTypes(file,result,False,showImplicit,addOn,priv); - ok= ok&&XkbWriteXKBSymbols(file,result,False,showImplicit,addOn,priv); + Bool ok; + XkbDescPtr xkb; + + xkb = result->xkb; + fprintf(file, "xkb_layout {\n"); + ok = XkbWriteXKBKeycodes(file, result, False, showImplicit, addOn, priv); + ok = ok && + XkbWriteXKBKeyTypes(file, result, False, showImplicit, addOn, priv); + ok = ok && + XkbWriteXKBSymbols(file, result, False, showImplicit, addOn, priv); if (xkb->geom) - ok= ok&&XkbWriteXKBGeometry(file,result,False,showImplicit,addOn,priv); - fprintf(file,"};\n"); + ok = ok && + XkbWriteXKBGeometry(file, result, False, showImplicit, addOn, priv); + fprintf(file, "};\n"); return ok; } /*ARGSUSED*/ Bool -XkbWriteXKBKeymap( FILE * file, - XkbFileInfo * result, - Bool topLevel, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBKeymap(FILE * file, + XkbFileInfo * result, + Bool topLevel, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Bool ok; -XkbDescPtr xkb; - - xkb= result->xkb; - fprintf(file,"xkb_keymap {\n"); - ok= XkbWriteXKBKeycodes(file,result,False,showImplicit,addOn,priv); - ok= ok&&XkbWriteXKBKeyTypes(file,result,False,showImplicit,addOn,priv); - ok= ok&&XkbWriteXKBCompatMap(file,result,False,showImplicit,addOn,priv); - ok= ok&&XkbWriteXKBSymbols(file,result,False,showImplicit,addOn,priv); + Bool ok; + XkbDescPtr xkb; + + xkb = result->xkb; + fprintf(file, "xkb_keymap {\n"); + ok = XkbWriteXKBKeycodes(file, result, False, showImplicit, addOn, priv); + ok = ok && + XkbWriteXKBKeyTypes(file, result, False, showImplicit, addOn, priv); + ok = ok && + XkbWriteXKBCompatMap(file, result, False, showImplicit, addOn, priv); + ok = ok && + XkbWriteXKBSymbols(file, result, False, showImplicit, addOn, priv); if (xkb->geom) - ok= ok&&XkbWriteXKBGeometry(file,result,False,showImplicit,addOn,priv); - fprintf(file,"};\n"); + ok = ok && + XkbWriteXKBGeometry(file, result, False, showImplicit, addOn, priv); + fprintf(file, "};\n"); return ok; } Bool -XkbWriteXKBFile( FILE * out, - XkbFileInfo * result, - Bool showImplicit, - XkbFileAddOnFunc addOn, - void * priv) +XkbWriteXKBFile(FILE * out, + XkbFileInfo * result, + Bool showImplicit, + XkbFileAddOnFunc addOn, + void * priv) { -Bool ok = False; -Bool (*func)( - FILE * /* file */, - XkbFileInfo * /* result */, - Bool /* topLevel */, - Bool /* showImplicit */, - XkbFileAddOnFunc /* addOn */, - void * /* priv */ -) = NULL; + Bool ok = False; + + Bool (*func) (FILE * /* file */ , + XkbFileInfo * /* result */ , + Bool /* topLevel */ , + Bool /* showImplicit */ , + XkbFileAddOnFunc /* addOn */ , + void * /* priv */ + ) = NULL; switch (result->type) { - case XkmSemanticsFile: - func= XkbWriteXKBSemantics; - break; - case XkmLayoutFile: - func= XkbWriteXKBLayout; - break; - case XkmKeymapFile: - func= XkbWriteXKBKeymap; - break; - case XkmTypesIndex: - func= XkbWriteXKBKeyTypes; - break; - case XkmCompatMapIndex: - func= XkbWriteXKBCompatMap; - break; - case XkmSymbolsIndex: - func= XkbWriteXKBSymbols; - break; - case XkmKeyNamesIndex: - func= XkbWriteXKBKeycodes; - break; - case XkmGeometryFile: - case XkmGeometryIndex: - func= XkbWriteXKBGeometry; - break; - case XkmVirtualModsIndex: - case XkmIndicatorsIndex: - _XkbLibError(_XkbErrBadImplementation, - XkbConfigText(result->type,XkbMessage),0); - return False; + case XkmSemanticsFile: + func = XkbWriteXKBSemantics; + break; + case XkmLayoutFile: + func = XkbWriteXKBLayout; + break; + case XkmKeymapFile: + func = XkbWriteXKBKeymap; + break; + case XkmTypesIndex: + func = XkbWriteXKBKeyTypes; + break; + case XkmCompatMapIndex: + func = XkbWriteXKBCompatMap; + break; + case XkmSymbolsIndex: + func = XkbWriteXKBSymbols; + break; + case XkmKeyNamesIndex: + func = XkbWriteXKBKeycodes; + break; + case XkmGeometryFile: + case XkmGeometryIndex: + func = XkbWriteXKBGeometry; + break; + case XkmVirtualModsIndex: + case XkmIndicatorsIndex: + _XkbLibError(_XkbErrBadImplementation, + XkbConfigText(result->type, XkbMessage), 0); + return False; } - if (out==NULL) { - _XkbLibError(_XkbErrFileCannotOpen,"XkbWriteXkbFile",0); - ok= False; + if (out == NULL) { + _XkbLibError(_XkbErrFileCannotOpen, "XkbWriteXkbFile", 0); + ok = False; } else if (func) { - ok= (*func)(out,result,True,showImplicit,addOn,priv); + ok = (*func) (out, result, True, showImplicit, addOn, priv); } return ok; } diff --git a/src/xkbtext.c b/src/xkbtext.c index 3a82b17..e25aa25 100644 --- a/src/xkbtext.c +++ b/src/xkbtext.c @@ -64,168 +64,181 @@ #define BUFFER_SIZE 512 static char textBuffer[BUFFER_SIZE]; -static int tbNext= 0; +static int tbNext = 0; static char * tbGetBuffer(unsigned size) { -char *rtrn; - - if (size>=BUFFER_SIZE) - return NULL; - if ((BUFFER_SIZE-tbNext)<=size) - tbNext= 0; - rtrn= &textBuffer[tbNext]; - tbNext+= size; + char *rtrn; + + if (size >= BUFFER_SIZE) + return NULL; + if ((BUFFER_SIZE - tbNext) <= size) + tbNext = 0; + rtrn = &textBuffer[tbNext]; + tbNext += size; return rtrn; } /***====================================================================***/ char * -XkbAtomText(Display *dpy,Atom atm,unsigned format) +XkbAtomText(Display *dpy, Atom atm, unsigned format) { -char *rtrn,*tmp; - - tmp= XkbAtomGetString(dpy,atm); - if (tmp!=NULL) { - int len; - len= strlen(tmp)+1; - if (len>BUFFER_SIZE) - len= BUFFER_SIZE-2; - rtrn= tbGetBuffer(len); - strncpy(rtrn,tmp,len); - rtrn[len]= '\0'; + char *rtrn, *tmp; + + tmp = XkbAtomGetString(dpy, atm); + if (tmp != NULL) { + int len; + + len = strlen(tmp) + 1; + if (len > BUFFER_SIZE) + len = BUFFER_SIZE - 2; + rtrn = tbGetBuffer(len); + strncpy(rtrn, tmp, len); + rtrn[len] = '\0'; _XkbFree(tmp); } else { - rtrn= tbGetBuffer(1); - rtrn[0]= '\0'; - } - if (format==XkbCFile) { - for (tmp=rtrn;*tmp!='\0';tmp++) { - if ((tmp==rtrn)&&(!isalpha(*tmp))) - *tmp= '_'; - else if (!isalnum(*tmp)) - *tmp= '_'; - } - } - return XkbStringText(rtrn,format); + rtrn = tbGetBuffer(1); + rtrn[0] = '\0'; + } + if (format == XkbCFile) { + for (tmp = rtrn; *tmp != '\0'; tmp++) { + if ((tmp == rtrn) && (!isalpha(*tmp))) + *tmp = '_'; + else if (!isalnum(*tmp)) + *tmp = '_'; + } + } + return XkbStringText(rtrn, format); } /***====================================================================***/ char * -XkbVModIndexText(Display *dpy,XkbDescPtr xkb,unsigned ndx,unsigned format) +XkbVModIndexText(Display *dpy, XkbDescPtr xkb, unsigned ndx, unsigned format) { -register int len; -register Atom *vmodNames; -char *rtrn,*tmp; + register int len; + register Atom *vmodNames; + char *rtrn, *tmp; if (xkb && xkb->names) - vmodNames= xkb->names->vmods; - else vmodNames= NULL; - - tmp= NULL; - if (ndx>=XkbNumVirtualMods) - tmp= strdup("illegal"); - else if (vmodNames&&(vmodNames[ndx]!=None)) - tmp= XkbAtomGetString(dpy,vmodNames[ndx]); - if (tmp==NULL) { - tmp= (char *)_XkbAlloc(20 * sizeof(char)); - snprintf(tmp,20,"%d",ndx); - } - - len= strlen(tmp)+1; - if (format==XkbCFile) - len+= 4; - if (len>=BUFFER_SIZE) - len= BUFFER_SIZE-1; - rtrn= tbGetBuffer(len); - if (format==XkbCFile) { - snprintf(rtrn, len, "vmod_%s", tmp); - } - else strncpy(rtrn,tmp,len); + vmodNames = xkb->names->vmods; + else + vmodNames = NULL; + + tmp = NULL; + if (ndx >= XkbNumVirtualMods) + tmp = strdup("illegal"); + else if (vmodNames && (vmodNames[ndx] != None)) + tmp = XkbAtomGetString(dpy, vmodNames[ndx]); + if (tmp == NULL) { + tmp = (char *) _XkbAlloc(20 * sizeof(char)); + snprintf(tmp, 20, "%d", ndx); + } + + len = strlen(tmp) + 1; + if (format == XkbCFile) + len += 4; + if (len >= BUFFER_SIZE) + len = BUFFER_SIZE - 1; + rtrn = tbGetBuffer(len); + if (format == XkbCFile) { + snprintf(rtrn, len, "vmod_%s", tmp); + } + else + strncpy(rtrn, tmp, len); _XkbFree(tmp); return rtrn; } char * -XkbVModMaskText( Display * dpy, - XkbDescPtr xkb, - unsigned modMask, - unsigned mask, - unsigned format) +XkbVModMaskText(Display * dpy, + XkbDescPtr xkb, + unsigned modMask, + unsigned mask, + unsigned format) { -register int i,bit; -int len; -char *mm,*rtrn; -char *str,buf[BUFFER_SIZE]; - - if ((modMask==0)&&(mask==0)) { - rtrn= tbGetBuffer(5); - if (format==XkbCFile) - sprintf(rtrn,"0"); - else sprintf(rtrn,"none"); - return rtrn; - } - if (modMask!=0) - mm= XkbModMaskText(modMask,format); - else mm= NULL; - - str= buf; - buf[0]= '\0'; + register int i, bit; + int len; + char *mm, *rtrn; + char *str, buf[BUFFER_SIZE]; + + if ((modMask == 0) && (mask == 0)) { + rtrn = tbGetBuffer(5); + if (format == XkbCFile) + sprintf(rtrn, "0"); + else + sprintf(rtrn, "none"); + return rtrn; + } + if (modMask != 0) + mm = XkbModMaskText(modMask, format); + else + mm = NULL; + + str = buf; + buf[0] = '\0'; if (mask) { - char *tmp; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (mask&bit) { - tmp= XkbVModIndexText(dpy,xkb,i,format); - len= strlen(tmp)+1+(str==buf?0:1); - if (format==XkbCFile) - len+= 4; - if ((str-(buf+len))<=BUFFER_SIZE) { - if (str!=buf) { - if (format==XkbCFile) *str++= '|'; - else *str++= '+'; - len--; - } - } - if (format==XkbCFile) - sprintf(str,"%sMask",tmp); - else strcpy(str,tmp); - str= &str[len-1]; - } - } - str= buf; - } - else str= NULL; + char *tmp; + + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + if (mask & bit) { + tmp = XkbVModIndexText(dpy, xkb, i, format); + len = strlen(tmp) + 1 + (str == buf ? 0 : 1); + if (format == XkbCFile) + len += 4; + if ((str - (buf + len)) <= BUFFER_SIZE) { + if (str != buf) { + if (format == XkbCFile) + *str++ = '|'; + else + *str++ = '+'; + len--; + } + } + if (format == XkbCFile) + sprintf(str, "%sMask", tmp); + else + strcpy(str, tmp); + str = &str[len - 1]; + } + } + str = buf; + } + else + str = NULL; if (mm) - len= strlen(mm); - else len= 0; + len = strlen(mm); + else + len = 0; if (str) - len+= strlen(str)+(mm==NULL?0:1); - if (len>=BUFFER_SIZE) - len= BUFFER_SIZE-1; - rtrn= tbGetBuffer(len+1); - rtrn[0]= '\0'; - - if (mm!=NULL) { - i= strlen(mm); - if (i>len) - i= len; - strcpy(rtrn,mm); + len += strlen(str) + (mm == NULL ? 0 : 1); + if (len >= BUFFER_SIZE) + len = BUFFER_SIZE - 1; + rtrn = tbGetBuffer(len + 1); + rtrn[0] = '\0'; + + if (mm != NULL) { + i = strlen(mm); + if (i > len) + i = len; + strcpy(rtrn, mm); } else { - i=0; - } - if (str!=NULL) { - if (mm!=NULL) { - if (format==XkbCFile) strcat(rtrn,"|"); - else strcat(rtrn,"+"); - } - strncat(rtrn,str,len-i); - } - rtrn[len]= '\0'; + i = 0; + } + if (str != NULL) { + if (mm != NULL) { + if (format == XkbCFile) + strcat(rtrn, "|"); + else + strcat(rtrn, "+"); + } + strncat(rtrn, str, len - i); + } + rtrn[len] = '\0'; return rtrn; } @@ -234,64 +247,73 @@ static const char *modNames[XkbNumModifiers] = { }; char * -XkbModIndexText(unsigned ndx,unsigned format) +XkbModIndexText(unsigned ndx, unsigned format) { -char * rtrn; -char buf[100]; + char *rtrn; + char buf[100]; - if (format==XkbCFile) { - if (ndx<XkbNumModifiers) - sprintf(buf,"%sMapIndex",modNames[ndx]); - else if (ndx==XkbNoModifier) - sprintf(buf,"XkbNoModifier"); - else sprintf(buf,"0x%02x",ndx); + if (format == XkbCFile) { + if (ndx < XkbNumModifiers) + sprintf(buf, "%sMapIndex", modNames[ndx]); + else if (ndx == XkbNoModifier) + sprintf(buf, "XkbNoModifier"); + else + sprintf(buf, "0x%02x", ndx); } else { - if (ndx<XkbNumModifiers) - strcpy(buf,modNames[ndx]); - else if (ndx==XkbNoModifier) - strcpy(buf,"none"); - else sprintf(buf,"ILLEGAL_%02x",ndx); - } - rtrn= tbGetBuffer(strlen(buf)+1); - strcpy(rtrn,buf); + if (ndx < XkbNumModifiers) + strcpy(buf, modNames[ndx]); + else if (ndx == XkbNoModifier) + strcpy(buf, "none"); + else + sprintf(buf, "ILLEGAL_%02x", ndx); + } + rtrn = tbGetBuffer(strlen(buf) + 1); + strcpy(rtrn, buf); return rtrn; } char * -XkbModMaskText(unsigned mask,unsigned format) +XkbModMaskText(unsigned mask, unsigned format) { -register int i,bit; -char buf[64],*rtrn; + register int i, bit; + char buf[64], *rtrn; - if ((mask&0xff)==0xff) { - if (format==XkbCFile) strcpy(buf,"0xff"); - else strcpy(buf,"all"); + if ((mask & 0xff) == 0xff) { + if (format == XkbCFile) + strcpy(buf, "0xff"); + else + strcpy(buf, "all"); } - else if ((mask&0xff)==0) { - if (format==XkbCFile) strcpy(buf,"0"); - else strcpy(buf,"none"); + else if ((mask & 0xff) == 0) { + if (format == XkbCFile) + strcpy(buf, "0"); + else + strcpy(buf, "none"); } else { - char *str= buf; - buf[0]= '\0'; - for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) { - if (mask&bit) { - if (str!=buf) { - if (format==XkbCFile) *str++= '|'; - else *str++= '+'; - } - strcpy(str,modNames[i]); - str= &str[strlen(str)]; - if (format==XkbCFile) { - strcpy(str,"Mask"); - str+= 4; - } - } - } - } - rtrn= tbGetBuffer(strlen(buf)+1); - strcpy(rtrn,buf); + char *str = buf; + + buf[0] = '\0'; + for (i = 0, bit = 1; i < XkbNumModifiers; i++, bit <<= 1) { + if (mask & bit) { + if (str != buf) { + if (format == XkbCFile) + *str++ = '|'; + else + *str++ = '+'; + } + strcpy(str, modNames[i]); + str = &str[strlen(str)]; + if (format == XkbCFile) { + strcpy(str, "Mask"); + str += 4; + } + } + } + } + rtrn = tbGetBuffer(strlen(buf) + 1); + strcpy(rtrn, buf); return rtrn; } @@ -299,46 +321,46 @@ char buf[64],*rtrn; /*ARGSUSED*/ char * -XkbConfigText(unsigned config,unsigned format) +XkbConfigText(unsigned config, unsigned format) { -static char *buf; + static char *buf; - buf= tbGetBuffer(32); + buf = tbGetBuffer(32); switch (config) { - case XkmSemanticsFile: - strcpy(buf,"Semantics"); - break; - case XkmLayoutFile: - strcpy(buf,"Layout"); - break; - case XkmKeymapFile: - strcpy(buf,"Keymap"); - break; - case XkmGeometryFile: - case XkmGeometryIndex: - strcpy(buf,"Geometry"); - break; - case XkmTypesIndex: - strcpy(buf,"Types"); - break; - case XkmCompatMapIndex: - strcpy(buf,"CompatMap"); - break; - case XkmSymbolsIndex: - strcpy(buf,"Symbols"); - break; - case XkmIndicatorsIndex: - strcpy(buf,"Indicators"); - break; - case XkmKeyNamesIndex: - strcpy(buf,"KeyNames"); - break; - case XkmVirtualModsIndex: - strcpy(buf,"VirtualMods"); - break; - default: - sprintf(buf,"unknown(%d)",config); - break; + case XkmSemanticsFile: + strcpy(buf, "Semantics"); + break; + case XkmLayoutFile: + strcpy(buf, "Layout"); + break; + case XkmKeymapFile: + strcpy(buf, "Keymap"); + break; + case XkmGeometryFile: + case XkmGeometryIndex: + strcpy(buf, "Geometry"); + break; + case XkmTypesIndex: + strcpy(buf, "Types"); + break; + case XkmCompatMapIndex: + strcpy(buf, "CompatMap"); + break; + case XkmSymbolsIndex: + strcpy(buf, "Symbols"); + break; + case XkmIndicatorsIndex: + strcpy(buf, "Indicators"); + break; + case XkmKeyNamesIndex: + strcpy(buf, "KeyNames"); + break; + case XkmVirtualModsIndex: + strcpy(buf, "VirtualMods"); + break; + default: + sprintf(buf, "unknown(%d)", config); + break; } return buf; } @@ -346,47 +368,49 @@ static char *buf; /***====================================================================***/ char * -XkbKeysymText(KeySym sym,unsigned format) +XkbKeysymText(KeySym sym, unsigned format) { -static char buf[32],*rtrn; + static char buf[32], *rtrn; #ifndef XKB_IN_SERVER - if (sym==NoSymbol) - strcpy(rtrn=buf,"NoSymbol"); - else if ((rtrn=XKeysymToString(sym))==NULL) - sprintf(rtrn=buf, "0x%lx", (long)sym); - else if (format==XkbCFile) { - sprintf(buf,"XK_%s",rtrn); - rtrn= buf; + if (sym == NoSymbol) + strcpy(rtrn = buf, "NoSymbol"); + else if ((rtrn = XKeysymToString(sym)) == NULL) + sprintf(rtrn = buf, "0x%lx", (long) sym); + else if (format == XkbCFile) { + sprintf(buf, "XK_%s", rtrn); + rtrn = buf; } return rtrn; -#else /* def XKB_IN_SERVER */ - if (sym==NoSymbol) - strcpy(rtrn=buf,"NoSymbol"); - else sprintf(rtrn=buf, "0x%lx", (long)sym); +#else /* def XKB_IN_SERVER */ + if (sym == NoSymbol) + strcpy(rtrn = buf, "NoSymbol"); + else + sprintf(rtrn = buf, "0x%lx", (long) sym); return rtrn; -#endif /* XKB_IN_SERVER */ +#endif /* XKB_IN_SERVER */ } char * -XkbKeyNameText(char *name,unsigned format) +XkbKeyNameText(char *name, unsigned format) { -char *buf; + char *buf; - if (format==XkbCFile) { - buf= tbGetBuffer(5); - memcpy(buf,name,4); - buf[4]= '\0'; + if (format == XkbCFile) { + buf = tbGetBuffer(5); + memcpy(buf, name, 4); + buf[4] = '\0'; } else { - int len; - buf= tbGetBuffer(7); - buf[0]= '<'; - memcpy(&buf[1],name,4); - buf[5]= '\0'; - len= strlen(buf); - buf[len++]= '>'; - buf[len]= '\0'; + int len; + + buf = tbGetBuffer(7); + buf[0] = '<'; + memcpy(&buf[1], name, 4); + buf[5] = '\0'; + len = strlen(buf); + buf[len++] = '>'; + buf[len] = '\0'; } return buf; } @@ -394,239 +418,271 @@ char *buf; /***====================================================================***/ static char *siMatchText[5] = { - "NoneOf", "AnyOfOrNone", "AnyOf", "AllOf", "Exactly" + "NoneOf", "AnyOfOrNone", "AnyOf", "AllOf", "Exactly" }; char * -XkbSIMatchText(unsigned type,unsigned format) +XkbSIMatchText(unsigned type, unsigned format) { -static char buf[40]; -char *rtrn; - - switch (type&XkbSI_OpMask) { - case XkbSI_NoneOf: rtrn= siMatchText[0]; break; - case XkbSI_AnyOfOrNone: rtrn= siMatchText[1]; break; - case XkbSI_AnyOf: rtrn= siMatchText[2]; break; - case XkbSI_AllOf: rtrn= siMatchText[3]; break; - case XkbSI_Exactly: rtrn= siMatchText[4]; break; - default: sprintf(buf,"0x%x",type&XkbSI_OpMask); - return buf; - } - if (format==XkbCFile) { - if (type&XkbSI_LevelOneOnly) - sprintf(buf,"XkbSI_LevelOneOnly|XkbSI_%s",rtrn); - else sprintf(buf,"XkbSI_%s",rtrn); - rtrn= buf; + static char buf[40]; + + char *rtrn; + + switch (type & XkbSI_OpMask) { + case XkbSI_NoneOf: rtrn = siMatchText[0]; break; + case XkbSI_AnyOfOrNone: rtrn = siMatchText[1]; break; + case XkbSI_AnyOf: rtrn = siMatchText[2]; break; + case XkbSI_AllOf: rtrn = siMatchText[3]; break; + case XkbSI_Exactly: rtrn = siMatchText[4]; break; + default: + sprintf(buf, "0x%x", type & XkbSI_OpMask); + return buf; + } + if (format == XkbCFile) { + if (type & XkbSI_LevelOneOnly) + sprintf(buf, "XkbSI_LevelOneOnly|XkbSI_%s", rtrn); + else + sprintf(buf, "XkbSI_%s", rtrn); + rtrn = buf; } return rtrn; } /***====================================================================***/ -static const char *imWhichNames[]= { - "base", - "latched", - "locked", - "effective", - "compat" +static const char *imWhichNames[] = { + "base", + "latched", + "locked", + "effective", + "compat" }; char * -XkbIMWhichStateMaskText(unsigned use_which,unsigned format) +XkbIMWhichStateMaskText(unsigned use_which, unsigned format) { -int len; -unsigned i,bit,tmp; -char * buf; - - if (use_which==0) { - buf= tbGetBuffer(2); - strcpy(buf,"0"); - return buf; - } - tmp= use_which&XkbIM_UseAnyMods; - for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) { - if (tmp&bit) { - tmp&= ~bit; - len+= strlen(imWhichNames[i])+1; - if (format==XkbCFile) - len+= 9; - } - } - buf= tbGetBuffer(len+1); - tmp= use_which&XkbIM_UseAnyMods; - for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) { - if (tmp&bit) { - tmp&= ~bit; - if (format==XkbCFile) { - if (len!=0) - buf[len++]= '|'; - sprintf(&buf[len],"XkbIM_Use%s",imWhichNames[i]); - buf[len+9]= toupper(buf[len+9]); - } - else { - if (len!=0) - buf[len++]= '+'; - sprintf(&buf[len],"%s",imWhichNames[i]); - } - len+= strlen(&buf[len]); - } + int len; + unsigned i, bit, tmp; + char *buf; + + if (use_which == 0) { + buf = tbGetBuffer(2); + strcpy(buf, "0"); + return buf; + } + tmp = use_which & XkbIM_UseAnyMods; + for (len = i = 0, bit = 1; tmp != 0; i++, bit <<= 1) { + if (tmp & bit) { + tmp &= ~bit; + len += strlen(imWhichNames[i]) + 1; + if (format == XkbCFile) + len += 9; + } + } + buf = tbGetBuffer(len + 1); + tmp = use_which & XkbIM_UseAnyMods; + for (len = i = 0, bit = 1; tmp != 0; i++, bit <<= 1) { + if (tmp & bit) { + tmp &= ~bit; + if (format == XkbCFile) { + if (len != 0) + buf[len++] = '|'; + sprintf(&buf[len], "XkbIM_Use%s", imWhichNames[i]); + buf[len + 9] = toupper(buf[len + 9]); + } + else { + if (len != 0) + buf[len++] = '+'; + sprintf(&buf[len], "%s", imWhichNames[i]); + } + len += strlen(&buf[len]); + } } return buf; } char * -XkbAccessXDetailText(unsigned state,unsigned format) +XkbAccessXDetailText(unsigned state, unsigned format) { -char *buf; -const char *prefix; - - buf= tbGetBuffer(32); - if (format==XkbMessage) prefix= ""; - else prefix= "XkbAXN_"; - switch (state){ - case XkbAXN_SKPress: sprintf(buf,"%sSKPress",prefix); break; - case XkbAXN_SKAccept: sprintf(buf,"%sSKAccept",prefix); break; - case XkbAXN_SKRelease: sprintf(buf,"%sSKRelease",prefix); break; - case XkbAXN_SKReject: sprintf(buf,"%sSKReject",prefix); break; - case XkbAXN_BKAccept: sprintf(buf,"%sBKAccept",prefix); break; - case XkbAXN_BKReject: sprintf(buf,"%sBKReject",prefix); break; - case XkbAXN_AXKWarning: sprintf(buf,"%sAXKWarning",prefix); break; - default: sprintf(buf,"ILLEGAL"); break; + char *buf; + const char *prefix; + + buf = tbGetBuffer(32); + if (format == XkbMessage) + prefix = ""; + else + prefix = "XkbAXN_"; + switch (state) { + case XkbAXN_SKPress: + sprintf(buf, "%sSKPress", prefix); + break; + case XkbAXN_SKAccept: + sprintf(buf, "%sSKAccept", prefix); + break; + case XkbAXN_SKRelease: + sprintf(buf, "%sSKRelease", prefix); + break; + case XkbAXN_SKReject: + sprintf(buf, "%sSKReject", prefix); + break; + case XkbAXN_BKAccept: + sprintf(buf, "%sBKAccept", prefix); + break; + case XkbAXN_BKReject: + sprintf(buf, "%sBKReject", prefix); + break; + case XkbAXN_AXKWarning: + sprintf(buf, "%sAXKWarning", prefix); + break; + default: + sprintf(buf, "ILLEGAL"); + break; } return buf; } static const char *nknNames[] = { - "keycodes", "geometry", "deviceID" + "keycodes", "geometry", "deviceID" }; #define NUM_NKN (sizeof(nknNames)/sizeof(char *)) char * -XkbNKNDetailMaskText(unsigned detail,unsigned format) +XkbNKNDetailMaskText(unsigned detail, unsigned format) { -char *buf; -const char *prefix,*suffix; -register int i; -register unsigned bit; -int len,plen,slen; - - - if ((detail&XkbAllNewKeyboardEventsMask)==0) { - const char *tmp = ""; - if (format==XkbCFile) tmp= "0"; - else if (format==XkbMessage) tmp= "none"; - buf= tbGetBuffer(strlen(tmp)+1); - strcpy(buf,tmp); - return buf; - } - else if ((detail&XkbAllNewKeyboardEventsMask)==XkbAllNewKeyboardEventsMask){ - const char * tmp; - if (format==XkbCFile) tmp= "XkbAllNewKeyboardEventsMask"; - else tmp= "all"; - buf= tbGetBuffer(strlen(tmp)+1); - strcpy(buf,tmp); - return buf; - } - if (format==XkbMessage) { - prefix= ""; - suffix= ""; - slen= plen= 0; + char *buf; + const char *prefix, *suffix; + register int i; + register unsigned bit; + int len, plen, slen; + + if ((detail & XkbAllNewKeyboardEventsMask) == 0) { + const char *tmp = ""; + + if (format == XkbCFile) + tmp = "0"; + else if (format == XkbMessage) + tmp = "none"; + buf = tbGetBuffer(strlen(tmp) + 1); + strcpy(buf, tmp); + return buf; + } + else if ((detail & XkbAllNewKeyboardEventsMask) == + XkbAllNewKeyboardEventsMask) { + const char *tmp; + + if (format == XkbCFile) + tmp = "XkbAllNewKeyboardEventsMask"; + else + tmp = "all"; + buf = tbGetBuffer(strlen(tmp) + 1); + strcpy(buf, tmp); + return buf; + } + if (format == XkbMessage) { + prefix = ""; + suffix = ""; + slen = plen = 0; } else { - prefix= "XkbNKN_"; - plen= 7; - if (format==XkbCFile) - suffix= "Mask"; - else suffix= ""; - slen= strlen(suffix); - } - for (len=0,i=0,bit=1;i<NUM_NKN;i++,bit<<=1) { - if (detail&bit) { - if (len!=0) len+= 1; /* room for '+' or '|' */ - len+= plen+slen+strlen(nknNames[i]); - } - } - buf= tbGetBuffer(len+1); - buf[0]= '\0'; - for (len=0,i=0,bit=1;i<NUM_NKN;i++,bit<<=1) { - if (detail&bit) { - if (len!=0) { - if (format==XkbCFile) buf[len++]= '|'; - else buf[len++]= '+'; - } - if (plen) { - strcpy(&buf[len],prefix); - len+= plen; - } - strcpy(&buf[len],nknNames[i]); - len+= strlen(nknNames[i]); - if (slen) { - strcpy(&buf[len],suffix); - len+= slen; - } - } - } - buf[len++]= '\0'; + prefix = "XkbNKN_"; + plen = 7; + if (format == XkbCFile) + suffix = "Mask"; + else + suffix = ""; + slen = strlen(suffix); + } + for (len = 0, i = 0, bit = 1; i < NUM_NKN; i++, bit <<= 1) { + if (detail & bit) { + if (len != 0) + len += 1; /* room for '+' or '|' */ + len += plen + slen + strlen(nknNames[i]); + } + } + buf = tbGetBuffer(len + 1); + buf[0] = '\0'; + for (len = 0, i = 0, bit = 1; i < NUM_NKN; i++, bit <<= 1) { + if (detail & bit) { + if (len != 0) { + if (format == XkbCFile) + buf[len++] = '|'; + else + buf[len++] = '+'; + } + if (plen) { + strcpy(&buf[len], prefix); + len += plen; + } + strcpy(&buf[len], nknNames[i]); + len += strlen(nknNames[i]); + if (slen) { + strcpy(&buf[len], suffix); + len += slen; + } + } + } + buf[len++] = '\0'; return buf; } static const char *ctrlNames[] = { - "repeatKeys", - "slowKeys", - "bounceKeys", - "stickyKeys", - "mouseKeys", - "mouseKeysAccel", - "accessXKeys", - "accessXTimeout", - "accessXFeedback", - "audibleBell", - "overlay1", - "overlay2", - "ignoreGroupLock" + "repeatKeys", + "slowKeys", + "bounceKeys", + "stickyKeys", + "mouseKeys", + "mouseKeysAccel", + "accessXKeys", + "accessXTimeout", + "accessXFeedback", + "audibleBell", + "overlay1", + "overlay2", + "ignoreGroupLock" }; char * -XkbControlsMaskText(unsigned ctrls,unsigned format) +XkbControlsMaskText(unsigned ctrls, unsigned format) { -int len; -unsigned i,bit,tmp; -char * buf; - - if (ctrls==0) { - buf= tbGetBuffer(5); - if (format==XkbCFile) - strcpy(buf,"0"); - else strcpy(buf,"none"); - return buf; - } - tmp= ctrls&XkbAllBooleanCtrlsMask; - for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) { - if (tmp&bit) { - tmp&= ~bit; - len+= strlen(ctrlNames[i])+1; - if (format==XkbCFile) - len+= 7; - } - } - buf= tbGetBuffer(len+1); - tmp= ctrls&XkbAllBooleanCtrlsMask; - for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) { - if (tmp&bit) { - tmp&= ~bit; - if (format==XkbCFile) { - if (len!=0) - buf[len++]= '|'; - sprintf(&buf[len],"Xkb%sMask",ctrlNames[i]); - buf[len+3]= toupper(buf[len+3]); - } - else { - if (len!=0) - buf[len++]= '+'; - sprintf(&buf[len],"%s",ctrlNames[i]); - } - len+= strlen(&buf[len]); - } + int len; + unsigned i, bit, tmp; + char *buf; + + if (ctrls == 0) { + buf = tbGetBuffer(5); + if (format == XkbCFile) + strcpy(buf, "0"); + else + strcpy(buf, "none"); + return buf; + } + tmp = ctrls & XkbAllBooleanCtrlsMask; + for (len = i = 0, bit = 1; tmp != 0; i++, bit <<= 1) { + if (tmp & bit) { + tmp &= ~bit; + len += strlen(ctrlNames[i]) + 1; + if (format == XkbCFile) + len += 7; + } + } + buf = tbGetBuffer(len + 1); + tmp = ctrls & XkbAllBooleanCtrlsMask; + for (len = i = 0, bit = 1; tmp != 0; i++, bit <<= 1) { + if (tmp & bit) { + tmp &= ~bit; + if (format == XkbCFile) { + if (len != 0) + buf[len++] = '|'; + sprintf(&buf[len], "Xkb%sMask", ctrlNames[i]); + buf[len + 3] = toupper(buf[len + 3]); + } + else { + if (len != 0) + buf[len++] = '+'; + sprintf(&buf[len], "%s", ctrlNames[i]); + } + len += strlen(&buf[len]); + } } return buf; } @@ -634,111 +690,135 @@ char * buf; /***====================================================================***/ char * -XkbStringText(char *str,unsigned format) +XkbStringText(char *str, unsigned format) { -char * buf; -register char *in,*out; -int len; -Bool ok; - - if (str==NULL) { - buf= tbGetBuffer(2); - buf[0]='\0'; - return buf; - } - else if (format==XkbXKMFile) - return str; - for (ok= True,len=0,in=str;*in!='\0';in++,len++) { - if (!isprint(*in)) { - ok= False; - switch (*in) { - case '\n': case '\t': case '\v': - case '\b': case '\r': case '\f': - len++; - break; - default: - len+= 4; - break; - } - } + char *buf; + register char *in, *out; + int len; + Bool ok; + + if (str == NULL) { + buf = tbGetBuffer(2); + buf[0] = '\0'; + return buf; + } + else if (format == XkbXKMFile) + return str; + for (ok = True, len = 0, in = str; *in != '\0'; in++, len++) { + if (!isprint(*in)) { + ok = False; + switch (*in) { + case '\n': + case '\t': + case '\v': + case '\b': + case '\r': + case '\f': + len++; + break; + default: + len += 4; + break; + } + } } if (ok) - return str; - buf= tbGetBuffer(len+1); - for (in=str,out=buf;*in!='\0';in++) { - if (isprint(*in)) - *out++= *in; - else { - *out++= '\\'; - if (*in=='\n') *out++= 'n'; - else if (*in=='\t') *out++= 't'; - else if (*in=='\v') *out++= 'v'; - else if (*in=='\b') *out++= 'b'; - else if (*in=='\r') *out++= 'r'; - else if (*in=='\f') *out++= 'f'; - else if ((*in=='\033')&&(format==XkbXKMFile)) { - *out++= 'e'; - } - else { - *out++= '0'; - sprintf(out,"%o",*in); - while (*out!='\0') - out++; - } - } - } - *out++= '\0'; + return str; + buf = tbGetBuffer(len + 1); + for (in = str, out = buf; *in != '\0'; in++) { + if (isprint(*in)) + *out++ = *in; + else { + *out++ = '\\'; + if (*in == '\n') + *out++ = 'n'; + else if (*in == '\t') + *out++ = 't'; + else if (*in == '\v') + *out++ = 'v'; + else if (*in == '\b') + *out++ = 'b'; + else if (*in == '\r') + *out++ = 'r'; + else if (*in == '\f') + *out++ = 'f'; + else if ((*in == '\033') && (format == XkbXKMFile)) { + *out++ = 'e'; + } + else { + *out++ = '0'; + sprintf(out, "%o", *in); + while (*out != '\0') + out++; + } + } + } + *out++ = '\0'; return buf; } /***====================================================================***/ char * -XkbGeomFPText(int val,unsigned format) +XkbGeomFPText(int val, unsigned format) { -int whole,frac; -char * buf; + int whole, frac; + char *buf; - buf= tbGetBuffer(12); - if (format==XkbCFile) { - sprintf(buf,"%d",val); + buf = tbGetBuffer(12); + if (format == XkbCFile) { + sprintf(buf, "%d", val); } else { - whole= val/XkbGeomPtsPerMM; - frac= val%XkbGeomPtsPerMM; - if (frac!=0) - sprintf(buf,"%d.%d",whole,frac); - else sprintf(buf,"%d",whole); + whole = val / XkbGeomPtsPerMM; + frac = val % XkbGeomPtsPerMM; + if (frac != 0) + sprintf(buf, "%d.%d", whole, frac); + else + sprintf(buf, "%d", whole); } return buf; } char * -XkbDoodadTypeText(unsigned type,unsigned format) +XkbDoodadTypeText(unsigned type, unsigned format) { -char * buf; - if (format==XkbCFile) { - buf= tbGetBuffer(24); - if (type==XkbOutlineDoodad) strcpy(buf,"XkbOutlineDoodad"); - else if (type==XkbSolidDoodad) strcpy(buf,"XkbSolidDoodad"); - else if (type==XkbTextDoodad) strcpy(buf,"XkbTextDoodad"); - else if (type==XkbIndicatorDoodad) strcpy(buf,"XkbIndicatorDoodad"); - else if (type==XkbLogoDoodad) strcpy(buf,"XkbLogoDoodad"); - else sprintf(buf,"UnknownDoodad%d",type); + char *buf; + + if (format == XkbCFile) { + buf = tbGetBuffer(24); + if (type == XkbOutlineDoodad) + strcpy(buf, "XkbOutlineDoodad"); + else if (type == XkbSolidDoodad) + strcpy(buf, "XkbSolidDoodad"); + else if (type == XkbTextDoodad) + strcpy(buf, "XkbTextDoodad"); + else if (type == XkbIndicatorDoodad) + strcpy(buf, "XkbIndicatorDoodad"); + else if (type == XkbLogoDoodad) + strcpy(buf, "XkbLogoDoodad"); + else + sprintf(buf, "UnknownDoodad%d", type); } else { - buf= tbGetBuffer(12); - if (type==XkbOutlineDoodad) strcpy(buf,"outline"); - else if (type==XkbSolidDoodad) strcpy(buf,"solid"); - else if (type==XkbTextDoodad) strcpy(buf,"text"); - else if (type==XkbIndicatorDoodad) strcpy(buf,"indicator"); - else if (type==XkbLogoDoodad) strcpy(buf,"logo"); - else sprintf(buf,"unknown%d",type); + buf = tbGetBuffer(12); + if (type == XkbOutlineDoodad) + strcpy(buf, "outline"); + else if (type == XkbSolidDoodad) + strcpy(buf, "solid"); + else if (type == XkbTextDoodad) + strcpy(buf, "text"); + else if (type == XkbIndicatorDoodad) + strcpy(buf, "indicator"); + else if (type == XkbLogoDoodad) + strcpy(buf, "logo"); + else + sprintf(buf, "unknown%d", type); } return buf; } -static char *actionTypeNames[XkbSA_NumActions]= { +static char *actionTypeNames[XkbSA_NumActions] = { "NoAction", "SetMods", "LatchMods", "LockMods", "SetGroup", "LatchGroup", "LockGroup", @@ -754,583 +834,638 @@ static char *actionTypeNames[XkbSA_NumActions]= { }; char * -XkbActionTypeText(unsigned type,unsigned format) +XkbActionTypeText(unsigned type, unsigned format) { -static char buf[32]; -char *rtrn; - - if (type<=XkbSA_LastAction) { - rtrn= actionTypeNames[type]; - if (format==XkbCFile) { - sprintf(buf,"XkbSA_%s",rtrn); - return buf; - } - return rtrn; - } - sprintf(buf,"Private"); + static char buf[32]; + char *rtrn; + + if (type <= XkbSA_LastAction) { + rtrn = actionTypeNames[type]; + if (format == XkbCFile) { + sprintf(buf, "XkbSA_%s", rtrn); + return buf; + } + return rtrn; + } + sprintf(buf, "Private"); return buf; } /***====================================================================***/ static int -TryCopyStr(char *to,const char *from,int *pLeft) +TryCopyStr(char *to, const char *from, int *pLeft) { -register int len; - if (*pLeft>0) { - len= strlen(from); - if (len<((*pLeft)-3)) { - strcat(to,from); - *pLeft-= len; - return True; - } - } - *pLeft= -1; + register int len; + + if (*pLeft > 0) { + len = strlen(from); + if (len < ((*pLeft) - 3)) { + strcat(to, from); + *pLeft -= len; + return True; + } + } + *pLeft = -1; return False; } /*ARGSUSED*/ static Bool -CopyNoActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int*sz) +CopyNoActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { return True; } static Bool -CopyModActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int* sz) +CopyModActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbModAction * act; -unsigned tmp; - - act= &action->mods; - tmp= XkbModActionVMods(act); - TryCopyStr(buf,"modifiers=",sz); - if (act->flags&XkbSA_UseModMapMods) - TryCopyStr(buf,"modMapMods",sz); + XkbModAction *act; + unsigned tmp; + + act = &action->mods; + tmp = XkbModActionVMods(act); + TryCopyStr(buf, "modifiers=", sz); + if (act->flags & XkbSA_UseModMapMods) + TryCopyStr(buf, "modMapMods", sz); else if (act->real_mods || tmp) { - TryCopyStr(buf, - XkbVModMaskText(dpy,xkb,act->real_mods,tmp,XkbXKBFile), - sz); - } - else TryCopyStr(buf,"none",sz); - if (act->type==XkbSA_LockMods) - return True; - if (act->flags&XkbSA_ClearLocks) - TryCopyStr(buf,",clearLocks",sz); - if (act->flags&XkbSA_LatchToLock) - TryCopyStr(buf,",latchToLock",sz); + TryCopyStr(buf, + XkbVModMaskText(dpy, xkb, act->real_mods, tmp, XkbXKBFile), + sz); + } + else + TryCopyStr(buf, "none", sz); + if (act->type == XkbSA_LockMods) + return True; + if (act->flags & XkbSA_ClearLocks) + TryCopyStr(buf, ",clearLocks", sz); + if (act->flags & XkbSA_LatchToLock) + TryCopyStr(buf, ",latchToLock", sz); return True; } /*ARGSUSED*/ static Bool -CopyGroupActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopyGroupActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbGroupAction * act; -char tbuf[32]; - - act= &action->group; - TryCopyStr(buf,"group=",sz); - if (act->flags&XkbSA_GroupAbsolute) - sprintf(tbuf,"%d",XkbSAGroup(act)+1); - else if (XkbSAGroup(act)<0) - sprintf(tbuf,"%d",XkbSAGroup(act)); - else sprintf(tbuf,"+%d",XkbSAGroup(act)); - TryCopyStr(buf,tbuf,sz); - if (act->type==XkbSA_LockGroup) - return True; - if (act->flags&XkbSA_ClearLocks) - TryCopyStr(buf,",clearLocks",sz); - if (act->flags&XkbSA_LatchToLock) - TryCopyStr(buf,",latchToLock",sz); + XkbGroupAction *act; + char tbuf[32]; + + act = &action->group; + TryCopyStr(buf, "group=", sz); + if (act->flags & XkbSA_GroupAbsolute) + sprintf(tbuf, "%d", XkbSAGroup(act) + 1); + else if (XkbSAGroup(act) < 0) + sprintf(tbuf, "%d", XkbSAGroup(act)); + else + sprintf(tbuf, "+%d", XkbSAGroup(act)); + TryCopyStr(buf, tbuf, sz); + if (act->type == XkbSA_LockGroup) + return True; + if (act->flags & XkbSA_ClearLocks) + TryCopyStr(buf, ",clearLocks", sz); + if (act->flags & XkbSA_LatchToLock) + TryCopyStr(buf, ",latchToLock", sz); return True; } /*ARGSUSED*/ static Bool -CopyMovePtrArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz) +CopyMovePtrArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbPtrAction * act; -int x,y; -char tbuf[32]; - - act= &action->ptr; - x= XkbPtrActionX(act); - y= XkbPtrActionY(act); - if ((act->flags&XkbSA_MoveAbsoluteX)||(x<0)) - sprintf(tbuf,"x=%d",x); - else sprintf(tbuf,"x=+%d",x); - TryCopyStr(buf,tbuf,sz); - - if ((act->flags&XkbSA_MoveAbsoluteY)||(y<0)) - sprintf(tbuf,",y=%d",y); - else sprintf(tbuf,",y=+%d",y); - TryCopyStr(buf,tbuf,sz); - if (act->flags&XkbSA_NoAcceleration) - TryCopyStr(buf,",!accel",sz); + XkbPtrAction *act; + int x, y; + char tbuf[32]; + + act = &action->ptr; + x = XkbPtrActionX(act); + y = XkbPtrActionY(act); + if ((act->flags & XkbSA_MoveAbsoluteX) || (x < 0)) + sprintf(tbuf, "x=%d", x); + else + sprintf(tbuf, "x=+%d", x); + TryCopyStr(buf, tbuf, sz); + + if ((act->flags & XkbSA_MoveAbsoluteY) || (y < 0)) + sprintf(tbuf, ",y=%d", y); + else + sprintf(tbuf, ",y=+%d", y); + TryCopyStr(buf, tbuf, sz); + if (act->flags & XkbSA_NoAcceleration) + TryCopyStr(buf, ",!accel", sz); return True; } /*ARGSUSED*/ static Bool -CopyPtrBtnArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz) +CopyPtrBtnArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbPtrBtnAction * act; -char tbuf[32]; - - act= &action->btn; - TryCopyStr(buf,"button=",sz); - if ((act->button>0)&&(act->button<6)) { - sprintf(tbuf,"%d",act->button); - TryCopyStr(buf,tbuf,sz); - } - else TryCopyStr(buf,"default",sz); - if (act->count>0) { - sprintf(tbuf,",count=%d",act->count); - TryCopyStr(buf,tbuf,sz); - } - if (action->type==XkbSA_LockPtrBtn) { - switch (act->flags&(XkbSA_LockNoUnlock|XkbSA_LockNoLock)) { - case XkbSA_LockNoLock: - sprintf(tbuf,",affect=unlock"); break; - case XkbSA_LockNoUnlock: - sprintf(tbuf,",affect=lock"); break; - case XkbSA_LockNoUnlock|XkbSA_LockNoLock: - sprintf(tbuf,",affect=neither"); break; - default: - sprintf(tbuf,",affect=both"); break; - } - TryCopyStr(buf,tbuf,sz); + XkbPtrBtnAction *act; + char tbuf[32]; + + act = &action->btn; + TryCopyStr(buf, "button=", sz); + if ((act->button > 0) && (act->button < 6)) { + sprintf(tbuf, "%d", act->button); + TryCopyStr(buf, tbuf, sz); + } + else + TryCopyStr(buf, "default", sz); + if (act->count > 0) { + sprintf(tbuf, ",count=%d", act->count); + TryCopyStr(buf, tbuf, sz); + } + if (action->type == XkbSA_LockPtrBtn) { + switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) { + case XkbSA_LockNoLock: + sprintf(tbuf, ",affect=unlock"); + break; + case XkbSA_LockNoUnlock: + sprintf(tbuf, ",affect=lock"); + break; + case XkbSA_LockNoUnlock | XkbSA_LockNoLock: + sprintf(tbuf, ",affect=neither"); + break; + default: + sprintf(tbuf, ",affect=both"); + break; + } + TryCopyStr(buf, tbuf, sz); } return True; } /*ARGSUSED*/ static Bool -CopySetPtrDfltArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopySetPtrDfltArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbPtrDfltAction * act; -char tbuf[32]; - - act= &action->dflt; - if (act->affect==XkbSA_AffectDfltBtn) { - TryCopyStr(buf,"affect=button,button=",sz); - if ((act->flags&XkbSA_DfltBtnAbsolute)||(XkbSAPtrDfltValue(act)<0)) - sprintf(tbuf,"%d",XkbSAPtrDfltValue(act)); - else sprintf(tbuf,"+%d",XkbSAPtrDfltValue(act)); - TryCopyStr(buf,tbuf,sz); + XkbPtrDfltAction *act; + char tbuf[32]; + + act = &action->dflt; + if (act->affect == XkbSA_AffectDfltBtn) { + TryCopyStr(buf, "affect=button,button=", sz); + if ((act->flags & XkbSA_DfltBtnAbsolute) || + (XkbSAPtrDfltValue(act) < 0)) + sprintf(tbuf, "%d", XkbSAPtrDfltValue(act)); + else + sprintf(tbuf, "+%d", XkbSAPtrDfltValue(act)); + TryCopyStr(buf, tbuf, sz); } return True; } static Bool -CopyISOLockArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz) +CopyISOLockArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbISOAction * act; -char tbuf[64]; - - act= &action->iso; - if (act->flags&XkbSA_ISODfltIsGroup) { - TryCopyStr(tbuf,"group=",sz); - if (act->flags&XkbSA_GroupAbsolute) - sprintf(tbuf,"%d",XkbSAGroup(act)+1); - else if (XkbSAGroup(act)<0) - sprintf(tbuf,"%d",XkbSAGroup(act)); - else sprintf(tbuf,"+%d",XkbSAGroup(act)); - TryCopyStr(buf,tbuf,sz); + XkbISOAction *act; + char tbuf[64]; + + act = &action->iso; + if (act->flags & XkbSA_ISODfltIsGroup) { + TryCopyStr(tbuf, "group=", sz); + if (act->flags & XkbSA_GroupAbsolute) + sprintf(tbuf, "%d", XkbSAGroup(act) + 1); + else if (XkbSAGroup(act) < 0) + sprintf(tbuf, "%d", XkbSAGroup(act)); + else + sprintf(tbuf, "+%d", XkbSAGroup(act)); + TryCopyStr(buf, tbuf, sz); } else { - unsigned tmp; - tmp= XkbModActionVMods(act); - TryCopyStr(buf,"modifiers=",sz); - if (act->flags&XkbSA_UseModMapMods) - TryCopyStr(buf,"modMapMods",sz); - else if (act->real_mods || tmp) { - if (act->real_mods) { - TryCopyStr(buf,XkbModMaskText(act->real_mods,XkbXKBFile),sz); - if (tmp) - TryCopyStr(buf,"+",sz); - } - if (tmp) - TryCopyStr(buf,XkbVModMaskText(dpy,xkb,0,tmp,XkbXKBFile),sz); - } - else TryCopyStr(buf,"none",sz); - } - TryCopyStr(buf,",affect=",sz); - if ((act->affect&XkbSA_ISOAffectMask)==0) - TryCopyStr(buf,"all",sz); + unsigned tmp; + + tmp = XkbModActionVMods(act); + TryCopyStr(buf, "modifiers=", sz); + if (act->flags & XkbSA_UseModMapMods) + TryCopyStr(buf, "modMapMods", sz); + else if (act->real_mods || tmp) { + if (act->real_mods) { + TryCopyStr(buf, XkbModMaskText(act->real_mods, XkbXKBFile), sz); + if (tmp) + TryCopyStr(buf, "+", sz); + } + if (tmp) + TryCopyStr(buf, XkbVModMaskText(dpy, xkb, 0, tmp, XkbXKBFile), + sz); + } + else + TryCopyStr(buf, "none", sz); + } + TryCopyStr(buf, ",affect=", sz); + if ((act->affect & XkbSA_ISOAffectMask) == 0) + TryCopyStr(buf, "all", sz); else { - int nOut= 0; - if ((act->affect&XkbSA_ISONoAffectMods)==0) { - TryCopyStr(buf,"mods",sz); - nOut++; - } - if ((act->affect&XkbSA_ISONoAffectGroup)==0) { - sprintf(tbuf,"%sgroups",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if ((act->affect&XkbSA_ISONoAffectPtr)==0) { - sprintf(tbuf,"%spointer",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if ((act->affect&XkbSA_ISONoAffectCtrls)==0) { - sprintf(tbuf,"%scontrols",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } + int nOut = 0; + + if ((act->affect & XkbSA_ISONoAffectMods) == 0) { + TryCopyStr(buf, "mods", sz); + nOut++; + } + if ((act->affect & XkbSA_ISONoAffectGroup) == 0) { + sprintf(tbuf, "%sgroups", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if ((act->affect & XkbSA_ISONoAffectPtr) == 0) { + sprintf(tbuf, "%spointer", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if ((act->affect & XkbSA_ISONoAffectCtrls) == 0) { + sprintf(tbuf, "%scontrols", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } } return True; } /*ARGSUSED*/ static Bool -CopySwitchScreenArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopySwitchScreenArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbSwitchScreenAction * act; -char tbuf[32]; - - act= &action->screen; - if ((act->flags&XkbSA_SwitchAbsolute)||(XkbSAScreen(act)<0)) - sprintf(tbuf,"screen=%d",XkbSAScreen(act)); - else sprintf(tbuf,"screen=+%d",XkbSAScreen(act)); - TryCopyStr(buf,tbuf,sz); - if (act->flags&XkbSA_SwitchApplication) - TryCopyStr(buf,",!same",sz); - else TryCopyStr(buf,",same",sz); + XkbSwitchScreenAction *act; + char tbuf[32]; + + act = &action->screen; + if ((act->flags & XkbSA_SwitchAbsolute) || (XkbSAScreen(act) < 0)) + sprintf(tbuf, "screen=%d", XkbSAScreen(act)); + else + sprintf(tbuf, "screen=+%d", XkbSAScreen(act)); + TryCopyStr(buf, tbuf, sz); + if (act->flags & XkbSA_SwitchApplication) + TryCopyStr(buf, ",!same", sz); + else + TryCopyStr(buf, ",same", sz); return True; } /*ARGSUSED*/ static Bool -CopySetLockControlsArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action, - char *buf,int *sz) +CopySetLockControlsArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbCtrlsAction * act; -unsigned tmp; -char tbuf[32]; - - act= &action->ctrls; - tmp= XkbActionCtrls(act); - TryCopyStr(buf,"controls=",sz); - if (tmp==0) - TryCopyStr(buf,"none",sz); - else if ((tmp&XkbAllBooleanCtrlsMask)==XkbAllBooleanCtrlsMask) - TryCopyStr(buf,"all",sz); + XkbCtrlsAction *act; + unsigned tmp; + char tbuf[32]; + + act = &action->ctrls; + tmp = XkbActionCtrls(act); + TryCopyStr(buf, "controls=", sz); + if (tmp == 0) + TryCopyStr(buf, "none", sz); + else if ((tmp & XkbAllBooleanCtrlsMask) == XkbAllBooleanCtrlsMask) + TryCopyStr(buf, "all", sz); else { - int nOut= 0; - if (tmp&XkbRepeatKeysMask) { - sprintf(tbuf,"%sRepeatKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbSlowKeysMask) { - sprintf(tbuf,"%sSlowKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbBounceKeysMask) { - sprintf(tbuf,"%sBounceKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbStickyKeysMask) { - sprintf(tbuf,"%sStickyKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbMouseKeysMask) { - sprintf(tbuf,"%sMouseKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbMouseKeysAccelMask) { - sprintf(tbuf,"%sMouseKeysAccel",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbAccessXKeysMask) { - sprintf(tbuf,"%sAccessXKeys",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbAccessXTimeoutMask) { - sprintf(tbuf,"%sAccessXTimeout",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbAccessXFeedbackMask) { - sprintf(tbuf,"%sAccessXFeedback",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbAudibleBellMask) { - sprintf(tbuf,"%sAudibleBell",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbOverlay1Mask) { - sprintf(tbuf,"%sOverlay1",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbOverlay2Mask) { - sprintf(tbuf,"%sOverlay2",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } - if (tmp&XkbIgnoreGroupLockMask) { - sprintf(tbuf,"%sIgnoreGroupLock",(nOut>0?"+":"")); - TryCopyStr(buf,tbuf,sz); - nOut++; - } + int nOut = 0; + + if (tmp & XkbRepeatKeysMask) { + sprintf(tbuf, "%sRepeatKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbSlowKeysMask) { + sprintf(tbuf, "%sSlowKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbBounceKeysMask) { + sprintf(tbuf, "%sBounceKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbStickyKeysMask) { + sprintf(tbuf, "%sStickyKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbMouseKeysMask) { + sprintf(tbuf, "%sMouseKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbMouseKeysAccelMask) { + sprintf(tbuf, "%sMouseKeysAccel", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbAccessXKeysMask) { + sprintf(tbuf, "%sAccessXKeys", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbAccessXTimeoutMask) { + sprintf(tbuf, "%sAccessXTimeout", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbAccessXFeedbackMask) { + sprintf(tbuf, "%sAccessXFeedback", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbAudibleBellMask) { + sprintf(tbuf, "%sAudibleBell", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbOverlay1Mask) { + sprintf(tbuf, "%sOverlay1", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbOverlay2Mask) { + sprintf(tbuf, "%sOverlay2", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } + if (tmp & XkbIgnoreGroupLockMask) { + sprintf(tbuf, "%sIgnoreGroupLock", (nOut > 0 ? "+" : "")); + TryCopyStr(buf, tbuf, sz); + nOut++; + } } return True; } /*ARGSUSED*/ static Bool -CopyActionMessageArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopyActionMessageArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbMessageAction * act; -unsigned all; -char tbuf[32]; - - act= &action->msg; - all= XkbSA_MessageOnPress|XkbSA_MessageOnRelease; - TryCopyStr(buf,"report=",sz); - if ((act->flags&all)==0) - TryCopyStr(buf,"none",sz); - else if ((act->flags&all)==all) - TryCopyStr(buf,"all",sz); - else if (act->flags&XkbSA_MessageOnPress) - TryCopyStr(buf,"KeyPress",sz); - else TryCopyStr(buf,"KeyRelease",sz); - sprintf(tbuf,",data[0]=0x%02x",act->message[0]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[1]=0x%02x",act->message[1]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[2]=0x%02x",act->message[2]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[3]=0x%02x",act->message[3]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[4]=0x%02x",act->message[4]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[5]=0x%02x",act->message[5]); TryCopyStr(buf,tbuf,sz); + XkbMessageAction *act; + unsigned all; + char tbuf[32]; + + act = &action->msg; + all = XkbSA_MessageOnPress | XkbSA_MessageOnRelease; + TryCopyStr(buf, "report=", sz); + if ((act->flags & all) == 0) + TryCopyStr(buf, "none", sz); + else if ((act->flags & all) == all) + TryCopyStr(buf, "all", sz); + else if (act->flags & XkbSA_MessageOnPress) + TryCopyStr(buf, "KeyPress", sz); + else + TryCopyStr(buf, "KeyRelease", sz); + sprintf(tbuf, ",data[0]=0x%02x", act->message[0]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[1]=0x%02x", act->message[1]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[2]=0x%02x", act->message[2]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[3]=0x%02x", act->message[3]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[4]=0x%02x", act->message[4]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[5]=0x%02x", act->message[5]); + TryCopyStr(buf, tbuf, sz); return True; } static Bool -CopyRedirectKeyArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopyRedirectKeyArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbRedirectKeyAction * act; -char tbuf[32],*tmp; -unsigned kc; -unsigned vmods,vmods_mask; - - act= &action->redirect; - kc= act->new_key; - vmods= XkbSARedirectVMods(act); - vmods_mask= XkbSARedirectVModsMask(act); - if (xkb && xkb->names && xkb->names->keys && (kc<=xkb->max_key_code) && - (xkb->names->keys[kc].name[0]!='\0')) { - char *kn; - kn= XkbKeyNameText(xkb->names->keys[kc].name,XkbXKBFile); - sprintf(tbuf,"key=%s",kn); - } - else sprintf(tbuf,"key=%d",kc); - TryCopyStr(buf,tbuf,sz); - if ((act->mods_mask==0)&&(vmods_mask==0)) - return True; - if ((act->mods_mask==XkbAllModifiersMask)&& - (vmods_mask==XkbAllVirtualModsMask)) { - tmp= XkbVModMaskText(dpy,xkb,act->mods,vmods,XkbXKBFile); - TryCopyStr(buf,",mods=",sz); - TryCopyStr(buf,tmp,sz); + XkbRedirectKeyAction *act; + char tbuf[32], *tmp; + unsigned kc; + unsigned vmods, vmods_mask; + + act = &action->redirect; + kc = act->new_key; + vmods = XkbSARedirectVMods(act); + vmods_mask = XkbSARedirectVModsMask(act); + if (xkb && xkb->names && xkb->names->keys && (kc <= xkb->max_key_code) && + (xkb->names->keys[kc].name[0] != '\0')) { + char *kn; + + kn = XkbKeyNameText(xkb->names->keys[kc].name, XkbXKBFile); + sprintf(tbuf, "key=%s", kn); + } + else + sprintf(tbuf, "key=%d", kc); + TryCopyStr(buf, tbuf, sz); + if ((act->mods_mask == 0) && (vmods_mask == 0)) + return True; + if ((act->mods_mask == XkbAllModifiersMask) && + (vmods_mask == XkbAllVirtualModsMask)) { + tmp = XkbVModMaskText(dpy, xkb, act->mods, vmods, XkbXKBFile); + TryCopyStr(buf, ",mods=", sz); + TryCopyStr(buf, tmp, sz); } else { - if ((act->mods_mask&act->mods)||(vmods_mask&vmods)) { - tmp= XkbVModMaskText(dpy,xkb,act->mods_mask&act->mods, - vmods_mask&vmods,XkbXKBFile); - TryCopyStr(buf,",mods= ",sz); - TryCopyStr(buf,tmp,sz); - } - if ((act->mods_mask&(~act->mods))||(vmods_mask&(~vmods))) { - tmp= XkbVModMaskText(dpy,xkb,act->mods_mask&(~act->mods), - vmods_mask&(~vmods),XkbXKBFile); - TryCopyStr(buf,",clearMods= ",sz); - TryCopyStr(buf,tmp,sz); - } + if ((act->mods_mask & act->mods) || (vmods_mask & vmods)) { + tmp = XkbVModMaskText(dpy, xkb, act->mods_mask & act->mods, + vmods_mask & vmods, XkbXKBFile); + TryCopyStr(buf, ",mods= ", sz); + TryCopyStr(buf, tmp, sz); + } + if ((act->mods_mask & (~act->mods)) || (vmods_mask & (~vmods))) { + tmp = XkbVModMaskText(dpy, xkb, act->mods_mask & (~act->mods), + vmods_mask & (~vmods), XkbXKBFile); + TryCopyStr(buf, ",clearMods= ", sz); + TryCopyStr(buf, tmp, sz); + } } return True; } /*ARGSUSED*/ static Bool -CopyDeviceBtnArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf, - int *sz) +CopyDeviceBtnArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbDeviceBtnAction * act; -char tbuf[32]; - - act= &action->devbtn; - sprintf(tbuf,"device= %d",act->device); TryCopyStr(buf,tbuf,sz); - TryCopyStr(buf,",button=",sz); - sprintf(tbuf,"%d",act->button); - TryCopyStr(buf,tbuf,sz); - if (act->count>0) { - sprintf(tbuf,",count=%d",act->count); - TryCopyStr(buf,tbuf,sz); - } - if (action->type==XkbSA_LockDeviceBtn) { - switch (act->flags&(XkbSA_LockNoUnlock|XkbSA_LockNoLock)) { - case XkbSA_LockNoLock: - sprintf(tbuf,",affect=unlock"); break; - case XkbSA_LockNoUnlock: - sprintf(tbuf,",affect=lock"); break; - case XkbSA_LockNoUnlock|XkbSA_LockNoLock: - sprintf(tbuf,",affect=neither"); break; - default: - sprintf(tbuf,",affect=both"); break; - } - TryCopyStr(buf,tbuf,sz); + XkbDeviceBtnAction *act; + char tbuf[32]; + + act = &action->devbtn; + sprintf(tbuf, "device= %d", act->device); + TryCopyStr(buf, tbuf, sz); + TryCopyStr(buf, ",button=", sz); + sprintf(tbuf, "%d", act->button); + TryCopyStr(buf, tbuf, sz); + if (act->count > 0) { + sprintf(tbuf, ",count=%d", act->count); + TryCopyStr(buf, tbuf, sz); + } + if (action->type == XkbSA_LockDeviceBtn) { + switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) { + case XkbSA_LockNoLock: + sprintf(tbuf, ",affect=unlock"); + break; + case XkbSA_LockNoUnlock: + sprintf(tbuf, ",affect=lock"); + break; + case XkbSA_LockNoUnlock | XkbSA_LockNoLock: + sprintf(tbuf, ",affect=neither"); + break; + default: + sprintf(tbuf, ",affect=both"); + break; + } + TryCopyStr(buf, tbuf, sz); } return True; } /*ARGSUSED*/ static Bool -CopyOtherArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz) +CopyOtherArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action, + char *buf, int *sz) { -XkbAnyAction * act; -char tbuf[32]; - - act= &action->any; - sprintf(tbuf,"type=0x%02x",act->type); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[0]=0x%02x",act->data[0]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[1]=0x%02x",act->data[1]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[2]=0x%02x",act->data[2]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[3]=0x%02x",act->data[3]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[4]=0x%02x",act->data[4]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[5]=0x%02x",act->data[5]); TryCopyStr(buf,tbuf,sz); - sprintf(tbuf,",data[6]=0x%02x",act->data[6]); TryCopyStr(buf,tbuf,sz); + XkbAnyAction *act; + char tbuf[32]; + + act = &action->any; + sprintf(tbuf, "type=0x%02x", act->type); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[0]=0x%02x", act->data[0]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[1]=0x%02x", act->data[1]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[2]=0x%02x", act->data[2]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[3]=0x%02x", act->data[3]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[4]=0x%02x", act->data[4]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[5]=0x%02x", act->data[5]); + TryCopyStr(buf, tbuf, sz); + sprintf(tbuf, ",data[6]=0x%02x", act->data[6]); + TryCopyStr(buf, tbuf, sz); return True; } -typedef Bool (*actionCopy)( - Display * /* dpy */, - XkbDescPtr /* xkb */, - XkbAction * /* action */, - char * /* buf */, - int* /* sz */ -); -static actionCopy copyActionArgs[XkbSA_NumActions] = { - CopyNoActionArgs /* NoAction */, - CopyModActionArgs /* SetMods */, - CopyModActionArgs /* LatchMods */, - CopyModActionArgs /* LockMods */, - CopyGroupActionArgs /* SetGroup */, - CopyGroupActionArgs /* LatchGroup */, - CopyGroupActionArgs /* LockGroup */, - CopyMovePtrArgs /* MovePtr */, - CopyPtrBtnArgs /* PtrBtn */, - CopyPtrBtnArgs /* LockPtrBtn */, - CopySetPtrDfltArgs /* SetPtrDflt */, - CopyISOLockArgs /* ISOLock */, - CopyNoActionArgs /* Terminate */, - CopySwitchScreenArgs /* SwitchScreen */, - CopySetLockControlsArgs /* SetControls */, - CopySetLockControlsArgs /* LockControls */, - CopyActionMessageArgs /* ActionMessage*/, - CopyRedirectKeyArgs /* RedirectKey */, - CopyDeviceBtnArgs /* DeviceBtn */, - CopyDeviceBtnArgs /* LockDeviceBtn*/ +typedef Bool (*actionCopy) (Display * /* dpy */ , + XkbDescPtr /* xkb */ , + XkbAction * /* action */ , + char * /* buf */ , + int * /* sz */ + ); + +static actionCopy copyActionArgs[XkbSA_NumActions] = { + CopyNoActionArgs /* NoAction */ , + CopyModActionArgs /* SetMods */ , + CopyModActionArgs /* LatchMods */ , + CopyModActionArgs /* LockMods */ , + CopyGroupActionArgs /* SetGroup */ , + CopyGroupActionArgs /* LatchGroup */ , + CopyGroupActionArgs /* LockGroup */ , + CopyMovePtrArgs /* MovePtr */ , + CopyPtrBtnArgs /* PtrBtn */ , + CopyPtrBtnArgs /* LockPtrBtn */ , + CopySetPtrDfltArgs /* SetPtrDflt */ , + CopyISOLockArgs /* ISOLock */ , + CopyNoActionArgs /* Terminate */ , + CopySwitchScreenArgs /* SwitchScreen */ , + CopySetLockControlsArgs /* SetControls */ , + CopySetLockControlsArgs /* LockControls */ , + CopyActionMessageArgs /* ActionMessage */ , + CopyRedirectKeyArgs /* RedirectKey */ , + CopyDeviceBtnArgs /* DeviceBtn */ , + CopyDeviceBtnArgs /* LockDeviceBtn */ }; #define ACTION_SZ 256 char * -XkbActionText(Display *dpy,XkbDescPtr xkb,XkbAction *action,unsigned format) +XkbActionText(Display *dpy, XkbDescPtr xkb, XkbAction *action, unsigned format) { -char buf[ACTION_SZ],*tmp; -int sz; + char buf[ACTION_SZ], *tmp; + int sz; - if (format==XkbCFile) { - sprintf(buf, - "{ %20s, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x } }", - XkbActionTypeText(action->type,XkbCFile), - action->any.data[0],action->any.data[1],action->any.data[2], - action->any.data[3],action->any.data[4],action->any.data[5], - action->any.data[6]); + if (format == XkbCFile) { + sprintf(buf, + "{ %20s, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x } }", + XkbActionTypeText(action->type, XkbCFile), + action->any.data[0], action->any.data[1], action->any.data[2], + action->any.data[3], action->any.data[4], action->any.data[5], + action->any.data[6]); } else { - sprintf(buf,"%s(",XkbActionTypeText(action->type,XkbXKBFile)); - sz= ACTION_SZ-strlen(buf)+2; /* room for close paren and NULL */ - if (action->type<(unsigned)XkbSA_NumActions) - (*copyActionArgs[action->type])(dpy,xkb,action,buf,&sz); - else CopyOtherArgs(dpy,xkb,action,buf,&sz); - TryCopyStr(buf,")",&sz); - } - tmp= tbGetBuffer(strlen(buf)+1); - if (tmp!=NULL) - strcpy(tmp,buf); + sprintf(buf, "%s(", XkbActionTypeText(action->type, XkbXKBFile)); + sz = ACTION_SZ - strlen(buf) + 2; /* room for close paren and NULL */ + if (action->type < (unsigned) XkbSA_NumActions) + (*copyActionArgs[action->type]) (dpy, xkb, action, buf, &sz); + else + CopyOtherArgs(dpy, xkb, action, buf, &sz); + TryCopyStr(buf, ")", &sz); + } + tmp = tbGetBuffer(strlen(buf) + 1); + if (tmp != NULL) + strcpy(tmp, buf); return tmp; } char * -XkbBehaviorText(XkbDescPtr xkb,XkbBehavior *behavior,unsigned format) +XkbBehaviorText(XkbDescPtr xkb, XkbBehavior * behavior, unsigned format) { -char buf[256],*tmp; + char buf[256], *tmp; - if (format==XkbCFile) { - if (behavior->type==XkbKB_Default) - sprintf(buf,"{ 0, 0 }"); - else sprintf(buf,"{ %3d, 0x%02x }",behavior->type,behavior->data); + if (format == XkbCFile) { + if (behavior->type == XkbKB_Default) + sprintf(buf, "{ 0, 0 }"); + else + sprintf(buf, "{ %3d, 0x%02x }", behavior->type, behavior->data); } else { - unsigned type,permanent; - type= behavior->type&XkbKB_OpMask; - permanent=((behavior->type&XkbKB_Permanent)!=0); - - if (type==XkbKB_Lock) { - sprintf(buf,"lock= %s",(permanent?"Permanent":"True")); - } - else if (type==XkbKB_RadioGroup) { - int g; - char *tmp; - g= ((behavior->data)&(~XkbKB_RGAllowNone))+1; - if (XkbKB_RGAllowNone&behavior->data) { - sprintf(buf,"allowNone,"); - tmp= &buf[strlen(buf)]; - } - else tmp= buf; - if (permanent) - sprintf(tmp,"permanentRadioGroup= %d",g); - else sprintf(tmp,"radioGroup= %d",g); - } - else if ((type==XkbKB_Overlay1)||(type==XkbKB_Overlay2)) { - int ndx,kc; - char *kn; - - ndx= ((type==XkbKB_Overlay1)?1:2); - kc= behavior->data; - if ((xkb)&&(xkb->names)&&(xkb->names->keys)) - kn= XkbKeyNameText(xkb->names->keys[kc].name,XkbXKBFile); - else { - static char tbuf[8]; - sprintf(tbuf,"%d",kc); - kn= tbuf; - } - if (permanent) - sprintf(buf,"permanentOverlay%d= %s",ndx,kn); - else sprintf(buf,"overlay%d= %s",ndx,kn); - } - } - tmp= tbGetBuffer(strlen(buf)+1); - if (tmp!=NULL) - strcpy(tmp,buf); + unsigned type, permanent; + + type = behavior->type & XkbKB_OpMask; + permanent = ((behavior->type & XkbKB_Permanent) != 0); + + if (type == XkbKB_Lock) { + sprintf(buf, "lock= %s", (permanent ? "Permanent" : "True")); + } + else if (type == XkbKB_RadioGroup) { + int g; + char *tmp; + + g = ((behavior->data) & (~XkbKB_RGAllowNone)) + 1; + if (XkbKB_RGAllowNone & behavior->data) { + sprintf(buf, "allowNone,"); + tmp = &buf[strlen(buf)]; + } + else + tmp = buf; + if (permanent) + sprintf(tmp, "permanentRadioGroup= %d", g); + else + sprintf(tmp, "radioGroup= %d", g); + } + else if ((type == XkbKB_Overlay1) || (type == XkbKB_Overlay2)) { + int ndx, kc; + char *kn; + + ndx = ((type == XkbKB_Overlay1) ? 1 : 2); + kc = behavior->data; + if ((xkb) && (xkb->names) && (xkb->names->keys)) + kn = XkbKeyNameText(xkb->names->keys[kc].name, XkbXKBFile); + else { + static char tbuf[8]; + + sprintf(tbuf, "%d", kc); + kn = tbuf; + } + if (permanent) + sprintf(buf, "permanentOverlay%d= %s", ndx, kn); + else + sprintf(buf, "overlay%d= %s", ndx, kn); + } + } + tmp = tbGetBuffer(strlen(buf) + 1); + if (tmp != NULL) + strcpy(tmp, buf); return tmp; } @@ -1339,16 +1474,16 @@ char buf[256],*tmp; char * XkbIndentText(unsigned size) { -static char buf[32]; -register int i; + static char buf[32]; + register int i; - if (size>31) - size= 31; + if (size > 31) + size = 31; - for (i=0;i<size;i++) { - buf[i]= ' '; + for (i = 0; i < size; i++) { + buf[i] = ' '; } - buf[size]= '\0'; + buf[size] = '\0'; return buf; } @@ -1359,81 +1494,81 @@ register int i; #define PIXEL_MAX 65535 Bool -XkbLookupCanonicalRGBColor(char *def,XColor *color) +XkbLookupCanonicalRGBColor(char *def, XColor *color) { -int tmp; - - if (_XkbStrCaseEqual(def,"black")) { - color->red= color->green= color->blue= 0; - return True; - } - else if (_XkbStrCaseEqual(def,"white")) { - color->red= color->green= color->blue= PIXEL_MAX; - return True; - } - else if ((sscanf(def,"grey%d",&tmp)==1)|| - (sscanf(def,"gray%d",&tmp)==1)|| - (sscanf(def,"Grey%d",&tmp)==1)|| - (sscanf(def,"Gray%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->red= color->green= color->blue= tmp; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"red")*100))|| - (sscanf(def,"red%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->red= tmp; - color->green= color->blue= 0; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"green")*100))|| - (sscanf(def,"green%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->green= tmp; - color->red= color->blue= 0; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"blue")*100))|| - (sscanf(def,"blue%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->blue= tmp; - color->red= color->green= 0; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"magenta")*100))|| - (sscanf(def,"magenta%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->green= 0; - color->red= color->blue= tmp; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"cyan")*100))|| - (sscanf(def,"cyan%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->red= 0; - color->green= color->blue= tmp; - return True; - } - } - else if ((tmp=(_XkbStrCaseEqual(def,"yellow")*100))|| - (sscanf(def,"yellow%d",&tmp)==1)) { - if ((tmp>0)&&(tmp<=100)) { - tmp= (PIXEL_MAX*tmp)/100; - color->blue= 0; - color->red= color->green= tmp; - return True; - } + int tmp; + + if (_XkbStrCaseEqual(def, "black")) { + color->red = color->green = color->blue = 0; + return True; + } + else if (_XkbStrCaseEqual(def, "white")) { + color->red = color->green = color->blue = PIXEL_MAX; + return True; + } + else if ((sscanf(def, "grey%d", &tmp) == 1) || + (sscanf(def, "gray%d", &tmp) == 1) || + (sscanf(def, "Grey%d", &tmp) == 1) || + (sscanf(def, "Gray%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->red = color->green = color->blue = tmp; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "red") * 100)) || + (sscanf(def, "red%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->red = tmp; + color->green = color->blue = 0; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "green") * 100)) || + (sscanf(def, "green%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->green = tmp; + color->red = color->blue = 0; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "blue") * 100)) || + (sscanf(def, "blue%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->blue = tmp; + color->red = color->green = 0; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "magenta") * 100)) || + (sscanf(def, "magenta%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->green = 0; + color->red = color->blue = tmp; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "cyan") * 100)) || + (sscanf(def, "cyan%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->red = 0; + color->green = color->blue = tmp; + return True; + } + } + else if ((tmp = (_XkbStrCaseEqual(def, "yellow") * 100)) || + (sscanf(def, "yellow%d", &tmp) == 1)) { + if ((tmp > 0) && (tmp <= 100)) { + tmp = (PIXEL_MAX * tmp) / 100; + color->blue = 0; + color->red = color->green = tmp; + return True; + } } return False; } diff --git a/src/xkmout.c b/src/xkmout.c index 1e43157..8f54e14 100644 --- a/src/xkmout.c +++ b/src/xkmout.c @@ -39,13 +39,13 @@ #include "XKBfileInt.h" typedef struct _XkmInfo { - unsigned short bound_vmods; - unsigned short named_vmods; - unsigned char num_bound; - unsigned char group_compat; - unsigned short num_group_compat; - unsigned short num_leds; - int total_vmodmaps; + unsigned short bound_vmods; + unsigned short named_vmods; + unsigned char num_bound; + unsigned char group_compat; + unsigned short num_group_compat; + unsigned short num_leds; + int total_vmodmaps; } XkmInfo; /***====================================================================***/ @@ -53,67 +53,68 @@ typedef struct _XkmInfo { #define xkmPutCARD8(f,v) (putc(v,f),1) static int -xkmPutCARD16(FILE *file,unsigned val) +xkmPutCARD16(FILE *file, unsigned val) { -CARD16 tmp= val; + CARD16 tmp = val; - fwrite(&tmp,2,1,file); + fwrite(&tmp, 2, 1, file); return 2; } static int -xkmPutCARD32(FILE *file,unsigned long val) +xkmPutCARD32(FILE *file, unsigned long val) { -CARD32 tmp= val; + CARD32 tmp = val; - fwrite(&tmp,4,1,file); + fwrite(&tmp, 4, 1, file); return 4; } static int -xkmPutPadding(FILE *file,unsigned pad) +xkmPutPadding(FILE *file, unsigned pad) { -int i; - for (i=0;i<pad;i++) { - putc('\0',file); + int i; + + for (i = 0; i < pad; i++) { + putc('\0', file); } return pad; } static int -xkmPutCountedBytes(FILE *file,char *ptr,unsigned count) +xkmPutCountedBytes(FILE *file, char *ptr, unsigned count) { -register int nOut; -register unsigned pad; - - if (count==0) - return xkmPutCARD32(file,(unsigned long)0); - - xkmPutCARD16(file,count); - nOut= fwrite(ptr,1,count,file); - if (nOut<0) - return 2; - nOut= count+2; - pad= XkbPaddedSize(nOut)-nOut; + register int nOut; + register unsigned pad; + + if (count == 0) + return xkmPutCARD32(file, (unsigned long) 0); + + xkmPutCARD16(file, count); + nOut = fwrite(ptr, 1, count, file); + if (nOut < 0) + return 2; + nOut = count + 2; + pad = XkbPaddedSize(nOut) - nOut; if (pad) - xkmPutPadding(file,pad); - return nOut+pad; + xkmPutPadding(file, pad); + return nOut + pad; } static unsigned xkmSizeCountedString(char *str) { - if (str==NULL) - return 4; - return XkbPaddedSize(strlen(str)+2); + if (str == NULL) + return 4; + return XkbPaddedSize(strlen(str) + 2); } static int -xkmPutCountedString(FILE *file,char *str) +xkmPutCountedString(FILE *file, char *str) { - if (str==NULL) - return xkmPutCARD32(file,(unsigned long)0); - return xkmPutCountedBytes(file,str,strlen(str)); + if (str == NULL) + return xkmPutCARD32(file, (unsigned long) 0); + return xkmPutCountedBytes(file, str, strlen(str)); } #define xkmSizeCountedAtomString(d,a) \ @@ -125,72 +126,72 @@ xkmPutCountedString(FILE *file,char *str) /***====================================================================***/ static unsigned -SizeXKMVirtualMods( XkbFileInfo * result, - XkmInfo * info, - xkmSectionInfo * toc, - int * offset_inout) +SizeXKMVirtualMods(XkbFileInfo *result, XkmInfo *info, + xkmSectionInfo *toc, int *offset_inout) { -Display * dpy; -XkbDescPtr xkb; -unsigned nBound,bound; -unsigned nNamed,named,szNames; -register unsigned i,bit; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->names)||(!xkb->server)) { - _XkbLibError(_XkbErrMissingVMods,"SizeXKMVirtualMods",0); - return 0; + Display *dpy; + XkbDescPtr xkb; + unsigned nBound, bound; + unsigned nNamed, named, szNames; + register unsigned i, bit; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->names) || (!xkb->server)) { + _XkbLibError(_XkbErrMissingVMods, "SizeXKMVirtualMods", 0); + return 0; } - bound=named=0; - for (i=nBound=nNamed=szNames=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (xkb->server->vmods[i]!=XkbNoModifierMask) { - bound|= bit; - nBound++; - } - if (xkb->names->vmods[i]!=None) { - named|= bit; - szNames+= xkmSizeCountedAtomString(dpy,xkb->names->vmods[i]); - nNamed++; - } + bound = named = 0; + for (i = nBound = nNamed = szNames = 0, bit = 1; i < XkbNumVirtualMods; + i++, bit <<= 1) { + if (xkb->server->vmods[i] != XkbNoModifierMask) { + bound |= bit; + nBound++; + } + if (xkb->names->vmods[i] != None) { + named |= bit; + szNames += xkmSizeCountedAtomString(dpy, xkb->names->vmods[i]); + nNamed++; + } } - info->num_bound= nBound; - info->bound_vmods= bound; - info->named_vmods= named; - if ((nBound==0)&&(nNamed==0)) - return 0; - toc->type= XkmVirtualModsIndex; - toc->format= MSBFirst; - toc->size= 4+XkbPaddedSize(nBound)+szNames+SIZEOF(xkmSectionInfo); - toc->offset= *offset_inout; - (*offset_inout)+= toc->size; + info->num_bound = nBound; + info->bound_vmods = bound; + info->named_vmods = named; + if ((nBound == 0) && (nNamed == 0)) + return 0; + toc->type = XkmVirtualModsIndex; + toc->format = MSBFirst; + toc->size = 4 + XkbPaddedSize(nBound) + szNames + SIZEOF(xkmSectionInfo); + toc->offset = *offset_inout; + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMVirtualMods(FILE *file,XkbFileInfo *result,XkmInfo *info) +WriteXKMVirtualMods(FILE *file, XkbFileInfo *result, XkmInfo *info) { -register unsigned int i,bit; -XkbDescPtr xkb; -Display * dpy; -unsigned size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - size+= xkmPutCARD16(file,info->bound_vmods); - size+= xkmPutCARD16(file,info->named_vmods); - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (info->bound_vmods&bit) - size+= xkmPutCARD8(file,xkb->server->vmods[i]); + register unsigned int i, bit; + XkbDescPtr xkb; + Display *dpy; + unsigned size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + size += xkmPutCARD16(file, info->bound_vmods); + size += xkmPutCARD16(file, info->named_vmods); + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + if (info->bound_vmods & bit) + size += xkmPutCARD8(file, xkb->server->vmods[i]); } - if ((i= XkbPaddedSize(info->num_bound)-info->num_bound)>0) - size+= xkmPutPadding(file,i); - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (info->named_vmods&bit) { - register char *name; - name= XkbAtomGetString(dpy,xkb->names->vmods[i]); - size+= xkmPutCountedString(file,name); - } + if ((i = XkbPaddedSize(info->num_bound) - info->num_bound) > 0) + size += xkmPutPadding(file, i); + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + if (info->named_vmods & bit) { + register char *name; + + name = XkbAtomGetString(dpy, xkb->names->vmods[i]); + size += xkmPutCountedString(file, name); + } } return size; } @@ -198,62 +199,62 @@ unsigned size= 0; /***====================================================================***/ static unsigned -SizeXKMKeycodes(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout) +SizeXKMKeycodes(XkbFileInfo *result, xkmSectionInfo *toc, int *offset_inout) { -XkbDescPtr xkb; -Atom kcName; -int size=0; -Display * dpy; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) { - _XkbLibError(_XkbErrMissingNames,"SizeXKMKeycodes",0); - return 0; + XkbDescPtr xkb; + Atom kcName; + int size = 0; + Display *dpy; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->names) || (!xkb->names->keys)) { + _XkbLibError(_XkbErrMissingNames, "SizeXKMKeycodes", 0); + return 0; } - kcName= xkb->names->keycodes; - size+= 4; /* min and max keycode */ - size+= xkmSizeCountedAtomString(dpy,kcName); - size+= XkbNumKeys(xkb)*sizeof(XkbKeyNameRec); - if (xkb->names->num_key_aliases>0) { - if (xkb->names->key_aliases!=NULL) - size+= xkb->names->num_key_aliases*sizeof(XkbKeyAliasRec); - else xkb->names->num_key_aliases= 0; + kcName = xkb->names->keycodes; + size += 4; /* min and max keycode */ + size += xkmSizeCountedAtomString(dpy, kcName); + size += XkbNumKeys(xkb) * sizeof(XkbKeyNameRec); + if (xkb->names->num_key_aliases > 0) { + if (xkb->names->key_aliases != NULL) + size += xkb->names->num_key_aliases * sizeof(XkbKeyAliasRec); + else + xkb->names->num_key_aliases = 0; } - toc->type= XkmKeyNamesIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + toc->type = XkmKeyNamesIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMKeycodes(FILE *file,XkbFileInfo *result) +WriteXKMKeycodes(FILE *file, XkbFileInfo *result) { -XkbDescPtr xkb; -Atom kcName; -char *start; -Display * dpy; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - kcName= xkb->names->keycodes; - start= xkb->names->keys[xkb->min_key_code].name; - - size+= xkmPutCountedString(file,XkbAtomGetString(dpy,kcName)); - size+= xkmPutCARD8(file,xkb->min_key_code); - size+= xkmPutCARD8(file,xkb->max_key_code); - size+= xkmPutCARD8(file,xkb->names->num_key_aliases); - size+= xkmPutPadding(file,1); - tmp= fwrite(start,sizeof(XkbKeyNameRec),XkbNumKeys(xkb),file); - size+= tmp*sizeof(XkbKeyNameRec); - if (xkb->names->num_key_aliases>0) { - tmp= fwrite((char *)xkb->names->key_aliases, - sizeof(XkbKeyAliasRec),xkb->names->num_key_aliases, - file); - size+= tmp*sizeof(XkbKeyAliasRec); + XkbDescPtr xkb; + Atom kcName; + char *start; + Display *dpy; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + kcName = xkb->names->keycodes; + start = xkb->names->keys[xkb->min_key_code].name; + + size += xkmPutCountedString(file, XkbAtomGetString(dpy, kcName)); + size += xkmPutCARD8(file, xkb->min_key_code); + size += xkmPutCARD8(file, xkb->max_key_code); + size += xkmPutCARD8(file, xkb->names->num_key_aliases); + size += xkmPutPadding(file, 1); + tmp = fwrite(start, sizeof(XkbKeyNameRec), XkbNumKeys(xkb), file); + size += tmp * sizeof(XkbKeyNameRec); + if (xkb->names->num_key_aliases > 0) { + tmp = fwrite((char *) xkb->names->key_aliases, + sizeof(XkbKeyAliasRec), xkb->names->num_key_aliases, file); + size += tmp * sizeof(XkbKeyAliasRec); } return size; } @@ -261,107 +262,116 @@ unsigned tmp,size= 0; /***====================================================================***/ static unsigned -SizeXKMKeyTypes(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout) +SizeXKMKeyTypes(XkbFileInfo *result, xkmSectionInfo *toc, int *offset_inout) { -register unsigned i,n,size; -XkbKeyTypePtr type; -XkbDescPtr xkb; -Display * dpy; -char * name; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->map)||(!xkb->map->types)) { - _XkbLibError(_XkbErrMissingTypes,"SizeXKBKeyTypes",0); - return 0; + register unsigned i, n, size; + XkbKeyTypePtr type; + XkbDescPtr xkb; + Display *dpy; + char *name; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->map) || (!xkb->map->types)) { + _XkbLibError(_XkbErrMissingTypes, "SizeXKBKeyTypes", 0); + return 0; } - if (xkb->map->num_types<XkbNumRequiredTypes) { - _XkbLibError(_XkbErrMissingReqTypes,"SizeXKBKeyTypes",0); - return 0; + if (xkb->map->num_types < XkbNumRequiredTypes) { + _XkbLibError(_XkbErrMissingReqTypes, "SizeXKBKeyTypes", 0); + return 0; } - if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->types); - else name= NULL; - size= xkmSizeCountedString(name); - size+= 4; /* room for # of key types + padding */ - for (i=0,type=xkb->map->types;i<xkb->map->num_types;i++,type++) { - size+= SIZEOF(xkmKeyTypeDesc); - size+= SIZEOF(xkmKTMapEntryDesc)*type->map_count; - size+= xkmSizeCountedAtomString(dpy,type->name); - if (type->preserve) - size+= SIZEOF(xkmModsDesc)*type->map_count; - if (type->level_names) { - Atom *names; - names= type->level_names; - for (n=0;n<(unsigned)type->num_levels;n++) { - size+= xkmSizeCountedAtomString(dpy,names[n]); - } - } + if (xkb->names) + name = XkbAtomGetString(dpy, xkb->names->types); + else + name = NULL; + size = xkmSizeCountedString(name); + size += 4; /* room for # of key types + padding */ + for (i = 0, type = xkb->map->types; i < xkb->map->num_types; i++, type++) { + size += SIZEOF(xkmKeyTypeDesc); + size += SIZEOF(xkmKTMapEntryDesc) * type->map_count; + size += xkmSizeCountedAtomString(dpy, type->name); + if (type->preserve) + size += SIZEOF(xkmModsDesc) * type->map_count; + if (type->level_names) { + Atom *names; + + names = type->level_names; + for (n = 0; n < (unsigned) type->num_levels; n++) { + size += xkmSizeCountedAtomString(dpy, names[n]); + } + } } - toc->type= XkmTypesIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + toc->type = XkmTypesIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMKeyTypes(FILE *file,XkbFileInfo *result) +WriteXKMKeyTypes(FILE *file, XkbFileInfo *result) { -register unsigned i,n; -XkbDescPtr xkb; -XkbKeyTypePtr type; -xkmKeyTypeDesc wire; -XkbKTMapEntryPtr entry; -xkmKTMapEntryDesc wire_entry; -Atom * names; -Display * dpy; -unsigned tmp,size= 0; -char * name; - - xkb= result->xkb; - dpy= xkb->dpy; - if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->types); - else name= NULL; - size+= xkmPutCountedString(file,name); - size+= xkmPutCARD16(file,xkb->map->num_types); - size+= xkmPutPadding(file,2); - type= xkb->map->types; - for (i=0;i<xkb->map->num_types;i++,type++) { - wire.realMods= type->mods.real_mods; - wire.virtualMods= type->mods.vmods; - wire.numLevels= type->num_levels; - wire.nMapEntries= type->map_count; - wire.preserve= (type->preserve!=NULL); - if (type->level_names!=NULL) - wire.nLevelNames= type->num_levels; - else wire.nLevelNames= 0; - tmp= fwrite(&wire,SIZEOF(xkmKeyTypeDesc),1,file); - size+= tmp*SIZEOF(xkmKeyTypeDesc); - for (n=0,entry= type->map;n<type->map_count;n++,entry++) { - wire_entry.level= entry->level; - wire_entry.realMods= entry->mods.real_mods; - wire_entry.virtualMods= entry->mods.vmods; - tmp= fwrite(&wire_entry,SIZEOF(xkmKTMapEntryDesc),1,file); - size+= tmp*SIZEOF(xkmKTMapEntryDesc); - } - size+= xkmPutCountedString(file,XkbAtomGetString(dpy,type->name)); - if (type->preserve) { - xkmModsDesc p_entry; - XkbModsPtr pre; - for (n=0,pre=type->preserve;n<type->map_count;n++,pre++) { - p_entry.realMods= pre->real_mods; - p_entry.virtualMods= pre->vmods; - tmp= fwrite(&p_entry,SIZEOF(xkmModsDesc),1,file); - size+= tmp*SIZEOF(xkmModsDesc); - } - } - if (type->level_names!=NULL) { - names= type->level_names; - for (n=0;n<wire.nLevelNames;n++) { - size+= xkmPutCountedString(file,XkbAtomGetString(dpy,names[n])); - } - } + register unsigned i, n; + XkbDescPtr xkb; + XkbKeyTypePtr type; + xkmKeyTypeDesc wire; + XkbKTMapEntryPtr entry; + xkmKTMapEntryDesc wire_entry; + Atom *names; + Display *dpy; + unsigned tmp, size = 0; + char *name; + + xkb = result->xkb; + dpy = xkb->dpy; + if (xkb->names) + name = XkbAtomGetString(dpy, xkb->names->types); + else + name = NULL; + size += xkmPutCountedString(file, name); + size += xkmPutCARD16(file, xkb->map->num_types); + size += xkmPutPadding(file, 2); + type = xkb->map->types; + for (i = 0; i < xkb->map->num_types; i++, type++) { + wire.realMods = type->mods.real_mods; + wire.virtualMods = type->mods.vmods; + wire.numLevels = type->num_levels; + wire.nMapEntries = type->map_count; + wire.preserve = (type->preserve != NULL); + if (type->level_names != NULL) + wire.nLevelNames = type->num_levels; + else + wire.nLevelNames = 0; + tmp = fwrite(&wire, SIZEOF(xkmKeyTypeDesc), 1, file); + size += tmp * SIZEOF(xkmKeyTypeDesc); + for (n = 0, entry = type->map; n < type->map_count; n++, entry++) { + wire_entry.level = entry->level; + wire_entry.realMods = entry->mods.real_mods; + wire_entry.virtualMods = entry->mods.vmods; + tmp = fwrite(&wire_entry, SIZEOF(xkmKTMapEntryDesc), 1, file); + size += tmp * SIZEOF(xkmKTMapEntryDesc); + } + size += xkmPutCountedString(file, XkbAtomGetString(dpy, type->name)); + if (type->preserve) { + xkmModsDesc p_entry; + + XkbModsPtr pre; + + for (n = 0, pre = type->preserve; n < type->map_count; n++, pre++) { + p_entry.realMods = pre->real_mods; + p_entry.virtualMods = pre->vmods; + tmp = fwrite(&p_entry, SIZEOF(xkmModsDesc), 1, file); + size += tmp * SIZEOF(xkmModsDesc); + } + } + if (type->level_names != NULL) { + names = type->level_names; + for (n = 0; n < wire.nLevelNames; n++) { + size += + xkmPutCountedString(file, XkbAtomGetString(dpy, names[n])); + } + } } return size; } @@ -369,96 +379,100 @@ char * name; /***====================================================================***/ static unsigned -SizeXKMCompatMap( XkbFileInfo * result, - XkmInfo * info, - xkmSectionInfo * toc, - int * offset_inout) +SizeXKMCompatMap(XkbFileInfo *result, XkmInfo *info, + xkmSectionInfo *toc, int *offset_inout) { -XkbDescPtr xkb; -char * name; -int size; -register int i; -unsigned groups,nGroups; -Display * dpy; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) { - _XkbLibError(_XkbErrMissingCompatMap,"SizeXKMCompatMap",0); - return 0; + XkbDescPtr xkb; + char *name; + int size; + register int i; + unsigned groups, nGroups; + Display *dpy; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->compat) || (!xkb->compat->sym_interpret)) { + _XkbLibError(_XkbErrMissingCompatMap, "SizeXKMCompatMap", 0); + return 0; } - if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->compat); - else name= NULL; - - for (i=groups=nGroups=0;i<XkbNumKbdGroups;i++) { - if ((xkb->compat->groups[i].real_mods!=0)|| - (xkb->compat->groups[i].vmods!=0)) { - groups|= (1<<i); - nGroups++; - } + if (xkb->names) + name = XkbAtomGetString(dpy, xkb->names->compat); + else + name = NULL; + + for (i = groups = nGroups = 0; i < XkbNumKbdGroups; i++) { + if ((xkb->compat->groups[i].real_mods != 0) || + (xkb->compat->groups[i].vmods != 0)) { + groups |= (1 << i); + nGroups++; + } } - info->group_compat= groups; - info->num_group_compat= nGroups; - size= 4; /* room for num_si and group_compat mask */ - size+= xkmSizeCountedString(name); - size+= (SIZEOF(xkmSymInterpretDesc)*xkb->compat->num_si); - size+= (SIZEOF(xkmModsDesc)*nGroups); - toc->type= XkmCompatMapIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + info->group_compat = groups; + info->num_group_compat = nGroups; + size = 4; /* room for num_si and group_compat mask */ + size += xkmSizeCountedString(name); + size += (SIZEOF(xkmSymInterpretDesc) * xkb->compat->num_si); + size += (SIZEOF(xkmModsDesc) * nGroups); + toc->type = XkmCompatMapIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMCompatMap(FILE *file,XkbFileInfo *result,XkmInfo *info) +WriteXKMCompatMap(FILE *file, XkbFileInfo *result, XkmInfo *info) { -register unsigned i; -char * name; -XkbDescPtr xkb; -XkbSymInterpretPtr interp; -xkmSymInterpretDesc wire; -Display * dpy; -unsigned tmp,size=0; - - xkb= result->xkb; - dpy= xkb->dpy; - if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->compat); - else name= NULL; - size+= xkmPutCountedString(file,name); - size+= xkmPutCARD16(file,xkb->compat->num_si); - size+= xkmPutCARD8(file,info->group_compat); - size+= xkmPutPadding(file,1); - interp= xkb->compat->sym_interpret; - for (i=0;i<xkb->compat->num_si;i++,interp++) { - wire.sym= interp->sym; - wire.mods= interp->mods; - wire.match= interp->match; - wire.virtualMod= interp->virtual_mod; - wire.flags= interp->flags; - wire.actionType= interp->act.type; - wire.actionData[0]= interp->act.data[0]; - wire.actionData[1]= interp->act.data[1]; - wire.actionData[2]= interp->act.data[2]; - wire.actionData[3]= interp->act.data[3]; - wire.actionData[4]= interp->act.data[4]; - wire.actionData[5]= interp->act.data[5]; - wire.actionData[6]= interp->act.data[6]; - tmp= fwrite(&wire,SIZEOF(xkmSymInterpretDesc),1,file); - size+= tmp*SIZEOF(xkmSymInterpretDesc); + register unsigned i; + char *name; + XkbDescPtr xkb; + XkbSymInterpretPtr interp; + xkmSymInterpretDesc wire; + Display *dpy; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + if (xkb->names) + name = XkbAtomGetString(dpy, xkb->names->compat); + else + name = NULL; + size += xkmPutCountedString(file, name); + size += xkmPutCARD16(file, xkb->compat->num_si); + size += xkmPutCARD8(file, info->group_compat); + size += xkmPutPadding(file, 1); + interp = xkb->compat->sym_interpret; + for (i = 0; i < xkb->compat->num_si; i++, interp++) { + wire.sym = interp->sym; + wire.mods = interp->mods; + wire.match = interp->match; + wire.virtualMod = interp->virtual_mod; + wire.flags = interp->flags; + wire.actionType = interp->act.type; + wire.actionData[0] = interp->act.data[0]; + wire.actionData[1] = interp->act.data[1]; + wire.actionData[2] = interp->act.data[2]; + wire.actionData[3] = interp->act.data[3]; + wire.actionData[4] = interp->act.data[4]; + wire.actionData[5] = interp->act.data[5]; + wire.actionData[6] = interp->act.data[6]; + tmp = fwrite(&wire, SIZEOF(xkmSymInterpretDesc), 1, file); + size += tmp * SIZEOF(xkmSymInterpretDesc); } if (info->group_compat) { - register unsigned bit; - xkmModsDesc modsWire; - for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { - if (info->group_compat&bit) { - modsWire.realMods= xkb->compat->groups[i].real_mods; - modsWire.virtualMods= xkb->compat->groups[i].vmods; - fwrite(&modsWire,SIZEOF(xkmModsDesc),1,file); - size+= SIZEOF(xkmModsDesc); - } - } + register unsigned bit; + + xkmModsDesc modsWire; + + for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) { + if (info->group_compat & bit) { + modsWire.realMods = xkb->compat->groups[i].real_mods; + modsWire.virtualMods = xkb->compat->groups[i].vmods; + fwrite(&modsWire, SIZEOF(xkmModsDesc), 1, file); + size += SIZEOF(xkmModsDesc); + } + } } return size; } @@ -466,171 +480,183 @@ unsigned tmp,size=0; /***====================================================================***/ static unsigned -SizeXKMSymbols( XkbFileInfo * result, - XkmInfo * info, - xkmSectionInfo * toc, - int * offset_inout) +SizeXKMSymbols(XkbFileInfo *result, XkmInfo *info, + xkmSectionInfo *toc, int *offset_inout) { -Display * dpy; -XkbDescPtr xkb; -unsigned size; -register int i,nSyms; -char * name; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->map)||((!xkb->map->syms))) { - _XkbLibError(_XkbErrMissingSymbols,"SizeXKMSymbols",0); - return 0; + Display *dpy; + XkbDescPtr xkb; + unsigned size; + register int i, nSyms; + char *name; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->map) || ((!xkb->map->syms))) { + _XkbLibError(_XkbErrMissingSymbols, "SizeXKMSymbols", 0); + return 0; } - if (xkb->names && (xkb->names->symbols!=None)) - name= XkbAtomGetString(dpy,xkb->names->symbols); - else name= NULL; - size= xkmSizeCountedString(name); - size+= 4; /* min and max keycode, group names mask */ - for (i=0;i<XkbNumKbdGroups;i++) { - if (xkb->names->groups[i]!=None) - size+= xkmSizeCountedAtomString(dpy,xkb->names->groups[i]); + if (xkb->names && (xkb->names->symbols != None)) + name = XkbAtomGetString(dpy, xkb->names->symbols); + else + name = NULL; + size = xkmSizeCountedString(name); + size += 4; /* min and max keycode, group names mask */ + for (i = 0; i < XkbNumKbdGroups; i++) { + if (xkb->names->groups[i] != None) + size += xkmSizeCountedAtomString(dpy, xkb->names->groups[i]); } - info->total_vmodmaps= 0; - for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) { - nSyms= XkbKeyNumSyms(xkb,i); - size+= SIZEOF(xkmKeySymMapDesc)+(nSyms*4); - if (xkb->server) { - if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) { - register int g; - for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) { - if (xkb->server->explicit[i]&(1<<g)) { - XkbKeyTypePtr type; - char * name; - type= XkbKeyKeyType(xkb,i,g); - name= XkbAtomGetString(dpy,type->name); - if (name!=NULL) - size+= xkmSizeCountedString(name); - } - } - } - if (XkbKeyHasActions(xkb,i)) - size+= nSyms*SIZEOF(xkmActionDesc); - if (xkb->server->behaviors[i].type!=XkbKB_Default) - size+= SIZEOF(xkmBehaviorDesc); - if (xkb->server->vmodmap && (xkb->server->vmodmap[i]!=0)) - info->total_vmodmaps++; - } + info->total_vmodmaps = 0; + for (i = xkb->min_key_code; i <= (int) xkb->max_key_code; i++) { + nSyms = XkbKeyNumSyms(xkb, i); + size += SIZEOF(xkmKeySymMapDesc) + (nSyms * 4); + if (xkb->server) { + if (xkb->server->explicit[i] & XkbExplicitKeyTypesMask) { + register int g; + + for (g = XkbKeyNumGroups(xkb, i) - 1; g >= 0; g--) { + if (xkb->server->explicit[i] & (1 << g)) { + XkbKeyTypePtr type; + char *name; + + type = XkbKeyKeyType(xkb, i, g); + name = XkbAtomGetString(dpy, type->name); + if (name != NULL) + size += xkmSizeCountedString(name); + } + } + } + if (XkbKeyHasActions(xkb, i)) + size += nSyms * SIZEOF(xkmActionDesc); + if (xkb->server->behaviors[i].type != XkbKB_Default) + size += SIZEOF(xkmBehaviorDesc); + if (xkb->server->vmodmap && (xkb->server->vmodmap[i] != 0)) + info->total_vmodmaps++; + } } - size+= info->total_vmodmaps*SIZEOF(xkmVModMapDesc); - toc->type= XkmSymbolsIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + size += info->total_vmodmaps * SIZEOF(xkmVModMapDesc); + toc->type = XkmSymbolsIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMSymbols(FILE *file,XkbFileInfo *result,XkmInfo *info) +WriteXKMSymbols(FILE *file, XkbFileInfo *result, XkmInfo *info) { -Display * dpy; -XkbDescPtr xkb; -register int i,n; -xkmKeySymMapDesc wireMap; -char * name; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - if (xkb->names && (xkb->names->symbols!=None)) - name= XkbAtomGetString(dpy,xkb->names->symbols); - else name= NULL; - size+= xkmPutCountedString(file,name); - for (tmp=i=0;i<XkbNumKbdGroups;i++) { - if (xkb->names->groups[i]!=None) - tmp|= (1<<i); + Display *dpy; + XkbDescPtr xkb; + register int i, n; + xkmKeySymMapDesc wireMap; + char *name; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + if (xkb->names && (xkb->names->symbols != None)) + name = XkbAtomGetString(dpy, xkb->names->symbols); + else + name = NULL; + size += xkmPutCountedString(file, name); + for (tmp = i = 0; i < XkbNumKbdGroups; i++) { + if (xkb->names->groups[i] != None) + tmp |= (1 << i); } - size+= xkmPutCARD8(file,xkb->min_key_code); - size+= xkmPutCARD8(file,xkb->max_key_code); - size+= xkmPutCARD8(file,tmp); - size+= xkmPutCARD8(file,info->total_vmodmaps); - for (i=0,n=1;i<XkbNumKbdGroups;i++,n<<=1) { - if ((tmp&n)==0) - continue; - size+= xkmPutCountedAtomString(dpy,file,xkb->names->groups[i]); + size += xkmPutCARD8(file, xkb->min_key_code); + size += xkmPutCARD8(file, xkb->max_key_code); + size += xkmPutCARD8(file, tmp); + size += xkmPutCARD8(file, info->total_vmodmaps); + for (i = 0, n = 1; i < XkbNumKbdGroups; i++, n <<= 1) { + if ((tmp & n) == 0) + continue; + size += xkmPutCountedAtomString(dpy, file, xkb->names->groups[i]); } - for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) { - char *typeName[XkbNumKbdGroups]; - wireMap.width= XkbKeyGroupsWidth(xkb,i); - wireMap.num_groups= XkbKeyGroupInfo(xkb,i); - if (xkb->map && xkb->map->modmap) - wireMap.modifier_map= xkb->map->modmap[i]; - else wireMap.modifier_map= 0; - wireMap.flags= 0; - bzero((char *)typeName,XkbNumKbdGroups*sizeof(char *)); - if (xkb->server) { - if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) { - register int g; - for (g=0;g<XkbKeyNumGroups(xkb,i);g++) { - if (xkb->server->explicit[i]&(1<<g)) { - XkbKeyTypePtr type; - type= XkbKeyKeyType(xkb,i,g); - typeName[g]= XkbAtomGetString(dpy,type->name); - if (typeName[g]!=NULL) - wireMap.flags|= (1<<g); - } - } - } - if (XkbKeyHasActions(xkb,i)) - wireMap.flags|= XkmKeyHasActions; - if (xkb->server->behaviors[i].type!=XkbKB_Default) - wireMap.flags|= XkmKeyHasBehavior; - if ((xkb->server->explicit[i]&XkbExplicitAutoRepeatMask)&& - (xkb->ctrls!=NULL)) { - if (xkb->ctrls->per_key_repeat[(i/8)]&(1<<(i%8))) - wireMap.flags|= XkmRepeatingKey; - else wireMap.flags|= XkmNonRepeatingKey; - } - } - tmp= fwrite(&wireMap,SIZEOF(xkmKeySymMapDesc),1,file); - size+= tmp*SIZEOF(xkmKeySymMapDesc); - if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) { - register int g; - for (g=0;g<XkbNumKbdGroups;g++) { - if (typeName[g]!=NULL) - size+= xkmPutCountedString(file,typeName[g]); - } - } - if (XkbNumGroups(wireMap.num_groups)>0) { - KeySym *sym; - sym= XkbKeySymsPtr(xkb,i); - for (n=XkbKeyNumSyms(xkb,i);n>0;n--,sym++) { - size+= xkmPutCARD32(file,(CARD32)*sym); - } - if (wireMap.flags&XkmKeyHasActions) { - XkbAction * act; - act= XkbKeyActionsPtr(xkb,i); - for (n=XkbKeyNumActions(xkb,i);n>0;n--,act++) { - tmp= fwrite(act,SIZEOF(xkmActionDesc),1,file); - size+= tmp*SIZEOF(xkmActionDesc); - } - } - } - if (wireMap.flags&XkmKeyHasBehavior) { - xkmBehaviorDesc b; - b.type= xkb->server->behaviors[i].type; - b.data= xkb->server->behaviors[i].data; - tmp= fwrite(&b,SIZEOF(xkmBehaviorDesc),1,file); - size+= tmp*SIZEOF(xkmBehaviorDesc); - } + for (i = xkb->min_key_code; i <= (int) xkb->max_key_code; i++) { + char *typeName[XkbNumKbdGroups]; + + wireMap.width = XkbKeyGroupsWidth(xkb, i); + wireMap.num_groups = XkbKeyGroupInfo(xkb, i); + if (xkb->map && xkb->map->modmap) + wireMap.modifier_map = xkb->map->modmap[i]; + else + wireMap.modifier_map = 0; + wireMap.flags = 0; + bzero((char *) typeName, XkbNumKbdGroups * sizeof(char *)); + if (xkb->server) { + if (xkb->server->explicit[i] & XkbExplicitKeyTypesMask) { + register int g; + + for (g = 0; g < XkbKeyNumGroups(xkb, i); g++) { + if (xkb->server->explicit[i] & (1 << g)) { + XkbKeyTypePtr type; + + type = XkbKeyKeyType(xkb, i, g); + typeName[g] = XkbAtomGetString(dpy, type->name); + if (typeName[g] != NULL) + wireMap.flags |= (1 << g); + } + } + } + if (XkbKeyHasActions(xkb, i)) + wireMap.flags |= XkmKeyHasActions; + if (xkb->server->behaviors[i].type != XkbKB_Default) + wireMap.flags |= XkmKeyHasBehavior; + if ((xkb->server->explicit[i] & XkbExplicitAutoRepeatMask) && + (xkb->ctrls != NULL)) { + if (xkb->ctrls->per_key_repeat[(i / 8)] & (1 << (i % 8))) + wireMap.flags |= XkmRepeatingKey; + else + wireMap.flags |= XkmNonRepeatingKey; + } + } + tmp = fwrite(&wireMap, SIZEOF(xkmKeySymMapDesc), 1, file); + size += tmp * SIZEOF(xkmKeySymMapDesc); + if (xkb->server->explicit[i] & XkbExplicitKeyTypesMask) { + register int g; + + for (g = 0; g < XkbNumKbdGroups; g++) { + if (typeName[g] != NULL) + size += xkmPutCountedString(file, typeName[g]); + } + } + if (XkbNumGroups(wireMap.num_groups) > 0) { + KeySym *sym; + + sym = XkbKeySymsPtr(xkb, i); + for (n = XkbKeyNumSyms(xkb, i); n > 0; n--, sym++) { + size += xkmPutCARD32(file, (CARD32) *sym); + } + if (wireMap.flags & XkmKeyHasActions) { + XkbAction *act; + + act = XkbKeyActionsPtr(xkb, i); + for (n = XkbKeyNumActions(xkb, i); n > 0; n--, act++) { + tmp = fwrite(act, SIZEOF(xkmActionDesc), 1, file); + size += tmp * SIZEOF(xkmActionDesc); + } + } + } + if (wireMap.flags & XkmKeyHasBehavior) { + xkmBehaviorDesc b; + + b.type = xkb->server->behaviors[i].type; + b.data = xkb->server->behaviors[i].data; + tmp = fwrite(&b, SIZEOF(xkmBehaviorDesc), 1, file); + size += tmp * SIZEOF(xkmBehaviorDesc); + } } - if (info->total_vmodmaps>0) { - xkmVModMapDesc v; - for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { - if (xkb->server->vmodmap[i]!=0) { - v.key= i; - v.vmods= xkb->server->vmodmap[i]; - tmp= fwrite(&v,SIZEOF(xkmVModMapDesc),1,file); - size+= tmp*SIZEOF(xkmVModMapDesc); - } - } + if (info->total_vmodmaps > 0) { + xkmVModMapDesc v; + + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { + if (xkb->server->vmodmap[i] != 0) { + v.key = i; + v.vmods = xkb->server->vmodmap[i]; + tmp = fwrite(&v, SIZEOF(xkmVModMapDesc), 1, file); + size += tmp * SIZEOF(xkmVModMapDesc); + } + } } return size; } @@ -638,90 +664,96 @@ unsigned tmp,size= 0; /***====================================================================***/ static unsigned -SizeXKMIndicators(XkbFileInfo *result,XkmInfo *info,xkmSectionInfo *toc, - int *offset_inout) +SizeXKMIndicators(XkbFileInfo *result, XkmInfo *info, + xkmSectionInfo *toc, int *offset_inout) { -Display * dpy; -XkbDescPtr xkb; -unsigned size; -register unsigned i,nLEDs; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((xkb==NULL)||(xkb->indicators==NULL)) { + Display *dpy; + XkbDescPtr xkb; + unsigned size; + register unsigned i, nLEDs; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((xkb == NULL) || (xkb->indicators == NULL)) { /* _XkbLibError(_XkbErrMissingIndicators,"SizeXKMIndicators",0);*/ - return 0; + return 0; } - nLEDs=0; - size= 8; /* number of indicator maps/physical indicators */ - if (xkb->indicators!=NULL) { - for (i=0;i<XkbNumIndicators;i++) { - XkbIndicatorMapPtr map= &xkb->indicators->maps[i]; - if ((map->flags!=0)||(map->which_groups!=0)||(map->groups!=0)|| - (map->which_mods!=0)|| - (map->mods.real_mods!=0)||(map->mods.vmods!=0)|| - (map->ctrls!=0) || - (xkb->names && (xkb->names->indicators[i]!=None))) { - char *name; - if (xkb->names && xkb->names->indicators[i]!=None) { - name= XkbAtomGetString(dpy,xkb->names->indicators[i]); - } - else name= NULL; - size+= xkmSizeCountedString(name); - size+= SIZEOF(xkmIndicatorMapDesc); - nLEDs++; - } - } + nLEDs = 0; + size = 8; /* number of indicator maps/physical indicators */ + if (xkb->indicators != NULL) { + for (i = 0; i < XkbNumIndicators; i++) { + XkbIndicatorMapPtr map = &xkb->indicators->maps[i]; + + if ((map->flags != 0) || (map->which_groups != 0) || + (map->groups != 0) || (map->which_mods != 0) || + (map->mods.real_mods != 0) || (map->mods.vmods != 0) || + (map->ctrls != 0) || + (xkb->names && (xkb->names->indicators[i] != None))) { + char *name; + + if (xkb->names && xkb->names->indicators[i] != None) { + name = XkbAtomGetString(dpy, xkb->names->indicators[i]); + } + else + name = NULL; + size += xkmSizeCountedString(name); + size += SIZEOF(xkmIndicatorMapDesc); + nLEDs++; + } + } } - info->num_leds= nLEDs; - toc->type= XkmIndicatorsIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + info->num_leds = nLEDs; + toc->type = XkmIndicatorsIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMIndicators(FILE *file,XkbFileInfo *result,XkmInfo *info) +WriteXKMIndicators(FILE *file, XkbFileInfo *result, XkmInfo *info) { -Display * dpy; -XkbDescPtr xkb; -register unsigned i; -xkmIndicatorMapDesc wire; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - size+= xkmPutCARD8(file,info->num_leds); - size+= xkmPutPadding(file,3); - size+= xkmPutCARD32(file,xkb->indicators->phys_indicators); - if (xkb->indicators!=NULL) { - for (i=0;i<XkbNumIndicators;i++) { - XkbIndicatorMapPtr map= &xkb->indicators->maps[i]; - if ((map->flags!=0)||(map->which_groups!=0)||(map->groups!=0)|| - (map->which_mods!=0)|| - (map->mods.real_mods!=0)||(map->mods.vmods!=0)|| - (map->ctrls!=0) || - (xkb->names && (xkb->names->indicators[i]!=None))) { - char *name; - if (xkb->names && xkb->names->indicators[i]!=None) { - name= XkbAtomGetString(dpy,xkb->names->indicators[i]); - } - else name= NULL; - size+= xkmPutCountedString(file,name); - wire.indicator= i+1; - wire.flags= map->flags; - wire.which_mods= map->which_mods; - wire.real_mods= map->mods.real_mods; - wire.vmods= map->mods.vmods; - wire.which_groups= map->which_groups; - wire.groups= map->groups; - wire.ctrls= map->ctrls; - tmp= fwrite(&wire,SIZEOF(xkmIndicatorMapDesc),1,file); - size+= tmp*SIZEOF(xkmIndicatorMapDesc); - } - } + Display *dpy; + XkbDescPtr xkb; + register unsigned i; + xkmIndicatorMapDesc wire; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + size += xkmPutCARD8(file, info->num_leds); + size += xkmPutPadding(file, 3); + size += xkmPutCARD32(file, xkb->indicators->phys_indicators); + if (xkb->indicators != NULL) { + for (i = 0; i < XkbNumIndicators; i++) { + XkbIndicatorMapPtr map = &xkb->indicators->maps[i]; + + if ((map->flags != 0) || (map->which_groups != 0) || + (map->groups != 0) || (map->which_mods != 0) || + (map->mods.real_mods != 0) || (map->mods.vmods != 0) || + (map->ctrls != 0) || (xkb->names && + (xkb->names->indicators[i] != None))) { + char *name; + + if (xkb->names && xkb->names->indicators[i] != None) { + name = XkbAtomGetString(dpy, xkb->names->indicators[i]); + } + else + name = NULL; + size += xkmPutCountedString(file, name); + wire.indicator = i + 1; + wire.flags = map->flags; + wire.which_mods = map->which_mods; + wire.real_mods = map->mods.real_mods; + wire.vmods = map->mods.vmods; + wire.which_groups = map->which_groups; + wire.groups = map->groups; + wire.ctrls = map->ctrls; + tmp = fwrite(&wire, SIZEOF(xkmIndicatorMapDesc), 1, file); + size += tmp * SIZEOF(xkmIndicatorMapDesc); + } + } } return size; } @@ -729,373 +761,408 @@ unsigned tmp,size= 0; /***====================================================================***/ static unsigned -SizeXKMGeomDoodad(XkbFileInfo *result,XkbDoodadPtr doodad) +SizeXKMGeomDoodad(XkbFileInfo *result, XkbDoodadPtr doodad) { -unsigned size; + unsigned size; - size= SIZEOF(xkmAnyDoodadDesc); - size+= xkmSizeCountedAtomString(result->xkb->dpy,doodad->any.name); - if (doodad->any.type==XkbTextDoodad) { - size+= xkmSizeCountedString(doodad->text.text); - size+= xkmSizeCountedString(doodad->text.font); + size = SIZEOF(xkmAnyDoodadDesc); + size += xkmSizeCountedAtomString(result->xkb->dpy, doodad->any.name); + if (doodad->any.type == XkbTextDoodad) { + size += xkmSizeCountedString(doodad->text.text); + size += xkmSizeCountedString(doodad->text.font); } - else if (doodad->any.type==XkbLogoDoodad) { - size+= xkmSizeCountedString(doodad->logo.logo_name); + else if (doodad->any.type == XkbLogoDoodad) { + size += xkmSizeCountedString(doodad->logo.logo_name); } return size; } static unsigned -SizeXKMGeomSection(XkbFileInfo *result,XkbSectionPtr section) +SizeXKMGeomSection(XkbFileInfo *result, XkbSectionPtr section) { -register int i; -unsigned size; + register int i; + unsigned size; - size= SIZEOF(xkmSectionDesc); - size+= xkmSizeCountedAtomString(result->xkb->dpy,section->name); + size = SIZEOF(xkmSectionDesc); + size += xkmSizeCountedAtomString(result->xkb->dpy, section->name); if (section->rows) { - XkbRowPtr row; - for (row=section->rows,i=0;i<section->num_rows;i++,row++) { - size+= SIZEOF(xkmRowDesc); - size+= row->num_keys*SIZEOF(xkmKeyDesc); - } + XkbRowPtr row; + + for (row = section->rows, i = 0; i < section->num_rows; i++, row++) { + size += SIZEOF(xkmRowDesc); + size += row->num_keys * SIZEOF(xkmKeyDesc); + } } if (section->doodads) { - XkbDoodadPtr doodad; - for (doodad=section->doodads,i=0;i<section->num_doodads;i++,doodad++) { - size+= SizeXKMGeomDoodad(result,doodad); - } + XkbDoodadPtr doodad; + + for (doodad = section->doodads, i = 0; i < section->num_doodads; + i++, doodad++) { + size += SizeXKMGeomDoodad(result, doodad); + } } if (section->overlays) { - XkbOverlayPtr ol; - for (ol=section->overlays,i=0;i<section->num_overlays;i++,ol++) { - register int r; - XkbOverlayRowPtr row; - size+= xkmSizeCountedAtomString(result->xkb->dpy,ol->name); - size+= SIZEOF(xkmOverlayDesc); - for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { - size+= SIZEOF(xkmOverlayRowDesc); - size+= row->num_keys*SIZEOF(xkmOverlayKeyDesc); - } - } + XkbOverlayPtr ol; + + for (ol = section->overlays, i = 0; i < section->num_overlays; + i++, ol++) { + register int r; + XkbOverlayRowPtr row; + + size += xkmSizeCountedAtomString(result->xkb->dpy, ol->name); + size += SIZEOF(xkmOverlayDesc); + for (r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { + size += SIZEOF(xkmOverlayRowDesc); + size += row->num_keys * SIZEOF(xkmOverlayKeyDesc); + } + } } return size; } static unsigned -SizeXKMGeometry(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout) +SizeXKMGeometry(XkbFileInfo *result, xkmSectionInfo *toc, int *offset_inout) { -register int i; -Display * dpy; -XkbDescPtr xkb; -XkbGeometryPtr geom; -unsigned size; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->geom)) - return 0; - geom= xkb->geom; - size= xkmSizeCountedAtomString(dpy,geom->name); - size+= SIZEOF(xkmGeometryDesc); - size+= xkmSizeCountedString(geom->label_font); + register int i; + Display *dpy; + XkbDescPtr xkb; + XkbGeometryPtr geom; + unsigned size; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->geom)) + return 0; + geom = xkb->geom; + size = xkmSizeCountedAtomString(dpy, geom->name); + size += SIZEOF(xkmGeometryDesc); + size += xkmSizeCountedString(geom->label_font); if (geom->properties) { - XkbPropertyPtr prop; - for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) { - size+= xkmSizeCountedString(prop->name); - size+= xkmSizeCountedString(prop->value); - } + XkbPropertyPtr prop; + + for (i = 0, prop = geom->properties; i < geom->num_properties; + i++, prop++) { + size += xkmSizeCountedString(prop->name); + size += xkmSizeCountedString(prop->value); + } } if (geom->colors) { - XkbColorPtr color; - for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) { - size+= xkmSizeCountedString(color->spec); - } + XkbColorPtr color; + + for (i = 0, color = geom->colors; i < geom->num_colors; i++, color++) { + size += xkmSizeCountedString(color->spec); + } } if (geom->shapes) { - XkbShapePtr shape; - for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) { - register int n; - register XkbOutlinePtr ol; - size+= xkmSizeCountedAtomString(dpy,shape->name); - size+= SIZEOF(xkmShapeDesc); - for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) { - size+= SIZEOF(xkmOutlineDesc); - size+= ol->num_points*SIZEOF(xkmPointDesc); - } - } + XkbShapePtr shape; + + for (i = 0, shape = geom->shapes; i < geom->num_shapes; i++, shape++) { + register int n; + register XkbOutlinePtr ol; + + size += xkmSizeCountedAtomString(dpy, shape->name); + size += SIZEOF(xkmShapeDesc); + for (n = 0, ol = shape->outlines; n < shape->num_outlines; + n++, ol++) { + size += SIZEOF(xkmOutlineDesc); + size += ol->num_points * SIZEOF(xkmPointDesc); + } + } } if (geom->sections) { - XkbSectionPtr section; - for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) { - size+= SizeXKMGeomSection(result,section); - } + XkbSectionPtr section; + + for (i = 0, section = geom->sections; i < geom->num_sections; + i++, section++) { + size += SizeXKMGeomSection(result, section); + } } - if (geom->doodads) { - XkbDoodadPtr doodad; - for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) { - size+= SizeXKMGeomDoodad(result,doodad); - } + if (geom->doodads) { + XkbDoodadPtr doodad; + + for (i = 0, doodad = geom->doodads; i < geom->num_doodads; + i++, doodad++) { + size += SizeXKMGeomDoodad(result, doodad); + } } if (geom->key_aliases) { - size+= geom->num_key_aliases*(XkbKeyNameLength*2); + size += geom->num_key_aliases * (XkbKeyNameLength * 2); } - toc->type= XkmGeometryIndex; - toc->format= MSBFirst; - toc->size= size+SIZEOF(xkmSectionInfo); - toc->offset= (*offset_inout); - (*offset_inout)+= toc->size; + toc->type = XkmGeometryIndex; + toc->format = MSBFirst; + toc->size = size + SIZEOF(xkmSectionInfo); + toc->offset = (*offset_inout); + (*offset_inout) += toc->size; return 1; } static unsigned -WriteXKMGeomDoodad(FILE *file,XkbFileInfo *result,XkbDoodadPtr doodad) +WriteXKMGeomDoodad(FILE *file, XkbFileInfo *result, XkbDoodadPtr doodad) { -Display * dpy; -XkbDescPtr xkb; -xkmDoodadDesc doodadWire; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - bzero((char *)&doodadWire,sizeof(doodadWire)); - doodadWire.any.type= doodad->any.type; - doodadWire.any.priority= doodad->any.priority; - doodadWire.any.top= doodad->any.top; - doodadWire.any.left= doodad->any.left; + Display *dpy; + XkbDescPtr xkb; + xkmDoodadDesc doodadWire; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + bzero((char *) &doodadWire, sizeof(doodadWire)); + doodadWire.any.type = doodad->any.type; + doodadWire.any.priority = doodad->any.priority; + doodadWire.any.top = doodad->any.top; + doodadWire.any.left = doodad->any.left; switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - doodadWire.shape.angle= doodad->shape.angle; - doodadWire.shape.color_ndx= doodad->shape.color_ndx; - doodadWire.shape.shape_ndx= doodad->shape.shape_ndx; - break; - case XkbTextDoodad: - doodadWire.text.angle= doodad->text.angle; - doodadWire.text.width= doodad->text.width; - doodadWire.text.height= doodad->text.height; - doodadWire.text.color_ndx= doodad->text.color_ndx; - break; - case XkbIndicatorDoodad: - doodadWire.indicator.shape_ndx= doodad->indicator.shape_ndx; - doodadWire.indicator.on_color_ndx= doodad->indicator.on_color_ndx; - doodadWire.indicator.off_color_ndx= doodad->indicator.off_color_ndx; - break; - case XkbLogoDoodad: - doodadWire.logo.angle= doodad->logo.angle; - doodadWire.logo.color_ndx= doodad->logo.color_ndx; - doodadWire.logo.shape_ndx= doodad->logo.shape_ndx; - break; - default: - _XkbLibError(_XkbErrIllegalDoodad,"WriteXKMGeomDoodad", - doodad->any.type); - return 0; + case XkbOutlineDoodad: + case XkbSolidDoodad: + doodadWire.shape.angle = doodad->shape.angle; + doodadWire.shape.color_ndx = doodad->shape.color_ndx; + doodadWire.shape.shape_ndx = doodad->shape.shape_ndx; + break; + case XkbTextDoodad: + doodadWire.text.angle = doodad->text.angle; + doodadWire.text.width = doodad->text.width; + doodadWire.text.height = doodad->text.height; + doodadWire.text.color_ndx = doodad->text.color_ndx; + break; + case XkbIndicatorDoodad: + doodadWire.indicator.shape_ndx = doodad->indicator.shape_ndx; + doodadWire.indicator.on_color_ndx = doodad->indicator.on_color_ndx; + doodadWire.indicator.off_color_ndx = doodad->indicator.off_color_ndx; + break; + case XkbLogoDoodad: + doodadWire.logo.angle = doodad->logo.angle; + doodadWire.logo.color_ndx = doodad->logo.color_ndx; + doodadWire.logo.shape_ndx = doodad->logo.shape_ndx; + break; + default: + _XkbLibError(_XkbErrIllegalDoodad, "WriteXKMGeomDoodad", + doodad->any.type); + return 0; } - size+= xkmPutCountedAtomString(dpy,file,doodad->any.name); - tmp= fwrite(&doodadWire,SIZEOF(xkmDoodadDesc),1,file); - size+= tmp*SIZEOF(xkmDoodadDesc); - if (doodad->any.type==XkbTextDoodad) { - size+= xkmPutCountedString(file,doodad->text.text); - size+= xkmPutCountedString(file,doodad->text.font); + size += xkmPutCountedAtomString(dpy, file, doodad->any.name); + tmp = fwrite(&doodadWire, SIZEOF(xkmDoodadDesc), 1, file); + size += tmp * SIZEOF(xkmDoodadDesc); + if (doodad->any.type == XkbTextDoodad) { + size += xkmPutCountedString(file, doodad->text.text); + size += xkmPutCountedString(file, doodad->text.font); } - else if (doodad->any.type==XkbLogoDoodad) { - size+= xkmPutCountedString(file,doodad->logo.logo_name); + else if (doodad->any.type == XkbLogoDoodad) { + size += xkmPutCountedString(file, doodad->logo.logo_name); } return size; } static unsigned -WriteXKMGeomOverlay(FILE *file,XkbFileInfo *result,XkbOverlayPtr ol) +WriteXKMGeomOverlay(FILE *file, XkbFileInfo *result, XkbOverlayPtr ol) { -register int r,k; -Display * dpy; -XkbDescPtr xkb; -XkbOverlayRowPtr row; -xkmOverlayDesc olWire; -xkmOverlayRowDesc rowWire; -xkmOverlayKeyDesc keyWire; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - bzero((char *)&olWire,sizeof(olWire)); - bzero((char *)&rowWire,sizeof(rowWire)); - bzero((char *)&keyWire,sizeof(keyWire)); - size+= xkmPutCountedAtomString(dpy,file,ol->name); - olWire.num_rows= ol->num_rows; - tmp= fwrite(&olWire,SIZEOF(xkmOverlayDesc),1,file); - size+= tmp*SIZEOF(xkmOverlayDesc); - for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) { - XkbOverlayKeyPtr key; - rowWire.row_under= row->row_under; - rowWire.num_keys= row->num_keys; - tmp= fwrite(&rowWire,SIZEOF(xkmOverlayRowDesc),1,file); - size+= tmp*SIZEOF(xkmOverlayRowDesc); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - memcpy(keyWire.over,key->over.name,XkbKeyNameLength); - memcpy(keyWire.under,key->under.name,XkbKeyNameLength); - tmp= fwrite(&keyWire,SIZEOF(xkmOverlayKeyDesc),1,file); - size+= tmp*SIZEOF(xkmOverlayKeyDesc); - } + register int r, k; + Display *dpy; + XkbDescPtr xkb; + XkbOverlayRowPtr row; + xkmOverlayDesc olWire; + xkmOverlayRowDesc rowWire; + xkmOverlayKeyDesc keyWire; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + bzero((char *) &olWire, sizeof(olWire)); + bzero((char *) &rowWire, sizeof(rowWire)); + bzero((char *) &keyWire, sizeof(keyWire)); + size += xkmPutCountedAtomString(dpy, file, ol->name); + olWire.num_rows = ol->num_rows; + tmp = fwrite(&olWire, SIZEOF(xkmOverlayDesc), 1, file); + size += tmp * SIZEOF(xkmOverlayDesc); + for (r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { + XkbOverlayKeyPtr key; + + rowWire.row_under = row->row_under; + rowWire.num_keys = row->num_keys; + tmp = fwrite(&rowWire, SIZEOF(xkmOverlayRowDesc), 1, file); + size += tmp * SIZEOF(xkmOverlayRowDesc); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + memcpy(keyWire.over, key->over.name, XkbKeyNameLength); + memcpy(keyWire.under, key->under.name, XkbKeyNameLength); + tmp = fwrite(&keyWire, SIZEOF(xkmOverlayKeyDesc), 1, file); + size += tmp * SIZEOF(xkmOverlayKeyDesc); + } } return size; } static unsigned -WriteXKMGeomSection(FILE *file,XkbFileInfo *result,XkbSectionPtr section) +WriteXKMGeomSection(FILE *file, XkbFileInfo *result, XkbSectionPtr section) { -register int i; -Display * dpy; -XkbDescPtr xkb; -xkmSectionDesc sectionWire; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - size+= xkmPutCountedAtomString(dpy,file,section->name); - sectionWire.top= section->top; - sectionWire.left= section->left; - sectionWire.width= section->width; - sectionWire.height= section->height; - sectionWire.angle= section->angle; - sectionWire.priority= section->priority; - sectionWire.num_rows= section->num_rows; - sectionWire.num_doodads= section->num_doodads; - sectionWire.num_overlays= section->num_overlays; - tmp= fwrite(§ionWire,SIZEOF(xkmSectionDesc),1,file); - size+= tmp*SIZEOF(xkmSectionDesc); + register int i; + Display *dpy; + XkbDescPtr xkb; + xkmSectionDesc sectionWire; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + size += xkmPutCountedAtomString(dpy, file, section->name); + sectionWire.top = section->top; + sectionWire.left = section->left; + sectionWire.width = section->width; + sectionWire.height = section->height; + sectionWire.angle = section->angle; + sectionWire.priority = section->priority; + sectionWire.num_rows = section->num_rows; + sectionWire.num_doodads = section->num_doodads; + sectionWire.num_overlays = section->num_overlays; + tmp = fwrite(§ionWire, SIZEOF(xkmSectionDesc), 1, file); + size += tmp * SIZEOF(xkmSectionDesc); if (section->rows) { - register unsigned k; - XkbRowPtr row; - xkmRowDesc rowWire; - XkbKeyPtr key; - xkmKeyDesc keyWire; - for (i=0,row=section->rows;i<section->num_rows;i++,row++) { - rowWire.top= row->top; - rowWire.left= row->left; - rowWire.num_keys= row->num_keys; - rowWire.vertical= row->vertical; - tmp= fwrite(&rowWire,SIZEOF(xkmRowDesc),1,file); - size+= tmp*SIZEOF(xkmRowDesc); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - memcpy(keyWire.name,key->name.name,XkbKeyNameLength); - keyWire.gap= key->gap; - keyWire.shape_ndx= key->shape_ndx; - keyWire.color_ndx= key->color_ndx; - tmp= fwrite(&keyWire,SIZEOF(xkmKeyDesc),1,file); - size+= tmp*SIZEOF(xkmKeyDesc); - } - } + register unsigned k; + XkbRowPtr row; + xkmRowDesc rowWire; + XkbKeyPtr key; + xkmKeyDesc keyWire; + + for (i = 0, row = section->rows; i < section->num_rows; i++, row++) { + rowWire.top = row->top; + rowWire.left = row->left; + rowWire.num_keys = row->num_keys; + rowWire.vertical = row->vertical; + tmp = fwrite(&rowWire, SIZEOF(xkmRowDesc), 1, file); + size += tmp * SIZEOF(xkmRowDesc); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + memcpy(keyWire.name, key->name.name, XkbKeyNameLength); + keyWire.gap = key->gap; + keyWire.shape_ndx = key->shape_ndx; + keyWire.color_ndx = key->color_ndx; + tmp = fwrite(&keyWire, SIZEOF(xkmKeyDesc), 1, file); + size += tmp * SIZEOF(xkmKeyDesc); + } + } } if (section->doodads) { - XkbDoodadPtr doodad; - for (i=0,doodad=section->doodads;i<section->num_doodads;i++,doodad++) { - size+= WriteXKMGeomDoodad(file,result,doodad); - } + XkbDoodadPtr doodad; + + for (i = 0, doodad = section->doodads; i < section->num_doodads; + i++, doodad++) { + size += WriteXKMGeomDoodad(file, result, doodad); + } } if (section->overlays) { - XkbOverlayPtr ol; - for (i=0,ol=section->overlays;i<section->num_overlays;i++,ol++) { - size+= WriteXKMGeomOverlay(file,result,ol); - } + XkbOverlayPtr ol; + + for (i = 0, ol = section->overlays; i < section->num_overlays; + i++, ol++) { + size += WriteXKMGeomOverlay(file, result, ol); + } } return size; } static unsigned -WriteXKMGeometry(FILE *file,XkbFileInfo *result) +WriteXKMGeometry(FILE *file, XkbFileInfo *result) { -register int i; -Display * dpy; -XkbDescPtr xkb; -XkbGeometryPtr geom; -xkmGeometryDesc wire; -unsigned tmp,size= 0; - - xkb= result->xkb; - dpy= xkb->dpy; - if ((!xkb)||(!xkb->geom)) - return 0; - geom= xkb->geom; - wire.width_mm= geom->width_mm; - wire.height_mm= geom->height_mm; - wire.base_color_ndx= XkbGeomColorIndex(geom,geom->base_color); - wire.label_color_ndx= XkbGeomColorIndex(geom,geom->label_color); - wire.num_properties= geom->num_properties; - wire.num_colors= geom->num_colors; - wire.num_shapes= geom->num_shapes; - wire.num_sections= geom->num_sections; - wire.num_doodads= geom->num_doodads; - wire.num_key_aliases= geom->num_key_aliases; - size+= xkmPutCountedAtomString(dpy,file,geom->name); - tmp= fwrite(&wire,SIZEOF(xkmGeometryDesc),1,file); - size+= tmp*SIZEOF(xkmGeometryDesc); - size+= xkmPutCountedString(file,geom->label_font); + register int i; + Display *dpy; + XkbDescPtr xkb; + XkbGeometryPtr geom; + xkmGeometryDesc wire; + unsigned tmp, size = 0; + + xkb = result->xkb; + dpy = xkb->dpy; + if ((!xkb) || (!xkb->geom)) + return 0; + geom = xkb->geom; + wire.width_mm = geom->width_mm; + wire.height_mm = geom->height_mm; + wire.base_color_ndx = XkbGeomColorIndex(geom, geom->base_color); + wire.label_color_ndx = XkbGeomColorIndex(geom, geom->label_color); + wire.num_properties = geom->num_properties; + wire.num_colors = geom->num_colors; + wire.num_shapes = geom->num_shapes; + wire.num_sections = geom->num_sections; + wire.num_doodads = geom->num_doodads; + wire.num_key_aliases = geom->num_key_aliases; + size += xkmPutCountedAtomString(dpy, file, geom->name); + tmp = fwrite(&wire, SIZEOF(xkmGeometryDesc), 1, file); + size += tmp * SIZEOF(xkmGeometryDesc); + size += xkmPutCountedString(file, geom->label_font); if (geom->properties) { - XkbPropertyPtr prop; - for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) { - size+= xkmPutCountedString(file,prop->name); - size+= xkmPutCountedString(file,prop->value); - } + XkbPropertyPtr prop; + + for (i = 0, prop = geom->properties; i < geom->num_properties; + i++, prop++) { + size += xkmPutCountedString(file, prop->name); + size += xkmPutCountedString(file, prop->value); + } } if (geom->colors) { - XkbColorPtr color; - for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) { - size+= xkmPutCountedString(file,color->spec); - } + XkbColorPtr color; + + for (i = 0, color = geom->colors; i < geom->num_colors; i++, color++) { + size += xkmPutCountedString(file, color->spec); + } } if (geom->shapes) { - XkbShapePtr shape; - xkmShapeDesc shapeWire; - - for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) { - register int n; - XkbOutlinePtr ol; - xkmOutlineDesc olWire; - bzero((char *)&shapeWire,sizeof(xkmShapeDesc)); - size+= xkmPutCountedAtomString(dpy,file,shape->name); - shapeWire.num_outlines= shape->num_outlines; - if (shape->primary!=NULL) - shapeWire.primary_ndx= XkbOutlineIndex(shape,shape->primary); - else shapeWire.primary_ndx= XkbNoShape; - if (shape->approx!=NULL) - shapeWire.approx_ndx= XkbOutlineIndex(shape,shape->approx); - else shapeWire.approx_ndx= XkbNoShape; - tmp= fwrite(&shapeWire,SIZEOF(xkmShapeDesc),1,file); - size+= tmp*SIZEOF(xkmShapeDesc); - for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) { - register int p; - XkbPointPtr pt; - xkmPointDesc ptWire; - olWire.num_points= ol->num_points; - olWire.corner_radius= ol->corner_radius; - tmp= fwrite(&olWire,SIZEOF(xkmOutlineDesc),1,file); - size+= tmp*SIZEOF(xkmOutlineDesc); - for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) { - ptWire.x= pt->x; - ptWire.y= pt->y; - tmp= fwrite(&ptWire,SIZEOF(xkmPointDesc),1,file); - size+= tmp*SIZEOF(xkmPointDesc); - } - } - } + XkbShapePtr shape; + xkmShapeDesc shapeWire; + + for (i = 0, shape = geom->shapes; i < geom->num_shapes; i++, shape++) { + register int n; + XkbOutlinePtr ol; + xkmOutlineDesc olWire; + + bzero((char *) &shapeWire, sizeof(xkmShapeDesc)); + size += xkmPutCountedAtomString(dpy, file, shape->name); + shapeWire.num_outlines = shape->num_outlines; + if (shape->primary != NULL) + shapeWire.primary_ndx = XkbOutlineIndex(shape, shape->primary); + else + shapeWire.primary_ndx = XkbNoShape; + if (shape->approx != NULL) + shapeWire.approx_ndx = XkbOutlineIndex(shape, shape->approx); + else + shapeWire.approx_ndx = XkbNoShape; + tmp = fwrite(&shapeWire, SIZEOF(xkmShapeDesc), 1, file); + size += tmp * SIZEOF(xkmShapeDesc); + for (n = 0, ol = shape->outlines; n < shape->num_outlines; + n++, ol++) { + register int p; + XkbPointPtr pt; + xkmPointDesc ptWire; + + olWire.num_points = ol->num_points; + olWire.corner_radius = ol->corner_radius; + tmp = fwrite(&olWire, SIZEOF(xkmOutlineDesc), 1, file); + size += tmp * SIZEOF(xkmOutlineDesc); + for (p = 0, pt = ol->points; p < ol->num_points; p++, pt++) { + ptWire.x = pt->x; + ptWire.y = pt->y; + tmp = fwrite(&ptWire, SIZEOF(xkmPointDesc), 1, file); + size += tmp * SIZEOF(xkmPointDesc); + } + } + } } if (geom->sections) { - XkbSectionPtr section; - for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) { - size+= WriteXKMGeomSection(file,result,section); - } + XkbSectionPtr section; + + for (i = 0, section = geom->sections; i < geom->num_sections; + i++, section++) { + size += WriteXKMGeomSection(file, result, section); + } } if (geom->doodads) { - XkbDoodadPtr doodad; - for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) { - size+= WriteXKMGeomDoodad(file,result,doodad); - } + XkbDoodadPtr doodad; + + for (i = 0, doodad = geom->doodads; i < geom->num_doodads; + i++, doodad++) { + size += WriteXKMGeomDoodad(file, result, doodad); + } } if (geom->key_aliases) { - tmp= fwrite(geom->key_aliases,2*XkbKeyNameLength,geom->num_key_aliases, - file); - size+= tmp*(2*XkbKeyNameLength); + tmp = + fwrite(geom->key_aliases, 2 * XkbKeyNameLength, + geom->num_key_aliases, file); + size += tmp * (2 * XkbKeyNameLength); } return size; } @@ -1104,197 +1171,181 @@ unsigned tmp,size= 0; /*ARGSUSED*/ static int -GetXKMKeyNamesTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMKeyNamesTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMKeycodes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMIndicators(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMTypesTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMTypesTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMVirtualMods(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeyTypes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMCompatMapTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMCompatMapTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMVirtualMods(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMCompatMap(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMIndicators(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMSemanticsTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMSemanticsTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMVirtualMods(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeyTypes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMCompatMap(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMIndicators(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMLayoutTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMLayoutTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMSymbols(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMVirtualMods(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeycodes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeyTypes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMSymbols(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMIndicators(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMGeometry(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMKeymapTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMKeymapTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; - - total_size= num_toc=0; - if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMSymbols(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size)) - num_toc++; - if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; + int num_toc; + int total_size; + + total_size = num_toc = 0; + if (SizeXKMVirtualMods(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeycodes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMKeyTypes(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMCompatMap(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMSymbols(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMIndicators(result, info, &toc_rtrn[num_toc], &total_size)) + num_toc++; + if (SizeXKMGeometry(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } /*ARGSUSED*/ static int -GetXKMGeometryTOC( XkbFileInfo * result, - XkmInfo * info, - int max_toc, - xkmSectionInfo *toc_rtrn) +GetXKMGeometryTOC(XkbFileInfo *result, XkmInfo *info, + int max_toc, xkmSectionInfo *toc_rtrn) { -int num_toc; -int total_size; + int num_toc; + int total_size; - total_size= num_toc=0; - if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size)) - num_toc++; + total_size = num_toc = 0; + if (SizeXKMGeometry(result, &toc_rtrn[num_toc], &total_size)) + num_toc++; return num_toc; } static Bool -WriteXKMFile( FILE * file, - XkbFileInfo * result, - int num_toc, - xkmSectionInfo *toc, - XkmInfo * info) +WriteXKMFile(FILE *file, XkbFileInfo *result, + int num_toc, xkmSectionInfo *toc, XkmInfo *info) { -register int i; -unsigned tmp,size,total= 0; - - for (i=0;i<num_toc;i++) { - tmp= fwrite(&toc[i],SIZEOF(xkmSectionInfo),1,file); - total+= tmp*SIZEOF(xkmSectionInfo); - switch (toc[i].type) { - case XkmTypesIndex: - size= WriteXKMKeyTypes(file,result); - break; - case XkmCompatMapIndex: - size= WriteXKMCompatMap(file,result,info); - break; - case XkmSymbolsIndex: - size= WriteXKMSymbols(file,result,info); - break; - case XkmIndicatorsIndex: - size= WriteXKMIndicators(file,result,info); - break; - case XkmKeyNamesIndex: - size= WriteXKMKeycodes(file,result); - break; - case XkmGeometryIndex: - size= WriteXKMGeometry(file,result); - break; - case XkmVirtualModsIndex: - size= WriteXKMVirtualMods(file,result,info); - break; - default: - _XkbLibError(_XkbErrIllegalTOCType,"WriteXKMFile",toc[i].type); - return False; - } - size+= SIZEOF(xkmSectionInfo); - if (size!=toc[i].size) { - _XkbLibError(_XkbErrBadLength,XkbConfigText(toc[i].type,XkbMessage), - size-toc[i].size); - return False; - } + register int i; + unsigned tmp, size, total = 0; + + for (i = 0; i < num_toc; i++) { + tmp = fwrite(&toc[i], SIZEOF(xkmSectionInfo), 1, file); + total += tmp * SIZEOF(xkmSectionInfo); + switch (toc[i].type) { + case XkmTypesIndex: + size = WriteXKMKeyTypes(file, result); + break; + case XkmCompatMapIndex: + size = WriteXKMCompatMap(file, result, info); + break; + case XkmSymbolsIndex: + size = WriteXKMSymbols(file, result, info); + break; + case XkmIndicatorsIndex: + size = WriteXKMIndicators(file, result, info); + break; + case XkmKeyNamesIndex: + size = WriteXKMKeycodes(file, result); + break; + case XkmGeometryIndex: + size = WriteXKMGeometry(file, result); + break; + case XkmVirtualModsIndex: + size = WriteXKMVirtualMods(file, result, info); + break; + default: + _XkbLibError(_XkbErrIllegalTOCType, "WriteXKMFile", toc[i].type); + return False; + } + size += SIZEOF(xkmSectionInfo); + if (size != toc[i].size) { + _XkbLibError(_XkbErrBadLength, + XkbConfigText(toc[i].type, XkbMessage), + size - toc[i].size); + return False; + } } return True; } @@ -1303,85 +1354,85 @@ unsigned tmp,size,total= 0; #define MAX_TOC 16 Bool -XkbWriteXKMFile(FILE *out,XkbFileInfo *result) +XkbWriteXKMFile(FILE *out, XkbFileInfo *result) { -Bool ok; -XkbDescPtr xkb; -XkmInfo info; -int size_toc,i; -unsigned hdr,present; -xkmFileInfo fileInfo; -xkmSectionInfo toc[MAX_TOC]; -int (*getTOC)( - XkbFileInfo * /* result */, - XkmInfo * /* info */, - int /* max_to */, - xkmSectionInfo */* toc_rtrn */ -); + Bool ok; + XkbDescPtr xkb; + XkmInfo info; + int size_toc, i; + unsigned hdr, present; + xkmFileInfo fileInfo; + xkmSectionInfo toc[MAX_TOC]; + + int (*getTOC) (XkbFileInfo * /* result */ , + XkmInfo * /* info */ , + int /* max_to */ , + xkmSectionInfo * /* toc_rtrn */ + ); switch (result->type) { - case XkmKeyNamesIndex: - getTOC= GetXKMKeyNamesTOC; - break; - case XkmTypesIndex: - getTOC= GetXKMTypesTOC; - break; - case XkmCompatMapIndex: - getTOC= GetXKMCompatMapTOC; - break; - case XkmSemanticsFile: - getTOC= GetXKMSemanticsTOC; - break; - case XkmLayoutFile: - getTOC= GetXKMLayoutTOC; - break; - case XkmKeymapFile: - getTOC= GetXKMKeymapTOC; - break; - case XkmGeometryFile: - case XkmGeometryIndex: - getTOC= GetXKMGeometryTOC; - break; - default: - _XkbLibError(_XkbErrIllegalContents, - XkbConfigText(result->type,XkbMessage),0); - return False; + case XkmKeyNamesIndex: + getTOC = GetXKMKeyNamesTOC; + break; + case XkmTypesIndex: + getTOC = GetXKMTypesTOC; + break; + case XkmCompatMapIndex: + getTOC = GetXKMCompatMapTOC; + break; + case XkmSemanticsFile: + getTOC = GetXKMSemanticsTOC; + break; + case XkmLayoutFile: + getTOC = GetXKMLayoutTOC; + break; + case XkmKeymapFile: + getTOC = GetXKMKeymapTOC; + break; + case XkmGeometryFile: + case XkmGeometryIndex: + getTOC = GetXKMGeometryTOC; + break; + default: + _XkbLibError(_XkbErrIllegalContents, + XkbConfigText(result->type, XkbMessage), 0); + return False; } - xkb= result->xkb; + xkb = result->xkb; - bzero((char *)&info,sizeof(XkmInfo)); - size_toc= (*getTOC)(result,&info,MAX_TOC,toc); - if (size_toc<1) { - _XkbLibError(_XkbErrEmptyFile,"XkbWriteXKMFile",0); - return False; + bzero((char *) &info, sizeof(XkmInfo)); + size_toc = (*getTOC) (result, &info, MAX_TOC, toc); + if (size_toc < 1) { + _XkbLibError(_XkbErrEmptyFile, "XkbWriteXKMFile", 0); + return False; } - if (out==NULL) { - _XkbLibError(_XkbErrFileCannotOpen,"XkbWriteXKMFile",0); - return False; + if (out == NULL) { + _XkbLibError(_XkbErrFileCannotOpen, "XkbWriteXKMFile", 0); + return False; } - for (i=present=0;i<size_toc;i++) { - toc[i].offset+= 4+SIZEOF(xkmFileInfo); - toc[i].offset+= (size_toc*SIZEOF(xkmSectionInfo)); - if (toc[i].type<=XkmLastIndex) { - present|= (1<<toc[i].type); - } + for (i = present = 0; i < size_toc; i++) { + toc[i].offset += 4 + SIZEOF(xkmFileInfo); + toc[i].offset += (size_toc * SIZEOF(xkmSectionInfo)); + if (toc[i].type <= XkmLastIndex) { + present |= (1 << toc[i].type); + } #ifdef DEBUG - else { - fprintf(stderr,"Illegal section type %d\n",toc[i].type); - fprintf(stderr,"Ignored\n"); - } + else { + fprintf(stderr, "Illegal section type %d\n", toc[i].type); + fprintf(stderr, "Ignored\n"); + } #endif } - hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion); - xkmPutCARD32(out,(unsigned long)hdr); - fileInfo.type= result->type; - fileInfo.min_kc= xkb->min_key_code; - fileInfo.max_kc= xkb->max_key_code; - fileInfo.num_toc= size_toc; - fileInfo.present= present; - fileInfo.pad= 0; - fwrite(&fileInfo,SIZEOF(xkmFileInfo),1,out); - fwrite(toc,SIZEOF(xkmSectionInfo),size_toc,out); - ok= WriteXKMFile(out,result,size_toc,toc,&info); + hdr = (('x' << 24) | ('k' << 16) | ('m' << 8) | XkmFileVersion); + xkmPutCARD32(out, (unsigned long) hdr); + fileInfo.type = result->type; + fileInfo.min_kc = xkb->min_key_code; + fileInfo.max_kc = xkb->max_key_code; + fileInfo.num_toc = size_toc; + fileInfo.present = present; + fileInfo.pad = 0; + fwrite(&fileInfo, SIZEOF(xkmFileInfo), 1, out); + fwrite(toc, SIZEOF(xkmSectionInfo), size_toc, out); + ok = WriteXKMFile(out, result, size_toc, toc, &info); return ok; } diff --git a/src/xkmread.c b/src/xkmread.c index 5df95aa..55a4436 100644 --- a/src/xkmread.c +++ b/src/xkmread.c @@ -60,11 +60,11 @@ #include <X11/extensions/XKBgeom.h> Atom -XkbInternAtom(Display *dpy,char *str,Bool only_if_exists) +XkbInternAtom(Display * dpy, char *str, Bool only_if_exists) { - if (str==NULL) - return None; - return MakeAtom(str,strlen(str),!only_if_exists); + if (str == NULL) + return None; + return MakeAtom(str, strlen(str), !only_if_exists); } #endif @@ -76,24 +76,25 @@ XkbInternAtom(Display *dpy,char *str,Bool only_if_exists) /***====================================================================***/ static XPointer -XkmInsureSize(XPointer oldPtr,int oldCount,int *newCountRtrn,int elemSize) +XkmInsureSize(XPointer oldPtr, int oldCount, int *newCountRtrn, int elemSize) { -int newCount= *newCountRtrn; + int newCount = *newCountRtrn; - if (oldPtr==NULL) { - if (newCount==0) - return NULL; - oldPtr= (XPointer)_XkbCalloc(newCount,elemSize); + if (oldPtr == NULL) { + if (newCount == 0) + return NULL; + oldPtr = (XPointer) _XkbCalloc(newCount, elemSize); } - else if (oldCount<newCount) { - oldPtr= (XPointer)_XkbRealloc(oldPtr,newCount*elemSize); - if (oldPtr!=NULL) { - char *tmp= (char *)oldPtr; - bzero(&tmp[oldCount*elemSize],(newCount-oldCount)*elemSize); - } + else if (oldCount < newCount) { + oldPtr = (XPointer) _XkbRealloc(oldPtr, newCount * elemSize); + if (oldPtr != NULL) { + char *tmp = (char *) oldPtr; + + bzero(&tmp[oldCount * elemSize], (newCount - oldCount) * elemSize); + } } - else if (newCount<oldCount) { - *newCountRtrn= oldCount; + else if (newCount < oldCount) { + *newCountRtrn = oldCount; } return oldPtr; } @@ -101,116 +102,122 @@ int newCount= *newCountRtrn; #define XkmInsureTypedSize(p,o,n,t) ((p)=((t *)XkmInsureSize((char *)(p),(o),(n),sizeof(t)))) static CARD8 -XkmGetCARD8(FILE *file,int *pNRead) +XkmGetCARD8(FILE * file, int *pNRead) { -int tmp; - tmp= getc(file); - if (pNRead&&(tmp!=EOF)) - (*pNRead)+= 1; + int tmp; + + tmp = getc(file); + if (pNRead && (tmp != EOF)) + (*pNRead) += 1; return tmp; } static CARD16 -XkmGetCARD16(FILE *file,int *pNRead) +XkmGetCARD16(FILE * file, int *pNRead) { -CARD16 val; + CARD16 val; - if ((fread(&val,2,1,file)==1)&&(pNRead)) - (*pNRead)+= 2; + if ((fread(&val, 2, 1, file) == 1) && (pNRead)) + (*pNRead) += 2; return val; } static CARD32 -XkmGetCARD32(FILE *file,int *pNRead) +XkmGetCARD32(FILE * file, int *pNRead) { -CARD32 val; + CARD32 val; - if ((fread(&val,4,1,file)==1)&&(pNRead)) - (*pNRead)+= 4; + if ((fread(&val, 4, 1, file) == 1) && (pNRead)) + (*pNRead) += 4; return val; } static int -XkmSkipPadding(FILE *file,unsigned pad) +XkmSkipPadding(FILE * file, unsigned pad) { -register int i,nRead=0; + register int i, nRead = 0; - for (i=0;i<pad;i++) { - if (getc(file)!=EOF) - nRead++; + for (i = 0; i < pad; i++) { + if (getc(file) != EOF) + nRead++; } return nRead; } static int -XkmGetCountedString(FILE *file,char *str,int max_len) +XkmGetCountedString(FILE * file, char *str, int max_len) { -int count,nRead=0; - - count= XkmGetCARD16(file,&nRead); - if (count>0) { - int tmp; - if (count>max_len) { - tmp= fread(str,1,max_len,file); - while (tmp<count) { - if ((getc(file))!=EOF) - tmp++; - else break; - } - } - else { - tmp= fread(str,1,count,file); - } - nRead+= tmp; - } - if (count>=max_len) str[max_len-1]= '\0'; - else str[count]= '\0'; - count= XkbPaddedSize(nRead)-nRead; - if (count>0) - nRead+= XkmSkipPadding(file,count); + int count, nRead = 0; + + count = XkmGetCARD16(file, &nRead); + if (count > 0) { + int tmp; + + if (count > max_len) { + tmp = fread(str, 1, max_len, file); + while (tmp < count) { + if ((getc(file)) != EOF) + tmp++; + else + break; + } + } + else { + tmp = fread(str, 1, count, file); + } + nRead += tmp; + } + if (count >= max_len) + str[max_len - 1] = '\0'; + else + str[count] = '\0'; + count = XkbPaddedSize(nRead) - nRead; + if (count > 0) + nRead += XkmSkipPadding(file, count); return nRead; } /***====================================================================***/ static int -ReadXkmVirtualMods(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) +ReadXkmVirtualMods(FILE *file, XkbFileInfo *result, XkbChangesPtr changes) { -register unsigned int i,bit; -unsigned int bound,named,tmp; -int nRead=0; -XkbDescPtr xkb; - - xkb= result->xkb; - if (XkbAllocServerMap(xkb,XkbVirtualModsMask,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0); - return -1; - } - bound= XkmGetCARD16(file,&nRead); - named= XkmGetCARD16(file,&nRead); - for (i=tmp=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (bound&bit) { - xkb->server->vmods[i]= XkmGetCARD8(file,&nRead); - if (changes) - changes->map.vmods|= bit; - tmp++; - } - } - if ((i= XkbPaddedSize(tmp)-tmp)>0) - nRead+= XkmSkipPadding(file,i); - if (XkbAllocNames(xkb,XkbVirtualModNamesMask,0,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0); - return -1; - } - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - char name[100]; - if (named&bit) { - if (nRead+=XkmGetCountedString(file,name,100)) { - xkb->names->vmods[i]= XkbInternAtom(xkb->dpy,name,False); - if (changes) - changes->names.changed_vmods|= bit; - } - } + register unsigned int i, bit; + unsigned int bound, named, tmp; + int nRead = 0; + XkbDescPtr xkb; + + xkb = result->xkb; + if (XkbAllocServerMap(xkb, XkbVirtualModsMask, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmVirtualMods", 0); + return -1; + } + bound = XkmGetCARD16(file, &nRead); + named = XkmGetCARD16(file, &nRead); + for (i = tmp = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + if (bound & bit) { + xkb->server->vmods[i] = XkmGetCARD8(file, &nRead); + if (changes) + changes->map.vmods |= bit; + tmp++; + } + } + if ((i = XkbPaddedSize(tmp) - tmp) > 0) + nRead += XkmSkipPadding(file, i); + if (XkbAllocNames(xkb, XkbVirtualModNamesMask, 0, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmVirtualMods", 0); + return -1; + } + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + char name[100]; + + if (named & bit) { + if (nRead += XkmGetCountedString(file, name, 100)) { + xkb->names->vmods[i] = XkbInternAtom(xkb->dpy, name, False); + if (changes) + changes->names.changed_vmods |= bit; + } + } } return nRead; } @@ -218,204 +225,212 @@ XkbDescPtr xkb; /***====================================================================***/ static int -ReadXkmKeycodes(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) +ReadXkmKeycodes(FILE *file, XkbFileInfo *result, XkbChangesPtr changes) { -register int i; -unsigned minKC,maxKC,nAl; -int nRead=0; -char name[100]; -XkbKeyNamePtr pN; -XkbDescPtr xkb; - - xkb= result->xkb; - name[0]= '\0'; - nRead+= XkmGetCountedString(file,name,100); - minKC= XkmGetCARD8(file,&nRead); - maxKC= XkmGetCARD8(file,&nRead); - if (xkb->min_key_code==0) { - xkb->min_key_code= minKC; - xkb->max_key_code= maxKC; + register int i; + unsigned minKC, maxKC, nAl; + int nRead = 0; + char name[100]; + XkbKeyNamePtr pN; + XkbDescPtr xkb; + + xkb = result->xkb; + name[0] = '\0'; + nRead += XkmGetCountedString(file, name, 100); + minKC = XkmGetCARD8(file, &nRead); + maxKC = XkmGetCARD8(file, &nRead); + if (xkb->min_key_code == 0) { + xkb->min_key_code = minKC; + xkb->max_key_code = maxKC; } else { - if (minKC<xkb->min_key_code) - xkb->min_key_code= minKC; - if (maxKC>xkb->max_key_code) { - _XkbLibError(_XkbErrBadValue,"ReadXkmKeycodes",maxKC); - return -1; - } + if (minKC < xkb->min_key_code) + xkb->min_key_code = minKC; + if (maxKC > xkb->max_key_code) { + _XkbLibError(_XkbErrBadValue, "ReadXkmKeycodes", maxKC); + return -1; + } } - nAl= XkmGetCARD8(file,&nRead); - nRead+= XkmSkipPadding(file,1); + nAl = XkmGetCARD8(file, &nRead); + nRead += XkmSkipPadding(file, 1); #define WANTED (XkbKeycodesNameMask|XkbKeyNamesMask|XkbKeyAliasesMask) - if (XkbAllocNames(xkb,WANTED,0,nAl)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0); - return -1; - } - if (name[0]!='\0') { - xkb->names->keycodes= XkbInternAtom(xkb->dpy,name,False); - } - - for (pN=&xkb->names->keys[minKC],i=minKC;i<=(int)maxKC;i++,pN++) { - if (fread(pN,1,XkbKeyNameLength,file)!=XkbKeyNameLength) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0); - return -1; - } - nRead+= XkbKeyNameLength; - } - if (nAl>0) { - XkbKeyAliasPtr pAl; - for (pAl= xkb->names->key_aliases,i=0;i<nAl;i++,pAl++) { - int tmp; - tmp= fread(pAl,1,2*XkbKeyNameLength,file); - if (tmp!=2*XkbKeyNameLength) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0); - return -1; - } - nRead+= 2*XkbKeyNameLength; - } - if (changes) - changes->names.changed|= XkbKeyAliasesMask; + if (XkbAllocNames(xkb, WANTED, 0, nAl) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmKeycodes", 0); + return -1; + } + if (name[0] != '\0') { + xkb->names->keycodes = XkbInternAtom(xkb->dpy, name, False); + } + + for (pN = &xkb->names->keys[minKC], i = minKC; i <= (int) maxKC; i++, pN++) { + if (fread(pN, 1, XkbKeyNameLength, file) != XkbKeyNameLength) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeycodes", 0); + return -1; + } + nRead += XkbKeyNameLength; + } + if (nAl > 0) { + XkbKeyAliasPtr pAl; + + for (pAl = xkb->names->key_aliases, i = 0; i < nAl; i++, pAl++) { + int tmp; + + tmp = fread(pAl, 1, 2 * XkbKeyNameLength, file); + if (tmp != 2 * XkbKeyNameLength) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeycodes", 0); + return -1; + } + nRead += 2 * XkbKeyNameLength; + } + if (changes) + changes->names.changed |= XkbKeyAliasesMask; } if (changes) - changes->names.changed|= XkbKeyNamesMask; + changes->names.changed |= XkbKeyNamesMask; return nRead; } /***====================================================================***/ static int -ReadXkmKeyTypes(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) +ReadXkmKeyTypes(FILE *file, XkbFileInfo *result, XkbChangesPtr changes) { -register unsigned i,n; -unsigned num_types; -int nRead=0; -int tmp; -XkbKeyTypePtr type; -xkmKeyTypeDesc wire; -XkbKTMapEntryPtr entry; -xkmKTMapEntryDesc wire_entry; -char buf[100]; -XkbDescPtr xkb; - - xkb= result->xkb; - if ((tmp= XkmGetCountedString(file,buf,100))<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0); - return -1; - } - nRead+= tmp; - if (buf[0]!='\0') { - if (XkbAllocNames(xkb,XkbTypesNameMask,0,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0); - return -1; + register unsigned i, n; + unsigned num_types; + int nRead = 0; + int tmp; + XkbKeyTypePtr type; + xkmKeyTypeDesc wire; + XkbKTMapEntryPtr entry; + xkmKTMapEntryDesc wire_entry; + char buf[100]; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((tmp = XkmGetCountedString(file, buf, 100)) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeyTypes", 0); + return -1; + } + nRead += tmp; + if (buf[0] != '\0') { + if (XkbAllocNames(xkb, XkbTypesNameMask, 0, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmKeyTypes", 0); + return -1; + } + xkb->names->types = XkbInternAtom(xkb->dpy, buf, False); + } + num_types = XkmGetCARD16(file, &nRead); + nRead += XkmSkipPadding(file, 2); + if (num_types < 1) + return nRead; + if (XkbAllocClientMap(xkb, XkbKeyTypesMask, num_types) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmKeyTypes", 0); + return nRead; + } + xkb->map->num_types = num_types; + if (num_types < XkbNumRequiredTypes) { + _XkbLibError(_XkbErrMissingReqTypes, "ReadXkmKeyTypes", 0); + return -1; + } + type = xkb->map->types; + for (i = 0; i < num_types; i++, type++) { + if ((int) fread(&wire, SIZEOF(xkmKeyTypeDesc), 1, file) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeyTypes", 0); + return -1; + } + nRead += SIZEOF(xkmKeyTypeDesc); + if (((i == XkbOneLevelIndex) && (wire.numLevels != 1)) || + (((i == XkbTwoLevelIndex) || (i == XkbAlphabeticIndex) || + ((i) == XkbKeypadIndex)) && (wire.numLevels != 2))) { + _XkbLibError(_XkbErrBadTypeWidth, "ReadXkmKeyTypes", i); + return -1; } - xkb->names->types= XkbInternAtom(xkb->dpy,buf,False); - } - num_types= XkmGetCARD16(file,&nRead); - nRead+= XkmSkipPadding(file,2); - if (num_types<1) - return nRead; - if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_types)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0); - return nRead; - } - xkb->map->num_types= num_types; - if (num_types<XkbNumRequiredTypes) { - _XkbLibError(_XkbErrMissingReqTypes,"ReadXkmKeyTypes",0); - return -1; - } - type= xkb->map->types; - for (i=0;i<num_types;i++,type++) { - if ((int)fread(&wire,SIZEOF(xkmKeyTypeDesc),1,file)<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0); - return -1; - } - nRead+= SIZEOF(xkmKeyTypeDesc); - if (((i==XkbOneLevelIndex)&&(wire.numLevels!=1))|| - (((i==XkbTwoLevelIndex)||(i==XkbAlphabeticIndex)|| - ((i)==XkbKeypadIndex))&&(wire.numLevels!=2))) { - _XkbLibError(_XkbErrBadTypeWidth,"ReadXkmKeyTypes",i); - return -1; - } - tmp= wire.nMapEntries; - XkmInsureTypedSize(type->map,type->map_count,&tmp,XkbKTMapEntryRec); - if ((wire.nMapEntries>0)&&(type->map==NULL)) { - _XkbLibError(_XkbErrBadValue,"ReadXkmKeyTypes",wire.nMapEntries); - return -1; - } - for (n=0,entry= type->map;n<wire.nMapEntries;n++,entry++) { - if (fread(&wire_entry,SIZEOF(xkmKTMapEntryDesc),1,file)<(int)1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0); - return -1; - } - nRead+= SIZEOF(xkmKTMapEntryDesc); - entry->active= (wire_entry.virtualMods==0); - entry->level= wire_entry.level; - entry->mods.mask= wire_entry.realMods; - entry->mods.real_mods= wire_entry.realMods; - entry->mods.vmods= wire_entry.virtualMods; - } - nRead+= XkmGetCountedString(file,buf,100); - if (((i==XkbOneLevelIndex)&&(strcmp(buf,"ONE_LEVEL")!=0))|| - ((i==XkbTwoLevelIndex)&&(strcmp(buf,"TWO_LEVEL")!=0))|| - ((i==XkbAlphabeticIndex)&&(strcmp(buf,"ALPHABETIC")!=0))|| - ((i==XkbKeypadIndex)&&(strcmp(buf,"KEYPAD")!=0))) { - _XkbLibError(_XkbErrBadTypeName,"ReadXkmKeyTypes",0); - return -1; - } - if (buf[0]!='\0') { - type->name= XkbInternAtom(xkb->dpy,buf,False); - } - else type->name= None; - - if (wire.preserve) { - xkmModsDesc p_entry; - XkbModsPtr pre; - XkmInsureTypedSize(type->preserve,type->map_count,&tmp, - XkbModsRec); - if (type->preserve==NULL) { - _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0); - return -1; - } - for (n=0,pre=type->preserve;n<wire.nMapEntries;n++,pre++) { - if (fread(&p_entry,SIZEOF(xkmModsDesc),1,file)<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0); - return -1; - } - nRead+= SIZEOF(xkmModsDesc); - pre->mask= p_entry.realMods; - pre->real_mods= p_entry.realMods; - pre->vmods= p_entry.virtualMods; - } - } - if (wire.nLevelNames>0) { - int width= wire.numLevels; - if (wire.nLevelNames>(unsigned)width) { - _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0); - return -1; - } - XkmInsureTypedSize(type->level_names,type->num_levels,&width,Atom); - if (type->level_names!=NULL) { - for (n=0;n<wire.nLevelNames;n++) { - if ((tmp=XkmGetCountedString(file,buf,100))<1) - return -1; - nRead+= tmp; - if (strlen(buf)==0) - type->level_names[n]= None; - else type->level_names[n]= XkbInternAtom(xkb->dpy,buf,0); - } - } - } - type->mods.mask= wire.realMods; - type->mods.real_mods= wire.realMods; - type->mods.vmods= wire.virtualMods; - type->num_levels= wire.numLevels; - type->map_count= wire.nMapEntries; + tmp = wire.nMapEntries; + XkmInsureTypedSize(type->map, type->map_count, &tmp, XkbKTMapEntryRec); + if ((wire.nMapEntries > 0) && (type->map == NULL)) { + _XkbLibError(_XkbErrBadValue, "ReadXkmKeyTypes", wire.nMapEntries); + return -1; + } + for (n = 0, entry = type->map; n < wire.nMapEntries; n++, entry++) { + if (fread(&wire_entry, SIZEOF(xkmKTMapEntryDesc), 1, file) < + (int) 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeyTypes", 0); + return -1; + } + nRead += SIZEOF(xkmKTMapEntryDesc); + entry->active = (wire_entry.virtualMods == 0); + entry->level = wire_entry.level; + entry->mods.mask = wire_entry.realMods; + entry->mods.real_mods = wire_entry.realMods; + entry->mods.vmods = wire_entry.virtualMods; + } + nRead += XkmGetCountedString(file, buf, 100); + if (((i == XkbOneLevelIndex) && (strcmp(buf, "ONE_LEVEL") != 0)) || + ((i == XkbTwoLevelIndex) && (strcmp(buf, "TWO_LEVEL") != 0)) || + ((i == XkbAlphabeticIndex) && (strcmp(buf, "ALPHABETIC") != 0)) || + ((i == XkbKeypadIndex) && (strcmp(buf, "KEYPAD") != 0))) { + _XkbLibError(_XkbErrBadTypeName, "ReadXkmKeyTypes", 0); + return -1; + } + if (buf[0] != '\0') { + type->name = XkbInternAtom(xkb->dpy, buf, False); + } + else + type->name = None; + + if (wire.preserve) { + xkmModsDesc p_entry; + XkbModsPtr pre; + + XkmInsureTypedSize(type->preserve, type->map_count, &tmp, + XkbModsRec); + if (type->preserve == NULL) { + _XkbLibError(_XkbErrBadMatch, "ReadXkmKeycodes", 0); + return -1; + } + for (n = 0, pre = type->preserve; n < wire.nMapEntries; n++, pre++) { + if (fread(&p_entry, SIZEOF(xkmModsDesc), 1, file) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmKeycodes", 0); + return -1; + } + nRead += SIZEOF(xkmModsDesc); + pre->mask = p_entry.realMods; + pre->real_mods = p_entry.realMods; + pre->vmods = p_entry.virtualMods; + } + } + if (wire.nLevelNames > 0) { + int width = wire.numLevels; + + if (wire.nLevelNames > (unsigned) width) { + _XkbLibError(_XkbErrBadMatch, "ReadXkmKeycodes", 0); + return -1; + } + XkmInsureTypedSize(type->level_names, type->num_levels, &width, + Atom); + if (type->level_names != NULL) { + for (n = 0; n < wire.nLevelNames; n++) { + if ((tmp = XkmGetCountedString(file, buf, 100)) < 1) + return -1; + nRead += tmp; + if (strlen(buf) == 0) + type->level_names[n] = None; + else + type->level_names[n] = XkbInternAtom(xkb->dpy, buf, 0); + } + } + } + type->mods.mask = wire.realMods; + type->mods.real_mods = wire.realMods; + type->mods.vmods = wire.virtualMods; + type->num_levels = wire.numLevels; + type->map_count = wire.nMapEntries; } if (changes) { - changes->map.changed|= XkbKeyTypesMask; - changes->map.first_type= 0; - changes->map.num_types= xkb->map->num_types; + changes->map.changed |= XkbKeyTypesMask; + changes->map.first_type = 0; + changes->map.num_types = xkb->map->num_types; } return nRead; } @@ -423,631 +438,655 @@ XkbDescPtr xkb; /***====================================================================***/ static int -ReadXkmCompatMap(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) +ReadXkmCompatMap(FILE *file, XkbFileInfo *result, XkbChangesPtr changes) { -register int i; -unsigned num_si,groups; -char name[100]; -XkbSymInterpretPtr interp; -xkmSymInterpretDesc wire; -unsigned tmp; -int nRead=0; -XkbDescPtr xkb; -XkbCompatMapPtr compat; - - xkb= result->xkb; - if ((tmp= XkmGetCountedString(file,name,100))<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0); - return -1; - } - nRead+= tmp; - if (name[0]!='\0') { - if (XkbAllocNames(xkb,XkbCompatNameMask,0,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmCompatMap",0); - return -1; - } - xkb->names->compat= XkbInternAtom(xkb->dpy,name,False); - } - num_si= XkmGetCARD16(file,&nRead); - groups= XkmGetCARD8(file,&nRead); - nRead+= XkmSkipPadding(file,1); - if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_si)!=Success) - return -1; - compat= xkb->compat; - compat->num_si= num_si; - interp= compat->sym_interpret; - for (i=0;i<num_si;i++,interp++) { - tmp= fread(&wire,SIZEOF(xkmSymInterpretDesc),1,file); - nRead+= tmp*SIZEOF(xkmSymInterpretDesc); - interp->sym= wire.sym; - interp->mods= wire.mods; - interp->match= wire.match; - interp->virtual_mod= wire.virtualMod; - interp->flags= wire.flags; - interp->act.type= wire.actionType; - interp->act.data[0]= wire.actionData[0]; - interp->act.data[1]= wire.actionData[1]; - interp->act.data[2]= wire.actionData[2]; - interp->act.data[3]= wire.actionData[3]; - interp->act.data[4]= wire.actionData[4]; - interp->act.data[5]= wire.actionData[5]; - interp->act.data[6]= wire.actionData[6]; - } - if ((num_si>0)&&(changes)) { - changes->compat.first_si= 0; - changes->compat.num_si= num_si; + register int i; + unsigned num_si, groups; + char name[100]; + XkbSymInterpretPtr interp; + xkmSymInterpretDesc wire; + unsigned tmp; + int nRead = 0; + XkbDescPtr xkb; + XkbCompatMapPtr compat; + + xkb = result->xkb; + if ((tmp = XkmGetCountedString(file, name, 100)) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmCompatMap", 0); + return -1; + } + nRead += tmp; + if (name[0] != '\0') { + if (XkbAllocNames(xkb, XkbCompatNameMask, 0, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmCompatMap", 0); + return -1; + } + xkb->names->compat = XkbInternAtom(xkb->dpy, name, False); + } + num_si = XkmGetCARD16(file, &nRead); + groups = XkmGetCARD8(file, &nRead); + nRead += XkmSkipPadding(file, 1); + if (XkbAllocCompatMap(xkb, XkbAllCompatMask, num_si) != Success) + return -1; + compat = xkb->compat; + compat->num_si = num_si; + interp = compat->sym_interpret; + for (i = 0; i < num_si; i++, interp++) { + tmp = fread(&wire, SIZEOF(xkmSymInterpretDesc), 1, file); + nRead += tmp * SIZEOF(xkmSymInterpretDesc); + interp->sym = wire.sym; + interp->mods = wire.mods; + interp->match = wire.match; + interp->virtual_mod = wire.virtualMod; + interp->flags = wire.flags; + interp->act.type = wire.actionType; + interp->act.data[0] = wire.actionData[0]; + interp->act.data[1] = wire.actionData[1]; + interp->act.data[2] = wire.actionData[2]; + interp->act.data[3] = wire.actionData[3]; + interp->act.data[4] = wire.actionData[4]; + interp->act.data[5] = wire.actionData[5]; + interp->act.data[6] = wire.actionData[6]; + } + if ((num_si > 0) && (changes)) { + changes->compat.first_si = 0; + changes->compat.num_si = num_si; } if (groups) { - register unsigned bit; - for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { - xkmModsDesc md; - if (groups&bit) { - tmp= fread(&md,SIZEOF(xkmModsDesc),1,file); - nRead+= tmp*SIZEOF(xkmModsDesc); - xkb->compat->groups[i].real_mods= md.realMods; - xkb->compat->groups[i].vmods= md.virtualMods; - if (md.virtualMods != 0) { - unsigned mask; - if (XkbVirtualModsToReal(xkb,md.virtualMods,&mask)) - xkb->compat->groups[i].mask= md.realMods|mask; - } - else xkb->compat->groups[i].mask= md.realMods; - } - } - if (changes) - changes->compat.changed_groups|= groups; + register unsigned bit; + + for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) { + xkmModsDesc md; + + if (groups & bit) { + tmp = fread(&md, SIZEOF(xkmModsDesc), 1, file); + nRead += tmp * SIZEOF(xkmModsDesc); + xkb->compat->groups[i].real_mods = md.realMods; + xkb->compat->groups[i].vmods = md.virtualMods; + if (md.virtualMods != 0) { + unsigned mask; + + if (XkbVirtualModsToReal(xkb, md.virtualMods, &mask)) + xkb->compat->groups[i].mask = md.realMods | mask; + } + else + xkb->compat->groups[i].mask = md.realMods; + } + } + if (changes) + changes->compat.changed_groups |= groups; } return nRead; } static int -ReadXkmIndicators(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) +ReadXkmIndicators(FILE *file, XkbFileInfo *result, XkbChangesPtr changes) { -register unsigned nLEDs; -xkmIndicatorMapDesc wire; -char buf[100]; -unsigned tmp; -int nRead=0; -XkbDescPtr xkb; - - xkb= result->xkb; - if ((xkb->indicators==NULL)&&(XkbAllocIndicatorMaps(xkb)!=Success)) { - _XkbLibError(_XkbErrBadAlloc,"indicator rec",0); - return -1; - } - if (XkbAllocNames(xkb,XkbIndicatorNamesMask,0,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"indicator names",0); - return -1; - } - nLEDs= XkmGetCARD8(file,&nRead); - nRead+= XkmSkipPadding(file,3); - xkb->indicators->phys_indicators= XkmGetCARD32(file,&nRead); - while (nLEDs-->0) { - Atom name; - XkbIndicatorMapPtr map; - - if ((tmp=XkmGetCountedString(file,buf,100))<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0); - return -1; - } - nRead+= tmp; - if (buf[0]!='\0') - name= XkbInternAtom(xkb->dpy,buf,False); - else name= None; - if ((tmp=fread(&wire,SIZEOF(xkmIndicatorMapDesc),1,file))<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0); - return -1; - } - nRead+= tmp*SIZEOF(xkmIndicatorMapDesc); - if (xkb->names) { - xkb->names->indicators[wire.indicator-1]= name; - if (changes) - changes->names.changed_indicators|= (1<<(wire.indicator-1)); - } - map= &xkb->indicators->maps[wire.indicator-1]; - map->flags= wire.flags; - map->which_groups= wire.which_groups; - map->groups= wire.groups; - map->which_mods= wire.which_mods; - map->mods.mask= wire.real_mods; - map->mods.real_mods= wire.real_mods; - map->mods.vmods= wire.vmods; - map->ctrls= wire.ctrls; + register unsigned nLEDs; + xkmIndicatorMapDesc wire; + char buf[100]; + unsigned tmp; + int nRead = 0; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((xkb->indicators == NULL) && (XkbAllocIndicatorMaps(xkb) != Success)) { + _XkbLibError(_XkbErrBadAlloc, "indicator rec", 0); + return -1; + } + if (XkbAllocNames(xkb, XkbIndicatorNamesMask, 0, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "indicator names", 0); + return -1; + } + nLEDs = XkmGetCARD8(file, &nRead); + nRead += XkmSkipPadding(file, 3); + xkb->indicators->phys_indicators = XkmGetCARD32(file, &nRead); + while (nLEDs-- > 0) { + Atom name; + XkbIndicatorMapPtr map; + + if ((tmp = XkmGetCountedString(file, buf, 100)) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmIndicators", 0); + return -1; + } + nRead += tmp; + if (buf[0] != '\0') + name = XkbInternAtom(xkb->dpy, buf, False); + else + name = None; + if ((tmp = fread(&wire, SIZEOF(xkmIndicatorMapDesc), 1, file)) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmIndicators", 0); + return -1; + } + nRead += tmp * SIZEOF(xkmIndicatorMapDesc); + if (xkb->names) { + xkb->names->indicators[wire.indicator - 1] = name; + if (changes) + changes->names.changed_indicators |= + (1 << (wire.indicator - 1)); + } + map = &xkb->indicators->maps[wire.indicator - 1]; + map->flags = wire.flags; + map->which_groups = wire.which_groups; + map->groups = wire.groups; + map->which_mods = wire.which_mods; + map->mods.mask = wire.real_mods; + map->mods.real_mods = wire.real_mods; + map->mods.vmods = wire.vmods; + map->ctrls = wire.ctrls; } return nRead; } static XkbKeyTypePtr -FindTypeForKey(XkbDescPtr xkb,Atom name,unsigned width,KeySym *syms) +FindTypeForKey(XkbDescPtr xkb, Atom name, unsigned width, KeySym *syms) { - if ((!xkb)||(!xkb->map)) - return NULL; - if (name!=None) { - register unsigned i; - for (i=0;i<xkb->map->num_types;i++) { - if (xkb->map->types[i].name==name) { + if ((!xkb) || (!xkb->map)) + return NULL; + if (name != None) { + register unsigned i; + + for (i = 0; i < xkb->map->num_types; i++) { + if (xkb->map->types[i].name == name) { #ifdef DEBUG - if (xkb->map->types[i].num_levels!=width) - fprintf(stderr,"Group width mismatch between key and type\n"); + if (xkb->map->types[i].num_levels != width) + fprintf(stderr, + "Group width mismatch between key and type\n"); #endif - return &xkb->map->types[i]; - } - } - } - if ((width<2)||((syms!=NULL)&&(syms[1]==NoSymbol))) - return &xkb->map->types[XkbOneLevelIndex]; - if (syms!=NULL) { - if (XkbKSIsLower(syms[0])&&XkbKSIsUpper(syms[1])) - return &xkb->map->types[XkbAlphabeticIndex]; - else if (XkbKSIsKeypad(syms[0])||XkbKSIsKeypad(syms[1])) - return &xkb->map->types[XkbKeypadIndex]; + return &xkb->map->types[i]; + } + } + } + if ((width < 2) || ((syms != NULL) && (syms[1] == NoSymbol))) + return &xkb->map->types[XkbOneLevelIndex]; + if (syms != NULL) { + if (XkbKSIsLower(syms[0]) && XkbKSIsUpper(syms[1])) + return &xkb->map->types[XkbAlphabeticIndex]; + else if (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])) + return &xkb->map->types[XkbKeypadIndex]; } return &xkb->map->types[XkbTwoLevelIndex]; } static int -ReadXkmSymbols(FILE *file,XkbFileInfo *result) +ReadXkmSymbols(FILE *file, XkbFileInfo *result) { -register int i,g,s,totalVModMaps; -xkmKeySymMapDesc wireMap; -char buf[100]; -unsigned minKC,maxKC,groupNames,tmp; -int nRead=0; -XkbDescPtr xkb; - - xkb= result->xkb; - if ((tmp=XkmGetCountedString(file,buf,100))<1) - return -1; - nRead+= tmp; - minKC= XkmGetCARD8(file,&nRead); - maxKC= XkmGetCARD8(file,&nRead); - groupNames= XkmGetCARD8(file,&nRead); - totalVModMaps= XkmGetCARD8(file,&nRead); + register int i, g, s, totalVModMaps; + xkmKeySymMapDesc wireMap; + char buf[100]; + unsigned minKC, maxKC, groupNames, tmp; + int nRead = 0; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((tmp = XkmGetCountedString(file, buf, 100)) < 1) + return -1; + nRead += tmp; + minKC = XkmGetCARD8(file, &nRead); + maxKC = XkmGetCARD8(file, &nRead); + groupNames = XkmGetCARD8(file, &nRead); + totalVModMaps = XkmGetCARD8(file, &nRead); if (XkbAllocNames(xkb, - XkbSymbolsNameMask|XkbPhysSymbolsNameMask|XkbGroupNamesMask, - 0,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"physical names",0); - return -1; - } - if ((buf[0]!='\0')&&(xkb->names)) { - Atom name; - name= XkbInternAtom(xkb->dpy,buf,0); - xkb->names->symbols= name; - xkb->names->phys_symbols= name; - } - for (i=0,g=1;i<XkbNumKbdGroups;i++,g<<=1) { - if (groupNames&g) { - if ((tmp=XkmGetCountedString(file,buf,100))<1) - return -1; - nRead+= tmp; - if ((buf[0]!='\0')&&(xkb->names)) { - Atom name; - name= XkbInternAtom(xkb->dpy,buf,0); - xkb->names->groups[i]= name; - } - else xkb->names->groups[i]= None; - } - } - if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"server map",0); - return -1; - } - if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"client map",0); - return -1; - } - if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"controls",0); - return -1; - } - if ((xkb->map==NULL)||(xkb->server==NULL)) - return -1; - if (xkb->min_key_code<8) xkb->min_key_code= minKC; - if (xkb->max_key_code<8) xkb->max_key_code= maxKC; - if ((minKC>=8)&&(minKC<xkb->min_key_code)) - xkb->min_key_code= minKC; - if ((maxKC>=8)&&(maxKC>xkb->max_key_code)) { - _XkbLibError(_XkbErrBadValue,"keys in symbol map",maxKC); - return -1; - } - for (i=minKC;i<=(int)maxKC;i++) { - Atom typeName[XkbNumKbdGroups]; - XkbKeyTypePtr type[XkbNumKbdGroups]; - if ((tmp=fread(&wireMap,SIZEOF(xkmKeySymMapDesc),1,file))<1) { - _XkbLibError(_XkbErrBadLength,"ReadXkmSymbols",0); - return -1; - } - nRead+= tmp*SIZEOF(xkmKeySymMapDesc); - bzero((char *)typeName,XkbNumKbdGroups*sizeof(Atom)); - bzero((char *)type,XkbNumKbdGroups*sizeof(XkbKeyTypePtr)); - if (wireMap.flags&XkmKeyHasTypes) { - register int g; - for (g=0;g<XkbNumKbdGroups;g++) { - if ((wireMap.flags&(1<<g))&& - ((tmp=XkmGetCountedString(file,buf,100))>0)) { - typeName[g]= XkbInternAtom(xkb->dpy,buf,1); - nRead+= tmp; - } - type[g]=FindTypeForKey(xkb,typeName[g],wireMap.width,NULL); - if (type[g]==NULL) { - _XkbLibError(_XkbErrMissingTypes,"ReadXkmSymbols",0); - return -1; - } - if (typeName[g]==type[g]->name) - xkb->server->explicit[i]|= (1<<g); - } - } - if (wireMap.flags&XkmRepeatingKey) { - xkb->ctrls->per_key_repeat[i/8]|= (1<<(i%8)); - xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask; - } - else if (wireMap.flags&XkmNonRepeatingKey) { - xkb->ctrls->per_key_repeat[i/8]&= ~(1<<(i%8)); - xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask; - } - xkb->map->modmap[i]= wireMap.modifier_map; - if (XkbNumGroups(wireMap.num_groups)>0) { - KeySym *sym; - int nSyms; - - if (XkbNumGroups(wireMap.num_groups)>xkb->ctrls->num_groups) - xkb->ctrls->num_groups= wireMap.num_groups; - nSyms= XkbNumGroups(wireMap.num_groups)*wireMap.width; - sym= XkbResizeKeySyms(xkb,i,nSyms); - if (!sym) - return -1; - for (s=0;s<nSyms;s++) { - *sym++= XkmGetCARD32(file,&nRead); - } - if (wireMap.flags&XkmKeyHasActions) { - XkbAction * act; - act= XkbResizeKeyActions(xkb,i,nSyms); - for (s=0;s<nSyms;s++,act++) { - tmp=fread(act,SIZEOF(xkmActionDesc),1,file); - nRead+= tmp*SIZEOF(xkmActionDesc); - } - xkb->server->explicit[i]|= XkbExplicitInterpretMask; - } - } - for (g=0;g<XkbNumGroups(wireMap.num_groups);g++) { - if (((xkb->server->explicit[i]&(1<<g))==0)||(type[g]==NULL)) { - KeySym *tmpSyms; - tmpSyms= XkbKeySymsPtr(xkb,i)+(wireMap.width*g); - type[g]= FindTypeForKey(xkb,None,wireMap.width,tmpSyms); - } - xkb->map->key_sym_map[i].kt_index[g]= type[g]-(&xkb->map->types[0]); - } - xkb->map->key_sym_map[i].group_info= wireMap.num_groups; - xkb->map->key_sym_map[i].width= wireMap.width; - if (wireMap.flags&XkmKeyHasBehavior) { - xkmBehaviorDesc b; - tmp= fread(&b,SIZEOF(xkmBehaviorDesc),1,file); - nRead+= tmp*SIZEOF(xkmBehaviorDesc); - xkb->server->behaviors[i].type= b.type; - xkb->server->behaviors[i].data= b.data; - xkb->server->explicit[i]|= XkbExplicitBehaviorMask; - } - } - if (totalVModMaps>0) { - xkmVModMapDesc v; - for (i=0;i<totalVModMaps;i++) { - tmp= fread(&v,SIZEOF(xkmVModMapDesc),1,file); - nRead+= tmp*SIZEOF(xkmVModMapDesc); - if (tmp>0) - xkb->server->vmodmap[v.key]= v.vmods; - } + XkbSymbolsNameMask | XkbPhysSymbolsNameMask | + XkbGroupNamesMask, 0, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "physical names", 0); + return -1; + } + if ((buf[0] != '\0') && (xkb->names)) { + Atom name; + + name = XkbInternAtom(xkb->dpy, buf, 0); + xkb->names->symbols = name; + xkb->names->phys_symbols = name; + } + for (i = 0, g = 1; i < XkbNumKbdGroups; i++, g <<= 1) { + if (groupNames & g) { + if ((tmp = XkmGetCountedString(file, buf, 100)) < 1) + return -1; + nRead += tmp; + if ((buf[0] != '\0') && (xkb->names)) { + Atom name; + + name = XkbInternAtom(xkb->dpy, buf, 0); + xkb->names->groups[i] = name; + } + else + xkb->names->groups[i] = None; + } + } + if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "server map", 0); + return -1; + } + if (XkbAllocClientMap(xkb, XkbAllClientInfoMask, 0) != Success) { + _XkbLibError(_XkbErrBadAlloc, "client map", 0); + return -1; + } + if (XkbAllocControls(xkb, XkbAllControlsMask) != Success) { + _XkbLibError(_XkbErrBadAlloc, "controls", 0); + return -1; + } + if ((xkb->map == NULL) || (xkb->server == NULL)) + return -1; + if (xkb->min_key_code < 8) + xkb->min_key_code = minKC; + if (xkb->max_key_code < 8) + xkb->max_key_code = maxKC; + if ((minKC >= 8) && (minKC < xkb->min_key_code)) + xkb->min_key_code = minKC; + if ((maxKC >= 8) && (maxKC > xkb->max_key_code)) { + _XkbLibError(_XkbErrBadValue, "keys in symbol map", maxKC); + return -1; + } + for (i = minKC; i <= (int) maxKC; i++) { + Atom typeName[XkbNumKbdGroups]; + XkbKeyTypePtr type[XkbNumKbdGroups]; + + if ((tmp = fread(&wireMap, SIZEOF(xkmKeySymMapDesc), 1, file)) < 1) { + _XkbLibError(_XkbErrBadLength, "ReadXkmSymbols", 0); + return -1; + } + nRead += tmp * SIZEOF(xkmKeySymMapDesc); + bzero((char *) typeName, XkbNumKbdGroups * sizeof(Atom)); + bzero((char *) type, XkbNumKbdGroups * sizeof(XkbKeyTypePtr)); + if (wireMap.flags & XkmKeyHasTypes) { + register int g; + + for (g = 0; g < XkbNumKbdGroups; g++) { + if ((wireMap.flags & (1 << g)) && + ((tmp = XkmGetCountedString(file, buf, 100)) > 0)) { + typeName[g] = XkbInternAtom(xkb->dpy, buf, 1); + nRead += tmp; + } + type[g] = FindTypeForKey(xkb, typeName[g], wireMap.width, NULL); + if (type[g] == NULL) { + _XkbLibError(_XkbErrMissingTypes, "ReadXkmSymbols", 0); + return -1; + } + if (typeName[g] == type[g]->name) + xkb->server->explicit[i] |= (1 << g); + } + } + if (wireMap.flags & XkmRepeatingKey) { + xkb->ctrls->per_key_repeat[i / 8] |= (1 << (i % 8)); + xkb->server->explicit[i] |= XkbExplicitAutoRepeatMask; + } + else if (wireMap.flags & XkmNonRepeatingKey) { + xkb->ctrls->per_key_repeat[i / 8] &= ~(1 << (i % 8)); + xkb->server->explicit[i] |= XkbExplicitAutoRepeatMask; + } + xkb->map->modmap[i] = wireMap.modifier_map; + if (XkbNumGroups(wireMap.num_groups) > 0) { + KeySym *sym; + int nSyms; + + if (XkbNumGroups(wireMap.num_groups) > xkb->ctrls->num_groups) + xkb->ctrls->num_groups = wireMap.num_groups; + nSyms = XkbNumGroups(wireMap.num_groups) * wireMap.width; + sym = XkbResizeKeySyms(xkb, i, nSyms); + if (!sym) + return -1; + for (s = 0; s < nSyms; s++) { + *sym++ = XkmGetCARD32(file, &nRead); + } + if (wireMap.flags & XkmKeyHasActions) { + XkbAction *act; + + act = XkbResizeKeyActions(xkb, i, nSyms); + for (s = 0; s < nSyms; s++, act++) { + tmp = fread(act, SIZEOF(xkmActionDesc), 1, file); + nRead += tmp * SIZEOF(xkmActionDesc); + } + xkb->server->explicit[i] |= XkbExplicitInterpretMask; + } + } + for (g = 0; g < XkbNumGroups(wireMap.num_groups); g++) { + if (((xkb->server->explicit[i] & (1 << g)) == 0) || + (type[g] == NULL)) { + KeySym *tmpSyms; + + tmpSyms = XkbKeySymsPtr(xkb, i) + (wireMap.width * g); + type[g] = FindTypeForKey(xkb, None, wireMap.width, tmpSyms); + } + xkb->map->key_sym_map[i].kt_index[g] = + type[g] - (&xkb->map->types[0]); + } + xkb->map->key_sym_map[i].group_info = wireMap.num_groups; + xkb->map->key_sym_map[i].width = wireMap.width; + if (wireMap.flags & XkmKeyHasBehavior) { + xkmBehaviorDesc b; + + tmp = fread(&b, SIZEOF(xkmBehaviorDesc), 1, file); + nRead += tmp * SIZEOF(xkmBehaviorDesc); + xkb->server->behaviors[i].type = b.type; + xkb->server->behaviors[i].data = b.data; + xkb->server->explicit[i] |= XkbExplicitBehaviorMask; + } + } + if (totalVModMaps > 0) { + xkmVModMapDesc v; + + for (i = 0; i < totalVModMaps; i++) { + tmp = fread(&v, SIZEOF(xkmVModMapDesc), 1, file); + nRead += tmp * SIZEOF(xkmVModMapDesc); + if (tmp > 0) + xkb->server->vmodmap[v.key] = v.vmods; + } } return nRead; } static int -ReadXkmGeomDoodad( - FILE * file, - Display * dpy, - XkbGeometryPtr geom, - XkbSectionPtr section) +ReadXkmGeomDoodad(FILE *file, Display *dpy, + XkbGeometryPtr geom, XkbSectionPtr section) { -XkbDoodadPtr doodad; -xkmDoodadDesc doodadWire; -char buf[100]; -unsigned tmp; -int nRead=0; - - nRead+= XkmGetCountedString(file,buf,100); - tmp= fread(&doodadWire,SIZEOF(xkmDoodadDesc),1,file); - nRead+= SIZEOF(xkmDoodadDesc)*tmp; - doodad= XkbAddGeomDoodad(geom,section,XkbInternAtom(dpy,buf,False)); + XkbDoodadPtr doodad; + xkmDoodadDesc doodadWire; + char buf[100]; + unsigned tmp; + int nRead = 0; + + nRead += XkmGetCountedString(file, buf, 100); + tmp = fread(&doodadWire, SIZEOF(xkmDoodadDesc), 1, file); + nRead += SIZEOF(xkmDoodadDesc) * tmp; + doodad = XkbAddGeomDoodad(geom, section, XkbInternAtom(dpy, buf, False)); if (!doodad) - return nRead; - doodad->any.type= doodadWire.any.type; - doodad->any.priority= doodadWire.any.priority; - doodad->any.top= doodadWire.any.top; - doodad->any.left= doodadWire.any.left; + return nRead; + doodad->any.type = doodadWire.any.type; + doodad->any.priority = doodadWire.any.priority; + doodad->any.top = doodadWire.any.top; + doodad->any.left = doodadWire.any.left; switch (doodadWire.any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - doodad->shape.angle= doodadWire.shape.angle; - doodad->shape.color_ndx= doodadWire.shape.color_ndx; - doodad->shape.shape_ndx= doodadWire.shape.shape_ndx; - break; - case XkbTextDoodad: - doodad->text.angle= doodadWire.text.angle; - doodad->text.width= doodadWire.text.width; - doodad->text.height= doodadWire.text.height; - doodad->text.color_ndx= doodadWire.text.color_ndx; - nRead+= XkmGetCountedString(file,buf,100); - doodad->text.text= _XkbDupString(buf); - nRead+= XkmGetCountedString(file,buf,100); - doodad->text.font= _XkbDupString(buf); - break; - case XkbIndicatorDoodad: - doodad->indicator.shape_ndx= doodadWire.indicator.shape_ndx; - doodad->indicator.on_color_ndx= doodadWire.indicator.on_color_ndx; - doodad->indicator.off_color_ndx= doodadWire.indicator.off_color_ndx; - break; - case XkbLogoDoodad: - doodad->logo.angle= doodadWire.logo.angle; - doodad->logo.color_ndx= doodadWire.logo.color_ndx; - doodad->logo.shape_ndx= doodadWire.logo.shape_ndx; - nRead+= XkmGetCountedString(file,buf,100); - doodad->logo.logo_name= _XkbDupString(buf); - break; - default: - /* report error? */ - return nRead; + case XkbOutlineDoodad: + case XkbSolidDoodad: + doodad->shape.angle = doodadWire.shape.angle; + doodad->shape.color_ndx = doodadWire.shape.color_ndx; + doodad->shape.shape_ndx = doodadWire.shape.shape_ndx; + break; + case XkbTextDoodad: + doodad->text.angle = doodadWire.text.angle; + doodad->text.width = doodadWire.text.width; + doodad->text.height = doodadWire.text.height; + doodad->text.color_ndx = doodadWire.text.color_ndx; + nRead += XkmGetCountedString(file, buf, 100); + doodad->text.text = _XkbDupString(buf); + nRead += XkmGetCountedString(file, buf, 100); + doodad->text.font = _XkbDupString(buf); + break; + case XkbIndicatorDoodad: + doodad->indicator.shape_ndx = doodadWire.indicator.shape_ndx; + doodad->indicator.on_color_ndx = doodadWire.indicator.on_color_ndx; + doodad->indicator.off_color_ndx = doodadWire.indicator.off_color_ndx; + break; + case XkbLogoDoodad: + doodad->logo.angle = doodadWire.logo.angle; + doodad->logo.color_ndx = doodadWire.logo.color_ndx; + doodad->logo.shape_ndx = doodadWire.logo.shape_ndx; + nRead += XkmGetCountedString(file, buf, 100); + doodad->logo.logo_name = _XkbDupString(buf); + break; + default: + /* report error? */ + return nRead; } return nRead; } static int -ReadXkmGeomOverlay( FILE * file, - Display * dpy, - XkbGeometryPtr geom, - XkbSectionPtr section) +ReadXkmGeomOverlay(FILE *file, Display *dpy, + XkbGeometryPtr geom, XkbSectionPtr section) { -char buf[100]; -unsigned tmp; -int nRead=0; -XkbOverlayPtr ol; -XkbOverlayRowPtr row; -xkmOverlayDesc olWire; -xkmOverlayRowDesc rowWire; -register int r; - - nRead+= XkmGetCountedString(file,buf,100); - tmp= fread(&olWire,SIZEOF(xkmOverlayDesc),1,file); - nRead+= tmp*SIZEOF(xkmOverlayDesc); - ol= XkbAddGeomOverlay(section,XkbInternAtom(dpy,buf,False), - olWire.num_rows); + char buf[100]; + unsigned tmp; + int nRead = 0; + XkbOverlayPtr ol; + XkbOverlayRowPtr row; + xkmOverlayDesc olWire; + xkmOverlayRowDesc rowWire; + register int r; + + nRead += XkmGetCountedString(file, buf, 100); + tmp = fread(&olWire, SIZEOF(xkmOverlayDesc), 1, file); + nRead += tmp * SIZEOF(xkmOverlayDesc); + ol = XkbAddGeomOverlay(section, XkbInternAtom(dpy, buf, False), + olWire.num_rows); if (!ol) - return nRead; - for (r=0;r<olWire.num_rows;r++) { - int k; - xkmOverlayKeyDesc keyWire; - tmp= fread(&rowWire,SIZEOF(xkmOverlayRowDesc),1,file); - nRead+= tmp*SIZEOF(xkmOverlayRowDesc); - row= XkbAddGeomOverlayRow(ol,rowWire.row_under,rowWire.num_keys); - if (!row) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomOverlay",0); - return nRead; - } - for (k=0;k<rowWire.num_keys;k++) { - tmp= fread(&keyWire,SIZEOF(xkmOverlayKeyDesc),1,file); - nRead+= tmp*SIZEOF(xkmOverlayKeyDesc); - memcpy(row->keys[k].over.name,keyWire.over,XkbKeyNameLength); - memcpy(row->keys[k].under.name,keyWire.under,XkbKeyNameLength); - } - row->num_keys= rowWire.num_keys; + return nRead; + for (r = 0; r < olWire.num_rows; r++) { + int k; + xkmOverlayKeyDesc keyWire; + + tmp = fread(&rowWire, SIZEOF(xkmOverlayRowDesc), 1, file); + nRead += tmp * SIZEOF(xkmOverlayRowDesc); + row = XkbAddGeomOverlayRow(ol, rowWire.row_under, rowWire.num_keys); + if (!row) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeomOverlay", 0); + return nRead; + } + for (k = 0; k < rowWire.num_keys; k++) { + tmp = fread(&keyWire, SIZEOF(xkmOverlayKeyDesc), 1, file); + nRead += tmp * SIZEOF(xkmOverlayKeyDesc); + memcpy(row->keys[k].over.name, keyWire.over, XkbKeyNameLength); + memcpy(row->keys[k].under.name, keyWire.under, XkbKeyNameLength); + } + row->num_keys = rowWire.num_keys; } return nRead; } static int -ReadXkmGeomSection( FILE * file, - Display * dpy, - XkbGeometryPtr geom) +ReadXkmGeomSection(FILE *file, Display *dpy, XkbGeometryPtr geom) { -register int i; -XkbSectionPtr section; -xkmSectionDesc sectionWire; -unsigned tmp; -int nRead= 0; -char buf[100]; -Atom nameAtom; - - nRead+= XkmGetCountedString(file,buf,100); - nameAtom= XkbInternAtom(dpy,buf,False); - tmp= fread(§ionWire,SIZEOF(xkmSectionDesc),1,file); - nRead+= SIZEOF(xkmSectionDesc)*tmp; - section= XkbAddGeomSection(geom,nameAtom,sectionWire.num_rows, - sectionWire.num_doodads, - sectionWire.num_overlays); + register int i; + XkbSectionPtr section; + xkmSectionDesc sectionWire; + unsigned tmp; + int nRead = 0; + char buf[100]; + Atom nameAtom; + + nRead += XkmGetCountedString(file, buf, 100); + nameAtom = XkbInternAtom(dpy, buf, False); + tmp = fread(§ionWire, SIZEOF(xkmSectionDesc), 1, file); + nRead += SIZEOF(xkmSectionDesc) * tmp; + section = XkbAddGeomSection(geom, nameAtom, sectionWire.num_rows, + sectionWire.num_doodads, + sectionWire.num_overlays); if (!section) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0); - return nRead; - } - section->top= sectionWire.top; - section->left= sectionWire.left; - section->width= sectionWire.width; - section->height= sectionWire.height; - section->angle= sectionWire.angle; - section->priority= sectionWire.priority; - if (sectionWire.num_rows>0) { - register int k; - XkbRowPtr row; - xkmRowDesc rowWire; - XkbKeyPtr key; - xkmKeyDesc keyWire; - - for (i=0;i<sectionWire.num_rows;i++) { - tmp= fread(&rowWire,SIZEOF(xkmRowDesc),1,file); - nRead+= SIZEOF(xkmRowDesc)*tmp; - row= XkbAddGeomRow(section,rowWire.num_keys); - if (!row) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0); - return nRead; - } - row->top= rowWire.top; - row->left= rowWire.left; - row->vertical= rowWire.vertical; - for (k=0;k<rowWire.num_keys;k++) { - tmp= fread(&keyWire,SIZEOF(xkmKeyDesc),1,file); - nRead+= SIZEOF(xkmKeyDesc)*tmp; - key= XkbAddGeomKey(row); - if (!key) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0); - return nRead; - } - memcpy(key->name.name,keyWire.name,XkbKeyNameLength); - key->gap= keyWire.gap; - key->shape_ndx= keyWire.shape_ndx; - key->color_ndx= keyWire.color_ndx; - } - } - } - if (sectionWire.num_doodads>0) { - for (i=0;i<sectionWire.num_doodads;i++) { - tmp= ReadXkmGeomDoodad(file,dpy,geom,section); - nRead+= tmp; - if (tmp<1) - return nRead; - } - } - if (sectionWire.num_overlays>0) { - for (i=0;i<sectionWire.num_overlays;i++) { - tmp= ReadXkmGeomOverlay(file,dpy,geom,section); - nRead+= tmp; - if (tmp<1) - return nRead; - } + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeomSection", 0); + return nRead; + } + section->top = sectionWire.top; + section->left = sectionWire.left; + section->width = sectionWire.width; + section->height = sectionWire.height; + section->angle = sectionWire.angle; + section->priority = sectionWire.priority; + if (sectionWire.num_rows > 0) { + register int k; + XkbRowPtr row; + xkmRowDesc rowWire; + XkbKeyPtr key; + xkmKeyDesc keyWire; + + for (i = 0; i < sectionWire.num_rows; i++) { + tmp = fread(&rowWire, SIZEOF(xkmRowDesc), 1, file); + nRead += SIZEOF(xkmRowDesc) * tmp; + row = XkbAddGeomRow(section, rowWire.num_keys); + if (!row) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmKeycodes", 0); + return nRead; + } + row->top = rowWire.top; + row->left = rowWire.left; + row->vertical = rowWire.vertical; + for (k = 0; k < rowWire.num_keys; k++) { + tmp = fread(&keyWire, SIZEOF(xkmKeyDesc), 1, file); + nRead += SIZEOF(xkmKeyDesc) * tmp; + key = XkbAddGeomKey(row); + if (!key) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeomSection", 0); + return nRead; + } + memcpy(key->name.name, keyWire.name, XkbKeyNameLength); + key->gap = keyWire.gap; + key->shape_ndx = keyWire.shape_ndx; + key->color_ndx = keyWire.color_ndx; + } + } + } + if (sectionWire.num_doodads > 0) { + for (i = 0; i < sectionWire.num_doodads; i++) { + tmp = ReadXkmGeomDoodad(file, dpy, geom, section); + nRead += tmp; + if (tmp < 1) + return nRead; + } + } + if (sectionWire.num_overlays > 0) { + for (i = 0; i < sectionWire.num_overlays; i++) { + tmp = ReadXkmGeomOverlay(file, dpy, geom, section); + nRead += tmp; + if (tmp < 1) + return nRead; + } } return nRead; } static int -ReadXkmGeometry(FILE *file,XkbFileInfo *result) +ReadXkmGeometry(FILE *file, XkbFileInfo *result) { -register int i; -char buf[100]; -unsigned tmp; -int nRead= 0; -xkmGeometryDesc wireGeom; -XkbGeometryPtr geom; -XkbGeometrySizesRec sizes; - - nRead+= XkmGetCountedString(file,buf,100); - tmp= fread(&wireGeom,SIZEOF(xkmGeometryDesc),1,file); - nRead+= tmp*SIZEOF(xkmGeometryDesc); - sizes.which= XkbGeomAllMask; - sizes.num_properties= wireGeom.num_properties; - sizes.num_colors= wireGeom.num_colors; - sizes.num_shapes= wireGeom.num_shapes; - sizes.num_sections= wireGeom.num_sections; - sizes.num_doodads= wireGeom.num_doodads; - sizes.num_key_aliases= wireGeom.num_key_aliases; - if (XkbAllocGeometry(result->xkb,&sizes)!=Success) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0); - return nRead; - } - geom= result->xkb->geom; - geom->name= XkbInternAtom(result->xkb->dpy,buf,False); - geom->width_mm= wireGeom.width_mm; - geom->height_mm= wireGeom.height_mm; - nRead+= XkmGetCountedString(file,buf,100); - geom->label_font= _XkbDupString(buf); - if (wireGeom.num_properties>0) { - char val[1024]; - for (i=0;i<wireGeom.num_properties;i++) { - nRead+= XkmGetCountedString(file,buf,100); - nRead+= XkmGetCountedString(file,val,1024); - if (XkbAddGeomProperty(geom,buf,val)==NULL) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0); - return nRead; - } - } - } - if (wireGeom.num_colors>0) { - for (i=0;i<wireGeom.num_colors;i++) { - nRead+= XkmGetCountedString(file,buf,100); - if (XkbAddGeomColor(geom,buf,i)==NULL) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0); - return nRead; - } - } - } - geom->base_color= &geom->colors[wireGeom.base_color_ndx]; - geom->label_color= &geom->colors[wireGeom.label_color_ndx]; - if (wireGeom.num_shapes>0) { - XkbShapePtr shape; - xkmShapeDesc shapeWire; - Atom nameAtom; - for (i=0;i<wireGeom.num_shapes;i++) { - register int n; - XkbOutlinePtr ol; - xkmOutlineDesc olWire; - nRead+= XkmGetCountedString(file,buf,100); - nameAtom= XkbInternAtom(result->xkb->dpy,buf,False); - tmp= fread(&shapeWire,SIZEOF(xkmShapeDesc),1,file); - nRead+= tmp*SIZEOF(xkmShapeDesc); - shape= XkbAddGeomShape(geom,nameAtom,shapeWire.num_outlines); - if (!shape) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0); - return nRead; - } - for (n=0;n<shapeWire.num_outlines;n++) { - register int p; - xkmPointDesc ptWire; - tmp= fread(&olWire,SIZEOF(xkmOutlineDesc),1,file); - nRead+= tmp*SIZEOF(xkmOutlineDesc); - ol= XkbAddGeomOutline(shape,olWire.num_points); - if (!ol) { - _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0); - return nRead; - } - ol->num_points= olWire.num_points; - ol->corner_radius= olWire.corner_radius; - for (p=0;p<olWire.num_points;p++) { - tmp= fread(&ptWire,SIZEOF(xkmPointDesc),1,file); - nRead+= tmp*SIZEOF(xkmPointDesc); - ol->points[p].x= ptWire.x; - ol->points[p].y= ptWire.y; - if (ptWire.x<shape->bounds.x1) shape->bounds.x1= ptWire.x; - if (ptWire.x>shape->bounds.x2) shape->bounds.x2= ptWire.x; - if (ptWire.y<shape->bounds.y1) shape->bounds.y1= ptWire.y; - if (ptWire.y>shape->bounds.y2) shape->bounds.y2= ptWire.y; - } - } - if (shapeWire.primary_ndx!=XkbNoShape) - shape->primary= &shape->outlines[shapeWire.primary_ndx]; - if (shapeWire.approx_ndx!=XkbNoShape) - shape->approx= &shape->outlines[shapeWire.approx_ndx]; - } - } - if (wireGeom.num_sections>0) { - for (i=0;i<wireGeom.num_sections;i++) { - tmp= ReadXkmGeomSection(file,result->xkb->dpy,geom); - nRead+= tmp; - if (tmp==0) - return nRead; - } - } - if (wireGeom.num_doodads>0) { - for (i=0;i<wireGeom.num_doodads;i++) { - tmp= ReadXkmGeomDoodad(file,result->xkb->dpy,geom,NULL); - nRead+= tmp; - if (tmp==0) - return nRead; - } - } - if ((wireGeom.num_key_aliases>0)&&(geom->key_aliases)) { - int sz= XkbKeyNameLength*2; - int num= wireGeom.num_key_aliases; - if (fread(geom->key_aliases,sz,num,file)!=num) { - _XkbLibError(_XkbErrBadLength,"ReadXkmGeometry",0); - return -1; - } - nRead+= (num*sz); - geom->num_key_aliases= num; + register int i; + char buf[100]; + unsigned tmp; + int nRead = 0; + xkmGeometryDesc wireGeom; + XkbGeometryPtr geom; + XkbGeometrySizesRec sizes; + + nRead += XkmGetCountedString(file, buf, 100); + tmp = fread(&wireGeom, SIZEOF(xkmGeometryDesc), 1, file); + nRead += tmp * SIZEOF(xkmGeometryDesc); + sizes.which = XkbGeomAllMask; + sizes.num_properties = wireGeom.num_properties; + sizes.num_colors = wireGeom.num_colors; + sizes.num_shapes = wireGeom.num_shapes; + sizes.num_sections = wireGeom.num_sections; + sizes.num_doodads = wireGeom.num_doodads; + sizes.num_key_aliases = wireGeom.num_key_aliases; + if (XkbAllocGeometry(result->xkb, &sizes) != Success) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeometry", 0); + return nRead; + } + geom = result->xkb->geom; + geom->name = XkbInternAtom(result->xkb->dpy, buf, False); + geom->width_mm = wireGeom.width_mm; + geom->height_mm = wireGeom.height_mm; + nRead += XkmGetCountedString(file, buf, 100); + geom->label_font = _XkbDupString(buf); + if (wireGeom.num_properties > 0) { + char val[1024]; + + for (i = 0; i < wireGeom.num_properties; i++) { + nRead += XkmGetCountedString(file, buf, 100); + nRead += XkmGetCountedString(file, val, 1024); + if (XkbAddGeomProperty(geom, buf, val) == NULL) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeometry", 0); + return nRead; + } + } + } + if (wireGeom.num_colors > 0) { + for (i = 0; i < wireGeom.num_colors; i++) { + nRead += XkmGetCountedString(file, buf, 100); + if (XkbAddGeomColor(geom, buf, i) == NULL) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeometry", 0); + return nRead; + } + } + } + geom->base_color = &geom->colors[wireGeom.base_color_ndx]; + geom->label_color = &geom->colors[wireGeom.label_color_ndx]; + if (wireGeom.num_shapes > 0) { + XkbShapePtr shape; + xkmShapeDesc shapeWire; + Atom nameAtom; + + for (i = 0; i < wireGeom.num_shapes; i++) { + register int n; + XkbOutlinePtr ol; + xkmOutlineDesc olWire; + + nRead += XkmGetCountedString(file, buf, 100); + nameAtom = XkbInternAtom(result->xkb->dpy, buf, False); + tmp = fread(&shapeWire, SIZEOF(xkmShapeDesc), 1, file); + nRead += tmp * SIZEOF(xkmShapeDesc); + shape = XkbAddGeomShape(geom, nameAtom, shapeWire.num_outlines); + if (!shape) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeometry", 0); + return nRead; + } + for (n = 0; n < shapeWire.num_outlines; n++) { + register int p; + xkmPointDesc ptWire; + + tmp = fread(&olWire, SIZEOF(xkmOutlineDesc), 1, file); + nRead += tmp * SIZEOF(xkmOutlineDesc); + ol = XkbAddGeomOutline(shape, olWire.num_points); + if (!ol) { + _XkbLibError(_XkbErrBadAlloc, "ReadXkmGeometry", 0); + return nRead; + } + ol->num_points = olWire.num_points; + ol->corner_radius = olWire.corner_radius; + for (p = 0; p < olWire.num_points; p++) { + tmp = fread(&ptWire, SIZEOF(xkmPointDesc), 1, file); + nRead += tmp * SIZEOF(xkmPointDesc); + ol->points[p].x = ptWire.x; + ol->points[p].y = ptWire.y; + if (ptWire.x < shape->bounds.x1) + shape->bounds.x1 = ptWire.x; + if (ptWire.x > shape->bounds.x2) + shape->bounds.x2 = ptWire.x; + if (ptWire.y < shape->bounds.y1) + shape->bounds.y1 = ptWire.y; + if (ptWire.y > shape->bounds.y2) + shape->bounds.y2 = ptWire.y; + } + } + if (shapeWire.primary_ndx != XkbNoShape) + shape->primary = &shape->outlines[shapeWire.primary_ndx]; + if (shapeWire.approx_ndx != XkbNoShape) + shape->approx = &shape->outlines[shapeWire.approx_ndx]; + } + } + if (wireGeom.num_sections > 0) { + for (i = 0; i < wireGeom.num_sections; i++) { + tmp = ReadXkmGeomSection(file, result->xkb->dpy, geom); + nRead += tmp; + if (tmp == 0) + return nRead; + } + } + if (wireGeom.num_doodads > 0) { + for (i = 0; i < wireGeom.num_doodads; i++) { + tmp = ReadXkmGeomDoodad(file, result->xkb->dpy, geom, NULL); + nRead += tmp; + if (tmp == 0) + return nRead; + } + } + if ((wireGeom.num_key_aliases > 0) && (geom->key_aliases)) { + int sz = XkbKeyNameLength * 2; + int num = wireGeom.num_key_aliases; + + if (fread(geom->key_aliases, sz, num, file) != num) { + _XkbLibError(_XkbErrBadLength, "ReadXkmGeometry", 0); + return -1; + } + nRead += (num * sz); + geom->num_key_aliases = num; } return nRead; } @@ -1055,167 +1094,168 @@ XkbGeometrySizesRec sizes; Bool XkmProbe(FILE *file) { -unsigned hdr,tmp; -int nRead=0; - - hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion); - tmp= XkmGetCARD32(file,&nRead); - if (tmp!=hdr) { - if ((tmp&(~0xff))==(hdr&(~0xff))) { - _XkbLibError(_XkbErrBadFileVersion,"XkmProbe",tmp&0xff); - } - return 0; + unsigned hdr, tmp; + int nRead = 0; + + hdr = (('x' << 24) | ('k' << 16) | ('m' << 8) | XkmFileVersion); + tmp = XkmGetCARD32(file, &nRead); + if (tmp != hdr) { + if ((tmp & (~0xff)) == (hdr & (~0xff))) { + _XkbLibError(_XkbErrBadFileVersion, "XkmProbe", tmp & 0xff); + } + return 0; } return 1; } Bool -XkmReadTOC(FILE *file,xkmFileInfo* file_info,int max_toc,xkmSectionInfo *toc) +XkmReadTOC(FILE *file, xkmFileInfo *file_info, + int max_toc, xkmSectionInfo *toc) { -unsigned hdr,tmp; -int nRead=0; -unsigned i,size_toc; - - hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion); - tmp= XkmGetCARD32(file,&nRead); - if (tmp!=hdr) { - if ((tmp&(~0xff))==(hdr&(~0xff))) { - _XkbLibError(_XkbErrBadFileVersion,"XkmReadTOC",tmp&0xff); - } - else { - _XkbLibError(_XkbErrBadFileType,"XkmReadTOC",tmp); - } - return 0; - } - fread(file_info,SIZEOF(xkmFileInfo),1,file); - size_toc= file_info->num_toc; - if (size_toc>max_toc) { + unsigned hdr, tmp; + int nRead = 0; + unsigned i, size_toc; + + hdr = (('x' << 24) | ('k' << 16) | ('m' << 8) | XkmFileVersion); + tmp = XkmGetCARD32(file, &nRead); + if (tmp != hdr) { + if ((tmp & (~0xff)) == (hdr & (~0xff))) { + _XkbLibError(_XkbErrBadFileVersion, "XkmReadTOC", tmp & 0xff); + } + else { + _XkbLibError(_XkbErrBadFileType, "XkmReadTOC", tmp); + } + return 0; + } + fread(file_info, SIZEOF(xkmFileInfo), 1, file); + size_toc = file_info->num_toc; + if (size_toc > max_toc) { #ifdef DEBUG - fprintf(stderr,"Warning! Too many TOC entries; last %d ignored\n", - size_toc-max_toc); + fprintf(stderr, "Warning! Too many TOC entries; last %d ignored\n", + size_toc - max_toc); #endif - size_toc= max_toc; + size_toc = max_toc; } - for (i=0;i<size_toc;i++) { - fread(&toc[i],SIZEOF(xkmSectionInfo),1,file); + for (i = 0; i < size_toc; i++) { + fread(&toc[i], SIZEOF(xkmSectionInfo), 1, file); } return 1; } xkmSectionInfo * -XkmFindTOCEntry(xkmFileInfo *finfo,xkmSectionInfo *toc,unsigned type) +XkmFindTOCEntry(xkmFileInfo *finfo, xkmSectionInfo *toc, unsigned type) { -register int i; + register int i; - for (i=0;i<finfo->num_toc;i++) { - if (toc[i].type==type) - return &toc[i]; + for (i = 0; i < finfo->num_toc; i++) { + if (toc[i].type == type) + return &toc[i]; } return NULL; } Bool -XkmReadFileSection( FILE * file, - xkmSectionInfo * toc, - XkbFileInfo * result, - unsigned * loaded_rtrn) +XkmReadFileSection(FILE * file, + xkmSectionInfo * toc, + XkbFileInfo * result, + unsigned * loaded_rtrn) { -xkmSectionInfo tmpTOC; -int nRead; + xkmSectionInfo tmpTOC; + int nRead; - if ((!result)||(!result->xkb)) { - _XkbLibError(_XkbErrBadMatch,"XkmReadFileSection",0); - return 0; + if ((!result) || (!result->xkb)) { + _XkbLibError(_XkbErrBadMatch, "XkmReadFileSection", 0); + return 0; } - fseek(file,toc->offset,SEEK_SET); - fread(&tmpTOC,SIZEOF(xkmSectionInfo),1,file); - nRead= SIZEOF(xkmSectionInfo); - if ((tmpTOC.type!=toc->type)||(tmpTOC.format!=toc->format)|| - (tmpTOC.size!=toc->size)||(tmpTOC.offset!=toc->offset)) { - _XkbLibError(_XkbErrIllegalContents,"XkmReadFileSection",0); - return 0; + fseek(file, toc->offset, SEEK_SET); + fread(&tmpTOC, SIZEOF(xkmSectionInfo), 1, file); + nRead = SIZEOF(xkmSectionInfo); + if ((tmpTOC.type != toc->type) || (tmpTOC.format != toc->format) || + (tmpTOC.size != toc->size) || (tmpTOC.offset != toc->offset)) { + _XkbLibError(_XkbErrIllegalContents, "XkmReadFileSection", 0); + return 0; } switch (tmpTOC.type) { - case XkmVirtualModsIndex: - nRead+= ReadXkmVirtualMods(file,result,NULL); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmVirtualModsMask; - break; - case XkmTypesIndex: - nRead+= ReadXkmKeyTypes(file,result,NULL); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmTypesMask; - break; - case XkmCompatMapIndex: - nRead+= ReadXkmCompatMap(file,result,NULL); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmCompatMapMask; - break; - case XkmKeyNamesIndex: - nRead+= ReadXkmKeycodes(file,result,NULL); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmKeyNamesMask; - break; - case XkmSymbolsIndex: - nRead+= ReadXkmSymbols(file,result); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmSymbolsMask; - break; - case XkmIndicatorsIndex: - nRead+= ReadXkmIndicators(file,result,NULL); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmIndicatorsMask; - break; - case XkmGeometryIndex: - nRead+= ReadXkmGeometry(file,result); - if ((loaded_rtrn)&&(nRead>=0)) - *loaded_rtrn|= XkmGeometryMask; - break; - default: - _XkbLibError(_XkbErrBadImplementation, - XkbConfigText(tmpTOC.type,XkbMessage),0); - nRead= 0; - break; - } - if (nRead!=tmpTOC.size) { - _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage), - nRead-tmpTOC.size); - return 0; - } - return (nRead>=0); + case XkmVirtualModsIndex: + nRead += ReadXkmVirtualMods(file, result, NULL); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmVirtualModsMask; + break; + case XkmTypesIndex: + nRead += ReadXkmKeyTypes(file, result, NULL); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmTypesMask; + break; + case XkmCompatMapIndex: + nRead += ReadXkmCompatMap(file, result, NULL); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmCompatMapMask; + break; + case XkmKeyNamesIndex: + nRead += ReadXkmKeycodes(file, result, NULL); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmKeyNamesMask; + break; + case XkmSymbolsIndex: + nRead += ReadXkmSymbols(file, result); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmSymbolsMask; + break; + case XkmIndicatorsIndex: + nRead += ReadXkmIndicators(file, result, NULL); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmIndicatorsMask; + break; + case XkmGeometryIndex: + nRead += ReadXkmGeometry(file, result); + if ((loaded_rtrn) && (nRead >= 0)) + *loaded_rtrn |= XkmGeometryMask; + break; + default: + _XkbLibError(_XkbErrBadImplementation, + XkbConfigText(tmpTOC.type, XkbMessage), 0); + nRead = 0; + break; + } + if (nRead != tmpTOC.size) { + _XkbLibError(_XkbErrBadLength, XkbConfigText(tmpTOC.type, XkbMessage), + nRead - tmpTOC.size); + return 0; + } + return (nRead >= 0); } char * -XkmReadFileSectionName(FILE *file,xkmSectionInfo *toc) +XkmReadFileSectionName(FILE *file, xkmSectionInfo *toc) { -xkmSectionInfo tmpTOC; -char name[100]; + xkmSectionInfo tmpTOC; + char name[100]; - if ((!file)||(!toc)) - return NULL; + if ((!file) || (!toc)) + return NULL; switch (toc->type) { - case XkmVirtualModsIndex: - case XkmIndicatorsIndex: - break; - case XkmTypesIndex: - case XkmCompatMapIndex: - case XkmKeyNamesIndex: - case XkmSymbolsIndex: - case XkmGeometryIndex: - fseek(file,toc->offset,SEEK_SET); - fread(&tmpTOC,SIZEOF(xkmSectionInfo),1,file); - if ((tmpTOC.type!=toc->type)||(tmpTOC.format!=toc->format)|| - (tmpTOC.size!=toc->size)||(tmpTOC.offset!=toc->offset)) { - _XkbLibError(_XkbErrIllegalContents,"XkmReadFileSectionName",0); - return NULL; - } - if (XkmGetCountedString(file,name,100)>0) - return _XkbDupString(name); - break; - default: - _XkbLibError(_XkbErrBadImplementation, - XkbConfigText(tmpTOC.type,XkbMessage),0); - break; + case XkmVirtualModsIndex: + case XkmIndicatorsIndex: + break; + case XkmTypesIndex: + case XkmCompatMapIndex: + case XkmKeyNamesIndex: + case XkmSymbolsIndex: + case XkmGeometryIndex: + fseek(file, toc->offset, SEEK_SET); + fread(&tmpTOC, SIZEOF(xkmSectionInfo), 1, file); + if ((tmpTOC.type != toc->type) || (tmpTOC.format != toc->format) || + (tmpTOC.size != toc->size) || (tmpTOC.offset != toc->offset)) { + _XkbLibError(_XkbErrIllegalContents, "XkmReadFileSectionName", 0); + return NULL; + } + if (XkmGetCountedString(file, name, 100) > 0) + return _XkbDupString(name); + break; + default: + _XkbLibError(_XkbErrBadImplementation, + XkbConfigText(tmpTOC.type, XkbMessage), 0); + break; } return NULL; } @@ -1224,76 +1264,77 @@ char name[100]; #define MAX_TOC 16 unsigned -XkmReadFile(FILE *file,unsigned need,unsigned want,XkbFileInfo *result) +XkmReadFile(FILE *file, unsigned need, unsigned want, XkbFileInfo *result) { -register unsigned i; -xkmSectionInfo toc[MAX_TOC],tmpTOC; -xkmFileInfo fileInfo; -unsigned tmp,nRead=0; -unsigned which= need|want; - - if (!XkmReadTOC(file,&fileInfo,MAX_TOC,toc)) - return which; - if ((fileInfo.present&need)!=need) { - _XkbLibError(_XkbErrIllegalContents,"XkmReadFile", - need&(~fileInfo.present)); - return which; - } - result->type= fileInfo.type; - if (result->xkb==NULL) - result->xkb= XkbAllocKeyboard(); - for (i=0;i<fileInfo.num_toc;i++) { + register unsigned i; + xkmSectionInfo toc[MAX_TOC], tmpTOC; + xkmFileInfo fileInfo; + unsigned tmp, nRead = 0; + unsigned which = need | want; + + if (!XkmReadTOC(file, &fileInfo, MAX_TOC, toc)) + return which; + if ((fileInfo.present & need) != need) { + _XkbLibError(_XkbErrIllegalContents, "XkmReadFile", + need & (~fileInfo.present)); + return which; + } + result->type = fileInfo.type; + if (result->xkb == NULL) + result->xkb = XkbAllocKeyboard(); + for (i = 0; i < fileInfo.num_toc; i++) { #ifdef SEEK_SET - fseek(file,toc[i].offset,SEEK_SET); + fseek(file, toc[i].offset, SEEK_SET); #else - fseek(file,toc[i].offset,0); + fseek(file, toc[i].offset, 0); #endif - tmp= fread(&tmpTOC,SIZEOF(xkmSectionInfo),1,file); - nRead= tmp*SIZEOF(xkmSectionInfo); - if ((tmpTOC.type!=toc[i].type)||(tmpTOC.format!=toc[i].format)|| - (tmpTOC.size!=toc[i].size)||(tmpTOC.offset!=toc[i].offset)) { - return which; - } - if ((which&(1<<tmpTOC.type))==0) { - continue; - } - switch (tmpTOC.type) { - case XkmVirtualModsIndex: - tmp= ReadXkmVirtualMods(file,result,NULL); - break; - case XkmTypesIndex: - tmp= ReadXkmKeyTypes(file,result,NULL); - break; - case XkmCompatMapIndex: - tmp= ReadXkmCompatMap(file,result,NULL); - break; - case XkmKeyNamesIndex: - tmp= ReadXkmKeycodes(file,result,NULL); - break; - case XkmIndicatorsIndex: - tmp= ReadXkmIndicators(file,result,NULL); - break; - case XkmSymbolsIndex: - tmp= ReadXkmSymbols(file,result); - break; - case XkmGeometryIndex: - tmp= ReadXkmGeometry(file,result); - break; - default: - _XkbLibError(_XkbErrBadImplementation, - XkbConfigText(tmpTOC.type,XkbMessage),0); - tmp= 0; - break; - } - if (tmp>0) { - nRead+= tmp; - which&= ~(1<<toc[i].type); - result->defined|= (1<<toc[i].type); - } - if (nRead!=tmpTOC.size) { - _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage), - nRead-tmpTOC.size); - } + tmp = fread(&tmpTOC, SIZEOF(xkmSectionInfo), 1, file); + nRead = tmp * SIZEOF(xkmSectionInfo); + if ((tmpTOC.type != toc[i].type) || (tmpTOC.format != toc[i].format) || + (tmpTOC.size != toc[i].size) || (tmpTOC.offset != toc[i].offset)) { + return which; + } + if ((which & (1 << tmpTOC.type)) == 0) { + continue; + } + switch (tmpTOC.type) { + case XkmVirtualModsIndex: + tmp = ReadXkmVirtualMods(file, result, NULL); + break; + case XkmTypesIndex: + tmp = ReadXkmKeyTypes(file, result, NULL); + break; + case XkmCompatMapIndex: + tmp = ReadXkmCompatMap(file, result, NULL); + break; + case XkmKeyNamesIndex: + tmp = ReadXkmKeycodes(file, result, NULL); + break; + case XkmIndicatorsIndex: + tmp = ReadXkmIndicators(file, result, NULL); + break; + case XkmSymbolsIndex: + tmp = ReadXkmSymbols(file, result); + break; + case XkmGeometryIndex: + tmp = ReadXkmGeometry(file, result); + break; + default: + _XkbLibError(_XkbErrBadImplementation, + XkbConfigText(tmpTOC.type, XkbMessage), 0); + tmp = 0; + break; + } + if (tmp > 0) { + nRead += tmp; + which &= ~(1 << toc[i].type); + result->defined |= (1 << toc[i].type); + } + if (nRead != tmpTOC.size) { + _XkbLibError(_XkbErrBadLength, + XkbConfigText(tmpTOC.type, XkbMessage), + nRead - tmpTOC.size); + } } return which; } |