xref: /OK3568_Linux_fs/external/xserver/xkb/xkbfmisc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /************************************************************
2*4882a593Smuzhiyun  Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun  Permission to use, copy, modify, and distribute this
5*4882a593Smuzhiyun  software and its documentation for any purpose and without
6*4882a593Smuzhiyun  fee is hereby granted, provided that the above copyright
7*4882a593Smuzhiyun  notice appear in all copies and that both that copyright
8*4882a593Smuzhiyun  notice and this permission notice appear in supporting
9*4882a593Smuzhiyun  documentation, and that the name of Silicon Graphics not be
10*4882a593Smuzhiyun  used in advertising or publicity pertaining to distribution
11*4882a593Smuzhiyun  of the software without specific prior written permission.
12*4882a593Smuzhiyun  Silicon Graphics makes no representation about the suitability
13*4882a593Smuzhiyun  of this software for any purpose. It is provided "as is"
14*4882a593Smuzhiyun  without any express or implied warranty.
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun  SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17*4882a593Smuzhiyun  SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18*4882a593Smuzhiyun  AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19*4882a593Smuzhiyun  GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20*4882a593Smuzhiyun  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21*4882a593Smuzhiyun  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22*4882a593Smuzhiyun  OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23*4882a593Smuzhiyun  THE USE OR PERFORMANCE OF THIS SOFTWARE.
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun  ********************************************************/
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
28*4882a593Smuzhiyun #include <dix-config.h>
29*4882a593Smuzhiyun #endif
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #include <stdio.h>
32*4882a593Smuzhiyun #include <ctype.h>
33*4882a593Smuzhiyun #include <stdlib.h>
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #include <X11/Xos.h>
36*4882a593Smuzhiyun #include <X11/Xfuncs.h>
37*4882a593Smuzhiyun #include <X11/extensions/XKMformat.h>
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #include <X11/X.h>
40*4882a593Smuzhiyun #include <X11/keysym.h>
41*4882a593Smuzhiyun #include <X11/Xproto.h>
42*4882a593Smuzhiyun #include "misc.h"
43*4882a593Smuzhiyun #include "inputstr.h"
44*4882a593Smuzhiyun #include "dix.h"
45*4882a593Smuzhiyun #include "xkbstr.h"
46*4882a593Smuzhiyun #define XKBSRV_NEED_FILE_FUNCS	1
47*4882a593Smuzhiyun #include <xkbsrv.h>
48*4882a593Smuzhiyun #include "xkbgeom.h"
49*4882a593Smuzhiyun #include "xkb.h"
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun unsigned
_XkbKSCheckCase(KeySym ks)52*4882a593Smuzhiyun _XkbKSCheckCase(KeySym ks)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun     unsigned set, rtrn;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     set = (ks & (~0xff)) >> 8;
57*4882a593Smuzhiyun     rtrn = 0;
58*4882a593Smuzhiyun     switch (set) {
59*4882a593Smuzhiyun     case 0:                    /* latin 1 */
60*4882a593Smuzhiyun         if (((ks >= XK_A) && (ks <= XK_Z)) ||
61*4882a593Smuzhiyun             ((ks >= XK_Agrave) && (ks <= XK_THORN) && (ks != XK_multiply))) {
62*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
63*4882a593Smuzhiyun         }
64*4882a593Smuzhiyun         if (((ks >= XK_a) && (ks <= XK_z)) ||
65*4882a593Smuzhiyun             ((ks >= XK_ssharp) && (ks <= XK_ydiaeresis) &&
66*4882a593Smuzhiyun              (ks != XK_division))) {
67*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
68*4882a593Smuzhiyun         }
69*4882a593Smuzhiyun         break;
70*4882a593Smuzhiyun     case 1:                    /* latin 2 */
71*4882a593Smuzhiyun         if (((ks >= XK_Aogonek) && (ks <= XK_Zabovedot) && (ks != XK_breve)) ||
72*4882a593Smuzhiyun             ((ks >= XK_Racute) && (ks <= XK_Tcedilla))) {
73*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
74*4882a593Smuzhiyun         }
75*4882a593Smuzhiyun         if (((ks >= XK_aogonek) && (ks <= XK_zabovedot) && (ks != XK_ogonek) &&
76*4882a593Smuzhiyun              (ks != XK_caron) && (ks != XK_doubleacute)) || ((ks >= XK_racute)
77*4882a593Smuzhiyun                                                              && (ks <=
78*4882a593Smuzhiyun                                                                  XK_tcedilla)))
79*4882a593Smuzhiyun         {
80*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
81*4882a593Smuzhiyun         }
82*4882a593Smuzhiyun         break;
83*4882a593Smuzhiyun     case 2:                    /* latin 3 */
84*4882a593Smuzhiyun         if (((ks >= XK_Hstroke) && (ks <= XK_Jcircumflex)) ||
85*4882a593Smuzhiyun             ((ks >= XK_Cabovedot) && (ks <= XK_Scircumflex))) {
86*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
87*4882a593Smuzhiyun         }
88*4882a593Smuzhiyun         if (((ks >= XK_hstroke) && (ks <= XK_jcircumflex)) ||
89*4882a593Smuzhiyun             ((ks >= XK_cabovedot) && (ks <= XK_scircumflex))) {
90*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
91*4882a593Smuzhiyun         }
92*4882a593Smuzhiyun         break;
93*4882a593Smuzhiyun     case 3:                    /* latin 4 */
94*4882a593Smuzhiyun         if (((ks >= XK_Rcedilla) && (ks <= XK_Tslash)) ||
95*4882a593Smuzhiyun             (ks == XK_ENG) || ((ks >= XK_Amacron) && (ks <= XK_Umacron))) {
96*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
97*4882a593Smuzhiyun         }
98*4882a593Smuzhiyun         if ((ks == XK_kra) ||
99*4882a593Smuzhiyun             ((ks >= XK_rcedilla) && (ks <= XK_tslash)) ||
100*4882a593Smuzhiyun             (ks == XK_eng) || ((ks >= XK_amacron) && (ks <= XK_umacron))) {
101*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
102*4882a593Smuzhiyun         }
103*4882a593Smuzhiyun         break;
104*4882a593Smuzhiyun     case 18:                   /* latin 8 */
105*4882a593Smuzhiyun         if ((ks == XK_Wcircumflex) ||
106*4882a593Smuzhiyun             (ks == XK_Ycircumflex) ||
107*4882a593Smuzhiyun             (ks == XK_Babovedot) ||
108*4882a593Smuzhiyun             (ks == XK_Dabovedot) ||
109*4882a593Smuzhiyun             (ks == XK_Fabovedot) ||
110*4882a593Smuzhiyun             (ks == XK_Mabovedot) ||
111*4882a593Smuzhiyun             (ks == XK_Pabovedot) ||
112*4882a593Smuzhiyun             (ks == XK_Sabovedot) ||
113*4882a593Smuzhiyun             (ks == XK_Tabovedot) ||
114*4882a593Smuzhiyun             (ks == XK_Wgrave) ||
115*4882a593Smuzhiyun             (ks == XK_Wacute) || (ks == XK_Wdiaeresis) || (ks == XK_Ygrave)) {
116*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
117*4882a593Smuzhiyun         }
118*4882a593Smuzhiyun         if ((ks == XK_wcircumflex) ||
119*4882a593Smuzhiyun             (ks == XK_ycircumflex) ||
120*4882a593Smuzhiyun             (ks == XK_babovedot) ||
121*4882a593Smuzhiyun             (ks == XK_dabovedot) ||
122*4882a593Smuzhiyun             (ks == XK_fabovedot) ||
123*4882a593Smuzhiyun             (ks == XK_mabovedot) ||
124*4882a593Smuzhiyun             (ks == XK_pabovedot) ||
125*4882a593Smuzhiyun             (ks == XK_sabovedot) ||
126*4882a593Smuzhiyun             (ks == XK_tabovedot) ||
127*4882a593Smuzhiyun             (ks == XK_wgrave) ||
128*4882a593Smuzhiyun             (ks == XK_wacute) || (ks == XK_wdiaeresis) || (ks == XK_ygrave)) {
129*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
130*4882a593Smuzhiyun         }
131*4882a593Smuzhiyun         break;
132*4882a593Smuzhiyun     case 19:                   /* latin 9 */
133*4882a593Smuzhiyun         if ((ks == XK_OE) || (ks == XK_Ydiaeresis)) {
134*4882a593Smuzhiyun             rtrn |= _XkbKSUpper;
135*4882a593Smuzhiyun         }
136*4882a593Smuzhiyun         if (ks == XK_oe) {
137*4882a593Smuzhiyun             rtrn |= _XkbKSLower;
138*4882a593Smuzhiyun         }
139*4882a593Smuzhiyun         break;
140*4882a593Smuzhiyun     }
141*4882a593Smuzhiyun     return rtrn;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /***===================================================================***/
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun static Bool
XkbWriteSectionFromName(FILE * file,const char * sectionName,const char * name)147*4882a593Smuzhiyun XkbWriteSectionFromName(FILE * file, const char *sectionName, const char *name)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun     fprintf(file, "    xkb_%-20s { include \"%s\" };\n", sectionName, name);
150*4882a593Smuzhiyun     return TRUE;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun #define	NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%')))
154*4882a593Smuzhiyun #define	COMPLETE(n)  ((n)&&(!NEED_DESC(n)))
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /* ARGSUSED */
157*4882a593Smuzhiyun static void
_AddIncl(FILE * file,XkbDescPtr xkb,Bool topLevel,Bool showImplicit,int index,void * priv)158*4882a593Smuzhiyun _AddIncl(FILE * file,
159*4882a593Smuzhiyun          XkbDescPtr xkb,
160*4882a593Smuzhiyun          Bool topLevel, Bool showImplicit, int index, void *priv)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun     if ((priv) && (strcmp((char *) priv, "%") != 0))
163*4882a593Smuzhiyun         fprintf(file, "    include \"%s\"\n", (char *) priv);
164*4882a593Smuzhiyun     return;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun Bool
XkbWriteXKBKeymapForNames(FILE * file,XkbComponentNamesPtr names,XkbDescPtr xkb,unsigned want,unsigned need)168*4882a593Smuzhiyun XkbWriteXKBKeymapForNames(FILE * file,
169*4882a593Smuzhiyun                           XkbComponentNamesPtr names,
170*4882a593Smuzhiyun                           XkbDescPtr xkb, unsigned want, unsigned need)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun     const char *tmp;
173*4882a593Smuzhiyun     unsigned complete;
174*4882a593Smuzhiyun     XkbNamesPtr old_names;
175*4882a593Smuzhiyun     int multi_section;
176*4882a593Smuzhiyun     unsigned wantNames, wantConfig, wantDflts;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun     complete = 0;
179*4882a593Smuzhiyun     if (COMPLETE(names->keycodes))
180*4882a593Smuzhiyun         complete |= XkmKeyNamesMask;
181*4882a593Smuzhiyun     if (COMPLETE(names->types))
182*4882a593Smuzhiyun         complete |= XkmTypesMask;
183*4882a593Smuzhiyun     if (COMPLETE(names->compat))
184*4882a593Smuzhiyun         complete |= XkmCompatMapMask;
185*4882a593Smuzhiyun     if (COMPLETE(names->symbols))
186*4882a593Smuzhiyun         complete |= XkmSymbolsMask;
187*4882a593Smuzhiyun     if (COMPLETE(names->geometry))
188*4882a593Smuzhiyun         complete |= XkmGeometryMask;
189*4882a593Smuzhiyun     want |= (complete | need);
190*4882a593Smuzhiyun     if (want & XkmSymbolsMask)
191*4882a593Smuzhiyun         want |= XkmKeyNamesMask | XkmTypesMask;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun     if (want == 0)
194*4882a593Smuzhiyun         return FALSE;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun     if (xkb) {
197*4882a593Smuzhiyun         old_names = xkb->names;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun         xkb->defined = 0;
200*4882a593Smuzhiyun         /* Wow would it ever be neat if we didn't need this noise. */
201*4882a593Smuzhiyun         if (xkb->names && xkb->names->keys)
202*4882a593Smuzhiyun             xkb->defined |= XkmKeyNamesMask;
203*4882a593Smuzhiyun         if (xkb->map && xkb->map->types)
204*4882a593Smuzhiyun             xkb->defined |= XkmTypesMask;
205*4882a593Smuzhiyun         if (xkb->compat)
206*4882a593Smuzhiyun             xkb->defined |= XkmCompatMapMask;
207*4882a593Smuzhiyun         if (xkb->map && xkb->map->num_syms)
208*4882a593Smuzhiyun             xkb->defined |= XkmSymbolsMask;
209*4882a593Smuzhiyun         if (xkb->indicators)
210*4882a593Smuzhiyun             xkb->defined |= XkmIndicatorsMask;
211*4882a593Smuzhiyun         if (xkb->geom)
212*4882a593Smuzhiyun             xkb->defined |= XkmGeometryMask;
213*4882a593Smuzhiyun     }
214*4882a593Smuzhiyun     else {
215*4882a593Smuzhiyun         old_names = NULL;
216*4882a593Smuzhiyun     }
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun     wantConfig = want & (~complete);
219*4882a593Smuzhiyun     if (xkb != NULL) {
220*4882a593Smuzhiyun         if (wantConfig & XkmTypesMask) {
221*4882a593Smuzhiyun             if ((!xkb->map) || (xkb->map->num_types < XkbNumRequiredTypes))
222*4882a593Smuzhiyun                 wantConfig &= ~XkmTypesMask;
223*4882a593Smuzhiyun         }
224*4882a593Smuzhiyun         if (wantConfig & XkmCompatMapMask) {
225*4882a593Smuzhiyun             if ((!xkb->compat) || (xkb->compat->num_si < 1))
226*4882a593Smuzhiyun                 wantConfig &= ~XkmCompatMapMask;
227*4882a593Smuzhiyun         }
228*4882a593Smuzhiyun         if (wantConfig & XkmSymbolsMask) {
229*4882a593Smuzhiyun             if ((!xkb->map) || (!xkb->map->key_sym_map))
230*4882a593Smuzhiyun                 wantConfig &= ~XkmSymbolsMask;
231*4882a593Smuzhiyun         }
232*4882a593Smuzhiyun         if (wantConfig & XkmIndicatorsMask) {
233*4882a593Smuzhiyun             if (!xkb->indicators)
234*4882a593Smuzhiyun                 wantConfig &= ~XkmIndicatorsMask;
235*4882a593Smuzhiyun         }
236*4882a593Smuzhiyun         if (wantConfig & XkmKeyNamesMask) {
237*4882a593Smuzhiyun             if ((!xkb->names) || (!xkb->names->keys))
238*4882a593Smuzhiyun                 wantConfig &= ~XkmKeyNamesMask;
239*4882a593Smuzhiyun         }
240*4882a593Smuzhiyun         if ((wantConfig & XkmGeometryMask) && (!xkb->geom))
241*4882a593Smuzhiyun             wantConfig &= ~XkmGeometryMask;
242*4882a593Smuzhiyun     }
243*4882a593Smuzhiyun     else {
244*4882a593Smuzhiyun         wantConfig = 0;
245*4882a593Smuzhiyun     }
246*4882a593Smuzhiyun     complete |= wantConfig;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     wantDflts = 0;
249*4882a593Smuzhiyun     wantNames = want & (~complete);
250*4882a593Smuzhiyun     if ((xkb != NULL) && (old_names != NULL)) {
251*4882a593Smuzhiyun         if (wantNames & XkmTypesMask) {
252*4882a593Smuzhiyun             if (old_names->types != None) {
253*4882a593Smuzhiyun                 tmp = NameForAtom(old_names->types);
254*4882a593Smuzhiyun                 names->types = Xstrdup(tmp);
255*4882a593Smuzhiyun             }
256*4882a593Smuzhiyun             else {
257*4882a593Smuzhiyun                 wantDflts |= XkmTypesMask;
258*4882a593Smuzhiyun             }
259*4882a593Smuzhiyun             complete |= XkmTypesMask;
260*4882a593Smuzhiyun         }
261*4882a593Smuzhiyun         if (wantNames & XkmCompatMapMask) {
262*4882a593Smuzhiyun             if (old_names->compat != None) {
263*4882a593Smuzhiyun                 tmp = NameForAtom(old_names->compat);
264*4882a593Smuzhiyun                 names->compat = Xstrdup(tmp);
265*4882a593Smuzhiyun             }
266*4882a593Smuzhiyun             else
267*4882a593Smuzhiyun                 wantDflts |= XkmCompatMapMask;
268*4882a593Smuzhiyun             complete |= XkmCompatMapMask;
269*4882a593Smuzhiyun         }
270*4882a593Smuzhiyun         if (wantNames & XkmSymbolsMask) {
271*4882a593Smuzhiyun             if (old_names->symbols == None)
272*4882a593Smuzhiyun                 return FALSE;
273*4882a593Smuzhiyun             tmp = NameForAtom(old_names->symbols);
274*4882a593Smuzhiyun             names->symbols = Xstrdup(tmp);
275*4882a593Smuzhiyun             complete |= XkmSymbolsMask;
276*4882a593Smuzhiyun         }
277*4882a593Smuzhiyun         if (wantNames & XkmKeyNamesMask) {
278*4882a593Smuzhiyun             if (old_names->keycodes != None) {
279*4882a593Smuzhiyun                 tmp = NameForAtom(old_names->keycodes);
280*4882a593Smuzhiyun                 names->keycodes = Xstrdup(tmp);
281*4882a593Smuzhiyun             }
282*4882a593Smuzhiyun             else
283*4882a593Smuzhiyun                 wantDflts |= XkmKeyNamesMask;
284*4882a593Smuzhiyun             complete |= XkmKeyNamesMask;
285*4882a593Smuzhiyun         }
286*4882a593Smuzhiyun         if (wantNames & XkmGeometryMask) {
287*4882a593Smuzhiyun             if (old_names->geometry == None)
288*4882a593Smuzhiyun                 return FALSE;
289*4882a593Smuzhiyun             tmp = NameForAtom(old_names->geometry);
290*4882a593Smuzhiyun             names->geometry = Xstrdup(tmp);
291*4882a593Smuzhiyun             complete |= XkmGeometryMask;
292*4882a593Smuzhiyun             wantNames &= ~XkmGeometryMask;
293*4882a593Smuzhiyun         }
294*4882a593Smuzhiyun     }
295*4882a593Smuzhiyun     if (complete & XkmCompatMapMask)
296*4882a593Smuzhiyun         complete |= XkmIndicatorsMask | XkmVirtualModsMask;
297*4882a593Smuzhiyun     else if (complete & (XkmSymbolsMask | XkmTypesMask))
298*4882a593Smuzhiyun         complete |= XkmVirtualModsMask;
299*4882a593Smuzhiyun     if (need & (~complete))
300*4882a593Smuzhiyun         return FALSE;
301*4882a593Smuzhiyun     if ((complete & XkmSymbolsMask) &&
302*4882a593Smuzhiyun         ((XkmKeyNamesMask | XkmTypesMask) & (~complete)))
303*4882a593Smuzhiyun         return FALSE;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun     multi_section = 1;
306*4882a593Smuzhiyun     if (((complete & XkmKeymapRequired) == XkmKeymapRequired) &&
307*4882a593Smuzhiyun         ((complete & (~XkmKeymapLegal)) == 0)) {
308*4882a593Smuzhiyun         fprintf(file, "xkb_keymap \"default\" {\n");
309*4882a593Smuzhiyun     }
310*4882a593Smuzhiyun     else if (((complete & XkmSemanticsRequired) == XkmSemanticsRequired) &&
311*4882a593Smuzhiyun              ((complete & (~XkmSemanticsLegal)) == 0)) {
312*4882a593Smuzhiyun         fprintf(file, "xkb_semantics \"default\" {\n");
313*4882a593Smuzhiyun     }
314*4882a593Smuzhiyun     else if (((complete & XkmLayoutRequired) == XkmLayoutRequired) &&
315*4882a593Smuzhiyun              ((complete & (~XkmLayoutLegal)) == 0)) {
316*4882a593Smuzhiyun         fprintf(file, "xkb_layout \"default\" {\n");
317*4882a593Smuzhiyun     }
318*4882a593Smuzhiyun     else if (XkmSingleSection(complete & (~XkmVirtualModsMask))) {
319*4882a593Smuzhiyun         multi_section = 0;
320*4882a593Smuzhiyun     }
321*4882a593Smuzhiyun     else {
322*4882a593Smuzhiyun         return FALSE;
323*4882a593Smuzhiyun     }
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun     wantNames = complete & (~(wantConfig | wantDflts));
326*4882a593Smuzhiyun     if (wantConfig & XkmKeyNamesMask)
327*4882a593Smuzhiyun         XkbWriteXKBKeycodes(file, xkb, FALSE, FALSE, _AddIncl, names->keycodes);
328*4882a593Smuzhiyun     else if (wantDflts & XkmKeyNamesMask)
329*4882a593Smuzhiyun         fprintf(stderr, "Default symbols not implemented yet!\n");
330*4882a593Smuzhiyun     else if (wantNames & XkmKeyNamesMask)
331*4882a593Smuzhiyun         XkbWriteSectionFromName(file, "keycodes", names->keycodes);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun     if (wantConfig & XkmTypesMask)
334*4882a593Smuzhiyun         XkbWriteXKBKeyTypes(file, xkb, FALSE, FALSE, _AddIncl, names->types);
335*4882a593Smuzhiyun     else if (wantDflts & XkmTypesMask)
336*4882a593Smuzhiyun         fprintf(stderr, "Default types not implemented yet!\n");
337*4882a593Smuzhiyun     else if (wantNames & XkmTypesMask)
338*4882a593Smuzhiyun         XkbWriteSectionFromName(file, "types", names->types);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun     if (wantConfig & XkmCompatMapMask)
341*4882a593Smuzhiyun         XkbWriteXKBCompatMap(file, xkb, FALSE, FALSE, _AddIncl, names->compat);
342*4882a593Smuzhiyun     else if (wantDflts & XkmCompatMapMask)
343*4882a593Smuzhiyun         fprintf(stderr, "Default interps not implemented yet!\n");
344*4882a593Smuzhiyun     else if (wantNames & XkmCompatMapMask)
345*4882a593Smuzhiyun         XkbWriteSectionFromName(file, "compatibility", names->compat);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun     if (wantConfig & XkmSymbolsMask)
348*4882a593Smuzhiyun         XkbWriteXKBSymbols(file, xkb, FALSE, FALSE, _AddIncl, names->symbols);
349*4882a593Smuzhiyun     else if (wantNames & XkmSymbolsMask)
350*4882a593Smuzhiyun         XkbWriteSectionFromName(file, "symbols", names->symbols);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun     if (wantConfig & XkmGeometryMask)
353*4882a593Smuzhiyun         XkbWriteXKBGeometry(file, xkb, FALSE, FALSE, _AddIncl, names->geometry);
354*4882a593Smuzhiyun     else if (wantNames & XkmGeometryMask)
355*4882a593Smuzhiyun         XkbWriteSectionFromName(file, "geometry", names->geometry);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun     if (multi_section)
358*4882a593Smuzhiyun         fprintf(file, "};\n");
359*4882a593Smuzhiyun     return TRUE;
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun /***====================================================================***/
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun int
XkbFindKeycodeByName(XkbDescPtr xkb,char * name,Bool use_aliases)365*4882a593Smuzhiyun XkbFindKeycodeByName(XkbDescPtr xkb, char *name, Bool use_aliases)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun     register int i;
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun     if ((!xkb) || (!xkb->names) || (!xkb->names->keys))
370*4882a593Smuzhiyun         return 0;
371*4882a593Smuzhiyun     for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) {
372*4882a593Smuzhiyun         if (strncmp(xkb->names->keys[i].name, name, XkbKeyNameLength) == 0)
373*4882a593Smuzhiyun             return i;
374*4882a593Smuzhiyun     }
375*4882a593Smuzhiyun     if (!use_aliases)
376*4882a593Smuzhiyun         return 0;
377*4882a593Smuzhiyun     if (xkb->geom && xkb->geom->key_aliases) {
378*4882a593Smuzhiyun         XkbKeyAliasPtr a;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun         a = xkb->geom->key_aliases;
381*4882a593Smuzhiyun         for (i = 0; i < xkb->geom->num_key_aliases; i++, a++) {
382*4882a593Smuzhiyun             if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
383*4882a593Smuzhiyun                 return XkbFindKeycodeByName(xkb, a->real, FALSE);
384*4882a593Smuzhiyun         }
385*4882a593Smuzhiyun     }
386*4882a593Smuzhiyun     if (xkb->names && xkb->names->key_aliases) {
387*4882a593Smuzhiyun         XkbKeyAliasPtr a;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun         a = xkb->names->key_aliases;
390*4882a593Smuzhiyun         for (i = 0; i < xkb->names->num_key_aliases; i++, a++) {
391*4882a593Smuzhiyun             if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
392*4882a593Smuzhiyun                 return XkbFindKeycodeByName(xkb, a->real, FALSE);
393*4882a593Smuzhiyun         }
394*4882a593Smuzhiyun     }
395*4882a593Smuzhiyun     return 0;
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun unsigned
XkbConvertGetByNameComponents(Bool toXkm,unsigned orig)399*4882a593Smuzhiyun XkbConvertGetByNameComponents(Bool toXkm, unsigned orig)
400*4882a593Smuzhiyun {
401*4882a593Smuzhiyun     unsigned rtrn;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun     rtrn = 0;
404*4882a593Smuzhiyun     if (toXkm) {
405*4882a593Smuzhiyun         if (orig & XkbGBN_TypesMask)
406*4882a593Smuzhiyun             rtrn |= XkmTypesMask;
407*4882a593Smuzhiyun         if (orig & XkbGBN_CompatMapMask)
408*4882a593Smuzhiyun             rtrn |= XkmCompatMapMask;
409*4882a593Smuzhiyun         if (orig & XkbGBN_SymbolsMask)
410*4882a593Smuzhiyun             rtrn |= XkmSymbolsMask;
411*4882a593Smuzhiyun         if (orig & XkbGBN_IndicatorMapMask)
412*4882a593Smuzhiyun             rtrn |= XkmIndicatorsMask;
413*4882a593Smuzhiyun         if (orig & XkbGBN_KeyNamesMask)
414*4882a593Smuzhiyun             rtrn |= XkmKeyNamesMask;
415*4882a593Smuzhiyun         if (orig & XkbGBN_GeometryMask)
416*4882a593Smuzhiyun             rtrn |= XkmGeometryMask;
417*4882a593Smuzhiyun     }
418*4882a593Smuzhiyun     else {
419*4882a593Smuzhiyun         if (orig & XkmTypesMask)
420*4882a593Smuzhiyun             rtrn |= XkbGBN_TypesMask;
421*4882a593Smuzhiyun         if (orig & XkmCompatMapMask)
422*4882a593Smuzhiyun             rtrn |= XkbGBN_CompatMapMask;
423*4882a593Smuzhiyun         if (orig & XkmSymbolsMask)
424*4882a593Smuzhiyun             rtrn |= XkbGBN_SymbolsMask;
425*4882a593Smuzhiyun         if (orig & XkmIndicatorsMask)
426*4882a593Smuzhiyun             rtrn |= XkbGBN_IndicatorMapMask;
427*4882a593Smuzhiyun         if (orig & XkmKeyNamesMask)
428*4882a593Smuzhiyun             rtrn |= XkbGBN_KeyNamesMask;
429*4882a593Smuzhiyun         if (orig & XkmGeometryMask)
430*4882a593Smuzhiyun             rtrn |= XkbGBN_GeometryMask;
431*4882a593Smuzhiyun         if (orig != 0)
432*4882a593Smuzhiyun             rtrn |= XkbGBN_OtherNamesMask;
433*4882a593Smuzhiyun     }
434*4882a593Smuzhiyun     return rtrn;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun /***====================================================================***/
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun #define	UNMATCHABLE(c)	(((c)=='(')||((c)==')')||((c)=='/'))
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun Bool
XkbNameMatchesPattern(char * name,char * ptrn)442*4882a593Smuzhiyun XkbNameMatchesPattern(char *name, char *ptrn)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun     while (ptrn[0] != '\0') {
445*4882a593Smuzhiyun         if (name[0] == '\0') {
446*4882a593Smuzhiyun             if (ptrn[0] == '*') {
447*4882a593Smuzhiyun                 ptrn++;
448*4882a593Smuzhiyun                 continue;
449*4882a593Smuzhiyun             }
450*4882a593Smuzhiyun             return FALSE;
451*4882a593Smuzhiyun         }
452*4882a593Smuzhiyun         if (ptrn[0] == '?') {
453*4882a593Smuzhiyun             if (UNMATCHABLE(name[0]))
454*4882a593Smuzhiyun                 return FALSE;
455*4882a593Smuzhiyun         }
456*4882a593Smuzhiyun         else if (ptrn[0] == '*') {
457*4882a593Smuzhiyun             if ((!UNMATCHABLE(name[0])) &&
458*4882a593Smuzhiyun                 XkbNameMatchesPattern(name + 1, ptrn))
459*4882a593Smuzhiyun                 return TRUE;
460*4882a593Smuzhiyun             return XkbNameMatchesPattern(name, ptrn + 1);
461*4882a593Smuzhiyun         }
462*4882a593Smuzhiyun         else if (ptrn[0] != name[0])
463*4882a593Smuzhiyun             return FALSE;
464*4882a593Smuzhiyun         name++;
465*4882a593Smuzhiyun         ptrn++;
466*4882a593Smuzhiyun     }
467*4882a593Smuzhiyun     /* if we get here, the pattern is exhausted (-:just like me:-) */
468*4882a593Smuzhiyun     return name[0] == '\0';
469*4882a593Smuzhiyun }
470