1 /************************************************************
2 Copyright (c) 1993 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 ********************************************************/
30 #include <X11/extensions/XKB.h>
32 #define XkbCharToInt(v) ((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
33 #define XkbIntTo2Chars(i,h,l) (((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
35 #if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
36 #define Xkb2CharsToInt(h,l) ((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
37 (int)(((h)<<8)|(l)&0x7fff))
39 #define Xkb2CharsToInt(h,l) ((short)(((h)<<8)|(l)))
43 * Common data structures and access macros
46 typedef struct _XkbStateRec {
48 unsigned char locked_group;
49 unsigned short base_group;
50 unsigned short latched_group;
52 unsigned char base_mods;
53 unsigned char latched_mods;
54 unsigned char locked_mods;
55 unsigned char compat_state;
56 unsigned char grab_mods;
57 unsigned char compat_grab_mods;
58 unsigned char lookup_mods;
59 unsigned char compat_lookup_mods;
60 unsigned short ptr_buttons;
61 } XkbStateRec,*XkbStatePtr;
62 #define XkbModLocks(s) ((s)->locked_mods)
63 #define XkbStateMods(s) ((s)->base_mods|(s)->latched_mods|XkbModLocks(s))
64 #define XkbGroupLock(s) ((s)->locked_group)
65 #define XkbStateGroup(s) ((s)->base_group+(s)->latched_group+XkbGroupLock(s))
66 #define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
67 #define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)
69 typedef struct _XkbMods {
70 unsigned char mask; /* effective mods */
71 unsigned char real_mods;
73 } XkbModsRec,*XkbModsPtr;
75 typedef struct _XkbKTMapEntry {
79 } XkbKTMapEntryRec,*XkbKTMapEntryPtr;
81 typedef struct _XkbKeyType {
83 unsigned char num_levels;
84 unsigned char map_count;
89 } XkbKeyTypeRec, *XkbKeyTypePtr;
91 #define XkbNumGroups(g) ((g)&0x0f)
92 #define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
93 #define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
94 #define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
95 #define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
96 #define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
99 * Structures and access macros used primarily by the server
102 typedef struct _XkbBehavior {
107 #define XkbAnyActionDataSize 7
108 typedef struct _XkbAnyAction {
110 unsigned char data[XkbAnyActionDataSize];
113 typedef struct _XkbModAction {
117 unsigned char real_mods;
118 unsigned char vmods1;
119 unsigned char vmods2;
121 #define XkbModActionVMods(a) \
122 ((short)(((a)->vmods1<<8)|((a)->vmods2)))
123 #define XkbSetModActionVMods(a,v) \
124 (((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
126 typedef struct _XkbGroupAction {
131 #define XkbSAGroup(a) (XkbCharToInt((a)->group_XXX))
132 #define XkbSASetGroup(a,g) ((a)->group_XXX=(g))
134 typedef struct _XkbISOAction {
138 unsigned char real_mods;
140 unsigned char affect;
141 unsigned char vmods1;
142 unsigned char vmods2;
145 typedef struct _XkbPtrAction {
148 unsigned char high_XXX;
149 unsigned char low_XXX;
150 unsigned char high_YYY;
151 unsigned char low_YYY;
153 #define XkbPtrActionX(a) (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
154 #define XkbPtrActionY(a) (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
155 #define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
156 #define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
158 typedef struct _XkbPtrBtnAction {
162 unsigned char button;
165 typedef struct _XkbPtrDfltAction {
168 unsigned char affect;
171 #define XkbSAPtrDfltValue(a) (XkbCharToInt((a)->valueXXX))
172 #define XkbSASetPtrDfltValue(a,c) ((a)->valueXXX= ((c)&0xff))
174 typedef struct _XkbSwitchScreenAction {
178 } XkbSwitchScreenAction;
179 #define XkbSAScreen(a) (XkbCharToInt((a)->screenXXX))
180 #define XkbSASetScreen(a,s) ((a)->screenXXX= ((s)&0xff))
182 typedef struct _XkbCtrlsAction {
185 unsigned char ctrls3;
186 unsigned char ctrls2;
187 unsigned char ctrls1;
188 unsigned char ctrls0;
190 #define XkbActionSetCtrls(a,c) (((a)->ctrls3=(((c)>>24)&0xff)),\
191 ((a)->ctrls2=(((c)>>16)&0xff)),\
192 ((a)->ctrls1=(((c)>>8)&0xff)),\
193 ((a)->ctrls0=((c)&0xff)))
194 #define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
195 (((unsigned int)(a)->ctrls2)<<16)|\
196 (((unsigned int)(a)->ctrls1)<<8)|\
197 ((unsigned int)((a)->ctrls0)))
199 typedef struct _XkbMessageAction {
202 unsigned char message[6];
205 typedef struct _XkbRedirectKeyAction {
207 unsigned char new_key;
208 unsigned char mods_mask;
210 unsigned char vmods_mask0;
211 unsigned char vmods_mask1;
212 unsigned char vmods0;
213 unsigned char vmods1;
214 } XkbRedirectKeyAction;
216 #define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\
217 ((unsigned int)(a)->vmods0))
218 #define XkbSARedirectSetVMods(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
219 ((a)->vmods_mask0=((m)&0xff)))
220 #define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\
221 ((unsigned int)(a)->vmods_mask0))
222 #define XkbSARedirectSetVModsMask(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
223 ((a)->vmods_mask0=((m)&0xff)))
225 typedef struct _XkbDeviceBtnAction {
229 unsigned char button;
230 unsigned char device;
231 } XkbDeviceBtnAction;
233 typedef struct _XkbDeviceValuatorAction {
235 unsigned char device;
236 unsigned char v1_what;
237 unsigned char v1_ndx;
238 unsigned char v1_value;
239 unsigned char v2_what;
240 unsigned char v2_ndx;
241 unsigned char v2_value;
242 } XkbDeviceValuatorAction;
244 typedef union _XkbAction {
247 XkbGroupAction group;
251 XkbPtrDfltAction dflt;
252 XkbSwitchScreenAction screen;
253 XkbCtrlsAction ctrls;
254 XkbMessageAction msg;
255 XkbRedirectKeyAction redirect;
256 XkbDeviceBtnAction devbtn;
257 XkbDeviceValuatorAction devval;
261 typedef struct _XkbControls {
262 unsigned char mk_dflt_btn;
263 unsigned char num_groups;
264 unsigned char groups_wrap;
266 XkbModsRec ignore_lock;
267 unsigned int enabled_ctrls;
268 unsigned short repeat_delay;
269 unsigned short repeat_interval;
270 unsigned short slow_keys_delay;
271 unsigned short debounce_delay;
272 unsigned short mk_delay;
273 unsigned short mk_interval;
274 unsigned short mk_time_to_max;
275 unsigned short mk_max_speed;
277 unsigned short ax_options;
278 unsigned short ax_timeout;
279 unsigned short axt_opts_mask;
280 unsigned short axt_opts_values;
281 unsigned int axt_ctrls_mask;
282 unsigned int axt_ctrls_values;
283 unsigned char per_key_repeat[XkbPerKeyBitArraySize];
284 } XkbControlsRec, *XkbControlsPtr;
286 #define XkbAX_AnyFeedback(c) ((c)->enabled_ctrls&XkbAccessXFeedbackMask)
287 #define XkbAX_NeedOption(c,w) ((c)->ax_options&(w))
288 #define XkbAX_NeedFeedback(c,w) (XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
290 typedef struct _XkbServerMapRec {
291 unsigned short num_acts;
292 unsigned short size_acts;
295 XkbBehavior *behaviors;
296 unsigned short *key_acts;
297 #if defined(__cplusplus) || defined(c_plusplus)
298 /* explicit is a C++ reserved word */
299 unsigned char *c_explicit;
301 unsigned char *explicit;
303 unsigned char vmods[XkbNumVirtualMods];
304 unsigned short *vmodmap;
305 } XkbServerMapRec, *XkbServerMapPtr;
307 #define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
310 * Structures and access macros used primarily by clients
313 typedef struct _XkbSymMapRec {
314 unsigned char kt_index[XkbNumKbdGroups];
315 unsigned char group_info;
317 unsigned short offset;
318 } XkbSymMapRec, *XkbSymMapPtr;
320 typedef struct _XkbClientMapRec {
321 unsigned char size_types;
322 unsigned char num_types;
325 unsigned short size_syms;
326 unsigned short num_syms;
328 XkbSymMapPtr key_sym_map;
330 unsigned char *modmap;
331 } XkbClientMapRec, *XkbClientMapPtr;
333 #define XkbCMKeyGroupInfo(m,k) ((m)->key_sym_map[k].group_info)
334 #define XkbCMKeyNumGroups(m,k) (XkbNumGroups((m)->key_sym_map[k].group_info))
335 #define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
336 #define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
337 #define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
338 #define XkbCMKeyType(m,k,g) (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
339 #define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
340 #define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset)
341 #define XkbCMKeySymsPtr(m,k) (&(m)->syms[XkbCMKeySymsOffset(m,k)])
344 * Compatibility structures and access macros
347 typedef struct _XkbSymInterpretRec {
352 unsigned char virtual_mod;
354 } XkbSymInterpretRec,*XkbSymInterpretPtr;
356 typedef struct _XkbCompatMapRec {
357 XkbSymInterpretPtr sym_interpret;
358 XkbModsRec groups[XkbNumKbdGroups];
359 unsigned short num_si;
360 unsigned short size_si;
361 } XkbCompatMapRec, *XkbCompatMapPtr;
363 typedef struct _XkbIndicatorMapRec {
365 unsigned char which_groups;
366 unsigned char groups;
367 unsigned char which_mods;
370 } XkbIndicatorMapRec, *XkbIndicatorMapPtr;
372 #define XkbIM_IsAuto(i) ((((i)->flags&XkbIM_NoAutomatic)==0)&&\
373 (((i)->which_groups&&(i)->groups)||\
374 ((i)->which_mods&&(i)->mods.mask)||\
376 #define XkbIM_InUse(i) (((i)->flags)||((i)->which_groups)||\
377 ((i)->which_mods)||((i)->ctrls))
380 typedef struct _XkbIndicatorRec {
381 unsigned long phys_indicators;
382 XkbIndicatorMapRec maps[XkbNumIndicators];
383 } XkbIndicatorRec,*XkbIndicatorPtr;
385 typedef struct _XkbKeyNameRec {
386 char name[XkbKeyNameLength];
387 } XkbKeyNameRec,*XkbKeyNamePtr;
389 typedef struct _XkbKeyAliasRec {
390 char real[XkbKeyNameLength];
391 char alias[XkbKeyNameLength];
392 } XkbKeyAliasRec,*XkbKeyAliasPtr;
395 * Names for everything
397 typedef struct _XkbNamesRec {
403 Atom vmods[XkbNumVirtualMods];
404 Atom indicators[XkbNumIndicators];
405 Atom groups[XkbNumKbdGroups];
407 XkbKeyAliasPtr key_aliases;
411 unsigned char num_keys;
412 unsigned char num_key_aliases;
413 unsigned short num_rg;
414 } XkbNamesRec,*XkbNamesPtr;
416 typedef struct _XkbGeometry *XkbGeometryPtr;
418 * Tie it all together into one big keyboard description
420 typedef struct _XkbDesc {
421 struct _XDisplay * dpy;
422 unsigned short flags;
423 unsigned short device_spec;
424 KeyCode min_key_code;
425 KeyCode max_key_code;
427 XkbControlsPtr ctrls;
428 XkbServerMapPtr server;
430 XkbIndicatorPtr indicators;
432 XkbCompatMapPtr compat;
434 } XkbDescRec, *XkbDescPtr;
435 #define XkbKeyKeyTypeIndex(d,k,g) (XkbCMKeyTypeIndex((d)->map,k,g))
436 #define XkbKeyKeyType(d,k,g) (XkbCMKeyType((d)->map,k,g))
437 #define XkbKeyGroupWidth(d,k,g) (XkbCMKeyGroupWidth((d)->map,k,g))
438 #define XkbKeyGroupsWidth(d,k) (XkbCMKeyGroupsWidth((d)->map,k))
439 #define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k)))
440 #define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k)))
441 #define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k)))
442 #define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k)))
443 #define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])
444 #define XkbKeySymEntry(d,k,sl,g) \
445 (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
446 #define XkbKeyAction(d,k,n) \
447 (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
448 #define XkbKeyActionEntry(d,k,sl,g) \
449 (XkbKeyHasActions(d,k)?\
450 XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
452 #define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
453 #define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
454 #define XkbKeyActionsPtr(d,k) (XkbSMKeyActionsPtr((d)->server,k))
455 #define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
456 ((k)<=(d)->max_key_code))
457 #define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
461 * The following structures can be used to track changes
462 * to a keyboard device
464 typedef struct _XkbMapChanges {
465 unsigned short changed;
466 KeyCode min_key_code;
467 KeyCode max_key_code;
468 unsigned char first_type;
469 unsigned char num_types;
470 KeyCode first_key_sym;
471 unsigned char num_key_syms;
472 KeyCode first_key_act;
473 unsigned char num_key_acts;
474 KeyCode first_key_behavior;
475 unsigned char num_key_behaviors;
476 KeyCode first_key_explicit;
477 unsigned char num_key_explicit;
478 KeyCode first_modmap_key;
479 unsigned char num_modmap_keys;
480 KeyCode first_vmodmap_key;
481 unsigned char num_vmodmap_keys;
483 unsigned short vmods;
484 } XkbMapChangesRec,*XkbMapChangesPtr;
486 typedef struct _XkbControlsChanges {
487 unsigned int changed_ctrls;
488 unsigned int enabled_ctrls_changes;
489 Bool num_groups_changed;
490 } XkbControlsChangesRec,*XkbControlsChangesPtr;
492 typedef struct _XkbIndicatorChanges {
493 unsigned int state_changes;
494 unsigned int map_changes;
495 } XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
497 typedef struct _XkbNameChanges {
498 unsigned int changed;
499 unsigned char first_type;
500 unsigned char num_types;
501 unsigned char first_lvl;
502 unsigned char num_lvls;
503 unsigned char num_aliases;
504 unsigned char num_rg;
505 unsigned char first_key;
506 unsigned char num_keys;
507 unsigned short changed_vmods;
508 unsigned long changed_indicators;
509 unsigned char changed_groups;
510 } XkbNameChangesRec,*XkbNameChangesPtr;
512 typedef struct _XkbCompatChanges {
513 unsigned char changed_groups;
514 unsigned short first_si;
515 unsigned short num_si;
516 } XkbCompatChangesRec,*XkbCompatChangesPtr;
518 typedef struct _XkbChanges {
519 unsigned short device_spec;
520 unsigned short state_changes;
521 XkbMapChangesRec map;
522 XkbControlsChangesRec ctrls;
523 XkbIndicatorChangesRec indicators;
524 XkbNameChangesRec names;
525 XkbCompatChangesRec compat;
526 } XkbChangesRec, *XkbChangesPtr;
529 * These data structures are used to construct a keymap from
530 * a set of components or to list components in the server
533 typedef struct _XkbComponentNames {
540 } XkbComponentNamesRec, *XkbComponentNamesPtr;
542 typedef struct _XkbComponentName {
543 unsigned short flags;
545 } XkbComponentNameRec,*XkbComponentNamePtr;
547 typedef struct _XkbComponentList {
554 XkbComponentNamePtr keymaps;
555 XkbComponentNamePtr keycodes;
556 XkbComponentNamePtr types;
557 XkbComponentNamePtr compat;
558 XkbComponentNamePtr symbols;
559 XkbComponentNamePtr geometry;
560 } XkbComponentListRec, *XkbComponentListPtr;
563 * The following data structures describe and track changes to a
564 * non-keyboard extension device
566 typedef struct _XkbDeviceLedInfo {
567 unsigned short led_class;
568 unsigned short led_id;
569 unsigned int phys_indicators;
570 unsigned int maps_present;
571 unsigned int names_present;
573 Atom names[XkbNumIndicators];
574 XkbIndicatorMapRec maps[XkbNumIndicators];
575 } XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
577 typedef struct _XkbDeviceInfo {
580 unsigned short device_spec;
582 unsigned short supported;
583 unsigned short unsupported;
585 unsigned short num_btns;
586 XkbAction * btn_acts;
588 unsigned short sz_leds;
589 unsigned short num_leds;
590 unsigned short dflt_kbd_fb;
591 unsigned short dflt_led_fb;
592 XkbDeviceLedInfoPtr leds;
593 } XkbDeviceInfoRec,*XkbDeviceInfoPtr;
595 #define XkbXI_DevHasBtnActs(d) (((d)->num_btns>0)&&((d)->btn_acts!=NULL))
596 #define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
597 #define XkbXI_DevHasLeds(d) (((d)->num_leds>0)&&((d)->leds!=NULL))
599 typedef struct _XkbDeviceLedChanges {
600 unsigned short led_class;
601 unsigned short led_id;
602 unsigned int defined; /* names or maps changed */
603 struct _XkbDeviceLedChanges *next;
604 } XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
606 typedef struct _XkbDeviceChanges {
607 unsigned int changed;
608 unsigned short first_btn;
609 unsigned short num_btns;
610 XkbDeviceLedChangesRec leds;
611 } XkbDeviceChangesRec,*XkbDeviceChangesPtr;
613 #endif /* _XKBSTR_H_ */