1
/************************************************************
2
Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc.
4
Permission to use, copy, modify, and distribute this
5
software and its documentation for any purpose and without
6
fee is hereby granted, provided that the above copyright
7
notice appear in all copies and that both that copyright
8
notice and this permission notice appear in supporting
9
documentation, and that the name of Silicon Graphics not be
10
used in advertising or publicity pertaining to distribution
11
of the software without specific prior written permission.
12
Silicon Graphics makes no representation about the suitability
13
of this software for any purpose. It is provided "as is"
14
without any express or implied warranty.
16
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23
THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
********************************************************/
26
/* $XFree86: xc/programs/setxkbmap/setxkbmap.c,v 3.7 2003/01/20 04:15:08 dawes Exp $ */
35
#include <X11/XKBlib.h>
36
#include <X11/extensions/XKBfile.h>
37
#include <X11/extensions/XKBconfig.h>
38
#include <X11/extensions/XKBrules.h>
42
#define PATH_MAX MAXPATHLEN
48
#ifndef DFLT_XKB_CONFIG_ROOT
49
#define DFLT_XKB_CONFIG_ROOT "/usr/X11R6/lib/X11/xkb"
51
#ifndef DFLT_XKB_RULES_FILE
52
#define DFLT_XKB_RULES_FILE "xfree86"
54
#ifndef DFLT_XKB_LAYOUT
55
#define DFLT_XKB_LAYOUT "us"
57
#ifndef DFLT_XKB_MODEL
58
#define DFLT_XKB_MODEL "pc101"
65
#define FROM_CMD_LINE 4
75
#define KEYCODES_NDX 7
78
#define SYMBOLS_NDX 10
79
#define GEOMETRY_NDX 11
81
#define NUM_STRING_VALS 13
83
/***====================================================================***/
90
char * srcName[NUM_SOURCES] = {
91
"undefined", "X server", "rules file", "config file", "command line"
94
char * svName[NUM_STRING_VALS]= {
95
"rules file", "config file", "X display", "locale",
96
"keyboard model", "keyboard layout", "layout variant",
97
"keycodes", "types", "compatibility map", "symbols", "geometry",
100
int svSrc[NUM_STRING_VALS];
101
char * svValue[NUM_STRING_VALS];
103
XkbConfigFieldsRec cfgDflts;
104
XkbConfigRtrnRec cfgResult;
106
XkbRF_RulesPtr rules= NULL;
107
XkbRF_VarDefsRec rdefs;
109
Bool clearOptions= False;
112
char ** options= NULL;
116
char ** inclPath= NULL;
118
XkbDescPtr xkb= NULL;
120
/***====================================================================***/
122
#define streq(s1,s2) (strcmp(s1,s2)==0)
123
#define strpfx(s1,s2) (strncmp(s1,s2,strlen(s2))==0)
125
#define MSG(s) printf(s)
126
#define MSG1(s,a) printf(s,a)
127
#define MSG2(s,a,b) printf(s,a,b)
128
#define MSG3(s,a,b,c) printf(s,a,b,c)
130
#define VMSG(l,s) if (verbose>(l)) printf(s)
131
#define VMSG1(l,s,a) if (verbose>(l)) printf(s,a)
132
#define VMSG2(l,s,a,b) if (verbose>(l)) printf(s,a,b)
133
#define VMSG3(l,s,a,b,c) if (verbose>(l)) printf(s,a,b,c)
135
#define ERR(s) fprintf(stderr,s)
136
#define ERR1(s,a) fprintf(stderr,s,a)
137
#define ERR2(s,a,b) fprintf(stderr,s,a,b)
138
#define ERR3(s,a,b,c) fprintf(stderr,s,a,b,c)
140
/***====================================================================***/
142
Bool addToList ( int *sz, int *num, char ***listIn, char *newVal );
143
void usage ( int argc, char ** argv );
144
void dumpNames ( Bool wantRules, Bool wantCNames );
145
void trySetString ( int which, char * newVal, int src );
146
Bool setOptString ( int *arg, int argc, char **argv, int which, int src );
147
int parseArgs ( int argc, char ** argv );
148
Bool getDisplay ( int argc, char ** argv );
149
Bool getServerValues ( void );
150
FILE * findFileInPath ( char * name, char * subdir );
151
Bool addStringToOptions ( char * opt_str, int * sz_opts, int * num_opts, char *** opts );
152
char * stringFromOptions ( char * orig, int numNew, char ** newOpts );
153
Bool applyConfig ( char * name );
154
Bool applyRules ( void );
155
Bool applyComponentNames ( void );
156
void printKeymap( void );
158
/***====================================================================***/
161
#if NeedFunctionPrototypes
162
addToList(int *sz,int *num,char ***listIn,char *newVal)
164
addToList(sz,num,listIn,newVal)
174
if ((!newVal)||(!newVal[0])) {
179
for (i=0;i<*num;i++) {
180
if (streq(list[i],newVal))
183
if ((list==NULL)||(*sz<1)) {
186
list= (char **)calloc(*sz,sizeof(char *));
189
else if (*num>=*sz) {
191
list= (char **)realloc(list,(*sz)*sizeof(char *));
195
ERR("Internal Error! Allocation failure in add to list!\n");
199
list[*num]= strdup(newVal);
204
/***====================================================================***/
207
#if NeedFunctionPrototypes
208
usage(int argc,char **argv)
215
MSG1("Usage: %s [args] [<layout> [<variant> [<option> ... ]]]\n",argv[0]);
216
MSG("Where legal args are:\n");
217
MSG("-?,-help Print this message\n");
218
MSG("-compat <name> Specifies compatibility map component name\n");
219
MSG("-config <file> Specifies configuration file to use\n");
220
MSG("-display <dpy> Specifies display to use\n");
221
MSG("-geometry <name> Specifies geometry component name\n");
222
MSG("-I[<dir>] Add <dir> to list of directories to be used\n");
223
MSG("-keycodes <name> Specifies keycodes component name\n");
224
MSG("-keymap <name> Specifies name of keymap to load\n");
225
MSG("-layout <name> Specifies layout used to choose component names\n");
226
MSG("-model <name> Specifies model used to choose component names\n");
227
MSG("-option <name> Adds an option used to choose component names\n");
228
MSG("-print Print a complete xkb_keymap description and exit\n");
229
MSG("-rules <name> Name of rules file to use\n");
230
MSG("-symbols <name> Specifies symbols component name\n");
231
MSG("-synch Synchronize request w/X server\n");
232
MSG("-types <name> Specifies types component name\n");
233
MSG("-v[erbose] [<lvl>] Sets verbosity (1..10). Higher values yield\n");
234
MSG(" more messages\n");
235
MSG("-variant <name> Specifies layout variant used to choose component names\n");
239
#if NeedFunctionPrototypes
240
dumpNames(Bool wantRules,Bool wantCNames)
242
dumpNames(wantRules,wantCNames)
248
if (svValue[MODEL_NDX]) MSG1("model: %s\n",svValue[MODEL_NDX]);
249
if (svValue[LAYOUT_NDX]) MSG1("layout: %s\n",svValue[LAYOUT_NDX]);
250
if (svValue[VARIANT_NDX]) MSG1("variant: %s\n",svValue[VARIANT_NDX]);
252
char *opt_str=stringFromOptions(NULL, numOptions, options);
253
MSG1("options: %s\n", opt_str);
258
if (svValue[KEYMAP_NDX])
259
MSG1("keymap: %s\n",svValue[KEYMAP_NDX]);
260
if (svValue[KEYCODES_NDX])
261
MSG1("keycodes: %s\n",svValue[KEYCODES_NDX]);
262
if (svValue[TYPES_NDX])
263
MSG1("types: %s\n",svValue[TYPES_NDX]);
264
if (svValue[COMPAT_NDX])
265
MSG1("compat: %s\n",svValue[COMPAT_NDX]);
266
if (svValue[SYMBOLS_NDX])
267
MSG1("symbols: %s\n",svValue[SYMBOLS_NDX]);
268
if (svValue[GEOMETRY_NDX])
269
MSG1("geometry: %s\n",svValue[GEOMETRY_NDX]);
274
/***====================================================================***/
277
#if NeedFunctionPrototypes
278
trySetString(int which,char *newVal,int src)
280
trySetString(which,newVal,src)
286
if (svValue[which]!=NULL) {
287
if (svSrc[which]==src) {
288
VMSG2(0,"Warning! More than one %s from %s\n",
289
svName[which],srcName[src]);
290
VMSG2(0," Using \"%s\", ignoring \"%s\"\n",
291
svValue[which],newVal);
294
else if (svSrc[which]>src) {
295
VMSG1(5,"Warning! Multiple definitions of %s\n",svName[which]);
296
VMSG2(5," Using %s, ignoring %s\n",srcName[svSrc[which]],
302
svValue[which]= newVal;
307
#if NeedFunctionPrototypes
308
setOptString(int *arg,int argc,char **argv,int which,int src)
310
setOptString(arg,argc,argv,which,src)
324
VMSG1(0,"No %s specified on the command line\n",svName[which]);
325
VMSG1(0,"Trailing %s option ignored\n",opt);
330
if (svValue[which]!=NULL) {
331
if (svSrc[which]==src) {
332
VMSG2(0,"More than one %s on %s\n",svName[which],srcName[src]);
333
VMSG2(0,"Using \"%s\", ignoring \"%s\"\n",svValue[which],argv[ndx]);
336
else if (svSrc[which]>src) {
337
VMSG1(5,"Multiple definitions of %s\n",svName[which]);
338
VMSG2(5,"Using %s, ignoring %s\n",srcName[svSrc[which]],
344
svValue[which]= argv[ndx];
348
/***====================================================================***/
351
#if NeedFunctionPrototypes
352
parseArgs(int argc,char **argv)
364
addToList(&szInclPath,&numInclPath,&inclPath,".");
365
addToList(&szInclPath,&numInclPath,&inclPath,DFLT_XKB_CONFIG_ROOT);
366
for (i=1;(i<argc)&&ok;i++) {
367
if (argv[i][0]!='-') {
368
if (!svSrc[LAYOUT_NDX])
369
trySetString(LAYOUT_NDX,argv[i],FROM_CMD_LINE);
370
else if (!svSrc[VARIANT_NDX])
371
trySetString(VARIANT_NDX,argv[i],FROM_CMD_LINE);
372
else ok= addToList(&szOptions,&numOptions,&options,argv[i]);
374
else if (streq(argv[i],"-compat"))
375
ok= setOptString(&i,argc,argv,COMPAT_NDX,FROM_CMD_LINE);
376
else if (streq(argv[i],"-config"))
377
ok= setOptString(&i,argc,argv,CONFIG_NDX,FROM_CMD_LINE);
378
else if (streq(argv[i],"-display"))
379
ok= setOptString(&i,argc,argv,DISPLAY_NDX,FROM_CMD_LINE);
380
else if (streq(argv[i],"-geometry"))
381
ok= setOptString(&i,argc,argv,GEOMETRY_NDX,FROM_CMD_LINE);
382
else if (streq(argv[i],"-help")||streq(argv[i],"-?")) {
386
else if (strpfx(argv[i],"-I"))
387
ok= addToList(&szInclPath,&numInclPath,&inclPath,&argv[i][2]);
388
else if (streq(argv[i],"-keycodes"))
389
ok= setOptString(&i,argc,argv,KEYCODES_NDX,FROM_CMD_LINE);
390
else if (streq(argv[i],"-keymap"))
391
ok= setOptString(&i,argc,argv,KEYMAP_NDX,FROM_CMD_LINE);
392
else if (streq(argv[i],"-layout"))
393
ok= setOptString(&i,argc,argv,LAYOUT_NDX,FROM_CMD_LINE);
394
else if (streq(argv[i],"-model"))
395
ok= setOptString(&i,argc,argv,MODEL_NDX,FROM_CMD_LINE);
396
else if (streq(argv[i],"-option")) {
397
if ((i==argc-1)||(argv[i+1][0]=='\0')||(argv[i+1][0]=='-')) {
399
ok= addToList(&szOptions,&numOptions,&options,"");
400
if (i<argc-1 && argv[i+1][0]=='\0')
404
ok= addToList(&szOptions,&numOptions,&options,argv[++i]);
407
else if (streq(argv[i],"-print"))
409
else if (streq(argv[i],"-rules"))
410
ok= setOptString(&i,argc,argv,RULES_NDX,FROM_CMD_LINE);
411
else if (streq(argv[i],"-symbols"))
412
ok= setOptString(&i,argc,argv,SYMBOLS_NDX,FROM_CMD_LINE);
413
else if (streq(argv[i],"-synch"))
415
else if (streq(argv[i],"-types"))
416
ok= setOptString(&i,argc,argv,TYPES_NDX,FROM_CMD_LINE);
417
else if (streq(argv[i],"-verbose")||(streq(argv[i],"-v"))) {
418
if ((i<argc-1)&&(isdigit(argv[i+1][0])))
419
verbose= atoi(argv[++i]);
422
ERR1("Illegal verbose level %d. Reset to 0\n",verbose);
425
else if (verbose>10) {
426
ERR1("Illegal verbose level %d. Reset to 10\n",verbose);
429
VMSG1(7,"Setting verbose level to %d\n",verbose);
431
else if (streq(argv[i],"-variant"))
432
ok= setOptString(&i,argc,argv,VARIANT_NDX,FROM_CMD_LINE);
434
ERR1("Error! Option \"%s\" not recognized\n",argv[i]);
440
if (svValue[TYPES_NDX]) present++;
441
if (svValue[COMPAT_NDX]) present++;
442
if (svValue[SYMBOLS_NDX]) present++;
443
if (svValue[KEYCODES_NDX]) present++;
444
if (svValue[GEOMETRY_NDX]) present++;
445
if (svValue[CONFIG_NDX]) present++;
446
if (svValue[MODEL_NDX]) present++;
447
if (svValue[LAYOUT_NDX]) present++;
448
if (svValue[VARIANT_NDX]) present++;
449
if (svValue[KEYMAP_NDX] && present) {
450
ERR("No other components can be specified when a keymap is present\n");
457
#if NeedFunctionPrototypes
458
getDisplay(int argc,char **argv)
460
getDisplay(argc,argv)
467
major= XkbMajorVersion;
468
minor= XkbMinorVersion;
469
dpy= XkbOpenDisplay(svValue[DISPLAY_NDX],NULL,NULL,&major,&minor,&why);
471
if (svValue[DISPLAY_NDX]==NULL)
472
svValue[DISPLAY_NDX]= getenv("DISPLAY");
473
if (svValue[DISPLAY_NDX]==NULL)
474
svValue[DISPLAY_NDX]= "default display";
476
case XkbOD_BadLibraryVersion:
477
ERR3("%s was compiled with XKB version %d.%02d\n",argv[0],
478
XkbMajorVersion,XkbMinorVersion);
479
ERR2("Xlib supports incompatible version %d.%02d\n",
482
case XkbOD_ConnectionRefused:
483
ERR1("Cannot open display \"%s\"\n",svValue[DISPLAY_NDX]);
485
case XkbOD_NonXkbServer:
486
ERR1("XKB extension not present on %s\n",svValue[DISPLAY_NDX]);
488
case XkbOD_BadServerVersion:
489
ERR3("%s was compiled with XKB version %d.%02d\n",argv[0],
490
XkbMajorVersion,XkbMinorVersion);
491
ERR3("Server %s uses incompatible version %d.%02d\n",
492
svValue[DISPLAY_NDX],major,minor);
495
ERR1("Unknown error %d from XkbOpenDisplay\n",why);
501
XSynchronize(dpy,True);
505
/***====================================================================***/
508
#if NeedFunctionPrototypes
509
getServerValues(void)
517
if (!XkbRF_GetNamesProp(dpy,&tmp,&vd) || !tmp) {
518
VMSG1(3,"Couldn't interpret %s property\n",_XKB_RF_NAMES_PROP_ATOM);
519
tmp = DFLT_XKB_RULES_FILE;
520
vd.model = DFLT_XKB_MODEL;
521
vd.layout = DFLT_XKB_LAYOUT;
522
VMSG3(3,"Use defaults: rules - '%s' model - '%s' layout - '%s'\n",
523
tmp, vd.model, vd.layout);
526
trySetString(RULES_NDX,tmp,FROM_SERVER);
528
trySetString(MODEL_NDX,vd.model,FROM_SERVER);
530
trySetString(LAYOUT_NDX,vd.layout,FROM_SERVER);
532
trySetString(VARIANT_NDX,vd.variant,FROM_SERVER);
533
if ((vd.options)&&(!clearOptions)) {
534
addStringToOptions(vd.options,&szOptions,&numOptions,&options);
540
/***====================================================================***/
543
#if NeedFunctionPrototypes
544
findFileInPath(char *name,char *subdir)
546
findFileInPath(name,subdir)
557
if ((verbose>7)||((!fp)&&(verbose>0)))
558
MSG2("%s file %s\n",(fp?"Found":"Didn't find"),name);
561
for (i=0;(i<numInclPath);i++) {
562
if ((strlen(inclPath[i])+strlen(subdir)+strlen(name)+2)>PATH_MAX) {
563
VMSG3(0,"Path too long (%s/%s%s). Ignored.\n",inclPath[i],subdir,
567
sprintf(buf,"%s/%s%s",inclPath[i],subdir,name);
569
if ((verbose>7)||((!fp)&&(verbose>5)))
570
MSG2("%s file %s\n",(fp?"Found":"Didn't find"),buf);
577
/***====================================================================***/
580
#if NeedFunctionPrototypes
581
addStringToOptions(char *opt_str,int *sz_opts,int *num_opts,char ***opts)
583
addStringToOptions(opt_str,sz_opts,num_opts,opts)
590
char *tmp,*str,*next;
593
if ((str= malloc(strlen(opt_str)+1))!=NULL)
596
for (tmp= str,next=NULL;(tmp && *tmp!='\0')&&ok;tmp=next) {
597
next= strchr(str,',');
602
ok= addToList(sz_opts,num_opts,opts,tmp)&&ok;
608
/***====================================================================***/
611
#if NeedFunctionPrototypes
612
stringFromOptions(char *orig,int numNew,char **newOpts)
614
stringFromOptions(orig,numNew,newOpts)
622
if (orig) len= strlen(orig)+1;
624
for (i=0;i<numNew;i++) {
626
len+= strlen(newOpts[i])+1;
631
orig= (char *)realloc(orig,len);
635
orig= (char *)calloc(len,1);
638
for (i=0;i<numNew;i++) {
643
strcat(orig,newOpts[i]);
645
else strcpy(orig,newOpts[i]);
651
/***====================================================================***/
654
#if NeedFunctionPrototypes
655
applyConfig(char *name)
664
if ((fp=findFileInPath(name,""))==NULL)
666
ok= XkbCFParse(fp,XkbCFDflts,NULL,&cfgResult);
669
ERR1("Couldn't find configuration file \"%s\"\n", name);
672
if (cfgResult.rules_file) {
673
trySetString(RULES_NDX,cfgResult.rules_file,FROM_CONFIG);
674
cfgResult.rules_file= NULL;
676
if (cfgResult.model) {
677
trySetString(MODEL_NDX,cfgResult.model,FROM_CONFIG);
678
cfgResult.model= NULL;
680
if (cfgResult.layout) {
681
trySetString(LAYOUT_NDX,cfgResult.layout,FROM_CONFIG);
682
cfgResult.layout= NULL;
684
if (cfgResult.variant) {
685
trySetString(VARIANT_NDX,cfgResult.variant,FROM_CONFIG);
686
cfgResult.variant= NULL;
688
if (cfgResult.options) {
689
addStringToOptions(cfgResult.options,&szOptions,&numOptions,&options);
690
cfgResult.options= NULL;
692
if (cfgResult.keymap) {
693
trySetString(KEYMAP_NDX,cfgResult.keymap,FROM_CONFIG);
694
cfgResult.keymap= NULL;
696
if (cfgResult.keycodes) {
697
trySetString(KEYCODES_NDX,cfgResult.keycodes,FROM_CONFIG);
698
cfgResult.keycodes= NULL;
700
if (cfgResult.geometry) {
701
trySetString(GEOMETRY_NDX,cfgResult.geometry,FROM_CONFIG);
702
cfgResult.geometry= NULL;
704
if (cfgResult.symbols) {
705
trySetString(SYMBOLS_NDX,cfgResult.symbols,FROM_CONFIG);
706
cfgResult.symbols= NULL;
708
if (cfgResult.types) {
709
trySetString(TYPES_NDX,cfgResult.types,FROM_CONFIG);
710
cfgResult.types= NULL;
712
if (cfgResult.compat) {
713
trySetString(COMPAT_NDX,cfgResult.compat,FROM_CONFIG);
714
cfgResult.compat= NULL;
717
MSG("After config file:\n");
718
dumpNames(True,True);
724
#if NeedFunctionPrototypes
733
if (svSrc[MODEL_NDX]||svSrc[LAYOUT_NDX]||svSrc[VARIANT_NDX]||options) {
735
XkbComponentNamesRec rnames;
737
if(svSrc[VARIANT_NDX] < svSrc[LAYOUT_NDX])
738
svValue[VARIANT_NDX] = NULL;
740
rdefs.model= svValue[MODEL_NDX];
741
rdefs.layout= svValue[LAYOUT_NDX];
742
rdefs.variant= svValue[VARIANT_NDX];
744
rdefs.options=stringFromOptions(rdefs.options,numOptions,options);
746
if (svSrc[RULES_NDX])
747
rfName= svValue[RULES_NDX];
748
else rfName= DFLT_XKB_RULES_FILE;
750
if (rfName[0]=='/') {
751
rules= XkbRF_Load(rfName,svValue[LOCALE_NDX],True,True);
754
for (i=0;(i<numInclPath)&&(!rules);i++) {
755
if ((strlen(inclPath[i])+strlen(rfName)+8)>PATH_MAX) {
756
VMSG2(0,"Path too long (%s/rules/%s). Ignored.\n",
760
sprintf(buf,"%s/rules/%s",inclPath[i],svValue[RULES_NDX]);
761
rules= XkbRF_Load(buf,svValue[LOCALE_NDX],True,True);
765
ERR1("Couldn't find rules file (%s) \n",svValue[RULES_NDX]);
768
XkbRF_GetComponents(rules,&rdefs,&rnames);
769
if (rnames.keycodes) {
770
trySetString(KEYCODES_NDX,rnames.keycodes,FROM_RULES);
771
rnames.keycodes= NULL;
773
if (rnames.symbols) {
774
trySetString(SYMBOLS_NDX,rnames.symbols,FROM_RULES);
775
rnames.symbols= NULL;
778
trySetString(TYPES_NDX,rnames.types,FROM_RULES);
782
trySetString(COMPAT_NDX,rnames.compat,FROM_RULES);
785
if (rnames.geometry) {
786
trySetString(GEOMETRY_NDX,rnames.geometry,FROM_RULES);
787
rnames.geometry= NULL;
790
trySetString(KEYMAP_NDX,rnames.keymap,FROM_RULES);
794
MSG1("Applied rules from %s:\n",svValue[RULES_NDX]);
795
dumpNames(True,False);
798
else if (verbose>6) {
799
MSG("No rules variables specified. Rules file ignored\n");
804
/* Primitive sanity check - filter out 'map names' (inside parenthesis) */
805
/* that can confuse xkbcomp parser */
807
#if NeedFunctionPrototypes
808
checkName(char *name, char* string)
815
char *i = name, *opar = NULL;
826
if ((*i == '(') || (*i == '|') || (*i == '+')) {
840
for(i = opar+1; *i && n; i++) {
847
ERR1("Illegal map name '%s' ", opar);
849
ERR2("in %s name '%s'\n", string, name);
855
#if NeedFunctionPrototypes
861
MSG("xkb_keymap {\n");
862
if (svValue[KEYCODES_NDX])
863
MSG1("\txkb_keycodes { include \"%s\"\t};\n",svValue[KEYCODES_NDX]);
864
if (svValue[TYPES_NDX])
865
MSG1("\txkb_types { include \"%s\"\t};\n",svValue[TYPES_NDX]);
866
if (svValue[COMPAT_NDX])
867
MSG1("\txkb_compat { include \"%s\"\t};\n",svValue[COMPAT_NDX]);
868
if (svValue[SYMBOLS_NDX])
869
MSG1("\txkb_symbols { include \"%s\"\t};\n",svValue[SYMBOLS_NDX]);
870
if (svValue[GEOMETRY_NDX])
871
MSG1("\txkb_geometry { include \"%s\"\t};\n",svValue[GEOMETRY_NDX]);
876
#if NeedFunctionPrototypes
877
applyComponentNames(void)
879
applyComponentNames()
882
if(!checkName(svValue[TYPES_NDX], "types"))
884
if(!checkName(svValue[COMPAT_NDX], "compat"))
886
if(!checkName(svValue[SYMBOLS_NDX], "symbols"))
888
if(!checkName(svValue[KEYCODES_NDX], "keycodes"))
890
if(!checkName(svValue[GEOMETRY_NDX], "geometry"))
892
if(!checkName(svValue[KEYMAP_NDX], "keymap"))
896
MSG("Trying to build keymap using the following components:\n");
897
dumpNames(False,True);
900
XkbComponentNamesRec cmdNames;
901
cmdNames.types= svValue[TYPES_NDX];
902
cmdNames.compat= svValue[COMPAT_NDX];
903
cmdNames.symbols= svValue[SYMBOLS_NDX];
904
cmdNames.keycodes= svValue[KEYCODES_NDX];
905
cmdNames.geometry= svValue[GEOMETRY_NDX];
906
cmdNames.keymap= svValue[KEYMAP_NDX];
907
xkb= XkbGetKeyboardByName(dpy,XkbUseCoreKbd,&cmdNames,
908
XkbGBN_AllComponentsMask,
909
XkbGBN_AllComponentsMask&(~XkbGBN_GeometryMask),
912
ERR("Error loading new keyboard description\n");
915
if (svValue[RULES_NDX] && (rdefs.model || rdefs.layout)) {
916
if (!XkbRF_SetNamesProp(dpy,svValue[RULES_NDX],&rdefs)) {
917
VMSG(0,"Error updating the XKB names property\n");
929
#if NeedFunctionPrototypes
930
main(int argc,char **argv)
937
if ((!parseArgs(argc,argv))||(!getDisplay(argc,argv)))
939
svValue[LOCALE_NDX]= setlocale(LC_ALL,svValue[LOCALE_NDX]);
940
svSrc[LOCALE_NDX]= FROM_SERVER;
941
VMSG1(7,"locale is %s\n",svValue[LOCALE_NDX]);
944
if (svValue[CONFIG_NDX] && (!applyConfig(svValue[CONFIG_NDX])))
948
if (!applyComponentNames())