1 /* $TOG: XKBstr.h /main/16 1997/06/10 06:53:12 kaleb $ */
2 /************************************************************
3 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
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.
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 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
24 THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 ********************************************************/
31 #include <X11/extensions/XKB.h>
33 #define XkbCharToInt(v) ((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
34 #define XkbIntTo2Chars(i,h,l) (((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
36 #if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
37 #define Xkb2CharsToInt(h,l) ((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
38 (int)(((h)<<8)|(l)&0x7fff))
40 #define Xkb2CharsToInt(h,l) ((short)(((h)<<8)|(l)))
44 * Common data structures and access macros
47 typedef struct _XkbStateRec {
49 unsigned char locked_group;
50 unsigned short base_group;
51 unsigned short latched_group;
53 unsigned char base_mods;
54 unsigned char latched_mods;
55 unsigned char locked_mods;
56 unsigned char compat_state;
57 unsigned char grab_mods;
58 unsigned char compat_grab_mods;
59 unsigned char lookup_mods;
60 unsigned char compat_lookup_mods;
61 unsigned short ptr_buttons;
62 } XkbStateRec,*XkbStatePtr;
63 #define XkbModLocks(s) ((s)->locked_mods)
64 #define XkbStateMods(s) ((s)->base_mods|(s)->latched_mods|XkbModLocks(s))
65 #define XkbGroupLock(s) ((s)->locked_group)
66 #define XkbStateGroup(s) ((s)->base_group+(s)->latched_group+XkbGroupLock(s))
67 #define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
68 #define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)
70 typedef struct _XkbMods {
71 unsigned char mask; /* effective mods */
72 unsigned char real_mods;
74 } XkbModsRec,*XkbModsPtr;
76 typedef struct _XkbKTMapEntry {
80 } XkbKTMapEntryRec,*XkbKTMapEntryPtr;
82 typedef struct _XkbKeyType {
84 unsigned char num_levels;
85 unsigned char map_count;
90 } XkbKeyTypeRec, *XkbKeyTypePtr;
92 #define XkbNumGroups(g) ((g)&0x0f)
93 #define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
94 #define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
95 #define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
96 #define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
97 #define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
100 * Structures and access macros used primarily by the server
103 typedef struct _XkbBehavior {
108 #define XkbAnyActionDataSize 7
109 typedef struct _XkbAnyAction {
111 unsigned char data[XkbAnyActionDataSize];
114 typedef struct _XkbModAction {
118 unsigned char real_mods;
119 unsigned char vmods1;
120 unsigned char vmods2;
122 #define XkbModActionVMods(a) \
123 ((short)(((a)->vmods1<<8)|((a)->vmods2)))
124 #define XkbSetModActionVMods(a,v) \
125 (((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
127 typedef struct _XkbGroupAction {
132 #define XkbSAGroup(a) (XkbCharToInt((a)->group_XXX))
133 #define XkbSASetGroup(a,g) ((a)->group_XXX=(g))
135 typedef struct _XkbISOAction {
139 unsigned char real_mods;
141 unsigned char affect;
142 unsigned char vmods1;
143 unsigned char vmods2;
146 typedef struct _XkbPtrAction {
149 unsigned char high_XXX;
150 unsigned char low_XXX;
151 unsigned char high_YYY;
152 unsigned char low_YYY;
154 #define XkbPtrActionX(a) (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
155 #define XkbPtrActionY(a) (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
156 #define XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
157 #define XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
159 typedef struct _XkbPtrBtnAction {
163 unsigned char button;
166 typedef struct _XkbPtrDfltAction {
169 unsigned char affect;
172 #define XkbSAPtrDfltValue(a) (XkbCharToInt((a)->valueXXX))
173 #define XkbSASetPtrDfltValue(a,c) ((a)->valueXXX= ((c)&0xff))
175 typedef struct _XkbSwitchScreenAction {
179 } XkbSwitchScreenAction;
180 #define XkbSAScreen(a) (XkbCharToInt((a)->screenXXX))
181 #define XkbSASetScreen(a,s) ((a)->screenXXX= ((s)&0xff))
183 typedef struct _XkbCtrlsAction {
186 unsigned char ctrls3;
187 unsigned char ctrls2;
188 unsigned char ctrls1;
189 unsigned char ctrls0;
191 #define XkbActionSetCtrls(a,c) (((a)->ctrls3=(((c)>>24)&0xff)),\
192 ((a)->ctrls2=(((c)>>16)&0xff)),\
193 ((a)->ctrls1=(((c)>>8)&0xff)),\
194 ((a)->ctrls0=((c)&0xff)))
195 #define XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
196 (((unsigned int)(a)->ctrls2)<<16)|\
197 (((unsigned int)(a)->ctrls1)<<8)|\
198 ((unsigned int)((a)->ctrls0)))
200 typedef struct _XkbMessageAction {
203 unsigned char message[6];
206 typedef struct _XkbRedirectKeyAction {
208 unsigned char new_key;
209 unsigned char mods_mask;
211 unsigned char vmods_mask0;
212 unsigned char vmods_mask1;
213 unsigned char vmods0;
214 unsigned char vmods1;
215 } XkbRedirectKeyAction;
217 #define XkbSARedirectVMods(a) ((((unsigned int)(a)->vmods1)<<8)|\
218 ((unsigned int)(a)->vmods0))
219 #define XkbSARedirectSetVMods(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
220 ((a)->vmods_mask0=((m)&0xff)))
221 #define XkbSARedirectVModsMask(a) ((((unsigned int)(a)->vmods_mask1)<<8)|\
222 ((unsigned int)(a)->vmods_mask0))
223 #define XkbSARedirectSetVModsMask(a,m) (((a)->vmods_mask1=(((m)>>8)&0xff)),\
224 ((a)->vmods_mask0=((m)&0xff)))
226 typedef struct _XkbDeviceBtnAction {
230 unsigned char button;
231 unsigned char device;
232 } XkbDeviceBtnAction;
234 typedef struct _XkbDeviceValuatorAction {
236 unsigned char device;
237 unsigned char v1_what;
238 unsigned char v1_ndx;
239 unsigned char v1_value;
240 unsigned char v2_what;
241 unsigned char v2_ndx;
242 unsigned char v2_value;
243 } XkbDeviceValuatorAction;
245 typedef union _XkbAction {
248 XkbGroupAction group;
252 XkbPtrDfltAction dflt;
253 XkbSwitchScreenAction screen;
254 XkbCtrlsAction ctrls;
255 XkbMessageAction msg;
256 XkbRedirectKeyAction redirect;
257 XkbDeviceBtnAction devbtn;
258 XkbDeviceValuatorAction devval;
262 typedef struct _XkbControls {
263 unsigned char mk_dflt_btn;
264 unsigned char num_groups;
265 unsigned char groups_wrap;
267 XkbModsRec ignore_lock;
268 unsigned int enabled_ctrls;
269 unsigned short repeat_delay;
270 unsigned short repeat_interval;
271 unsigned short slow_keys_delay;
272 unsigned short debounce_delay;
273 unsigned short mk_delay;
274 unsigned short mk_interval;
275 unsigned short mk_time_to_max;
276 unsigned short mk_max_speed;
278 unsigned short ax_options;
279 unsigned short ax_timeout;
280 unsigned short axt_opts_mask;
281 unsigned short axt_opts_values;
282 unsigned int axt_ctrls_mask;
283 unsigned int axt_ctrls_values;
284 unsigned char per_key_repeat[XkbPerKeyBitArraySize];
285 } XkbControlsRec, *XkbControlsPtr;
287 #define XkbAX_AnyFeedback(c) ((c)->enabled_ctrls&XkbAccessXFeedbackMask)
288 #define XkbAX_NeedOption(c,w) ((c)->ax_options&(w))
289 #define XkbAX_NeedFeedback(c,w) (XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
291 typedef struct _XkbServerMapRec {
292 unsigned short num_acts;
293 unsigned short size_acts;
296 XkbBehavior *behaviors;
297 unsigned short *key_acts;
298 #if defined(__cplusplus) || defined(c_plusplus)
299 /* explicit is a C++ reserved word */
300 unsigned char *c_explicit;
302 unsigned char *explicit;
304 unsigned char vmods[XkbNumVirtualMods];
305 unsigned short *vmodmap;
306 } XkbServerMapRec, *XkbServerMapPtr;
308 #define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
311 * Structures and access macros used primarily by clients
314 typedef struct _XkbSymMapRec {
315 unsigned char kt_index[XkbNumKbdGroups];
316 unsigned char group_info;
318 unsigned short offset;
319 } XkbSymMapRec, *XkbSymMapPtr;
321 typedef struct _XkbClientMapRec {
322 unsigned char size_types;
323 unsigned char num_types;
326 unsigned short size_syms;
327 unsigned short num_syms;
329 XkbSymMapPtr key_sym_map;
331 unsigned char *modmap;
332 } XkbClientMapRec, *XkbClientMapPtr;
334 #define XkbCMKeyGroupInfo(m,k) ((m)->key_sym_map[k].group_info)
335 #define XkbCMKeyNumGroups(m,k) (XkbNumGroups((m)->key_sym_map[k].group_info))
336 #define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
337 #define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
338 #define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
339 #define XkbCMKeyType(m,k,g) (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
340 #define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
341 #define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset)
342 #define XkbCMKeySymsPtr(m,k) (&(m)->syms[XkbCMKeySymsOffset(m,k)])
345 * Compatibility structures and access macros
348 typedef struct _XkbSymInterpretRec {
353 unsigned char virtual_mod;
355 } XkbSymInterpretRec,*XkbSymInterpretPtr;
357 typedef struct _XkbCompatMapRec {
358 XkbSymInterpretPtr sym_interpret;
359 XkbModsRec groups[XkbNumKbdGroups];
360 unsigned short num_si;
361 unsigned short size_si;
362 } XkbCompatMapRec, *XkbCompatMapPtr;
364 typedef struct _XkbIndicatorMapRec {
366 unsigned char which_groups;
367 unsigned char groups;
368 unsigned char which_mods;
371 } XkbIndicatorMapRec, *XkbIndicatorMapPtr;
373 #define XkbIM_IsAuto(i) ((((i)->flags&XkbIM_NoAutomatic)==0)&&\
374 (((i)->which_groups&&(i)->groups)||\
375 ((i)->which_mods&&(i)->mods.mask)||\
377 #define XkbIM_InUse(i) (((i)->flags)||((i)->which_groups)||\
378 ((i)->which_mods)||((i)->ctrls))
381 typedef struct _XkbIndicatorRec {
382 unsigned long phys_indicators;
383 XkbIndicatorMapRec maps[XkbNumIndicators];
384 } XkbIndicatorRec,*XkbIndicatorPtr;
386 typedef struct _XkbKeyNameRec {
387 char name[XkbKeyNameLength];
388 } XkbKeyNameRec,*XkbKeyNamePtr;
390 typedef struct _XkbKeyAliasRec {
391 char real[XkbKeyNameLength];
392 char alias[XkbKeyNameLength];
393 } XkbKeyAliasRec,*XkbKeyAliasPtr;
396 * Names for everything
398 typedef struct _XkbNamesRec {
404 Atom vmods[XkbNumVirtualMods];
405 Atom indicators[XkbNumIndicators];
406 Atom groups[XkbNumKbdGroups];
408 XkbKeyAliasPtr key_aliases;
412 unsigned char num_keys;
413 unsigned char num_key_aliases;
414 unsigned short num_rg;
415 } XkbNamesRec,*XkbNamesPtr;
417 typedef struct _XkbGeometry *XkbGeometryPtr;
419 * Tie it all together into one big keyboard description
421 typedef struct _XkbDesc {
422 struct _XDisplay * dpy;
423 unsigned short flags;
424 unsigned short device_spec;
425 KeyCode min_key_code;
426 KeyCode max_key_code;
428 XkbControlsPtr ctrls;
429 XkbServerMapPtr server;
431 XkbIndicatorPtr indicators;
433 XkbCompatMapPtr compat;
435 } XkbDescRec, *XkbDescPtr;
436 #define XkbKeyKeyTypeIndex(d,k,g) (XkbCMKeyTypeIndex((d)->map,k,g))
437 #define XkbKeyKeyType(d,k,g) (XkbCMKeyType((d)->map,k,g))
438 #define XkbKeyGroupWidth(d,k,g) (XkbCMKeyGroupWidth((d)->map,k,g))
439 #define XkbKeyGroupsWidth(d,k) (XkbCMKeyGroupsWidth((d)->map,k))
440 #define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k)))
441 #define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k)))
442 #define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k)))
443 #define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k)))
444 #define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])
445 #define XkbKeySymEntry(d,k,sl,g) \
446 (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
447 #define XkbKeyAction(d,k,n) \
448 (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
449 #define XkbKeyActionEntry(d,k,sl,g) \
450 (XkbKeyHasActions(d,k)?\
451 XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
453 #define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
454 #define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
455 #define XkbKeyActionsPtr(d,k) (XkbSMKeyActionsPtr((d)->server,k))
456 #define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
457 ((k)<=(d)->max_key_code))
458 #define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
462 * The following structures can be used to track changes
463 * to a keyboard device
465 typedef struct _XkbMapChanges {
466 unsigned short changed;
467 KeyCode min_key_code;
468 KeyCode max_key_code;
469 unsigned char first_type;
470 unsigned char num_types;
471 KeyCode first_key_sym;
472 unsigned char num_key_syms;
473 KeyCode first_key_act;
474 unsigned char num_key_acts;
475 KeyCode first_key_behavior;
476 unsigned char num_key_behaviors;
477 KeyCode first_key_explicit;
478 unsigned char num_key_explicit;
479 KeyCode first_modmap_key;
480 unsigned char num_modmap_keys;
481 KeyCode first_vmodmap_key;
482 unsigned char num_vmodmap_keys;
484 unsigned short vmods;
485 } XkbMapChangesRec,*XkbMapChangesPtr;
487 typedef struct _XkbControlsChanges {
488 unsigned int changed_ctrls;
489 unsigned int enabled_ctrls_changes;
490 Bool num_groups_changed;
491 } XkbControlsChangesRec,*XkbControlsChangesPtr;
493 typedef struct _XkbIndicatorChanges {
494 unsigned int state_changes;
495 unsigned int map_changes;
496 } XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
498 typedef struct _XkbNameChanges {
499 unsigned int changed;
500 unsigned char first_type;
501 unsigned char num_types;
502 unsigned char first_lvl;
503 unsigned char num_lvls;
504 unsigned char num_aliases;
505 unsigned char num_rg;
506 unsigned char first_key;
507 unsigned char num_keys;
508 unsigned short changed_vmods;
509 unsigned long changed_indicators;
510 unsigned char changed_groups;
511 } XkbNameChangesRec,*XkbNameChangesPtr;
513 typedef struct _XkbCompatChanges {
514 unsigned char changed_groups;
515 unsigned short first_si;
516 unsigned short num_si;
517 } XkbCompatChangesRec,*XkbCompatChangesPtr;
519 typedef struct _XkbChanges {
520 unsigned short device_spec;
521 unsigned short state_changes;
522 XkbMapChangesRec map;
523 XkbControlsChangesRec ctrls;
524 XkbIndicatorChangesRec indicators;
525 XkbNameChangesRec names;
526 XkbCompatChangesRec compat;
527 } XkbChangesRec, *XkbChangesPtr;
530 * These data structures are used to construct a keymap from
531 * a set of components or to list components in the server
534 typedef struct _XkbComponentNames {
541 } XkbComponentNamesRec, *XkbComponentNamesPtr;
543 typedef struct _XkbComponentName {
544 unsigned short flags;
546 } XkbComponentNameRec,*XkbComponentNamePtr;
548 typedef struct _XkbComponentList {
555 XkbComponentNamePtr keymaps;
556 XkbComponentNamePtr keycodes;
557 XkbComponentNamePtr types;
558 XkbComponentNamePtr compat;
559 XkbComponentNamePtr symbols;
560 XkbComponentNamePtr geometry;
561 } XkbComponentListRec, *XkbComponentListPtr;
564 * The following data structures describe and track changes to a
565 * non-keyboard extension device
567 typedef struct _XkbDeviceLedInfo {
568 unsigned short led_class;
569 unsigned short led_id;
570 unsigned int phys_indicators;
571 unsigned int maps_present;
572 unsigned int names_present;
574 Atom names[XkbNumIndicators];
575 XkbIndicatorMapRec maps[XkbNumIndicators];
576 } XkbDeviceLedInfoRec,*XkbDeviceLedInfoPtr;
578 typedef struct _XkbDeviceInfo {
581 unsigned short device_spec;
583 unsigned short supported;
584 unsigned short unsupported;
586 unsigned short num_btns;
587 XkbAction * btn_acts;
589 unsigned short sz_leds;
590 unsigned short num_leds;
591 unsigned short dflt_kbd_fb;
592 unsigned short dflt_led_fb;
593 XkbDeviceLedInfoPtr leds;
594 } XkbDeviceInfoRec,*XkbDeviceInfoPtr;
596 #define XkbXI_DevHasBtnActs(d) (((d)->num_btns>0)&&((d)->btn_acts!=NULL))
597 #define XkbXI_LegalDevBtn(d,b) (XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
598 #define XkbXI_DevHasLeds(d) (((d)->num_leds>0)&&((d)->leds!=NULL))
600 typedef struct _XkbDeviceLedChanges {
601 unsigned short led_class;
602 unsigned short led_id;
603 unsigned int defined; /* names or maps changed */
604 struct _XkbDeviceLedChanges *next;
605 } XkbDeviceLedChangesRec,*XkbDeviceLedChangesPtr;
607 typedef struct _XkbDeviceChanges {
608 unsigned int changed;
609 unsigned short first_btn;
610 unsigned short num_btns;
611 XkbDeviceLedChangesRec leds;
612 } XkbDeviceChangesRec,*XkbDeviceChangesPtr;
614 #endif /* _XKBSTR_H_ */