1 /************************************************************
2 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
3 
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.
15 
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.
24 
25 ********************************************************/
26 
27 #ifndef _XKBLIBINT_H_
28 #define _XKBLIBINT_H_
29 
30 #include <X11/Xutil.h>
31 #include <X11/XKBlib.h>
32 #include "reallocarray.h"
33 
34 #define XkbMapPending           (1<<0)
35 #define XkbXlibNewKeyboard      (1<<1)
36 
37 typedef int     (*XkbKSToMBFunc)(
38         XPointer        /* priv */,
39         KeySym          /* sym */,
40         char *          /* buf */,
41         int             /* len */,
42         int *           /* extra_rtrn */
43 );
44 
45 typedef KeySym  (*XkbMBToKSFunc)(
46         XPointer        /* priv */,
47         char *          /* buf */,
48         int             /* len */,
49         Status *        /* status */
50 );
51 
52 typedef KeySym  (*XkbToUpperFunc)(
53         KeySym          /* sym */
54 );
55 
56 typedef struct _XkbConverters {
57         XkbKSToMBFunc    KSToMB;
58         XPointer         KSToMBPriv;
59         XkbMBToKSFunc    MBToKS;
60         XPointer         MBToKSPriv;
61         XkbToUpperFunc   KSToUpper;
62 } XkbConverters;
63 
64 extern  XkbInternAtomFunc       _XkbInternAtomFunc;
65 extern  XkbGetAtomNameFunc      _XkbGetAtomNameFunc;
66 
67 typedef struct _XkbInfoRec {
68         unsigned         flags;
69         unsigned         xlib_ctrls;
70         XExtCodes        *codes;
71         int              srv_major;
72         int              srv_minor;
73         unsigned         selected_events;
74         unsigned short   selected_nkn_details;
75         unsigned short   selected_map_details;
76         XkbDescRec      *desc;
77         XkbMapChangesRec changes;
78         Atom             composeLED;
79         XkbConverters    cvt;
80         XkbConverters    latin1cvt;
81 } XkbInfoRec, *XkbInfoPtr;
82 
83 
84 #define _XkbUnavailable(d) \
85         (((d)->flags&XlibDisplayNoXkb) || \
86          ((!(d)->xkb_info || (!(d)->xkb_info->desc)) && !_XkbLoadDpy(d)))
87 
88 #define _XkbCheckPendingRefresh(d,xi) { \
89     if ((xi)->flags&XkbXlibNewKeyboard) \
90         _XkbReloadDpy((d)); \
91     else if ((xi)->flags&XkbMapPending) { \
92         if (XkbGetMapChanges((d),(xi)->desc, &(xi)->changes)==Success) { \
93             LockDisplay((d)); \
94             (xi)->changes.changed= 0; \
95             UnlockDisplay((d)); \
96         } \
97     } \
98 }
99 
100 #define _XkbNeedModmap(i)    ((!(i)->desc->map)||(!(i)->desc->map->modmap))
101 
102         /*
103          * mask of the events that the "invisible" XKB support in Xlib needs
104          */
105 #define XKB_XLIB_MAP_MASK (XkbAllClientInfoMask)
106 
107         /*
108          * Handy helper macros
109          */
110 
111 typedef struct _XkbReadBuffer {
112         int      error;
113         int      size;
114         char    *start;
115         char    *data;
116 } XkbReadBufferRec, *XkbReadBufferPtr;
117 
118 #define _XkbAlloc(s)            Xmalloc((s))
119 #define _XkbCalloc(n,s)         Xcalloc((n),(s))
120 #define _XkbRealloc(o,s)        Xrealloc((o),(s))
121 #define _XkbTypedAlloc(t)       ((t *)Xmalloc(sizeof(t)))
122 #define _XkbTypedCalloc(n,t)    ((t *)Xcalloc((n),sizeof(t)))
123 #define _XkbFree(p)             Xfree(p)
124 
125 /* Resizes array to hold new_num elements, zeroing newly added entries.
126    Destroys old array on failure. */
127 #define _XkbResizeArray(array, old_num, new_num, type)                       \
128     do {                                                                     \
129         if (array == NULL) {                                                 \
130             array = _XkbTypedCalloc(new_num, type);                          \
131         } else {                                                             \
132             type *prev_array = array;                                        \
133             array = Xreallocarray(array, new_num, sizeof(type));             \
134             if (_X_UNLIKELY((array) == NULL)) {                              \
135                 _XkbFree(prev_array);                                        \
136             } else if ((new_num) > (old_num)) {                              \
137                 bzero(&array[old_num],                                       \
138                       ((new_num) - (old_num)) * sizeof(type));               \
139             }                                                                \
140         }                                                                    \
141     } while(0)
142 
143 _XFUNCPROTOBEGIN
144 
145 extern  void _XkbReloadDpy(
146     Display *           /* dpy */
147 );
148 
149 extern KeySym _XKeycodeToKeysym(
150     Display *           /* display */,
151 #if NeedWidePrototypes
152     unsigned int        /* keycode */,
153 #else
154     KeyCode             /* keycode */,
155 #endif
156     int                 /* index */
157 );
158 
159 extern KeyCode _XKeysymToKeycode(
160     Display *           /* display */,
161     KeySym              /* keysym */
162 );
163 
164 extern KeySym _XLookupKeysym(
165     XKeyEvent *         /* key_event */,
166     int                 /* index */
167 );
168 
169 extern int _XRefreshKeyboardMapping(
170     XMappingEvent *     /* event_map */
171 );
172 
173 extern unsigned _XKeysymToModifiers(
174     Display *           /* dpy */,
175     KeySym              /* ks */
176 );
177 
178 extern int _XTranslateKey(
179     register Display *  /* dpy */,
180     KeyCode             /* keycode */,
181     register unsigned int /* modifiers */,
182     unsigned int *      /* modifiers_return */,
183     KeySym *            /* keysym_return */
184 );
185 
186 extern int      _XTranslateKeySym(
187     Display *           /* dpy */,
188     register KeySym     /* symbol */,
189     unsigned int        /* modifiers */,
190     char *              /* buffer */,
191     int                 /* nbytes */
192 );
193 
194 extern  int _XLookupString(
195     register XKeyEvent *        /* event */,
196     char *                      /* buffer */,
197     int                         /* nbytes */,
198     KeySym *                    /* keysym */,
199     XComposeStatus *            /* status */
200 );
201 
202 extern void _XkbNoteCoreMapChanges(
203     XkbMapChangesRec *          /* old */,
204     XMappingEvent *             /* new */,
205     unsigned int                /* wanted */
206 );
207 
208 extern  int _XkbInitReadBuffer(
209     Display *           /* dpy */,
210     XkbReadBufferPtr    /* buf */,
211     int                 /* size */
212 );
213 
214 extern int _XkbSkipReadBufferData(
215     XkbReadBufferPtr    /* from */,
216     int                 /* size */
217 );
218 
219 extern int _XkbCopyFromReadBuffer(
220     XkbReadBufferPtr    /* from */,
221     char *              /* to */,
222     int                 /* size */
223 );
224 
225 
226 #ifdef LONG64
227 extern  int _XkbReadCopyData32(
228     int *               /* from */,
229     long *              /* to */,
230     int                 /* num_words */
231 );
232 
233 extern  int _XkbWriteCopyData32(
234     unsigned long *     /* from */,
235     CARD32 *            /* to */,
236     int                 /* num_words */
237 );
238 
239 extern int _XkbReadBufferCopy32(
240     XkbReadBufferPtr    /* from */,
241     long *              /* to */,
242     int                 /* size */
243 );
244 #else
245 #define _XkbReadCopyData32(f,t,s)    memcpy((char *)(t), (char *)(f), (s)*4)
246 #define _XkbWriteCopyData32(f,t,s)   memcpy((char *)(t), (char *)(f), (s)*4)
247 #define _XkbReadBufferCopy32(f,t,s) _XkbCopyFromReadBuffer(f, (char *)t, (s)*4)
248 #endif
249 
250 #ifndef NO_DEC_BINARY_COMPATIBILITY
251 #define XKB_FORCE_INT_KEYSYM 1
252 #endif
253 
254 #ifdef XKB_FORCE_INT_KEYSYM
255 extern int _XkbReadCopyKeySyms(
256     int *               /* from */,
257     KeySym *            /* to */,
258     int                 /* num_words */
259 );
260 
261 extern  int _XkbWriteCopyKeySyms(
262     KeySym *            /* from */,
263     CARD32 *            /* to */,
264     int                 /* num_words */
265 );
266 
267 extern int _XkbReadBufferCopyKeySyms(
268     XkbReadBufferPtr    /* from */,
269 #ifndef NO_DEC_BUG_FIX
270     KeySym *            /* to */,
271 #else
272     long *              /* to */,
273 #endif
274     int                 /* size */
275 );
276 #else
277 #define _XkbReadCopyKeySyms(f,t,n)              _XkbReadCopyData32(f,t,n)
278 #define _XkbWriteCopyKeySyms(f,t,n)             _XkbWriteCopyData32(f,t,n)
279 #define _XkbReadBufferCopyKeySyms(f,t,s)        _XkbReadBufferCopy32(f,t,s)
280 #endif
281 
282 extern char *_XkbPeekAtReadBuffer(
283     XkbReadBufferPtr    /* from */,
284     int                 /*  size */
285 );
286 
287 extern char *_XkbGetReadBufferPtr(
288     XkbReadBufferPtr    /* from */,
289     int                 /* size */
290 );
291 #define _XkbGetTypedRdBufPtr(b,n,t) ((t *)_XkbGetReadBufferPtr(b,(n)*SIZEOF(t)))
292 
293 extern int _XkbFreeReadBuffer(
294     XkbReadBufferPtr    /* buf */
295 );
296 
297 extern Bool
298 _XkbGetReadBufferCountedString(
299     XkbReadBufferPtr    /* buf */,
300     char **             /* rtrn */
301 );
302 
303 extern char *_XkbGetCharset(
304     void
305 );
306 
307 extern int       _XkbGetConverters(
308     const char *       /* encoding_name */,
309     XkbConverters *    /* cvt_rtrn */
310 );
311 
312 #ifdef  NEED_MAP_READERS
313 
314 extern  Status  _XkbReadGetMapReply(
315     Display *           /* dpy */,
316     xkbGetMapReply *    /* rep */,
317     XkbDescRec *        /* xkb */,
318     int *               /* nread_rtrn */
319 );
320 
321 extern  Status  _XkbReadGetCompatMapReply(
322     Display *                   /* dpy */,
323     xkbGetCompatMapReply *      /* rep */,
324     XkbDescPtr                  /* xkb */,
325     int *                       /* nread_rtrn */
326 );
327 
328 extern  Status  _XkbReadGetIndicatorMapReply(
329     Display *                   /* dpy */,
330     xkbGetIndicatorMapReply *   /* rep */,
331     XkbDescPtr                  /* xkb */,
332     int *                       /* nread_rtrn */
333 );
334 
335 extern  Status  _XkbReadGetNamesReply(
336     Display *                   /* dpy */,
337     xkbGetNamesReply *          /* rep */,
338     XkbDescPtr                  /* xkb */,
339     int *                       /* nread_rtrn */
340 );
341 
342 extern  Status  _XkbReadGetGeometryReply(
343     Display *                   /* dpy */,
344     xkbGetGeometryReply *       /* rep */,
345     XkbDescPtr                  /* xkb */,
346     int *                       /* nread_rtrn */
347 );
348 
349 #endif
350 
351 _XFUNCPROTOEND
352 
353 #endif /* _XKBLIBINT_H_ */
354