1/***********************************************************
2
3Copyright 1987, 1988, 1998  The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25
26Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
27
28                        All Rights Reserved
29
30Permission to use, copy, modify, and distribute this software and its
31documentation for any purpose and without fee is hereby granted,
32provided that the above copyright notice appear in all copies and that
33both that copyright notice and this permission notice appear in
34supporting documentation, and that the name of Digital not be
35used in advertising or publicity pertaining to distribution of the
36software without specific, written prior permission.
37
38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44SOFTWARE.
45
46******************************************************************/
47
48/*
49 * TranslateI.h - Header file private to translation management
50 *
51 * Author:	Gabe Beged-Dov, HP
52 *
53 * Former Author:	Charles Haynes
54 * 		Digital Equipment Corporation
55 * 		Western Research Laboratory
56 * Date:	Sat Aug 29 1987
57 */
58
59/*#define REFCNT_TRANSLATIONS*/
60#define CACHE_TRANSLATIONS
61
62#define TM_NO_MATCH (-2)
63
64#define _XtRStateTablePair "_XtStateTablePair"
65
66typedef unsigned char TMByteCard;
67typedef unsigned short TMShortCard;
68typedef unsigned long TMLongCard;
69typedef short TMShortInt;
70
71typedef struct _TMTypeMatchRec *TMTypeMatch;
72typedef struct _TMModifierMatchRec *TMModifierMatch;
73typedef struct _TMEventRec *TMEventPtr;
74
75typedef Boolean (*MatchProc)(TMTypeMatch typeMatch,
76			     TMModifierMatch modMatch,
77			     TMEventPtr eventSeq);
78
79typedef struct _ModToKeysymTable {
80    Modifiers mask;
81    int count;
82    int idx;
83} ModToKeysymTable;
84
85typedef struct _LateBindings {
86    unsigned int knot:1;
87    unsigned int pair:1;
88    unsigned short ref_count;	/* garbage collection */
89    KeySym keysym;
90} LateBindings, *LateBindingsPtr;
91
92typedef short ModifierMask;
93
94typedef struct _ActionsRec *ActionPtr;
95typedef struct _ActionsRec {
96    int idx;			/* index into quarkTable to find proc */
97    String *params;		/* pointer to array of params */
98    Cardinal num_params;	/* number of params */
99    ActionPtr next;		/* next action to perform */
100} ActionRec;
101
102typedef struct _XtStateRec *StatePtr;
103typedef struct _XtStateRec {
104    unsigned int	isCycleStart:1;
105    unsigned int	isCycleEnd:1;
106    TMShortCard		typeIndex;
107    TMShortCard		modIndex;
108    ActionPtr		actions;	/* rhs list of actions to perform */
109    StatePtr 		nextLevel;
110}StateRec;
111
112
113#define XtTableReplace	0
114#define XtTableAugment	1
115#define XtTableOverride	2
116#define XtTableUnmerge  3
117
118typedef unsigned int _XtTranslateOp;
119
120/*
121 * New Definitions
122 */
123typedef struct _TMModifierMatchRec{
124    TMLongCard	 modifiers;
125    TMLongCard	 modifierMask;
126    LateBindingsPtr lateModifiers;
127    Boolean	 standard;
128}TMModifierMatchRec;
129
130typedef struct _TMTypeMatchRec{
131    TMLongCard	 eventType;
132    TMLongCard	 eventCode;
133    TMLongCard	 eventCodeMask;
134    MatchProc	 matchEvent;
135}TMTypeMatchRec;
136
137typedef struct _TMBranchHeadRec {
138    unsigned int	isSimple:1;
139    unsigned int	hasActions:1;
140    unsigned int	hasCycles:1;
141    unsigned int	more:13;
142    TMShortCard		typeIndex;
143    TMShortCard		modIndex;
144}TMBranchHeadRec, *TMBranchHead;
145
146/* NOTE: elements of this structure must match those of
147 * TMComplexStateTreeRec and TMParseStateTreeRec.
148 */
149typedef struct _TMSimpleStateTreeRec{
150    unsigned int	isSimple:1;
151    unsigned int	isAccelerator:1;
152    unsigned int	mappingNotifyInterest:1;
153    unsigned int	refCount:13;
154    TMShortCard		numBranchHeads;
155    TMShortCard		numQuarks;   /* # of entries in quarkTbl */
156    TMShortCard		unused;	     /* to ensure same alignment */
157    TMBranchHeadRec	*branchHeadTbl;
158    XrmQuark		*quarkTbl;  /* table of quarkified rhs*/
159}TMSimpleStateTreeRec, *TMSimpleStateTree;
160
161/* NOTE: elements of this structure must match those of
162 * TMSimpleStateTreeRec and TMParseStateTreeRec.
163 */
164typedef struct _TMComplexStateTreeRec{
165    unsigned int	isSimple:1;
166    unsigned int	isAccelerator:1;
167    unsigned int	mappingNotifyInterest:1;
168    unsigned int	refCount:13;
169    TMShortCard		numBranchHeads;
170    TMShortCard		numQuarks;   /* # of entries in quarkTbl */
171    TMShortCard		numComplexBranchHeads;
172    TMBranchHeadRec	*branchHeadTbl;
173    XrmQuark		*quarkTbl;  /* table of quarkified rhs*/
174    StatePtr		*complexBranchHeadTbl;
175}TMComplexStateTreeRec, *TMComplexStateTree;
176
177/* NOTE: elements of this structure must match those of
178 * TMSimpleStateTreeRec and TMComplexStateTreeRec.
179 */
180typedef struct _TMParseStateTreeRec{
181    unsigned int	isSimple:1;
182    unsigned int	isAccelerator:1;
183    unsigned int	mappingNotifyInterest:1;
184    unsigned int	isStackQuarks:1;
185    unsigned int	isStackBranchHeads:1;
186    unsigned int	isStackComplexBranchHeads:1;
187    unsigned int	unused:10; /* to ensure correct alignment */
188    TMShortCard		numBranchHeads;
189    TMShortCard		numQuarks;   /* # of entries in quarkTbl */
190    TMShortCard		numComplexBranchHeads;
191    TMBranchHeadRec	*branchHeadTbl;
192    XrmQuark		*quarkTbl;  /* table of quarkified rhs*/
193    StatePtr		*complexBranchHeadTbl;
194    TMShortCard		branchHeadTblSize;
195    TMShortCard		quarkTblSize; /*total size of quarkTbl */
196    TMShortCard		complexBranchHeadTblSize;
197    StatePtr		head;
198}TMParseStateTreeRec, *TMParseStateTree;
199
200typedef union _TMStateTreeRec{
201    TMSimpleStateTreeRec	simple;
202    TMParseStateTreeRec		parse;
203    TMComplexStateTreeRec	complex;
204}*TMStateTree, **TMStateTreePtr, **TMStateTreeList;
205
206typedef struct _TMSimpleBindProcsRec {
207    XtActionProc	*procs;
208}TMSimpleBindProcsRec, *TMSimpleBindProcs;
209
210typedef struct _TMComplexBindProcsRec {
211    Widget	 	widget;		/*widgetID to pass to action Proc*/
212    XtTranslations	aXlations;
213    XtActionProc	*procs;
214}TMComplexBindProcsRec, *TMComplexBindProcs;
215
216typedef struct _TMSimpleBindDataRec {
217    unsigned int		isComplex:1;	/* must be first */
218    TMSimpleBindProcsRec	bindTbl[1];	/* variable length */
219}TMSimpleBindDataRec, *TMSimpleBindData;
220
221typedef struct _TMComplexBindDataRec {
222    unsigned int		isComplex:1;	/* must be first */
223    struct _ATranslationData	*accel_context;	/* for GetValues */
224    TMComplexBindProcsRec	bindTbl[1]; 	/* variable length */
225}TMComplexBindDataRec, *TMComplexBindData;
226
227typedef union _TMBindDataRec{
228    TMSimpleBindDataRec		simple;
229    TMComplexBindDataRec	complex;
230}*TMBindData;
231
232typedef struct _TranslationData{
233    unsigned char		hasBindings;	/* must be first */
234    unsigned char		operation; /*replace,augment,override*/
235    TMShortCard			numStateTrees;
236    struct _TranslationData    	*composers[2];
237    EventMask			eventMask;
238    TMStateTree			stateTreeTbl[1]; /* variable length */
239}TranslationData;
240
241/*
242 * ATranslations is returned by GetValues for translations that contain
243 * accelerators.  The TM can differentiate between this and TranslationData
244 * (that don't have a bindTbl) by looking at the first field (hasBindings)
245 * of either structure.  All ATranslationData structures associated with a
246 * widget are chained off the BindData record of the widget.
247 */
248typedef struct _ATranslationData{
249    unsigned char		hasBindings;	/* must be first */
250    unsigned char		operation;
251    struct _TranslationData	*xlations;  /* actual translations */
252    struct _ATranslationData	*next;      /* chain the contexts together */
253    TMComplexBindProcsRec	bindTbl[1]; /* accelerator bindings */
254}ATranslationData, *ATranslations;
255
256typedef struct _TMConvertRec {
257    XtTranslations	old; /* table to merge into */
258    XtTranslations	new; /* table to merge from */
259} TMConvertRec;
260
261#define _XtEventTimerEventType ((TMLongCard)~0L)
262#define KeysymModMask		(1L<<27) /* private to TM */
263#define AnyButtonMask		(1L<<28) /* private to TM */
264
265typedef struct _EventRec {
266    TMLongCard modifiers;
267    TMLongCard modifierMask;
268    LateBindingsPtr lateModifiers;
269    TMLongCard eventType;
270    TMLongCard eventCode;
271    TMLongCard eventCodeMask;
272    MatchProc matchEvent;
273    Boolean standard;
274} Event;
275
276typedef struct _EventSeqRec *EventSeqPtr;
277typedef struct _EventSeqRec {
278    Event event;	/* X event description */
279    StatePtr state;	/* private to state table builder */
280    EventSeqPtr next;	/* next event on line */
281    ActionPtr actions;	/* r.h.s.   list of actions to perform */
282} EventSeqRec;
283
284typedef EventSeqRec EventRec;
285typedef EventSeqPtr EventPtr;
286
287typedef struct _TMEventRec {
288    XEvent *xev;
289    Event event;
290}TMEventRec;
291
292typedef struct _ActionHookRec {
293    struct _ActionHookRec* next; /* must remain first */
294    XtAppContext app;
295    XtActionHookProc proc;
296    XtPointer closure;
297} ActionHookRec, *ActionHook;
298
299/* choose a number between 2 and 8 */
300#define TMKEYCACHELOG2 6
301#define TMKEYCACHESIZE (1<<TMKEYCACHELOG2)
302
303typedef struct _KeyCacheRec {
304    unsigned char modifiers_return[256]; /* constant per KeyCode, key proc */
305    KeyCode keycode[TMKEYCACHESIZE];
306    unsigned char modifiers[TMKEYCACHESIZE];
307    KeySym keysym[TMKEYCACHESIZE];
308} TMKeyCache;
309
310typedef struct _TMKeyContextRec {
311    XEvent *event;
312    unsigned long serial;
313    KeySym keysym;
314    Modifiers modifiers;
315    TMKeyCache keycache;  /* keep this last, to keep offsets to others small */
316} TMKeyContextRec, *TMKeyContext;
317
318typedef struct _TMGlobalRec{
319    TMTypeMatchRec 		**typeMatchSegmentTbl;
320    TMShortCard			numTypeMatches;
321    TMShortCard			numTypeMatchSegments;
322    TMShortCard			typeMatchSegmentTblSize;
323    TMModifierMatchRec 		**modMatchSegmentTbl;
324    TMShortCard			numModMatches;
325    TMShortCard			numModMatchSegments;
326    TMShortCard			modMatchSegmentTblSize;
327    Boolean			newMatchSemantics;
328#ifdef TRACE_TM
329    XtTranslations		*tmTbl;
330    TMShortCard			numTms;
331    TMShortCard			tmTblSize;
332    struct _TMBindCacheRec	**bindCacheTbl;
333    TMShortCard			numBindCache;
334    TMShortCard			bindCacheTblSize;
335    TMShortCard			numLateBindings;
336    TMShortCard			numBranchHeads;
337    TMShortCard			numComplexStates;
338    TMShortCard			numComplexActions;
339#endif /* TRACE_TM */
340}TMGlobalRec;
341
342_XFUNCPROTOBEGIN
343
344extern TMGlobalRec _XtGlobalTM;
345
346#define TM_MOD_SEGMENT_SIZE 	16
347#define TM_TYPE_SEGMENT_SIZE 	16
348
349#define TMGetTypeMatch(idx) \
350  ((TMTypeMatch) \
351   &((_XtGlobalTM.typeMatchSegmentTbl[((idx) >> 4)])[(idx) & 15]))
352#define TMGetModifierMatch(idx) \
353  ((TMModifierMatch) \
354   &((_XtGlobalTM.modMatchSegmentTbl[(idx) >> 4])[(idx) & 15]))
355
356/* Useful Access Macros */
357#define TMNewMatchSemantics() (_XtGlobalTM.newMatchSemantics)
358#define TMBranchMore(branch) (branch->more)
359#define TMComplexBranchHead(tree, br) \
360  (((TMComplexStateTree)tree)->complexBranchHeadTbl[TMBranchMore(br)])
361
362#define TMGetComplexBindEntry(bindData, idx) \
363  ((TMComplexBindProcs)&(((TMComplexBindData)bindData)->bindTbl[idx]))
364
365#define TMGetSimpleBindEntry(bindData, idx) \
366  ((TMSimpleBindProcs)&(((TMSimpleBindData)bindData)->bindTbl[idx]))
367
368
369#define _InitializeKeysymTables(dpy, pd) \
370    if (pd->keysyms == NULL) \
371        _XtBuildKeysymTables(dpy, pd)
372
373/*
374 * Internal Functions
375 */
376
377extern void _XtPopup(
378    Widget      /* widget */,
379    XtGrabKind  /* grab_kind */,
380    _XtBoolean	/* spring_loaded */
381);
382
383extern _XtString _XtPrintXlations(
384    Widget		/* w */,
385    XtTranslations 	/* xlations */,
386    Widget		/* accelWidget */,
387    _XtBoolean		/* includeRHS */
388);
389
390extern void _XtRegisterGrabs(
391    Widget	/* widget */
392);
393
394extern XtPointer _XtInitializeActionData(
395    struct _XtActionsRec *	/* actions */,
396    Cardinal 			/* count */,
397    _XtBoolean			/* inPlace */
398);
399
400extern void _XtAddEventSeqToStateTree(
401    EventSeqPtr		/* eventSeq */,
402    TMParseStateTree	/* stateTree */
403);
404
405extern Boolean _XtMatchUsingStandardMods(
406    TMTypeMatch		/* typeMatch */,
407    TMModifierMatch	/* modMatch */,
408    TMEventPtr		/* eventSeq */
409);
410
411extern Boolean _XtMatchUsingDontCareMods(
412    TMTypeMatch		/* typeMatch */,
413    TMModifierMatch	/* modMatch */,
414    TMEventPtr		/* eventSeq */
415);
416
417extern Boolean _XtRegularMatch(
418    TMTypeMatch		/* typeMatch */,
419    TMModifierMatch	/* modMatch */,
420    TMEventPtr		/* eventSeq */
421);
422
423extern Boolean _XtMatchAtom(
424    TMTypeMatch		/* typeMatch */,
425    TMModifierMatch	/* modMatch */,
426    TMEventPtr		/* eventSeq */
427);
428
429extern void _XtTranslateEvent(
430    Widget		/* widget */,
431    XEvent*		/* event */
432);
433
434#include "CallbackI.h"
435#include "EventI.h"
436#include "HookObjI.h"
437#include "PassivGraI.h"
438#include "ThreadsI.h"
439#include "InitialI.h"
440#include "ResourceI.h"
441#include "StringDefs.h"
442
443extern void _XtBuildKeysymTables(Display *dpy, XtPerDisplay pd);
444
445#ifndef NO_MIT_HACKS
446extern void  _XtDisplayTranslations(
447    Widget		/* widget */,
448    XEvent*		/* event */,
449    String*		/* params */,
450    Cardinal*		/* num_params */
451);
452
453extern void  _XtDisplayAccelerators(
454    Widget		/* widget */,
455    XEvent*		/* event */,
456    String*		/* params */,
457    Cardinal*		/* num_params */
458);
459
460extern void _XtDisplayInstalledAccelerators(
461    Widget		/* widget */,
462    XEvent*		/* event */,
463    String*		/* params */,
464    Cardinal*		/* num_params */
465);
466#endif /* ifndef NO_MIT_HACKS */
467
468extern void _XtPopupInitialize(
469    XtAppContext	/* app_context */
470);
471
472extern void _XtBindActions(
473    Widget	/* widget */,
474    XtTM 	/* tm_rec */
475);
476
477extern Boolean _XtComputeLateBindings(
478    Display*		/* dpy */,
479    LateBindingsPtr	/* lateModifiers */,
480    Modifiers*		/* computed */,
481    Modifiers*		/* computedMask */
482);
483
484extern XtTranslations _XtCreateXlations(
485    TMStateTree *	/* stateTrees */,
486    TMShortCard		/* numStateTrees */,
487    XtTranslations 	/* first */,
488    XtTranslations	/* second */
489);
490
491extern Boolean _XtCvtMergeTranslations(
492    Display*	/* dpy */,
493    XrmValuePtr	/* args */,
494    Cardinal*	/* num_args */,
495    XrmValuePtr	/* from */,
496    XrmValuePtr	/* to */,
497    XtPointer*	/* closure_ret */
498);
499
500void _XtRemoveStateTreeByIndex(
501    XtTranslations	/* xlations */,
502    TMShortCard	/* i */);
503
504void _XtFreeTranslations(
505    XtAppContext	/* app */,
506    XrmValuePtr		/* toVal */,
507    XtPointer		/* closure */,
508    XrmValuePtr		/* args */,
509    Cardinal*		/* num_args */
510);
511
512extern TMShortCard _XtGetModifierIndex(
513    Event*	/* event */
514);
515
516extern TMShortCard _XtGetQuarkIndex(
517    TMParseStateTree	/* stateTreePtr */,
518    XrmQuark		/* quark */
519);
520
521extern XtTranslations _XtGetTranslationValue(
522    Widget		/* widget */
523);
524
525extern TMShortCard _XtGetTypeIndex(
526    Event*	/* event */
527);
528
529extern void _XtGrabInitialize(
530    XtAppContext	/* app */
531);
532
533extern void _XtInstallTranslations(
534    Widget		/* widget */
535);
536
537extern void _XtRemoveTranslations(
538    Widget		/* widget */
539);
540
541extern void _XtDestroyTMData(
542    Widget		/* widget */
543);
544
545extern void _XtMergeTranslations(
546    Widget		/* widget */,
547    XtTranslations	/* newXlations */,
548    _XtTranslateOp	/* operation */
549);
550
551extern void _XtActionInitialize(
552    XtAppContext	/* app */
553);
554
555extern TMStateTree _XtParseTreeToStateTree(
556    TMParseStateTree 	/* parseTree */
557);
558
559extern String _XtPrintActions(
560    ActionRec*	/* actions */,
561    XrmQuark*	/* quarkTbl */
562);
563
564extern String _XtPrintState(
565    TMStateTree	/* stateTree */,
566    TMBranchHead /* branchHead */);
567
568extern String _XtPrintEventSeq(
569    EventSeqPtr	/* eventSeq */,
570    Display*	/* dpy */
571);
572
573typedef Boolean (*_XtTraversalProc)(
574    StatePtr	/* state */,
575    XtPointer	/* data */
576);
577
578extern void _XtTraverseStateTree(
579    TMStateTree		/* tree */,
580    _XtTraversalProc	/* func */,
581    XtPointer		/* data */
582);
583
584extern void _XtTranslateInitialize(
585    void
586);
587
588extern void _XtAddTMConverters(
589    ConverterTable	/* table */
590);
591
592extern void _XtUnbindActions(
593    Widget		/* widget */,
594    XtTranslations	/* xlations */,
595    TMBindData		/* bindData */
596);
597
598extern void _XtUnmergeTranslations(
599    Widget		/* widget */,
600    XtTranslations 	/* xlations */
601);
602
603/* TMKey.c */
604extern void _XtAllocTMContext(XtPerDisplay pd);
605
606_XFUNCPROTOEND
607