1 dawes 3.27 /* $Xorg: ddxLoad.c,v 1.3 2000/08/17 19:53:46 cpqbld Exp $ */
|
2 dawes 1.1 /************************************************************
3 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
4
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.
16
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 dawes 1.1 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
24 THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
26 ********************************************************/
|
27 dawes 3.31 /* $XFree86: xc/programs/Xserver/xkb/ddxLoad.c,v 3.30 2002/05/31 18:46:06 dawes Exp $ */
|
28 dawes 1.1
29 #include <stdio.h>
30 #include <ctype.h>
31 #define NEED_EVENTS 1
32 #include <X11/X.h>
33 #include <X11/Xos.h>
34 #include <X11/Xproto.h>
35 #include <X11/keysym.h>
36 #include <X11/extensions/XKM.h>
37 #include "inputstr.h"
38 #include "scrnintstr.h"
39 #include "windowstr.h"
40 #define XKBSRV_NEED_FILE_FUNCS
41 #include "XKBsrv.h"
42 #include "XI.h"
|
43 dawes 3.31 #include "xkb.h"
|
44 dawes 1.1
|
45 dawes 3.26 #if defined(CSRG_BASED) || defined(linux) || defined(__sgi) || defined(AIXV3) || defined(__osf__) || defined(__GNU__)
|
46 dawes 3.0 #include <paths.h>
47 #endif
48
|
49 dawes 1.1 #ifndef PATH_MAX
50 #ifdef MAXPATHLEN
51 #define PATH_MAX MAXPATHLEN
52 #else
53 #define PATH_MAX 1024
54 #endif
55 #endif
56
|
57 dawes 3.0 /*
58 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
59 * relative to the top-level XKB configuration directory.
60 * Making the server write to a subdirectory of that directory
61 * requires some work in the general case (install procedure
62 * has to create links to /var or somesuch on many machines),
63 * so we just compile into /usr/tmp for now.
64 */
65 #ifndef XKM_OUTPUT_DIR
|
66 dawes 3.3 #define XKM_OUTPUT_DIR "compiled/"
|
67 dawes 3.0 #endif
|
68 dawes 1.1
|
69 dawes 3.10 #define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
|
70 dawes 1.1 #define ERROR_PREFIX "\"> \""
71 #define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
72 #define POST_ERROR_MSG2 "\"End of messages from xkbcomp\""
73
|
74 dawes 3.10 static void
|
75 dawes 3.31 OutputDirectory(
76 char* outdir)
|
77 dawes 3.10 {
|
78 dawes 3.15 #ifndef WIN32
|
79 hohndel 3.21 if (getuid() == 0) {
80 /* if server running as root it *may* be able to write */
81 /* FIXME: check whether directory is writable at all */
|
82 dawes 3.10 (void) strcpy (outdir, XKM_OUTPUT_DIR);
|
83 dawes 3.15 } else
84 #endif
85 {
|
86 dawes 3.10 #ifdef _PATH_VARTMP
87 (void) strcpy (outdir, _PATH_VARTMP);
|
88 dawes 3.20 if (outdir[strlen(outdir) - 1] != '/') /* Hi IBM, Digital */
|
89 dawes 3.10 (void) strcat (outdir, "/");
90 #else
91 (void) strcpy (outdir, "/tmp/");
92 #endif
93 }
94 }
95
|
96 dawes 1.1 Bool
|
97 dawes 3.0 #if NeedFunctionPrototypes
98 XkbDDXCompileNamedKeymap( XkbDescPtr xkb,
99 XkbComponentNamesPtr names,
100 char * nameRtrn,
101 int nameRtrnLen)
102 #else
|
103 dawes 1.1 XkbDDXCompileNamedKeymap(xkb,names,nameRtrn,nameRtrnLen)
104 XkbDescPtr xkb;
105 XkbComponentNamesPtr names;
106 char * nameRtrn;
107 int nameRtrnLen;
|
108 dawes 3.0 #endif
|
109 dawes 1.1 {
|
110 dawes 3.9 char cmd[PATH_MAX],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
|
111 dawes 1.1
112 if (names->keymap==NULL)
113 return False;
114 strncpy(file,names->keymap,PATH_MAX); file[PATH_MAX-1]= '\0';
115 if ((map= strrchr(file,'('))!=NULL) {
116 char *tmp;
117 if ((tmp= strrchr(map,')'))!=NULL) {
118 *map++= '\0';
119 *tmp= '\0';
120 }
121 else {
122 map= NULL;
123 }
124 }
125 if ((outFile= strrchr(file,'/'))!=NULL)
126 outFile= _XkbDupString(&outFile[1]);
127 else outFile= _XkbDupString(file);
128 XkbEnsureSafeMapName(outFile);
|
129 dawes 3.10 OutputDirectory(xkm_output_dir);
|
130 dawes 3.19
|
131 dawes 1.1 if (XkbBaseDirectory!=NULL) {
|
132 dawes 3.30 #ifdef __UNIXOS2__
|
133 dawes 3.16 char *tmpbase = (char*)__XOS2RedirRoot(XkbBaseDirectory);
134 int i;
|
135 dawes 3.19 if (strlen(tmpbase)*2+(xkbDebugFlags>9?2:1)
136 #else
137 if (strlen(XkbBaseDirectory)*2+(xkbDebugFlags>9?2:1)
|
138 dawes 3.16 #endif
|
139 dawes 3.10 +(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
140 +strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
141 +strlen(file)+strlen(xkm_output_dir)
142 +strlen(outFile)+53 > PATH_MAX)
143 {
144 ErrorF("compiler command for keymap (%s) exceeds max length\n",
145 names->keymap);
146 return False;
147 }
|
148 dawes 3.30 #ifndef __UNIXOS2__
|
149 dawes 3.3 sprintf(cmd,"%s/xkbcomp -w %d -R%s -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
|
150 dawes 1.1 XkbBaseDirectory,
|
151 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
152 dawes 1.1 XkbBaseDirectory,(map?"-m ":""),(map?map:""),
|
153 dawes 3.0 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
|
154 dawes 3.9 xkm_output_dir,outFile);
|
155 dawes 3.16 #else
156 for (i=0; i<strlen(tmpbase); i++) if (tmpbase[i]=='/') tmpbase[i]='\\';
157 sprintf(cmd,"%s\\xkbcomp -w %d -R%s -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
158 tmpbase,
|
159 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
160 dawes 3.19 tmpbase,(map?"-m ":""),(map?map:""),
|
161 dawes 3.16 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
162 xkm_output_dir,outFile);
163 ErrorF("Command line for XKB is %s\n",cmd);
164 #endif
|
165 dawes 1.1 }
166 else {
|
167 dawes 3.10 if ((xkbDebugFlags>9?2:1)+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
168 +strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
169 +strlen(file)+strlen(xkm_output_dir)
170 +strlen(outFile)+49 > PATH_MAX)
171 {
172 ErrorF("compiler command for keymap (%s) exceeds max length\n",
173 names->keymap);
174 return False;
175 }
|
176 dawes 3.3 sprintf(cmd,"xkbcomp -w %d -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
|
177 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
178 dawes 1.1 (map?"-m ":""),(map?map:""),
|
179 dawes 3.0 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
|
180 dawes 3.9 xkm_output_dir,outFile);
|
181 dawes 1.1 }
182 #ifdef DEBUG
183 if (xkbDebugFlags) {
184 ErrorF("XkbDDXCompileNamedKeymap compiling keymap using:\n");
185 ErrorF(" \"cmd\"\n");
186 }
187 #endif
|
188 dawes 3.22 if (System(cmd)==0) {
|
189 dawes 1.1 if (nameRtrn) {
190 strncpy(nameRtrn,outFile,nameRtrnLen);
191 nameRtrn[nameRtrnLen-1]= '\0';
192 }
193 if (outFile!=NULL)
|
194 dawes 3.13 _XkbFree(outFile);
|
195 dawes 1.1 return True;
196 }
197 #ifdef DEBUG
198 ErrorF("Error compiling keymap (%s)\n",names->keymap);
199 #endif
200 if (outFile!=NULL)
|
201 dawes 3.13 _XkbFree(outFile);
|
202 dawes 1.1 return False;
203 }
204
205 Bool
|
206 dawes 3.0 #if NeedFunctionPrototypes
207 XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
208 XkbComponentNamesPtr names,
209 unsigned want,
210 unsigned need,
211 char * nameRtrn,
212 int nameRtrnLen)
213 #else
|
214 dawes 1.1 XkbDDXCompileKeymapByNames(xkb,names,want,need,nameRtrn,nameRtrnLen)
215 XkbDescPtr xkb;
216 XkbComponentNamesPtr names;
217 unsigned want;
218 unsigned need;
219 char * nameRtrn;
220 int nameRtrnLen;
|
221 dawes 3.0 #endif
|
222 dawes 1.1 {
223 FILE * out;
|
224 dawes 3.10 char buf[PATH_MAX],keymap[PATH_MAX],xkm_output_dir[PATH_MAX];
|
225 dawes 3.15 #ifdef WIN32
226 char tmpname[32];
227 #endif
|
228 dawes 3.30 #ifdef __UNIXOS2__
|
229 dawes 3.16 char *tmpbase;
|
230 dawes 3.18 int i;
|
231 dawes 3.16 #endif
|
232 dawes 1.1 if ((names->keymap==NULL)||(names->keymap[0]=='\0')) {
233 sprintf(keymap,"server-%s",display);
234 }
235 else {
|
236 dawes 3.25 if (strlen(names->keymap) > PATH_MAX - 1) {
237 ErrorF("name of keymap (%s) exceeds max length\n", names->keymap);
238 return False;
239 }
|
240 dawes 1.1 strcpy(keymap,names->keymap);
241 }
242
243 XkbEnsureSafeMapName(keymap);
|
244 dawes 3.10 OutputDirectory(xkm_output_dir);
|
245 dawes 3.15 #ifdef WIN32
246 strcpy(tmpname, "\\temp\\xkb_XXXXXX");
247 (void) mktemp(tmpname);
248 #endif
|
249 dawes 3.30 #ifdef __UNIXOS2__
|
250 dawes 3.18 tmpbase = (char*)__XOS2RedirRoot(XkbBaseDirectory);
|
251 dawes 3.16 #endif
|
252 dawes 1.1 if (XkbBaseDirectory!=NULL) {
|
253 dawes 3.10 if (strlen(XkbBaseDirectory)*2+(xkbDebugFlags>9?2:1)
254 +strlen(PRE_ERROR_MSG)+strlen(ERROR_PREFIX)
255 +strlen(POST_ERROR_MSG1)+strlen(xkm_output_dir)
256 +strlen(keymap)+48 > PATH_MAX)
257 {
258 ErrorF("compiler command for keymap (%s) exceeds max length\n",
259 names->keymap);
260 return False;
261 }
|
262 dawes 3.15 #ifndef WIN32
|
263 dawes 3.30 #ifndef __UNIXOS2__
|
264 dawes 3.15 sprintf(buf,
265 "%s/xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
266 XkbBaseDirectory,
|
267 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
268 dawes 3.15 XkbBaseDirectory,
269 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
270 xkm_output_dir,keymap);
|
271 dawes 3.16 #else
272 for (i=0; i<strlen(tmpbase); i++) if (tmpbase[i]=='/') tmpbase[i]='\\';
273 sprintf(buf,
274 "%s\\xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
275 tmpbase,
|
276 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
277 dawes 3.16 tmpbase,
278 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
279 xkm_output_dir,keymap);
280 #endif
|
281 dawes 3.6 #else
|
282 dawes 3.15 sprintf(buf,
283 "%s/xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\" < %s",
|
284 dawes 1.1 XkbBaseDirectory,
|
285 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
286 dawes 1.1 XkbBaseDirectory,
|
287 dawes 3.15 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
288 xkm_output_dir,keymap,tmpname);
|
289 dawes 3.6 #endif
|
290 dawes 1.1 }
291 else {
|
292 dawes 3.10 if ((xkbDebugFlags>9?2:1)+strlen(PRE_ERROR_MSG)
293 +strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
294 +strlen(xkm_output_dir)+strlen(keymap)+44 > PATH_MAX)
295 {
296 ErrorF("compiler command for keymap (%s) exceeds max length\n",
297 names->keymap);
298 return False;
299 }
|
300 dawes 3.15 #ifndef WIN32
301 sprintf(buf,
302 "xkbcomp -w %d -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
|
303 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
304 dawes 3.15 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
305 xkm_output_dir,keymap);
306 #else
307 sprintf(buf,
308 "xkbcomp -w %d -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\" < %s",
|
309 dawes 3.24 ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
|
310 dawes 3.15 PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
311 xkm_output_dir,keymap,tmpname);
312 #endif
|
313 dawes 1.1 }
|
314 dawes 3.15 #ifndef WIN32
|
315 dawes 3.22 out= Popen(buf,"w");
|
316 dawes 3.15 #else
317 out= fopen(tmpname, "w");
318 #endif
|
319 dawes 1.1 if (out!=NULL) {
320 #ifdef DEBUG
|
321 dawes 3.10 if (xkbDebugFlags) {
322 ErrorF("XkbDDXCompileKeymapByNames compiling keymap:\n");
323 XkbWriteXKBKeymapForNames(stderr,names,NULL,xkb,want,need);
324 }
|
325 dawes 1.1 #endif
326 XkbWriteXKBKeymapForNames(out,names,NULL,xkb,want,need);
|
327 dawes 3.15 #ifndef WIN32
|
328 dawes 3.22 if (Pclose(out)==0)
|
329 dawes 3.15 #else
330 if (fclose(out)==0)
331 #endif
332 {
333 #ifdef WIN32
|
334 dawes 3.22 if (System(buf) < 0)
|
335 dawes 3.15 ErrorF("Could not invoke keymap compiler\n");
336 else {
337 #endif
|
338 dawes 1.1 if (nameRtrn) {
339 strncpy(nameRtrn,keymap,nameRtrnLen);
340 nameRtrn[nameRtrnLen-1]= '\0';
341 }
|
342 dawes 3.23 #if defined(Lynx) && defined(__i386__) && defined(NEED_POPEN_WORKAROUND)
|
343 dawes 3.12 /* somehow popen/pclose is broken on LynxOS AT 2.3.0/2.4.0!
344 * the problem usually shows up with XF86Setup
345 * this hack waits at max 5 seconds after pclose() returns
346 * for the output of the xkbcomp output file.
347 * I didn't manage to get a patch in time for the 3.2 release
348 */
349 {
350 int i;
351 char name[PATH_MAX];
|
352 dawes 3.23 if (XkbBaseDirectory!=NULL)
353 sprintf(name,"%s/%s%s.xkm", XkbBaseDirectory
354 ,xkm_output_dir, keymap);
355 else
356 sprintf(name,"%s%s.xkm", xkm_output_dir, keymap);
|
357 dawes 3.12 for (i = 0; i < 10; i++) {
358 if (access(name, 0) == 0) break;
359 usleep(500000);
360 }
361 #ifdef DEBUG
362 if (i) ErrorF(">>>> Waited %d times for %s\n", i, name);
363 #endif
364 }
365 #endif
|
366 dawes 1.1 return True;
|
367 dawes 3.15 #ifdef WIN32
368 }
369 #endif
|
370 dawes 1.1 }
371 #ifdef DEBUG
|
372 dawes 3.15 else
373 ErrorF("Error compiling keymap (%s)\n",keymap);
|
374 dawes 1.1 #endif
375 }
376 #ifdef DEBUG
377 else {
|
378 dawes 3.15 #ifndef WIN32
|
379 dawes 1.1 ErrorF("Could not invoke keymap compiler\n");
|
380 dawes 3.15 #else
381 ErrorF("Could not open file %s\n", tmpname);
382 #endif
|
383 dawes 1.1 }
384 #endif
385 if (nameRtrn)
386 nameRtrn[0]= '\0';
387 return False;
388 }
389
390 FILE *
|
391 dawes 3.0 #if NeedFunctionPrototypes
392 XkbDDXOpenConfigFile(char *mapName,char *fileNameRtrn,int fileNameRtrnLen)
393 #else
|
394 dawes 1.1 XkbDDXOpenConfigFile(mapName,fileNameRtrn,fileNameRtrnLen)
395 char * mapName;
396 char * fileNameRtrn;
397 int fileNameRtrnLen;
|
398 dawes 3.0 #endif
|
399 dawes 1.1 {
|
400 dawes 3.10 char buf[PATH_MAX],xkm_output_dir[PATH_MAX];
|
401 dawes 1.1 FILE * file;
402
403 buf[0]= '\0';
404 if (mapName!=NULL) {
|
405 dawes 3.10 OutputDirectory(xkm_output_dir);
406 if ((XkbBaseDirectory!=NULL)&&(xkm_output_dir[0]!='/')) {
407 if (strlen(XkbBaseDirectory)+strlen(xkm_output_dir)
408 +strlen(mapName)+6 <= PATH_MAX)
409 {
410 sprintf(buf,"%s/%s%s.xkm",XkbBaseDirectory,
411 xkm_output_dir,mapName);
412 }
413 }
414 else if (strlen(xkm_output_dir)+strlen(mapName)+5 <= PATH_MAX)
415 sprintf(buf,"%s%s.xkm",xkm_output_dir,mapName);
416 if (buf[0] != '\0')
417 file= fopen(buf,"r");
418 else file= NULL;
|
419 dawes 1.1 }
420 else file= NULL;
421 if ((fileNameRtrn!=NULL)&&(fileNameRtrnLen>0)) {
422 strncpy(fileNameRtrn,buf,fileNameRtrnLen);
423 buf[fileNameRtrnLen-1]= '\0';
424 }
425 return file;
426 }
427
428 unsigned
|
429 dawes 3.0 #if NeedFunctionPrototypes
430 XkbDDXLoadKeymapByNames( DeviceIntPtr keybd,
431 XkbComponentNamesPtr names,
432 unsigned want,
433 unsigned need,
434 XkbFileInfo * finfoRtrn,
435 char * nameRtrn,
436 int nameRtrnLen)
437 #else
|
438 dawes 1.1 XkbDDXLoadKeymapByNames(keybd,names,want,need,finfoRtrn,nameRtrn,nameRtrnLen)
439 DeviceIntPtr keybd;
440 XkbComponentNamesPtr names;
441 unsigned want;
442 unsigned need;
443 XkbFileInfo * finfoRtrn;
444 char * nameRtrn;
445 int nameRtrnLen;
|
446 dawes 3.0 #endif
|
447 dawes 1.1 {
448 XkbDescPtr xkb;
449 FILE * file;
450 char fileName[PATH_MAX];
451 unsigned missing;
452
453 bzero(finfoRtrn,sizeof(XkbFileInfo));
454 if ((keybd==NULL)||(keybd->key==NULL)||(keybd->key->xkbInfo==NULL))
455 xkb= NULL;
456 else xkb= keybd->key->xkbInfo->desc;
457 if ((names->keycodes==NULL)&&(names->types==NULL)&&
458 (names->compat==NULL)&&(names->symbols==NULL)&&
459 (names->geometry==NULL)) {
460 if (names->keymap==NULL) {
461 bzero(finfoRtrn,sizeof(XkbFileInfo));
462 if (xkb && XkbDetermineFileType(finfoRtrn,XkbXKMFile,NULL) &&
463 ((finfoRtrn->defined&need)==need) ) {
464 finfoRtrn->xkb= xkb;
465 nameRtrn[0]= '\0';
466 return finfoRtrn->defined;
467 }
468 dawes 1.1 return 0;
469 }
470 else if (!XkbDDXCompileNamedKeymap(xkb,names,nameRtrn,nameRtrnLen)) {
471 #ifdef NOISY
472 ErrorF("Couldn't compile keymap file\n");
473 #endif
474 return 0;
475 }
476 }
477 else if (!XkbDDXCompileKeymapByNames(xkb,names,want,need,
478 nameRtrn,nameRtrnLen)){
479 #ifdef NOISY
480 ErrorF("Couldn't compile keymap file\n");
481 #endif
482 return 0;
483 }
484 file= XkbDDXOpenConfigFile(nameRtrn,fileName,PATH_MAX);
485 if (file==NULL) {
486 ErrorF("Couldn't open compiled keymap file %s\n",fileName);
487 return 0;
488 }
489 dawes 1.1 missing= XkmReadFile(file,need,want,finfoRtrn);
490 if (finfoRtrn->xkb==NULL) {
491 ErrorF("Error loading keymap %s\n",fileName);
492 fclose(file);
|
493 dawes 3.9 (void) unlink (fileName);
|
494 dawes 1.1 return 0;
495 }
496 #ifdef DEBUG
497 else if (xkbDebugFlags) {
498 ErrorF("Loaded %s, defined=0x%x\n",fileName,finfoRtrn->defined);
499 }
500 #endif
501 fclose(file);
|
502 dawes 3.9 (void) unlink (fileName);
|
503 dawes 1.1 return (need|want)&(~missing);
|
504 dawes 3.10 }
505
506 Bool
507 #if NeedFunctionPrototypes
508 XkbDDXNamesFromRules( DeviceIntPtr keybd,
509 char * rules_name,
510 XkbRF_VarDefsPtr defs,
511 XkbComponentNamesPtr names)
512 #else
513 XkbDDXNamesFromRules(keybd,rules_name,defs,names)
514 DeviceIntPtr keybd;
515 char * rules_name;
516 XkbRF_VarDefsPtr defs;
517 XkbComponentNamesPtr names;
518 #endif
519 {
520 char buf[PATH_MAX];
521 FILE * file;
522 Bool complete;
523 XkbRF_RulesPtr rules;
524
525 dawes 3.10 if (!rules_name)
526 return False;
527 if (XkbBaseDirectory==NULL) {
528 if (strlen(rules_name)+7 > PATH_MAX)
529 return False;
530 sprintf(buf,"rules/%s",rules_name);
531 }
532 else {
533 if (strlen(XkbBaseDirectory)+strlen(rules_name)+8 > PATH_MAX)
534 return False;
535 sprintf(buf,"%s/rules/%s",XkbBaseDirectory,rules_name);
536 }
537 if ((file= fopen(buf,"r"))==NULL)
538 return False;
539 if ((rules= XkbRF_Create(0,0))==NULL) {
540 fclose(file);
541 return False;
542 }
543 if (!XkbRF_LoadRules(file,rules)) {
544 fclose(file);
545 XkbRF_Free(rules,True);
546 dawes 3.10 return False;
547 }
548 bzero((char *)names,sizeof(XkbComponentNamesRec));
549 complete= XkbRF_GetComponents(rules,defs,names);
550 fclose(file);
551 XkbRF_Free(rules,True);
552 return complete;
|
553 dawes 1.1 }
|
554 eich 3.29
555
|