1
/* $Xorg: xkmout.c,v 1.3 2000/08/17 19:46:44 cpqbld Exp $ */
2
/************************************************************
3
Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
5
Permission to use, copy, modify, and distribute this
6
software and its documentation for any purpose and without
7
fee is hereby granted, provided that the above copyright
8
notice appear in all copies and that both that copyright
9
notice and this permission notice appear in supporting
10
documentation, and that the name of Silicon Graphics not be
11
used in advertising or publicity pertaining to distribution
12
of the software without specific prior written permission.
13
Silicon Graphics makes no representation about the suitability
14
of this software for any purpose. It is provided "as is"
15
without any express or implied warranty.
17
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
18
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
19
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
20
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
21
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
22
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
23
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
24
THE USE OR PERFORMANCE OF THIS SOFTWARE.
26
********************************************************/
27
/* $XFree86: xc/lib/xkbfile/xkmout.c,v 1.5 2001/07/25 15:04:58 dawes Exp $ */
32
#include <X11/Xfuncs.h>
34
#include <X11/XKBlib.h>
35
#include <X11/extensions/XKBgeom.h>
37
#include "XKMformat.h"
38
#include "XKBfileInt.h"
40
typedef struct _XkmInfo {
41
unsigned short bound_vmods;
42
unsigned short named_vmods;
43
unsigned char num_bound;
44
unsigned char group_compat;
45
unsigned short num_group_compat;
46
unsigned short num_leds;
50
/***====================================================================***/
52
#define xkmPutCARD8(f,v) (putc(v,f),1)
55
#if NeedFunctionPrototypes
56
xkmPutCARD16(FILE *file,unsigned val)
58
xkmPutCARD16(file,val)
65
fwrite(&tmp,2,1,file);
70
#if NeedFunctionPrototypes
71
xkmPutCARD32(FILE *file,unsigned long val)
73
xkmPutCARD32(file,val)
80
fwrite(&tmp,4,1,file);
85
#if NeedFunctionPrototypes
86
xkmPutPadding(FILE *file,unsigned pad)
88
xkmPutPadding(file,pad)
101
#if NeedFunctionPrototypes
102
xkmPutCountedBytes(FILE *file,char *ptr,unsigned count)
104
xkmPutCountedBytes(file,ptr,count)
111
register unsigned pad;
114
return xkmPutCARD32(file,(unsigned long)0);
116
xkmPutCARD16(file,count);
117
nOut= fwrite(ptr,1,count,file);
121
pad= XkbPaddedSize(nOut)-nOut;
123
xkmPutPadding(file,pad);
128
#if NeedFunctionPrototypes
129
xkmSizeCountedString(char *str)
131
xkmSizeCountedString(str)
137
return XkbPaddedSize(strlen(str)+2);
141
#if NeedFunctionPrototypes
142
xkmPutCountedString(FILE *file,char *str)
144
xkmPutCountedString(file,str)
150
return xkmPutCARD32(file,(unsigned long)0);
151
return xkmPutCountedBytes(file,str,strlen(str));
154
#define xkmSizeCountedAtomString(d,a) \
155
xkmSizeCountedString(XkbAtomGetString((d),(a)))
157
#define xkmPutCountedAtomString(d,f,a) \
158
xkmPutCountedString((f),XkbAtomGetString((d),(a)))
160
/***====================================================================***/
163
#if NeedFunctionPrototypes
164
SizeXKMVirtualMods( XkbFileInfo * result,
166
xkmSectionInfo * toc,
169
SizeXKMVirtualMods(result,info,toc,offset_inout)
170
XkbFileInfo * result;
172
xkmSectionInfo * toc;
178
unsigned nBound,bound;
179
unsigned nNamed,named,szNames;
180
register unsigned i,bit;
184
if ((!xkb)||(!xkb->names)||(!xkb->server)) {
185
_XkbLibError(_XkbErrMissingVMods,"SizeXKMVirtualMods",0);
189
for (i=nBound=nNamed=szNames=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
190
if (xkb->server->vmods[i]!=XkbNoModifierMask) {
194
if (xkb->names->vmods[i]!=None) {
196
szNames+= xkmSizeCountedAtomString(dpy,xkb->names->vmods[i]);
200
info->num_bound= nBound;
201
info->bound_vmods= bound;
202
info->named_vmods= named;
203
if ((nBound==0)&&(nNamed==0))
205
toc->type= XkmVirtualModsIndex;
206
toc->format= MSBFirst;
207
toc->size= 4+XkbPaddedSize(nBound)+szNames+SIZEOF(xkmSectionInfo);
208
toc->offset= *offset_inout;
209
(*offset_inout)+= toc->size;
214
#if NeedFunctionPrototypes
215
WriteXKMVirtualMods(FILE *file,XkbFileInfo *result,XkmInfo *info)
217
WriteXKMVirtualMods(file,result,info)
219
XkbFileInfo * result;
223
register unsigned int i,bit;
230
size+= xkmPutCARD16(file,info->bound_vmods);
231
size+= xkmPutCARD16(file,info->named_vmods);
232
for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
233
if (info->bound_vmods&bit)
234
size+= xkmPutCARD8(file,xkb->server->vmods[i]);
236
if ((i= XkbPaddedSize(info->num_bound)-info->num_bound)>0)
237
size+= xkmPutPadding(file,i);
238
for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
239
if (info->named_vmods&bit) {
241
name= XkbAtomGetString(dpy,xkb->names->vmods[i]);
242
size+= xkmPutCountedString(file,name);
248
/***====================================================================***/
251
#if NeedFunctionPrototypes
252
SizeXKMKeycodes(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout)
254
SizeXKMKeycodes(result,toc,offset_inout)
255
XkbFileInfo * result;
256
xkmSectionInfo * toc;
267
if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) {
268
_XkbLibError(_XkbErrMissingNames,"SizeXKMKeycodes",0);
271
kcName= xkb->names->keycodes;
272
size+= 4; /* min and max keycode */
273
size+= xkmSizeCountedAtomString(dpy,kcName);
274
size+= XkbNumKeys(xkb)*sizeof(XkbKeyNameRec);
275
if (xkb->names->num_key_aliases>0) {
276
if (xkb->names->key_aliases!=NULL)
277
size+= xkb->names->num_key_aliases*sizeof(XkbKeyAliasRec);
278
else xkb->names->num_key_aliases= 0;
280
toc->type= XkmKeyNamesIndex;
281
toc->format= MSBFirst;
282
toc->size= size+SIZEOF(xkmSectionInfo);
283
toc->offset= (*offset_inout);
284
(*offset_inout)+= toc->size;
289
#if NeedFunctionPrototypes
290
WriteXKMKeycodes(FILE *file,XkbFileInfo *result)
292
WriteXKMKeycodes(file,result)
294
XkbFileInfo * result;
301
unsigned tmp,size= 0;
305
kcName= xkb->names->keycodes;
306
start= xkb->names->keys[xkb->min_key_code].name;
308
size+= xkmPutCountedString(file,XkbAtomGetString(dpy,kcName));
309
size+= xkmPutCARD8(file,xkb->min_key_code);
310
size+= xkmPutCARD8(file,xkb->max_key_code);
311
size+= xkmPutCARD8(file,xkb->names->num_key_aliases);
312
size+= xkmPutPadding(file,1);
313
tmp= fwrite(start,sizeof(XkbKeyNameRec),XkbNumKeys(xkb),file);
314
size+= tmp*sizeof(XkbKeyNameRec);
315
if (xkb->names->num_key_aliases>0) {
316
tmp= fwrite((char *)xkb->names->key_aliases,
317
sizeof(XkbKeyAliasRec),xkb->names->num_key_aliases,
319
size+= tmp*sizeof(XkbKeyAliasRec);
324
/***====================================================================***/
327
#if NeedFunctionPrototypes
328
SizeXKMKeyTypes(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout)
330
SizeXKMKeyTypes(result,toc,offset_inout)
331
XkbFileInfo * result;
332
xkmSectionInfo * toc;
336
register unsigned i,n,size;
344
if ((!xkb)||(!xkb->map)||(!xkb->map->types)) {
345
_XkbLibError(_XkbErrMissingTypes,"SizeXKBKeyTypes",0);
348
if (xkb->map->num_types<XkbNumRequiredTypes) {
349
_XkbLibError(_XkbErrMissingReqTypes,"SizeXKBKeyTypes",0);
352
if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->types);
354
size= xkmSizeCountedString(name);
355
size+= 4; /* room for # of key types + padding */
356
for (i=0,type=xkb->map->types;i<xkb->map->num_types;i++,type++) {
357
size+= SIZEOF(xkmKeyTypeDesc);
358
size+= SIZEOF(xkmKTMapEntryDesc)*type->map_count;
359
size+= xkmSizeCountedAtomString(dpy,type->name);
361
size+= SIZEOF(xkmModsDesc)*type->map_count;
362
if (type->level_names) {
364
names= type->level_names;
365
for (n=0;n<(unsigned)type->num_levels;n++) {
366
size+= xkmSizeCountedAtomString(dpy,names[n]);
370
toc->type= XkmTypesIndex;
371
toc->format= MSBFirst;
372
toc->size= size+SIZEOF(xkmSectionInfo);
373
toc->offset= (*offset_inout);
374
(*offset_inout)+= toc->size;
379
#if NeedFunctionPrototypes
380
WriteXKMKeyTypes(FILE *file,XkbFileInfo *result)
382
WriteXKMKeyTypes(file,result)
384
XkbFileInfo * result;
387
register unsigned i,n;
391
XkbKTMapEntryPtr entry;
392
xkmKTMapEntryDesc wire_entry;
395
unsigned tmp,size= 0;
400
if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->types);
402
size+= xkmPutCountedString(file,name);
403
size+= xkmPutCARD16(file,xkb->map->num_types);
404
size+= xkmPutPadding(file,2);
405
type= xkb->map->types;
406
for (i=0;i<xkb->map->num_types;i++,type++) {
407
wire.realMods= type->mods.real_mods;
408
wire.virtualMods= type->mods.vmods;
409
wire.numLevels= type->num_levels;
410
wire.nMapEntries= type->map_count;
411
wire.preserve= (type->preserve!=NULL);
412
if (type->level_names!=NULL)
413
wire.nLevelNames= type->num_levels;
414
else wire.nLevelNames= 0;
415
tmp= fwrite(&wire,SIZEOF(xkmKeyTypeDesc),1,file);
416
size+= tmp*SIZEOF(xkmKeyTypeDesc);
417
for (n=0,entry= type->map;n<type->map_count;n++,entry++) {
418
wire_entry.level= entry->level;
419
wire_entry.realMods= entry->mods.real_mods;
420
wire_entry.virtualMods= entry->mods.vmods;
421
tmp= fwrite(&wire_entry,SIZEOF(xkmKTMapEntryDesc),1,file);
422
size+= tmp*SIZEOF(xkmKTMapEntryDesc);
424
size+= xkmPutCountedString(file,XkbAtomGetString(dpy,type->name));
425
if (type->preserve) {
428
for (n=0,pre=type->preserve;n<type->map_count;n++,pre++) {
429
p_entry.realMods= pre->real_mods;
430
p_entry.virtualMods= pre->vmods;
431
tmp= fwrite(&p_entry,SIZEOF(xkmModsDesc),1,file);
432
size+= tmp*SIZEOF(xkmModsDesc);
435
if (type->level_names!=NULL) {
436
names= type->level_names;
437
for (n=0;n<wire.nLevelNames;n++) {
438
size+= xkmPutCountedString(file,XkbAtomGetString(dpy,names[n]));
445
/***====================================================================***/
448
#if NeedFunctionPrototypes
449
SizeXKMCompatMap( XkbFileInfo * result,
451
xkmSectionInfo * toc,
454
SizeXKMCompatMap(result,info,toc,offset_inout)
455
XkbFileInfo * result;
457
xkmSectionInfo * toc;
465
unsigned groups,nGroups;
470
if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) {
471
_XkbLibError(_XkbErrMissingCompatMap,"SizeXKMCompatMap",0);
474
if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->compat);
477
for (i=groups=nGroups=0;i<XkbNumKbdGroups;i++) {
478
if ((xkb->compat->groups[i].real_mods!=0)||
479
(xkb->compat->groups[i].vmods!=0)) {
484
info->group_compat= groups;
485
info->num_group_compat= nGroups;
486
size= 4; /* room for num_si and group_compat mask */
487
size+= xkmSizeCountedString(name);
488
size+= (SIZEOF(xkmSymInterpretDesc)*xkb->compat->num_si);
489
size+= (SIZEOF(xkmModsDesc)*nGroups);
490
toc->type= XkmCompatMapIndex;
491
toc->format= MSBFirst;
492
toc->size= size+SIZEOF(xkmSectionInfo);
493
toc->offset= (*offset_inout);
494
(*offset_inout)+= toc->size;
499
#if NeedFunctionPrototypes
500
WriteXKMCompatMap(FILE *file,XkbFileInfo *result,XkmInfo *info)
502
WriteXKMCompatMap(file,result,info)
504
XkbFileInfo * result;
511
XkbSymInterpretPtr interp;
512
xkmSymInterpretDesc wire;
518
if (xkb->names) name= XkbAtomGetString(dpy,xkb->names->compat);
520
size+= xkmPutCountedString(file,name);
521
size+= xkmPutCARD16(file,xkb->compat->num_si);
522
size+= xkmPutCARD8(file,info->group_compat);
523
size+= xkmPutPadding(file,1);
524
interp= xkb->compat->sym_interpret;
525
for (i=0;i<xkb->compat->num_si;i++,interp++) {
526
wire.sym= interp->sym;
527
wire.mods= interp->mods;
528
wire.match= interp->match;
529
wire.virtualMod= interp->virtual_mod;
530
wire.flags= interp->flags;
531
wire.actionType= interp->act.type;
532
wire.actionData[0]= interp->act.data[0];
533
wire.actionData[1]= interp->act.data[1];
534
wire.actionData[2]= interp->act.data[2];
535
wire.actionData[3]= interp->act.data[3];
536
wire.actionData[4]= interp->act.data[4];
537
wire.actionData[5]= interp->act.data[5];
538
wire.actionData[6]= interp->act.data[6];
539
tmp= fwrite(&wire,SIZEOF(xkmSymInterpretDesc),1,file);
540
size+= tmp*SIZEOF(xkmSymInterpretDesc);
542
if (info->group_compat) {
543
register unsigned bit;
544
xkmModsDesc modsWire;
545
for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
546
if (info->group_compat&bit) {
547
modsWire.realMods= xkb->compat->groups[i].real_mods;
548
modsWire.virtualMods= xkb->compat->groups[i].vmods;
549
fwrite(&modsWire,SIZEOF(xkmModsDesc),1,file);
550
size+= SIZEOF(xkmModsDesc);
557
/***====================================================================***/
560
#if NeedFunctionPrototypes
561
SizeXKMSymbols( XkbFileInfo * result,
563
xkmSectionInfo * toc,
566
SizeXKMSymbols(result,info,toc,offset_inout)
567
XkbFileInfo * result;
569
xkmSectionInfo * toc;
576
register int i,nSyms;
581
if ((!xkb)||(!xkb->map)||((!xkb->map->syms))) {
582
_XkbLibError(_XkbErrMissingSymbols,"SizeXKMSymbols",0);
585
if (xkb->names && (xkb->names->symbols!=None))
586
name= XkbAtomGetString(dpy,xkb->names->symbols);
588
size= xkmSizeCountedString(name);
589
size+= 4; /* min and max keycode, group names mask */
590
for (i=0;i<XkbNumKbdGroups;i++) {
591
if (xkb->names->groups[i]!=None)
592
size+= xkmSizeCountedAtomString(dpy,xkb->names->groups[i]);
594
info->total_vmodmaps= 0;
595
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
596
nSyms= XkbKeyNumSyms(xkb,i);
597
size+= SIZEOF(xkmKeySymMapDesc)+(nSyms*4);
599
if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) {
601
for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) {
602
if (xkb->server->explicit[i]&(1<<g)) {
605
type= XkbKeyKeyType(xkb,i,g);
606
name= XkbAtomGetString(dpy,type->name);
608
size+= xkmSizeCountedString(name);
612
if (XkbKeyHasActions(xkb,i))
613
size+= nSyms*SIZEOF(xkmActionDesc);
614
if (xkb->server->behaviors[i].type!=XkbKB_Default)
615
size+= SIZEOF(xkmBehaviorDesc);
616
if (xkb->server->vmodmap && (xkb->server->vmodmap[i]!=0))
617
info->total_vmodmaps++;
620
size+= info->total_vmodmaps*SIZEOF(xkmVModMapDesc);
621
toc->type= XkmSymbolsIndex;
622
toc->format= MSBFirst;
623
toc->size= size+SIZEOF(xkmSectionInfo);
624
toc->offset= (*offset_inout);
625
(*offset_inout)+= toc->size;
630
#if NeedFunctionPrototypes
631
WriteXKMSymbols(FILE *file,XkbFileInfo *result,XkmInfo *info)
633
WriteXKMSymbols(file,result,info)
635
XkbFileInfo * result;
642
xkmKeySymMapDesc wireMap;
644
unsigned tmp,size= 0;
648
if (xkb->names && (xkb->names->symbols!=None))
649
name= XkbAtomGetString(dpy,xkb->names->symbols);
651
size+= xkmPutCountedString(file,name);
652
for (tmp=i=0;i<XkbNumKbdGroups;i++) {
653
if (xkb->names->groups[i]!=None)
656
size+= xkmPutCARD8(file,xkb->min_key_code);
657
size+= xkmPutCARD8(file,xkb->max_key_code);
658
size+= xkmPutCARD8(file,tmp);
659
size+= xkmPutCARD8(file,info->total_vmodmaps);
660
for (i=0,n=1;i<XkbNumKbdGroups;i++,n<<=1) {
663
size+= xkmPutCountedAtomString(dpy,file,xkb->names->groups[i]);
665
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
666
char *typeName[XkbNumKbdGroups];
667
wireMap.width= XkbKeyGroupsWidth(xkb,i);
668
wireMap.num_groups= XkbKeyGroupInfo(xkb,i);
669
if (xkb->map && xkb->map->modmap)
670
wireMap.modifier_map= xkb->map->modmap[i];
671
else wireMap.modifier_map= 0;
673
bzero((char *)typeName,XkbNumKbdGroups*sizeof(char *));
675
if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) {
677
for (g=0;g<XkbKeyNumGroups(xkb,i);g++) {
678
if (xkb->server->explicit[i]&(1<<g)) {
680
type= XkbKeyKeyType(xkb,i,g);
681
typeName[g]= XkbAtomGetString(dpy,type->name);
682
if (typeName[g]!=NULL)
683
wireMap.flags|= (1<<g);
687
if (XkbKeyHasActions(xkb,i))
688
wireMap.flags|= XkmKeyHasActions;
689
if (xkb->server->behaviors[i].type!=XkbKB_Default)
690
wireMap.flags|= XkmKeyHasBehavior;
691
if ((xkb->server->explicit[i]&XkbExplicitAutoRepeatMask)&&
692
(xkb->ctrls!=NULL)) {
693
if (xkb->ctrls->per_key_repeat[(i/8)]&(1<<(i%8)))
694
wireMap.flags|= XkmRepeatingKey;
695
else wireMap.flags|= XkmNonRepeatingKey;
698
tmp= fwrite(&wireMap,SIZEOF(xkmKeySymMapDesc),1,file);
699
size+= tmp*SIZEOF(xkmKeySymMapDesc);
700
if (xkb->server->explicit[i]&XkbExplicitKeyTypesMask) {
702
for (g=0;g<XkbNumKbdGroups;g++) {
703
if (typeName[g]!=NULL)
704
size+= xkmPutCountedString(file,typeName[g]);
707
if (XkbNumGroups(wireMap.num_groups)>0) {
709
sym= XkbKeySymsPtr(xkb,i);
710
for (n=XkbKeyNumSyms(xkb,i);n>0;n--,sym++) {
711
size+= xkmPutCARD32(file,(CARD32)*sym);
713
if (wireMap.flags&XkmKeyHasActions) {
715
act= XkbKeyActionsPtr(xkb,i);
716
for (n=XkbKeyNumActions(xkb,i);n>0;n--,act++) {
717
tmp= fwrite(act,SIZEOF(xkmActionDesc),1,file);
718
size+= tmp*SIZEOF(xkmActionDesc);
722
if (wireMap.flags&XkmKeyHasBehavior) {
724
b.type= xkb->server->behaviors[i].type;
725
b.data= xkb->server->behaviors[i].data;
726
tmp= fwrite(&b,SIZEOF(xkmBehaviorDesc),1,file);
727
size+= tmp*SIZEOF(xkmBehaviorDesc);
730
if (info->total_vmodmaps>0) {
732
for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
733
if (xkb->server->vmodmap[i]!=0) {
735
v.vmods= xkb->server->vmodmap[i];
736
tmp= fwrite(&v,SIZEOF(xkmVModMapDesc),1,file);
737
size+= tmp*SIZEOF(xkmVModMapDesc);
744
/***====================================================================***/
747
#if NeedFunctionPrototypes
748
SizeXKMIndicators(XkbFileInfo *result,XkmInfo *info,xkmSectionInfo *toc,
751
SizeXKMIndicators(result,info,toc,offset_inout)
752
XkbFileInfo * result;
754
xkmSectionInfo * toc;
761
register unsigned i,nLEDs;
765
if ((xkb==NULL)||(xkb->indicators==NULL)) {
766
/* _XkbLibError(_XkbErrMissingIndicators,"SizeXKMIndicators",0);*/
770
size= 8; /* number of indicator maps/physical indicators */
771
if (xkb->indicators!=NULL) {
772
for (i=0;i<XkbNumIndicators;i++) {
773
XkbIndicatorMapPtr map= &xkb->indicators->maps[i];
774
if ((map->flags!=0)||(map->which_groups!=0)||(map->groups!=0)||
775
(map->which_mods!=0)||
776
(map->mods.real_mods!=0)||(map->mods.vmods!=0)||
778
(xkb->names && (xkb->names->indicators[i]!=None))) {
780
if (xkb->names && xkb->names->indicators[i]!=None) {
781
name= XkbAtomGetString(dpy,xkb->names->indicators[i]);
784
size+= xkmSizeCountedString(name);
785
size+= SIZEOF(xkmIndicatorMapDesc);
790
info->num_leds= nLEDs;
791
toc->type= XkmIndicatorsIndex;
792
toc->format= MSBFirst;
793
toc->size= size+SIZEOF(xkmSectionInfo);
794
toc->offset= (*offset_inout);
795
(*offset_inout)+= toc->size;
800
#if NeedFunctionPrototypes
801
WriteXKMIndicators(FILE *file,XkbFileInfo *result,XkmInfo *info)
803
WriteXKMIndicators(file,result,info)
805
XkbFileInfo * result;
812
xkmIndicatorMapDesc wire;
813
unsigned tmp,size= 0;
817
size+= xkmPutCARD8(file,info->num_leds);
818
size+= xkmPutPadding(file,3);
819
size+= xkmPutCARD32(file,xkb->indicators->phys_indicators);
820
if (xkb->indicators!=NULL) {
821
for (i=0;i<XkbNumIndicators;i++) {
822
XkbIndicatorMapPtr map= &xkb->indicators->maps[i];
823
if ((map->flags!=0)||(map->which_groups!=0)||(map->groups!=0)||
824
(map->which_mods!=0)||
825
(map->mods.real_mods!=0)||(map->mods.vmods!=0)||
827
(xkb->names && (xkb->names->indicators[i]!=None))) {
829
if (xkb->names && xkb->names->indicators[i]!=None) {
830
name= XkbAtomGetString(dpy,xkb->names->indicators[i]);
833
size+= xkmPutCountedString(file,name);
835
wire.flags= map->flags;
836
wire.which_mods= map->which_mods;
837
wire.real_mods= map->mods.real_mods;
838
wire.vmods= map->mods.vmods;
839
wire.which_groups= map->which_groups;
840
wire.groups= map->groups;
841
wire.ctrls= map->ctrls;
842
tmp= fwrite(&wire,SIZEOF(xkmIndicatorMapDesc),1,file);
843
size+= tmp*SIZEOF(xkmIndicatorMapDesc);
850
/***====================================================================***/
853
#if NeedFunctionPrototypes
854
SizeXKMGeomDoodad(XkbFileInfo *result,XkbDoodadPtr doodad)
856
SizeXKMGeomDoodad(result,doodad)
857
XkbFileInfo * result;
863
size= SIZEOF(xkmAnyDoodadDesc);
864
size+= xkmSizeCountedAtomString(result->xkb->dpy,doodad->any.name);
865
if (doodad->any.type==XkbTextDoodad) {
866
size+= xkmSizeCountedString(doodad->text.text);
867
size+= xkmSizeCountedString(doodad->text.font);
869
else if (doodad->any.type==XkbLogoDoodad) {
870
size+= xkmSizeCountedString(doodad->logo.logo_name);
876
#if NeedFunctionPrototypes
877
SizeXKMGeomSection(XkbFileInfo *result,XkbSectionPtr section)
879
SizeXKMGeomSection(result,section)
880
XkbFileInfo * result;
881
XkbSectionPtr section;
887
size= SIZEOF(xkmSectionDesc);
888
size+= xkmSizeCountedAtomString(result->xkb->dpy,section->name);
891
for (row=section->rows,i=0;i<section->num_rows;i++,row++) {
892
size+= SIZEOF(xkmRowDesc);
893
size+= row->num_keys*SIZEOF(xkmKeyDesc);
896
if (section->doodads) {
898
for (doodad=section->doodads,i=0;i<section->num_doodads;i++,doodad++) {
899
size+= SizeXKMGeomDoodad(result,doodad);
902
if (section->overlays) {
904
for (ol=section->overlays,i=0;i<section->num_overlays;i++,ol++) {
906
XkbOverlayRowPtr row;
907
size+= xkmSizeCountedAtomString(result->xkb->dpy,ol->name);
908
size+= SIZEOF(xkmOverlayDesc);
909
for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
910
size+= SIZEOF(xkmOverlayRowDesc);
911
size+= row->num_keys*SIZEOF(xkmOverlayKeyDesc);
919
#if NeedFunctionPrototypes
920
SizeXKMGeometry(XkbFileInfo *result,xkmSectionInfo *toc,int *offset_inout)
922
SizeXKMGeometry(result,toc,offset_inout)
923
XkbFileInfo * result;
924
xkmSectionInfo * toc;
936
if ((!xkb)||(!xkb->geom))
939
size= xkmSizeCountedAtomString(dpy,geom->name);
940
size+= SIZEOF(xkmGeometryDesc);
941
size+= xkmSizeCountedString(geom->label_font);
942
if (geom->properties) {
944
for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
945
size+= xkmSizeCountedString(prop->name);
946
size+= xkmSizeCountedString(prop->value);
951
for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
952
size+= xkmSizeCountedString(color->spec);
957
for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
959
register XkbOutlinePtr ol;
960
size+= xkmSizeCountedAtomString(dpy,shape->name);
961
size+= SIZEOF(xkmShapeDesc);
962
for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
963
size+= SIZEOF(xkmOutlineDesc);
964
size+= ol->num_points*SIZEOF(xkmPointDesc);
968
if (geom->sections) {
969
XkbSectionPtr section;
970
for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
971
size+= SizeXKMGeomSection(result,section);
976
for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) {
977
size+= SizeXKMGeomDoodad(result,doodad);
980
if (geom->key_aliases) {
981
size+= geom->num_key_aliases*(XkbKeyNameLength*2);
983
toc->type= XkmGeometryIndex;
984
toc->format= MSBFirst;
985
toc->size= size+SIZEOF(xkmSectionInfo);
986
toc->offset= (*offset_inout);
987
(*offset_inout)+= toc->size;
992
#if NeedFunctionPrototypes
993
WriteXKMGeomDoodad(FILE *file,XkbFileInfo *result,XkbDoodadPtr doodad)
995
WriteXKMGeomDoodad(file,result,doodad)
997
XkbFileInfo * result;
1003
xkmDoodadDesc doodadWire;
1004
unsigned tmp,size= 0;
1008
bzero((char *)&doodadWire,sizeof(doodadWire));
1009
doodadWire.any.type= doodad->any.type;
1010
doodadWire.any.priority= doodad->any.priority;
1011
doodadWire.any.top= doodad->any.top;
1012
doodadWire.any.left= doodad->any.left;
1013
switch (doodad->any.type) {
1014
case XkbOutlineDoodad:
1015
case XkbSolidDoodad:
1016
doodadWire.shape.angle= doodad->shape.angle;
1017
doodadWire.shape.color_ndx= doodad->shape.color_ndx;
1018
doodadWire.shape.shape_ndx= doodad->shape.shape_ndx;
1021
doodadWire.text.angle= doodad->text.angle;
1022
doodadWire.text.width= doodad->text.width;
1023
doodadWire.text.height= doodad->text.height;
1024
doodadWire.text.color_ndx= doodad->text.color_ndx;
1026
case XkbIndicatorDoodad:
1027
doodadWire.indicator.shape_ndx= doodad->indicator.shape_ndx;
1028
doodadWire.indicator.on_color_ndx= doodad->indicator.on_color_ndx;
1029
doodadWire.indicator.off_color_ndx= doodad->indicator.off_color_ndx;
1032
doodadWire.logo.angle= doodad->logo.angle;
1033
doodadWire.logo.color_ndx= doodad->logo.color_ndx;
1034
doodadWire.logo.shape_ndx= doodad->logo.shape_ndx;
1037
_XkbLibError(_XkbErrIllegalDoodad,"WriteXKMGeomDoodad",
1041
size+= xkmPutCountedAtomString(dpy,file,doodad->any.name);
1042
tmp= fwrite(&doodadWire,SIZEOF(xkmDoodadDesc),1,file);
1043
size+= tmp*SIZEOF(xkmDoodadDesc);
1044
if (doodad->any.type==XkbTextDoodad) {
1045
size+= xkmPutCountedString(file,doodad->text.text);
1046
size+= xkmPutCountedString(file,doodad->text.font);
1048
else if (doodad->any.type==XkbLogoDoodad) {
1049
size+= xkmPutCountedString(file,doodad->logo.logo_name);
1055
#if NeedFunctionPrototypes
1056
WriteXKMGeomOverlay(FILE *file,XkbFileInfo *result,XkbOverlayPtr ol)
1058
WriteXKMGeomOverlay(file,result,ol)
1060
XkbFileInfo * result;
1067
XkbOverlayRowPtr row;
1068
xkmOverlayDesc olWire;
1069
xkmOverlayRowDesc rowWire;
1070
xkmOverlayKeyDesc keyWire;
1071
unsigned tmp,size= 0;
1075
bzero((char *)&olWire,sizeof(olWire));
1076
bzero((char *)&rowWire,sizeof(rowWire));
1077
bzero((char *)&keyWire,sizeof(keyWire));
1078
size+= xkmPutCountedAtomString(dpy,file,ol->name);
1079
olWire.num_rows= ol->num_rows;
1080
tmp= fwrite(&olWire,SIZEOF(xkmOverlayDesc),1,file);
1081
size+= tmp*SIZEOF(xkmOverlayDesc);
1082
for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
1083
XkbOverlayKeyPtr key;
1084
rowWire.row_under= row->row_under;
1085
rowWire.num_keys= row->num_keys;
1086
tmp= fwrite(&rowWire,SIZEOF(xkmOverlayRowDesc),1,file);
1087
size+= tmp*SIZEOF(xkmOverlayRowDesc);
1088
for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
1089
memcpy(keyWire.over,key->over.name,XkbKeyNameLength);
1090
memcpy(keyWire.under,key->under.name,XkbKeyNameLength);
1091
tmp= fwrite(&keyWire,SIZEOF(xkmOverlayKeyDesc),1,file);
1092
size+= tmp*SIZEOF(xkmOverlayKeyDesc);
1099
#if NeedFunctionPrototypes
1100
WriteXKMGeomSection(FILE *file,XkbFileInfo *result,XkbSectionPtr section)
1102
WriteXKMGeomSection(file,result,section)
1104
XkbFileInfo * result;
1105
XkbSectionPtr section;
1111
xkmSectionDesc sectionWire;
1112
unsigned tmp,size= 0;
1116
size+= xkmPutCountedAtomString(dpy,file,section->name);
1117
sectionWire.top= section->top;
1118
sectionWire.left= section->left;
1119
sectionWire.width= section->width;
1120
sectionWire.height= section->height;
1121
sectionWire.angle= section->angle;
1122
sectionWire.priority= section->priority;
1123
sectionWire.num_rows= section->num_rows;
1124
sectionWire.num_doodads= section->num_doodads;
1125
sectionWire.num_overlays= section->num_overlays;
1126
tmp= fwrite(§ionWire,SIZEOF(xkmSectionDesc),1,file);
1127
size+= tmp*SIZEOF(xkmSectionDesc);
1128
if (section->rows) {
1129
register unsigned k;
1134
for (i=0,row=section->rows;i<section->num_rows;i++,row++) {
1135
rowWire.top= row->top;
1136
rowWire.left= row->left;
1137
rowWire.num_keys= row->num_keys;
1138
rowWire.vertical= row->vertical;
1139
tmp= fwrite(&rowWire,SIZEOF(xkmRowDesc),1,file);
1140
size+= tmp*SIZEOF(xkmRowDesc);
1141
for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
1142
memcpy(keyWire.name,key->name.name,XkbKeyNameLength);
1143
keyWire.gap= key->gap;
1144
keyWire.shape_ndx= key->shape_ndx;
1145
keyWire.color_ndx= key->color_ndx;
1146
tmp= fwrite(&keyWire,SIZEOF(xkmKeyDesc),1,file);
1147
size+= tmp*SIZEOF(xkmKeyDesc);
1151
if (section->doodads) {
1152
XkbDoodadPtr doodad;
1153
for (i=0,doodad=section->doodads;i<section->num_doodads;i++,doodad++) {
1154
size+= WriteXKMGeomDoodad(file,result,doodad);
1157
if (section->overlays) {
1159
for (i=0,ol=section->overlays;i<section->num_overlays;i++,ol++) {
1160
size+= WriteXKMGeomOverlay(file,result,ol);
1167
#if NeedFunctionPrototypes
1168
WriteXKMGeometry(FILE *file,XkbFileInfo *result)
1170
WriteXKMGeometry(file,result)
1172
XkbFileInfo * result;
1178
XkbGeometryPtr geom;
1179
xkmGeometryDesc wire;
1180
unsigned tmp,size= 0;
1184
if ((!xkb)||(!xkb->geom))
1187
wire.width_mm= geom->width_mm;
1188
wire.height_mm= geom->height_mm;
1189
wire.base_color_ndx= XkbGeomColorIndex(geom,geom->base_color);
1190
wire.label_color_ndx= XkbGeomColorIndex(geom,geom->label_color);
1191
wire.num_properties= geom->num_properties;
1192
wire.num_colors= geom->num_colors;
1193
wire.num_shapes= geom->num_shapes;
1194
wire.num_sections= geom->num_sections;
1195
wire.num_doodads= geom->num_doodads;
1196
wire.num_key_aliases= geom->num_key_aliases;
1197
size+= xkmPutCountedAtomString(dpy,file,geom->name);
1198
tmp= fwrite(&wire,SIZEOF(xkmGeometryDesc),1,file);
1199
size+= tmp*SIZEOF(xkmGeometryDesc);
1200
size+= xkmPutCountedString(file,geom->label_font);
1201
if (geom->properties) {
1202
XkbPropertyPtr prop;
1203
for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
1204
size+= xkmPutCountedString(file,prop->name);
1205
size+= xkmPutCountedString(file,prop->value);
1210
for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
1211
size+= xkmPutCountedString(file,color->spec);
1216
xkmShapeDesc shapeWire;
1218
for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
1221
xkmOutlineDesc olWire;
1222
bzero((char *)&shapeWire,sizeof(xkmShapeDesc));
1223
size+= xkmPutCountedAtomString(dpy,file,shape->name);
1224
shapeWire.num_outlines= shape->num_outlines;
1225
if (shape->primary!=NULL)
1226
shapeWire.primary_ndx= XkbOutlineIndex(shape,shape->primary);
1227
else shapeWire.primary_ndx= XkbNoShape;
1228
if (shape->approx!=NULL)
1229
shapeWire.approx_ndx= XkbOutlineIndex(shape,shape->approx);
1230
else shapeWire.approx_ndx= XkbNoShape;
1231
tmp= fwrite(&shapeWire,SIZEOF(xkmShapeDesc),1,file);
1232
size+= tmp*SIZEOF(xkmShapeDesc);
1233
for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
1236
xkmPointDesc ptWire;
1237
olWire.num_points= ol->num_points;
1238
olWire.corner_radius= ol->corner_radius;
1239
tmp= fwrite(&olWire,SIZEOF(xkmOutlineDesc),1,file);
1240
size+= tmp*SIZEOF(xkmOutlineDesc);
1241
for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) {
1244
tmp= fwrite(&ptWire,SIZEOF(xkmPointDesc),1,file);
1245
size+= tmp*SIZEOF(xkmPointDesc);
1250
if (geom->sections) {
1251
XkbSectionPtr section;
1252
for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
1253
size+= WriteXKMGeomSection(file,result,section);
1256
if (geom->doodads) {
1257
XkbDoodadPtr doodad;
1258
for (i=0,doodad=geom->doodads;i<geom->num_doodads;i++,doodad++) {
1259
size+= WriteXKMGeomDoodad(file,result,doodad);
1262
if (geom->key_aliases) {
1263
tmp= fwrite(geom->key_aliases,2*XkbKeyNameLength,geom->num_key_aliases,
1265
size+= tmp*(2*XkbKeyNameLength);
1270
/***====================================================================***/
1274
#if NeedFunctionPrototypes
1275
GetXKMKeyNamesTOC( XkbFileInfo * result,
1278
xkmSectionInfo *toc_rtrn)
1280
GetXKMKeyNamesTOC(result,info,max_toc,toc_rtrn)
1281
XkbFileInfo * result;
1284
xkmSectionInfo * toc_rtrn;
1290
total_size= num_toc=0;
1291
if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size))
1293
if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size))
1300
#if NeedFunctionPrototypes
1301
GetXKMTypesTOC( XkbFileInfo * result,
1304
xkmSectionInfo *toc_rtrn)
1306
GetXKMTypesTOC(result,info,max_toc,toc_rtrn)
1307
XkbFileInfo * result;
1310
xkmSectionInfo * toc_rtrn;
1316
total_size= num_toc=0;
1317
if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size))
1319
if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size))
1326
#if NeedFunctionPrototypes
1327
GetXKMCompatMapTOC( XkbFileInfo * result,
1330
xkmSectionInfo *toc_rtrn)
1332
GetXKMCompatMapTOC(result,info,max_toc,toc_rtrn)
1333
XkbFileInfo * result;
1336
xkmSectionInfo * toc_rtrn;
1342
total_size= num_toc=0;
1343
if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size))
1345
if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size))
1347
if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size))
1354
#if NeedFunctionPrototypes
1355
GetXKMSemanticsTOC( XkbFileInfo * result,
1358
xkmSectionInfo *toc_rtrn)
1360
GetXKMSemanticsTOC(result,info,max_toc,toc_rtrn)
1361
XkbFileInfo * result;
1364
xkmSectionInfo * toc_rtrn;
1370
total_size= num_toc=0;
1371
if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size))
1373
if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size))
1375
if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size))
1377
if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size))
1384
#if NeedFunctionPrototypes
1385
GetXKMLayoutTOC( XkbFileInfo * result,
1388
xkmSectionInfo *toc_rtrn)
1390
GetXKMLayoutTOC(result,info,max_toc,toc_rtrn)
1391
XkbFileInfo * result;
1394
xkmSectionInfo * toc_rtrn;
1400
total_size= num_toc=0;
1401
if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size))
1403
if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size))
1405
if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size))
1407
if (SizeXKMSymbols(result,info,&toc_rtrn[num_toc],&total_size))
1409
if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size))
1411
if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size))
1418
#if NeedFunctionPrototypes
1419
GetXKMKeymapTOC( XkbFileInfo * result,
1422
xkmSectionInfo *toc_rtrn)
1424
GetXKMKeymapTOC(result,info,max_toc,toc_rtrn)
1425
XkbFileInfo * result;
1428
xkmSectionInfo * toc_rtrn;
1434
total_size= num_toc=0;
1435
if (SizeXKMVirtualMods(result,info,&toc_rtrn[num_toc],&total_size))
1437
if (SizeXKMKeycodes(result,&toc_rtrn[num_toc],&total_size))
1439
if (SizeXKMKeyTypes(result,&toc_rtrn[num_toc],&total_size))
1441
if (SizeXKMCompatMap(result,info,&toc_rtrn[num_toc],&total_size))
1443
if (SizeXKMSymbols(result,info,&toc_rtrn[num_toc],&total_size))
1445
if (SizeXKMIndicators(result,info,&toc_rtrn[num_toc],&total_size))
1447
if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size))
1454
#if NeedFunctionPrototypes
1455
GetXKMGeometryTOC( XkbFileInfo * result,
1458
xkmSectionInfo *toc_rtrn)
1460
GetXKMGeometryTOC(result,info,max_toc,toc_rtrn)
1461
XkbFileInfo * result;
1464
xkmSectionInfo * toc_rtrn;
1470
total_size= num_toc=0;
1471
if (SizeXKMGeometry(result,&toc_rtrn[num_toc],&total_size))
1477
#if NeedFunctionPrototypes
1478
WriteXKMFile( FILE * file,
1479
XkbFileInfo * result,
1481
xkmSectionInfo *toc,
1484
WriteXKMFile(file,result,num_toc,toc,info)
1486
XkbFileInfo * result;
1488
xkmSectionInfo * toc;
1493
unsigned tmp,size,total= 0;
1495
for (i=0;i<num_toc;i++) {
1496
tmp= fwrite(&toc[i],SIZEOF(xkmSectionInfo),1,file);
1497
total+= tmp*SIZEOF(xkmSectionInfo);
1498
switch (toc[i].type) {
1500
size= WriteXKMKeyTypes(file,result);
1502
case XkmCompatMapIndex:
1503
size= WriteXKMCompatMap(file,result,info);
1505
case XkmSymbolsIndex:
1506
size= WriteXKMSymbols(file,result,info);
1508
case XkmIndicatorsIndex:
1509
size= WriteXKMIndicators(file,result,info);
1511
case XkmKeyNamesIndex:
1512
size= WriteXKMKeycodes(file,result);
1514
case XkmGeometryIndex:
1515
size= WriteXKMGeometry(file,result);
1517
case XkmVirtualModsIndex:
1518
size= WriteXKMVirtualMods(file,result,info);
1521
_XkbLibError(_XkbErrIllegalTOCType,"WriteXKMFile",toc[i].type);
1524
size+= SIZEOF(xkmSectionInfo);
1525
if (size!=toc[i].size) {
1526
_XkbLibError(_XkbErrBadLength,XkbConfigText(toc[i].type,XkbMessage),
1538
#if NeedFunctionPrototypes
1539
XkbWriteXKMFile(FILE *out,XkbFileInfo *result)
1541
XkbWriteXKMFile(out,result)
1543
XkbFileInfo * result;
1550
unsigned hdr,present;
1551
xkmFileInfo fileInfo;
1552
xkmSectionInfo toc[MAX_TOC];
1554
#if NeedFunctionPrototypes
1555
XkbFileInfo * /* result */,
1556
XkmInfo * /* info */,
1558
xkmSectionInfo */* toc_rtrn */
1562
switch (result->type) {
1563
case XkmKeyNamesIndex:
1564
getTOC= GetXKMKeyNamesTOC;
1567
getTOC= GetXKMTypesTOC;
1569
case XkmCompatMapIndex:
1570
getTOC= GetXKMCompatMapTOC;
1572
case XkmSemanticsFile:
1573
getTOC= GetXKMSemanticsTOC;
1576
getTOC= GetXKMLayoutTOC;
1579
getTOC= GetXKMKeymapTOC;
1581
case XkmGeometryFile:
1582
case XkmGeometryIndex:
1583
getTOC= GetXKMGeometryTOC;
1586
_XkbLibError(_XkbErrIllegalContents,
1587
XkbConfigText(result->type,XkbMessage),0);
1592
bzero((char *)&info,sizeof(XkmInfo));
1593
size_toc= (*getTOC)(result,&info,MAX_TOC,toc);
1595
_XkbLibError(_XkbErrEmptyFile,"XkbWriteXKMFile",0);
1599
_XkbLibError(_XkbErrFileCannotOpen,"XkbWriteXKMFile",0);
1602
for (i=present=0;i<size_toc;i++) {
1603
toc[i].offset+= 4+SIZEOF(xkmFileInfo);
1604
toc[i].offset+= (size_toc*SIZEOF(xkmSectionInfo));
1605
if (toc[i].type<=XkmLastIndex) {
1606
present|= (1<<toc[i].type);
1610
fprintf(stderr,"Illegal section type %d\n",toc[i].type);
1611
fprintf(stderr,"Ignored\n");
1615
hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion);
1616
xkmPutCARD32(out,(unsigned long)hdr);
1617
fileInfo.type= result->type;
1618
fileInfo.min_kc= xkb->min_key_code;
1619
fileInfo.max_kc= xkb->max_key_code;
1620
fileInfo.num_toc= size_toc;
1621
fileInfo.present= present;
1623
fwrite(&fileInfo,SIZEOF(xkmFileInfo),1,out);
1624
fwrite(toc,SIZEOF(xkmSectionInfo),size_toc,out);
1625
ok= WriteXKMFile(out,result,size_toc,toc,&info);